1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.phone; 18 19 import android.content.Context; 20 import android.os.Bundle; 21 import android.os.PersistableBundle; 22 import android.os.UserManager; 23 import android.preference.Preference; 24 import android.preference.PreferenceScreen; 25 import android.telephony.CarrierConfigManager; 26 import android.telephony.SubscriptionManager; 27 import android.telephony.ims.ImsException; 28 import android.telephony.ims.ImsManager; 29 import android.telephony.ims.ImsMmTelManager; 30 import android.telephony.ims.feature.MmTelFeature; 31 import android.util.Log; 32 import android.view.MenuItem; 33 34 import com.android.internal.telephony.PhoneConstants; 35 import com.android.internal.telephony.flags.Flags; 36 37 public class CdmaCallOptions extends TimeConsumingPreferenceActivity { 38 private static final String LOG_TAG = "CdmaCallOptions"; 39 40 private static final String BUTTON_VP_KEY = "button_voice_privacy_key"; 41 private static final String CALL_FORWARDING_KEY = "call_forwarding_key"; 42 private static final String CALL_WAITING_KEY = "call_waiting_key"; 43 44 private class UtCallback extends ImsMmTelManager.CapabilityCallback { 45 @Override onCapabilitiesStatusChanged(MmTelFeature.MmTelCapabilities capabilities)46 public void onCapabilitiesStatusChanged(MmTelFeature.MmTelCapabilities capabilities) { 47 boolean isUtAvailable = capabilities.isCapable( 48 MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT); 49 updatePreferencesEnabled(isUtAvailable); 50 } 51 } 52 53 private Preference mCallForwardingPref; 54 private CdmaCallWaitingPreference mCallWaitingPref; 55 private UtCallback mUtCallback; 56 private ImsMmTelManager mMmTelManager; 57 58 @Override onCreate(Bundle icicle)59 protected void onCreate(Bundle icicle) { 60 super.onCreate(icicle); 61 62 getWindow().addSystemFlags( 63 android.view.WindowManager.LayoutParams 64 .SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); 65 66 addPreferencesFromResource(R.xml.cdma_call_privacy); 67 68 SubscriptionInfoHelper subInfoHelper = new SubscriptionInfoHelper(this, getIntent()); 69 subInfoHelper.setActionBarTitle( 70 getActionBar(), getResources(), R.string.labelCdmaMore_with_label); 71 72 CdmaVoicePrivacySwitchPreference buttonVoicePrivacy = 73 (CdmaVoicePrivacySwitchPreference) findPreference(BUTTON_VP_KEY); 74 buttonVoicePrivacy.setPhone(subInfoHelper.getPhone()); 75 PersistableBundle carrierConfig; 76 int subId; 77 if (subInfoHelper.hasSubId()) { 78 subId = subInfoHelper.getSubId(); 79 } else { 80 subId = SubscriptionManager.getDefaultSubscriptionId(); 81 } 82 carrierConfig = PhoneGlobals.getInstance().getCarrierConfigForSubId(subId); 83 if (subInfoHelper.getPhone().getPhoneType() != PhoneConstants.PHONE_TYPE_CDMA 84 || carrierConfig.getBoolean(CarrierConfigManager.KEY_VOICE_PRIVACY_DISABLE_UI_BOOL)) { 85 buttonVoicePrivacy.setEnabled(false); 86 } 87 88 // If mobile network configs are restricted, then hide the mCallForwardingPref and 89 // mCallWaitingPref. 90 UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE); 91 boolean mobileNetworkConfigsRestricted = 92 userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS); 93 if (Flags.ensureAccessToCallSettingsIsRestricted() && mobileNetworkConfigsRestricted) { 94 Log.i(LOG_TAG, "Mobile network configs are restricted, hiding CDMA call forwarding " 95 + "and CDMA call waiting options."); 96 } 97 98 mCallForwardingPref = getPreferenceScreen().findPreference(CALL_FORWARDING_KEY); 99 if (carrierConfig != null && carrierConfig.getBoolean( 100 CarrierConfigManager.KEY_CALL_FORWARDING_VISIBILITY_BOOL) && 101 (!mobileNetworkConfigsRestricted || 102 !Flags.ensureAccessToCallSettingsIsRestricted())) { 103 mCallForwardingPref.setIntent( 104 subInfoHelper.getIntent(CdmaCallForwardOptions.class)); 105 } else { 106 getPreferenceScreen().removePreference(mCallForwardingPref); 107 mCallForwardingPref = null; 108 } 109 110 mCallWaitingPref = (CdmaCallWaitingPreference) getPreferenceScreen() 111 .findPreference(CALL_WAITING_KEY); 112 if (carrierConfig == null || !carrierConfig.getBoolean( 113 CarrierConfigManager.KEY_ADDITIONAL_SETTINGS_CALL_WAITING_VISIBILITY_BOOL) || 114 (Flags.ensureAccessToCallSettingsIsRestricted() && 115 mobileNetworkConfigsRestricted)) { 116 getPreferenceScreen().removePreference(mCallWaitingPref); 117 mCallWaitingPref = null; 118 } 119 // Do not go further if the preferences are removed. 120 if (mCallForwardingPref == null && mCallWaitingPref == null) return; 121 122 boolean isSsOverCdmaEnabled = carrierConfig != null && carrierConfig.getBoolean( 123 CarrierConfigManager.KEY_SUPPORT_SS_OVER_CDMA_BOOL); 124 boolean isSsOverUtEnabled = carrierConfig != null && carrierConfig.getBoolean( 125 CarrierConfigManager.KEY_CARRIER_SUPPORTS_SS_OVER_UT_BOOL); 126 127 if (isSsOverCdmaEnabled && mCallWaitingPref != null) { 128 // If SS over CDMA is enabled, then the preference will always be enabled, 129 // independent of SS over UT status. Initialize it now. 130 mCallWaitingPref.init(this, subInfoHelper.getPhone()); 131 return; 132 } 133 // Since SS over UT availability can change, first disable the preferences that rely on it 134 // and only enable it if UT is available. 135 updatePreferencesEnabled(false); 136 if (isSsOverUtEnabled) { 137 // Register a callback to listen to SS over UT state. This will enable the preferences 138 // once the callback notifies settings that UT is enabled. 139 registerMmTelCapsCallback(subId); 140 } else { 141 Log.w(LOG_TAG, "SS over UT and CDMA disabled, but preferences are visible."); 142 } 143 } 144 145 @Override onStop()146 public void onStop() { 147 super.onStop(); 148 unregisterMmTelCapsCallback(); 149 } 150 unregisterMmTelCapsCallback()151 private void unregisterMmTelCapsCallback() { 152 if (mMmTelManager == null || mUtCallback == null) return; 153 mMmTelManager.unregisterMmTelCapabilityCallback(mUtCallback); 154 mUtCallback = null; 155 Log.d(LOG_TAG, "unregisterMmTelCapsCallback: UT availability callback unregistered"); 156 } 157 registerMmTelCapsCallback(int subId)158 private void registerMmTelCapsCallback(int subId) { 159 if (!SubscriptionManager.isValidSubscriptionId(subId)) return; 160 ImsManager imsManager = getSystemService(ImsManager.class); 161 try { 162 if (imsManager != null) { 163 mUtCallback = new UtCallback(); 164 mMmTelManager = imsManager.getImsMmTelManager(subId); 165 // Callback will call back with the state as soon as it is available. 166 mMmTelManager.registerMmTelCapabilityCallback(getMainExecutor(), mUtCallback); 167 Log.d(LOG_TAG, "registerMmTelCapsCallback: UT availability callback " 168 + "registered"); 169 } else { 170 Log.w(LOG_TAG, "registerMmTelCapsCallback: couldn't get ImsManager, assuming " 171 + "UT is not available: "); 172 updatePreferencesEnabled(false); 173 } 174 } catch (IllegalArgumentException | ImsException e) { 175 Log.w(LOG_TAG, "registerMmTelCapsCallback: couldn't register callback, assuming " 176 + "UT is not available: " + e); 177 updatePreferencesEnabled(false); 178 } 179 } 180 updatePreferencesEnabled(boolean isEnabled)181 private void updatePreferencesEnabled(boolean isEnabled) { 182 Log.d(LOG_TAG, "updatePreferencesEnabled: " + isEnabled); 183 if (mCallForwardingPref != null) mCallForwardingPref.setEnabled(isEnabled); 184 185 if (mCallWaitingPref == null || mCallWaitingPref.isEnabled() == isEnabled) return; 186 mCallWaitingPref.setActionAvailable(isEnabled); 187 if (isEnabled) { 188 SubscriptionInfoHelper subInfoHelper = new SubscriptionInfoHelper(this, getIntent()); 189 // kick off the normal process to populate the Call Waiting status. 190 mCallWaitingPref.init(this, subInfoHelper.getPhone()); 191 } 192 } 193 194 @Override onOptionsItemSelected(MenuItem item)195 public boolean onOptionsItemSelected(MenuItem item) { 196 final int itemId = item.getItemId(); 197 if (itemId == android.R.id.home) { 198 onBackPressed(); 199 return true; 200 } 201 return super.onOptionsItemSelected(item); 202 } 203 204 @Override onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)205 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 206 if (preference.getKey().equals(BUTTON_VP_KEY)) { 207 return true; 208 } 209 return false; 210 } 211 } 212