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 60 public CdmaOptions(Phone phone) { 61 mPhone = phone; 62 } 63 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. 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 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 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 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 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 206 protected void log(String s) { 207 android.util.Log.d(LOG_TAG, s); 208 } 209 } 210