/* * 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; } }