• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 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.Intent;
20 import android.os.PersistableBundle;
21 import android.os.SystemProperties;
22 import android.preference.Preference;
23 import android.preference.PreferenceFragment;
24 import android.preference.PreferenceScreen;
25 import android.provider.Settings;
26 import android.telephony.CarrierConfigManager;
27 import android.text.TextUtils;
28 
29 import com.android.internal.annotations.VisibleForTesting;
30 import com.android.internal.logging.MetricsLogger;
31 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
32 import com.android.internal.telephony.Phone;
33 import com.android.internal.telephony.PhoneConstants;
34 import com.android.settingslib.RestrictedLockUtils;
35 
36 /**
37  * List of Phone-specific settings screens.
38  */
39 public class CdmaOptions {
40     private static final String LOG_TAG = "CdmaOptions";
41 
42     private CdmaSystemSelectListPreference mButtonCdmaSystemSelect;
43     private CdmaSubscriptionListPreference mButtonCdmaSubscription;
44     private RestrictedPreference mButtonAPNExpand;
45     private Preference mCategoryAPNExpand;
46     private Preference mButtonCarrierSettings;
47 
48     private static final String BUTTON_CDMA_SYSTEM_SELECT_KEY = "cdma_system_select_key";
49     private static final String BUTTON_CDMA_SUBSCRIPTION_KEY = "cdma_subscription_key";
50     private static final String BUTTON_CARRIER_SETTINGS_KEY = "carrier_settings_key";
51     private static final String BUTTON_APN_EXPAND_KEY = "button_cdma_apn_key";
52     private static final String CATEGORY_APN_EXPAND_KEY = "category_cdma_apn_key";
53 
54     private PreferenceFragment mPrefFragment;
55     private PreferenceScreen mPrefScreen;
56     private Phone mPhone;
57 
58     // Constructor for CdmaOptionsTest, since PreferenceScreen is final and cannot be mocked
59     @VisibleForTesting
CdmaOptions(Phone phone)60     public CdmaOptions(Phone phone) {
61         mPhone = phone;
62     }
63 
CdmaOptions(PreferenceFragment prefFragment, PreferenceScreen prefScreen, Phone phone)64     public CdmaOptions(PreferenceFragment prefFragment, PreferenceScreen prefScreen, Phone phone) {
65         mPrefFragment = prefFragment;
66         mPrefScreen = prefScreen;
67         mPrefFragment.addPreferencesFromResource(R.xml.cdma_options);
68 
69         // Initialize preferences.
70         mButtonCdmaSystemSelect = (CdmaSystemSelectListPreference) mPrefScreen
71                 .findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY);
72         mButtonCdmaSubscription = (CdmaSubscriptionListPreference) mPrefScreen
73                 .findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY);
74         mButtonCarrierSettings = mPrefScreen.findPreference(BUTTON_CARRIER_SETTINGS_KEY);
75         mButtonAPNExpand = (RestrictedPreference) mPrefScreen.findPreference(BUTTON_APN_EXPAND_KEY);
76         mCategoryAPNExpand = mPrefScreen.findPreference(CATEGORY_APN_EXPAND_KEY);
77 
78         update(phone);
79     }
80 
81     // Unlike mPrefFragment or mPrefScreen, mPhone may change during lifecycle of CdmaOptions.
82     // For example, a new sim card is inserted. When that happens, we update CdmaOptions with new
83     // phone.
update(Phone phone)84     protected void update(Phone phone) {
85         mPhone = phone;
86 
87         PersistableBundle carrierConfig =
88                 PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
89         // Some CDMA carriers want the APN settings.
90         boolean addAPNExpand = shouldAddApnExpandPreference(carrierConfig);
91         boolean addCdmaSubscription =
92                 deviceSupportsNvAndRuim();
93         // Read platform settings for carrier settings
94         boolean addCarrierSettings =
95                 carrierConfig.getBoolean(CarrierConfigManager.KEY_CARRIER_SETTINGS_ENABLE_BOOL);
96 
97         mPrefScreen.addPreference(mButtonCdmaSystemSelect);
98         mButtonCdmaSystemSelect.setEnabled(true);
99 
100         // Making no assumptions of whether they are added or removed at this point.
101         // Calling add or remove explicitly to make sure they are updated.
102 
103         if (addAPNExpand) {
104             log("update: addAPNExpand");
105             mButtonAPNExpand.setDisabledByAdmin(
106                     MobileNetworkSettings.isDpcApnEnforced(mButtonAPNExpand.getContext())
107                             ? RestrictedLockUtils.getDeviceOwner(mButtonAPNExpand.getContext())
108                             : null);
109             mButtonAPNExpand.setOnPreferenceClickListener(
110                     new Preference.OnPreferenceClickListener() {
111                         @Override
112                         public boolean onPreferenceClick(Preference preference) {
113                             MetricsLogger.action(mButtonAPNExpand.getContext(),
114                                     MetricsEvent.ACTION_MOBILE_NETWORK_APN_SETTINGS);
115                             // We need to build the Intent by hand as the Preference Framework
116                             // does not allow to add an Intent with some extras into a Preference
117                             // XML file
118                             final Intent intent = new Intent(Settings.ACTION_APN_SETTINGS);
119                             // This will setup the Home and Search affordance
120                             intent.putExtra(":settings:show_fragment_as_subsetting", true);
121                             intent.putExtra("sub_id", mPhone.getSubId());
122                             mPrefFragment.startActivity(intent);
123                             return true;
124                         }
125                     });
126             mPrefScreen.addPreference(mCategoryAPNExpand);
127         } else {
128             mPrefScreen.removePreference(mCategoryAPNExpand);
129         }
130 
131         if (addCdmaSubscription) {
132             log("Both NV and Ruim supported, ENABLE subscription type selection");
133             mPrefScreen.addPreference(mButtonCdmaSubscription);
134             mButtonCdmaSubscription.setEnabled(true);
135         } else {
136             log("Both NV and Ruim NOT supported, REMOVE subscription type selection");
137             mPrefScreen.removePreference(mButtonCdmaSubscription);
138         }
139 
140         if (addCarrierSettings) {
141             mPrefScreen.addPreference(mButtonCarrierSettings);
142         } else {
143             mPrefScreen.removePreference(mButtonCarrierSettings);
144         }
145     }
146 
147     /**
148      * Return whether we should add the APN expandable preference based on the phone type and
149      * carrier config
150      */
151     @VisibleForTesting
shouldAddApnExpandPreference(PersistableBundle config)152     public boolean shouldAddApnExpandPreference(PersistableBundle config) {
153         if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA
154                 && config.getBoolean(CarrierConfigManager.KEY_SHOW_APN_SETTING_CDMA_BOOL)) {
155             return true;
156         }
157         return false;
158     }
159 
deviceSupportsNvAndRuim()160     private boolean deviceSupportsNvAndRuim() {
161         // retrieve the list of subscription types supported by device.
162         String subscriptionsSupported = SystemProperties.get("ril.subscription.types");
163         boolean nvSupported = false;
164         boolean ruimSupported = false;
165 
166         log("deviceSupportsnvAnRum: prop=" + subscriptionsSupported);
167         if (!TextUtils.isEmpty(subscriptionsSupported)) {
168             // Searches through the comma-separated list for a match for "NV"
169             // and "RUIM" to update nvSupported and ruimSupported.
170             for (String subscriptionType : subscriptionsSupported.split(",")) {
171                 subscriptionType = subscriptionType.trim();
172                 if (subscriptionType.equalsIgnoreCase("NV")) {
173                     nvSupported = true;
174                 }
175                 if (subscriptionType.equalsIgnoreCase("RUIM")) {
176                     ruimSupported = true;
177                 }
178             }
179         }
180 
181         log("deviceSupportsnvAnRum: nvSupported=" + nvSupported +
182                 " ruimSupported=" + ruimSupported);
183         return (nvSupported && ruimSupported);
184     }
185 
preferenceTreeClick(Preference preference)186     public boolean preferenceTreeClick(Preference preference) {
187         if (preference.getKey().equals(BUTTON_CDMA_SYSTEM_SELECT_KEY)) {
188             log("preferenceTreeClick: return BUTTON_CDMA_ROAMING_KEY true");
189             return true;
190         }
191         if (preference.getKey().equals(BUTTON_CDMA_SUBSCRIPTION_KEY)) {
192             log("preferenceTreeClick: return CDMA_SUBSCRIPTION_KEY true");
193             return true;
194         }
195         return false;
196     }
197 
showDialog(Preference preference)198     public void showDialog(Preference preference) {
199         if (preference.getKey().equals(BUTTON_CDMA_SYSTEM_SELECT_KEY)) {
200             mButtonCdmaSystemSelect.showDialog(null);
201         } else if (preference.getKey().equals(BUTTON_CDMA_SUBSCRIPTION_KEY)) {
202             mButtonCdmaSubscription.showDialog(null);
203         }
204     }
205 
log(String s)206     protected void log(String s) {
207         android.util.Log.d(LOG_TAG, s);
208     }
209 }
210