blob: 614587099ff5bdbff66a73c6a4d2852dbf4fbeea [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.phone;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.preference.Preference;
import android.preference.PreferenceScreen;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.ims.ImsException;
import android.telephony.ims.ImsManager;
import android.telephony.ims.ImsMmTelManager;
import android.telephony.ims.feature.MmTelFeature;
import android.util.Log;
import android.view.MenuItem;
import com.android.internal.telephony.PhoneConstants;
public class CdmaCallOptions extends TimeConsumingPreferenceActivity {
private static final String LOG_TAG = "CdmaCallOptions";
private static final String BUTTON_VP_KEY = "button_voice_privacy_key";
private static final String CALL_FORWARDING_KEY = "call_forwarding_key";
private static final String CALL_WAITING_KEY = "call_waiting_key";
private class UtCallback extends ImsMmTelManager.CapabilityCallback {
@Override
public void onCapabilitiesStatusChanged(MmTelFeature.MmTelCapabilities capabilities) {
boolean isUtAvailable = capabilities.isCapable(
MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT);
updatePreferencesEnabled(isUtAvailable);
}
}
private Preference mCallForwardingPref;
private CdmaCallWaitingPreference mCallWaitingPref;
private UtCallback mUtCallback;
private ImsMmTelManager mMmTelManager;
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
addPreferencesFromResource(R.xml.cdma_call_privacy);
SubscriptionInfoHelper subInfoHelper = new SubscriptionInfoHelper(this, getIntent());
subInfoHelper.setActionBarTitle(
getActionBar(), getResources(), R.string.labelCdmaMore_with_label);
CdmaVoicePrivacySwitchPreference buttonVoicePrivacy =
(CdmaVoicePrivacySwitchPreference) findPreference(BUTTON_VP_KEY);
buttonVoicePrivacy.setPhone(subInfoHelper.getPhone());
PersistableBundle carrierConfig;
int subId;
if (subInfoHelper.hasSubId()) {
subId = subInfoHelper.getSubId();
} else {
subId = SubscriptionManager.getDefaultSubscriptionId();
}
carrierConfig = PhoneGlobals.getInstance().getCarrierConfigForSubId(subId);
if (subInfoHelper.getPhone().getPhoneType() != PhoneConstants.PHONE_TYPE_CDMA
|| carrierConfig.getBoolean(CarrierConfigManager.KEY_VOICE_PRIVACY_DISABLE_UI_BOOL)) {
buttonVoicePrivacy.setEnabled(false);
}
mCallForwardingPref = getPreferenceScreen().findPreference(CALL_FORWARDING_KEY);
if (carrierConfig != null && carrierConfig.getBoolean(
CarrierConfigManager.KEY_CALL_FORWARDING_VISIBILITY_BOOL)) {
mCallForwardingPref.setIntent(
subInfoHelper.getIntent(CdmaCallForwardOptions.class));
} else {
getPreferenceScreen().removePreference(mCallForwardingPref);
mCallForwardingPref = null;
}
mCallWaitingPref = (CdmaCallWaitingPreference) getPreferenceScreen()
.findPreference(CALL_WAITING_KEY);
if (carrierConfig == null || !carrierConfig.getBoolean(
CarrierConfigManager.KEY_ADDITIONAL_SETTINGS_CALL_WAITING_VISIBILITY_BOOL)) {
getPreferenceScreen().removePreference(mCallWaitingPref);
mCallWaitingPref = null;
}
// Do not go further if the preferences are removed.
if (mCallForwardingPref == null && mCallWaitingPref == null) return;
boolean isSsOverCdmaEnabled = carrierConfig != null && carrierConfig.getBoolean(
CarrierConfigManager.KEY_SUPPORT_SS_OVER_CDMA_BOOL);
boolean isSsOverUtEnabled = carrierConfig != null && carrierConfig.getBoolean(
CarrierConfigManager.KEY_CARRIER_SUPPORTS_SS_OVER_UT_BOOL);
if (isSsOverCdmaEnabled && mCallWaitingPref != null) {
// If SS over CDMA is enabled, then the preference will always be enabled,
// independent of SS over UT status. Initialize it now.
mCallWaitingPref.init(this, subInfoHelper.getPhone());
return;
}
// Since SS over UT availability can change, first disable the preferences that rely on it
// and only enable it if UT is available.
updatePreferencesEnabled(false);
if (isSsOverUtEnabled) {
// Register a callback to listen to SS over UT state. This will enable the preferences
// once the callback notifies settings that UT is enabled.
registerMmTelCapsCallback(subId);
} else {
Log.w(LOG_TAG, "SS over UT and CDMA disabled, but preferences are visible.");
}
}
@Override
public void onStop() {
super.onStop();
unregisterMmTelCapsCallback();
}
private void unregisterMmTelCapsCallback() {
if (mMmTelManager == null || mUtCallback == null) return;
mMmTelManager.unregisterMmTelCapabilityCallback(mUtCallback);
mUtCallback = null;
Log.d(LOG_TAG, "unregisterMmTelCapsCallback: UT availability callback unregistered");
}
private void registerMmTelCapsCallback(int subId) {
if (!SubscriptionManager.isValidSubscriptionId(subId)) return;
ImsManager imsManager = getSystemService(ImsManager.class);
try {
if (imsManager != null) {
mUtCallback = new UtCallback();
mMmTelManager = imsManager.getImsMmTelManager(subId);
// Callback will call back with the state as soon as it is available.
mMmTelManager.registerMmTelCapabilityCallback(getMainExecutor(), mUtCallback);
Log.d(LOG_TAG, "registerMmTelCapsCallback: UT availability callback "
+ "registered");
} else {
Log.w(LOG_TAG, "registerMmTelCapsCallback: couldn't get ImsManager, assuming "
+ "UT is not available: ");
updatePreferencesEnabled(false);
}
} catch (IllegalArgumentException | ImsException e) {
Log.w(LOG_TAG, "registerMmTelCapsCallback: couldn't register callback, assuming "
+ "UT is not available: " + e);
updatePreferencesEnabled(false);
}
}
private void updatePreferencesEnabled(boolean isEnabled) {
Log.d(LOG_TAG, "updatePreferencesEnabled: " + isEnabled);
if (mCallForwardingPref != null) mCallForwardingPref.setEnabled(isEnabled);
if (mCallWaitingPref == null || mCallWaitingPref.isEnabled() == isEnabled) return;
mCallWaitingPref.setActionAvailable(isEnabled);
if (isEnabled) {
SubscriptionInfoHelper subInfoHelper = new SubscriptionInfoHelper(this, getIntent());
// kick off the normal process to populate the Call Waiting status.
mCallWaitingPref.init(this, subInfoHelper.getPhone());
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
final int itemId = item.getItemId();
if (itemId == android.R.id.home) {
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
if (preference.getKey().equals(BUTTON_VP_KEY)) {
return true;
}
return false;
}
}