• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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