1 /* 2 * Copyright (C) 2006 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 static android.provider.Telephony.Carriers.ENFORCE_MANAGED_URI; 20 21 import android.app.ActionBar; 22 import android.app.Activity; 23 import android.app.DialogFragment; 24 import android.app.Fragment; 25 import android.app.FragmentManager; 26 import android.content.BroadcastReceiver; 27 import android.content.ComponentName; 28 import android.content.ContentResolver; 29 import android.content.Context; 30 import android.content.Intent; 31 import android.content.IntentFilter; 32 import android.content.ServiceConnection; 33 import android.content.pm.PackageManager; 34 import android.content.pm.ResolveInfo; 35 import android.database.ContentObserver; 36 import android.database.Cursor; 37 import android.net.Uri; 38 import android.os.AsyncResult; 39 import android.os.Bundle; 40 import android.os.Handler; 41 import android.os.IBinder; 42 import android.os.Message; 43 import android.os.PersistableBundle; 44 import android.os.SystemProperties; 45 import android.os.UserHandle; 46 import android.os.UserManager; 47 import android.preference.ListPreference; 48 import android.preference.Preference; 49 import android.preference.PreferenceCategory; 50 import android.preference.PreferenceFragment; 51 import android.preference.PreferenceScreen; 52 import android.preference.SwitchPreference; 53 import android.provider.Settings; 54 import android.telecom.PhoneAccountHandle; 55 import android.telecom.TelecomManager; 56 import android.telephony.CarrierConfigManager; 57 import android.telephony.PhoneStateListener; 58 import android.telephony.ServiceState; 59 import android.telephony.SubscriptionInfo; 60 import android.telephony.SubscriptionManager; 61 import android.telephony.TelephonyManager; 62 import android.telephony.euicc.EuiccManager; 63 import android.telephony.ims.feature.ImsFeature; 64 import android.text.TextUtils; 65 import android.util.Log; 66 import android.view.LayoutInflater; 67 import android.view.MenuItem; 68 import android.view.View; 69 import android.view.ViewGroup; 70 import android.widget.TabHost; 71 72 import com.android.ims.ImsConfig; 73 import com.android.ims.ImsException; 74 import com.android.ims.ImsManager; 75 import com.android.internal.logging.MetricsLogger; 76 import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 77 import com.android.internal.telephony.Phone; 78 import com.android.internal.telephony.PhoneConstants; 79 import com.android.internal.telephony.PhoneFactory; 80 import com.android.internal.telephony.TelephonyIntents; 81 import com.android.phone.settings.PhoneAccountSettingsFragment; 82 import com.android.settingslib.RestrictedLockUtils; 83 84 import java.util.ArrayList; 85 import java.util.Arrays; 86 import java.util.Iterator; 87 import java.util.List; 88 89 /** 90 * "Mobile network settings" screen. This screen lets you 91 * enable/disable mobile data, and control data roaming and other 92 * network-specific mobile data features. It's used on non-voice-capable 93 * tablets as well as regular phone devices. 94 * 95 * Note that this Activity is part of the phone app, even though 96 * you reach it from the "Wireless & Networks" section of the main 97 * Settings app. It's not part of the "Call settings" hierarchy that's 98 * available from the Phone app (see CallFeaturesSetting for that.) 99 */ 100 101 public class MobileNetworkSettings extends Activity { 102 103 // CID of the device. 104 private static final String KEY_CID = "ro.boot.cid"; 105 // CIDs of devices which should not show anything related to eSIM. 106 private static final String KEY_ESIM_CID_IGNORE = "ro.setupwizard.esim_cid_ignore"; 107 // System Property which is used to decide whether the default eSIM UI will be shown, 108 // the default value is false. 109 private static final String KEY_ENABLE_ESIM_UI_BY_DEFAULT = 110 "esim.enable_esim_system_ui_by_default"; 111 112 private enum TabState { 113 NO_TABS, UPDATE, DO_NOTHING 114 } 115 116 @Override 117 protected void onNewIntent(Intent intent) { 118 setIntent(intent); 119 MobileNetworkFragment fragment = (MobileNetworkFragment) getFragmentManager() 120 .findFragmentById(R.id.network_setting_content); 121 if (fragment != null) { 122 fragment.onIntentUpdate(intent); 123 } 124 } 125 126 @Override 127 public void onCreate(Bundle savedInstanceState) { 128 super.onCreate(savedInstanceState); 129 setContentView(R.layout.network_setting); 130 131 FragmentManager fragmentManager = getFragmentManager(); 132 Fragment fragment = fragmentManager.findFragmentById(R.id.network_setting_content); 133 if (fragment == null) { 134 fragmentManager.beginTransaction() 135 .add(R.id.network_setting_content, new MobileNetworkFragment()) 136 .commit(); 137 } 138 } 139 140 @Override 141 public boolean onOptionsItemSelected(final MenuItem item) { 142 final int itemId = item.getItemId(); 143 switch (itemId) { 144 // Respond to the action bar's Up/Home button 145 case android.R.id.home: 146 finish(); 147 return true; 148 } 149 return super.onOptionsItemSelected(item); 150 } 151 152 /** 153 * Whether to show the entry point to eUICC settings. 154 * 155 * <p>We show the entry point on any device which supports eUICC as long as either the eUICC 156 * was ever provisioned (that is, at least one profile was ever downloaded onto it), or if 157 * the user has enabled development mode. 158 */ 159 public static boolean showEuiccSettings(Context context) { 160 EuiccManager euiccManager = 161 (EuiccManager) context.getSystemService(Context.EUICC_SERVICE); 162 if (!euiccManager.isEnabled()) { 163 return false; 164 } 165 166 ContentResolver cr = context.getContentResolver(); 167 168 TelephonyManager tm = 169 (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 170 String currentCountry = tm.getNetworkCountryIso().toLowerCase(); 171 String supportedCountries = 172 Settings.Global.getString(cr, Settings.Global.EUICC_SUPPORTED_COUNTRIES); 173 boolean inEsimSupportedCountries = false; 174 if (TextUtils.isEmpty(currentCountry)) { 175 inEsimSupportedCountries = true; 176 } else if (!TextUtils.isEmpty(supportedCountries)) { 177 List<String> supportedCountryList = 178 Arrays.asList(TextUtils.split(supportedCountries.toLowerCase(), ",")); 179 if (supportedCountryList.contains(currentCountry)) { 180 inEsimSupportedCountries = true; 181 } 182 } 183 final boolean esimIgnoredDevice = 184 Arrays.asList(TextUtils.split(SystemProperties.get(KEY_ESIM_CID_IGNORE, ""), ",")) 185 .contains(SystemProperties.get(KEY_CID, null)); 186 final boolean enabledEsimUiByDefault = 187 SystemProperties.getBoolean(KEY_ENABLE_ESIM_UI_BY_DEFAULT, true); 188 final boolean euiccProvisioned = 189 Settings.Global.getInt(cr, Settings.Global.EUICC_PROVISIONED, 0) != 0; 190 final boolean inDeveloperMode = 191 Settings.Global.getInt(cr, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0; 192 193 return (inDeveloperMode || euiccProvisioned 194 || (!esimIgnoredDevice && enabledEsimUiByDefault && inEsimSupportedCountries)); 195 } 196 197 /** 198 * Whether to show the Enhanced 4G LTE settings in search result. 199 * 200 * <p>We show this settings if the VoLTE can be enabled by this device and the carrier app 201 * doesn't set {@link CarrierConfigManager#KEY_HIDE_ENHANCED_4G_LTE_BOOL} to false. 202 */ 203 public static boolean hideEnhanced4gLteSettings(Context context) { 204 List<SubscriptionInfo> sil = 205 SubscriptionManager.from(context).getActiveSubscriptionInfoList(); 206 // Check all active subscriptions. We only hide the button if it's disabled for all 207 // active subscriptions. 208 if (sil != null) { 209 for (SubscriptionInfo subInfo : sil) { 210 ImsManager imsManager = ImsManager.getInstance(context, subInfo.getSimSlotIndex()); 211 PersistableBundle carrierConfig = PhoneGlobals.getInstance() 212 .getCarrierConfigForSubId(subInfo.getSubscriptionId()); 213 if ((imsManager.isVolteEnabledByPlatform() 214 && imsManager.isVolteProvisionedOnDevice()) 215 || carrierConfig.getBoolean( 216 CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL)) { 217 return false; 218 } 219 } 220 } 221 222 return true; 223 } 224 225 /** 226 * Returns if DPC APNs are enforced. 227 */ 228 public static boolean isDpcApnEnforced(Context context) { 229 try (Cursor enforceCursor = context.getContentResolver().query(ENFORCE_MANAGED_URI, 230 null, null, null, null)) { 231 if (enforceCursor == null || enforceCursor.getCount() != 1) { 232 return false; 233 } 234 enforceCursor.moveToFirst(); 235 return enforceCursor.getInt(0) > 0; 236 } 237 } 238 239 public static class MobileNetworkFragment extends PreferenceFragment implements 240 Preference.OnPreferenceChangeListener, RoamingDialogFragment.RoamingDialogListener { 241 242 // debug data 243 private static final String LOG_TAG = "NetworkSettings"; 244 private static final boolean DBG = true; 245 public static final int REQUEST_CODE_EXIT_ECM = 17; 246 247 // Number of active Subscriptions to show tabs 248 private static final int TAB_THRESHOLD = 2; 249 250 // Number of last phone number digits shown in Euicc Setting tab 251 private static final int NUM_LAST_PHONE_DIGITS = 4; 252 253 // fragment tag for roaming data dialog 254 private static final String ROAMING_TAG = "RoamingDialogFragment"; 255 256 //String keys for preference lookup 257 private static final String BUTTON_PREFERED_NETWORK_MODE = "preferred_network_mode_key"; 258 private static final String BUTTON_ROAMING_KEY = "button_roaming_key"; 259 private static final String BUTTON_CDMA_LTE_DATA_SERVICE_KEY = "cdma_lte_data_service_key"; 260 private static final String BUTTON_ENABLED_NETWORKS_KEY = "enabled_networks_key"; 261 private static final String BUTTON_4G_LTE_KEY = "enhanced_4g_lte"; 262 private static final String BUTTON_CELL_BROADCAST_SETTINGS = "cell_broadcast_settings"; 263 private static final String BUTTON_CARRIER_SETTINGS_KEY = "carrier_settings_key"; 264 private static final String BUTTON_CDMA_SYSTEM_SELECT_KEY = "cdma_system_select_key"; 265 private static final String BUTTON_CDMA_SUBSCRIPTION_KEY = "cdma_subscription_key"; 266 private static final String BUTTON_CARRIER_SETTINGS_EUICC_KEY = 267 "carrier_settings_euicc_key"; 268 private static final String BUTTON_WIFI_CALLING_KEY = "wifi_calling_key"; 269 private static final String BUTTON_VIDEO_CALLING_KEY = "video_calling_key"; 270 private static final String BUTTON_MOBILE_DATA_ENABLE_KEY = "mobile_data_enable"; 271 private static final String BUTTON_DATA_USAGE_KEY = "data_usage_summary"; 272 private static final String BUTTON_ADVANCED_OPTIONS_KEY = "advanced_options"; 273 private static final String CATEGORY_CALLING_KEY = "calling"; 274 private static final String CATEGORY_GSM_APN_EXPAND_KEY = "category_gsm_apn_key"; 275 private static final String CATEGORY_CDMA_APN_EXPAND_KEY = "category_cdma_apn_key"; 276 private static final String BUTTON_GSM_APN_EXPAND_KEY = "button_gsm_apn_key"; 277 private static final String BUTTON_CDMA_APN_EXPAND_KEY = "button_cdma_apn_key"; 278 279 private final BroadcastReceiver mPhoneChangeReceiver = new PhoneChangeReceiver(); 280 private final ContentObserver mDpcEnforcedContentObserver = new DpcApnEnforcedObserver(); 281 282 static final int preferredNetworkMode = Phone.PREFERRED_NT_MODE; 283 284 //Information about logical "up" Activity 285 private static final String UP_ACTIVITY_PACKAGE = "com.android.settings"; 286 private static final String UP_ACTIVITY_CLASS = 287 "com.android.settings.Settings$WirelessSettingsActivity"; 288 289 //Information that needs to save into Bundle. 290 private static final String EXPAND_ADVANCED_FIELDS = "expand_advanced_fields"; 291 //Intent extra to indicate expand all fields. 292 private static final String EXPAND_EXTRA = "expandable"; 293 294 private SubscriptionManager mSubscriptionManager; 295 private TelephonyManager mTelephonyManager; 296 297 //UI objects 298 private AdvancedOptionsPreference mAdvancedOptions; 299 private ListPreference mButtonPreferredNetworkMode; 300 private ListPreference mButtonEnabledNetworks; 301 private RestrictedSwitchPreference mButtonDataRoam; 302 private SwitchPreference mButton4glte; 303 private Preference mLteDataServicePref; 304 private Preference mEuiccSettingsPref; 305 private PreferenceCategory mCallingCategory; 306 private Preference mWiFiCallingPref; 307 private SwitchPreference mVideoCallingPref; 308 private NetworkSelectListPreference mButtonNetworkSelect; 309 private MobileDataPreference mMobileDataPref; 310 private DataUsagePreference mDataUsagePref; 311 312 private static final String iface = "rmnet0"; //TODO: this will go away 313 private List<SubscriptionInfo> mActiveSubInfos; 314 315 private UserManager mUm; 316 private Phone mPhone; 317 private ImsManager mImsMgr; 318 private MyHandler mHandler; 319 private boolean mOkClicked; 320 private boolean mExpandAdvancedFields; 321 322 // We assume the the value returned by mTabHost.getCurrentTab() == slotId 323 private TabHost mTabHost; 324 325 //GsmUmts options and Cdma options 326 GsmUmtsOptions mGsmUmtsOptions; 327 CdmaOptions mCdmaOptions; 328 329 private Preference mClickedPreference; 330 private boolean mShow4GForLTE; 331 private boolean mIsGlobalCdma; 332 private boolean mUnavailable; 333 334 private class PhoneCallStateListener extends PhoneStateListener { 335 /* 336 * Enable/disable the 'Enhanced 4G LTE Mode' when in/out of a call 337 * and depending on TTY mode and TTY support over VoLTE. 338 * @see android.telephony.PhoneStateListener#onCallStateChanged(int, 339 * java.lang.String) 340 */ 341 @Override 342 public void onCallStateChanged(int state, String incomingNumber) { 343 if (DBG) log("PhoneStateListener.onCallStateChanged: state=" + state); 344 345 updateEnhanced4gLteState(); 346 updateWiFiCallState(); 347 updateVideoCallState(); 348 } 349 350 /* 351 * Listen to different subId if mPhone is updated. 352 */ 353 protected void updatePhone() { 354 int newSubId = (mPhone != null 355 && SubscriptionManager.isValidSubscriptionId(mPhone.getSubId())) 356 ? mPhone.getSubId() 357 : SubscriptionManager.INVALID_SUBSCRIPTION_ID; 358 359 // Now, listen to new subId if it's valid. 360 mTelephonyManager.listen(this, PhoneStateListener.LISTEN_NONE); 361 362 mSubId = newSubId; 363 if (SubscriptionManager.isValidSubscriptionId(mSubId)) { 364 mTelephonyManager.listen(this, PhoneStateListener.LISTEN_CALL_STATE); 365 } 366 } 367 } 368 369 private final PhoneCallStateListener mPhoneStateListener = new PhoneCallStateListener(); 370 371 /** 372 * Service connection code for the NetworkQueryService. 373 * Handles the work of binding to a local object so that we can make 374 * the appropriate service calls. 375 */ 376 377 /** Local service interface */ 378 private INetworkQueryService mNetworkQueryService = null; 379 380 private void setNetworkQueryService() { 381 mButtonNetworkSelect = (NetworkSelectListPreference) getPreferenceScreen() 382 .findPreference(NetworkOperators.BUTTON_NETWORK_SELECT_KEY); 383 if (mButtonNetworkSelect != null) { 384 mButtonNetworkSelect.setNetworkQueryService(mNetworkQueryService); 385 } 386 387 } 388 /** Service connection */ 389 private final ServiceConnection mNetworkQueryServiceConnection = new ServiceConnection() { 390 391 /** Handle the task of binding the local object to the service */ 392 public void onServiceConnected(ComponentName className, IBinder service) { 393 if (DBG) log("connection created, binding local service."); 394 mNetworkQueryService = ((NetworkQueryService.LocalBinder) service).getService(); 395 setNetworkQueryService(); 396 } 397 398 /** Handle the task of cleaning up the local binding */ 399 public void onServiceDisconnected(ComponentName className) { 400 if (DBG) log("connection disconnected, cleaning local binding."); 401 mNetworkQueryService = null; 402 setNetworkQueryService(); 403 } 404 }; 405 406 private void bindNetworkQueryService() { 407 getContext().startService(new Intent(getContext(), NetworkQueryService.class)); 408 getContext().bindService(new Intent(getContext(), NetworkQueryService.class).setAction( 409 NetworkQueryService.ACTION_LOCAL_BINDER), 410 mNetworkQueryServiceConnection, Context.BIND_AUTO_CREATE); 411 } 412 413 private void unbindNetworkQueryService() { 414 // unbind the service. 415 getContext().unbindService(mNetworkQueryServiceConnection); 416 } 417 418 @Override 419 public void onPositiveButtonClick(DialogFragment dialog) { 420 mPhone.setDataRoamingEnabled(true); 421 mButtonDataRoam.setChecked(true); 422 MetricsLogger.action(getContext(), 423 getMetricsEventCategory(getPreferenceScreen(), mButtonDataRoam), 424 true); 425 } 426 427 @Override 428 public void onViewCreated(View view, Bundle savedInstanceState) { 429 if (getListView() != null) { 430 getListView().setDivider(null); 431 } 432 } 433 434 public void onIntentUpdate(Intent intent) { 435 if (!mUnavailable) { 436 updateCurrentTab(intent); 437 } 438 } 439 440 /** 441 * Invoked on each preference click in this hierarchy, overrides 442 * PreferenceActivity's implementation. Used to make sure we track the 443 * preference click events. 444 */ 445 @Override 446 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, 447 Preference preference) { 448 sendMetricsEventPreferenceClicked(preferenceScreen, preference); 449 450 /** TODO: Refactor and get rid of the if's using subclasses */ 451 final int phoneSubId = mPhone.getSubId(); 452 if (preference.getKey().equals(BUTTON_4G_LTE_KEY)) { 453 return true; 454 } else if (mGsmUmtsOptions != null && 455 mGsmUmtsOptions.preferenceTreeClick(preference) == true) { 456 return true; 457 } else if (mCdmaOptions != null && 458 mCdmaOptions.preferenceTreeClick(preference) == true) { 459 if (mPhone.isInEcm()) { 460 461 mClickedPreference = preference; 462 463 // In ECM mode launch ECM app dialog 464 startActivityForResult( 465 new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null), 466 REQUEST_CODE_EXIT_ECM); 467 } 468 return true; 469 } else if (preference == mButtonPreferredNetworkMode) { 470 //displays the value taken from the Settings.System 471 int settingsNetworkMode = android.provider.Settings.Global.getInt( 472 mPhone.getContext().getContentResolver(), 473 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId, 474 preferredNetworkMode); 475 mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode)); 476 return true; 477 } else if (preference == mLteDataServicePref) { 478 String tmpl = android.provider.Settings.Global.getString( 479 getActivity().getContentResolver(), 480 android.provider.Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL); 481 if (!TextUtils.isEmpty(tmpl)) { 482 String imsi = mTelephonyManager.getSubscriberId(); 483 if (imsi == null) { 484 imsi = ""; 485 } 486 final String url = TextUtils.isEmpty(tmpl) ? null 487 : TextUtils.expandTemplate(tmpl, imsi).toString(); 488 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 489 startActivity(intent); 490 } else { 491 android.util.Log.e(LOG_TAG, "Missing SETUP_PREPAID_DATA_SERVICE_URL"); 492 } 493 return true; 494 } else if (preference == mButtonEnabledNetworks) { 495 int settingsNetworkMode = android.provider.Settings.Global.getInt( 496 mPhone.getContext().getContentResolver(), 497 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId, 498 preferredNetworkMode); 499 mButtonEnabledNetworks.setValue(Integer.toString(settingsNetworkMode)); 500 return true; 501 } else if (preference == mButtonDataRoam) { 502 // Do not disable the preference screen if the user clicks Data roaming. 503 return true; 504 } else if (preference == mEuiccSettingsPref) { 505 Intent intent = new Intent(EuiccManager.ACTION_MANAGE_EMBEDDED_SUBSCRIPTIONS); 506 startActivity(intent); 507 return true; 508 } else if (preference == mWiFiCallingPref || preference == mVideoCallingPref 509 || preference == mMobileDataPref || preference == mDataUsagePref) { 510 return false; 511 } else if (preference == mAdvancedOptions) { 512 mExpandAdvancedFields = true; 513 updateBody(); 514 return true; 515 } else { 516 // if the button is anything but the simple toggle preference, 517 // we'll need to disable all preferences to reject all click 518 // events until the sub-activity's UI comes up. 519 preferenceScreen.setEnabled(false); 520 // Let the intents be launched by the Preference manager 521 return false; 522 } 523 } 524 525 private final SubscriptionManager.OnSubscriptionsChangedListener 526 mOnSubscriptionsChangeListener 527 = new SubscriptionManager.OnSubscriptionsChangedListener() { 528 @Override 529 public void onSubscriptionsChanged() { 530 if (DBG) log("onSubscriptionsChanged:"); 531 initializeSubscriptions(); 532 } 533 }; 534 535 private int getSlotIdFromIntent(Intent intent) { 536 Bundle data = intent.getExtras(); 537 int subId = -1; 538 if (data != null) { 539 subId = data.getInt(Settings.EXTRA_SUB_ID, -1); 540 } 541 return SubscriptionManager.getSlotIndex(subId); 542 } 543 544 private void initializeSubscriptions() { 545 final Activity activity = getActivity(); 546 if (activity == null || activity.isDestroyed()) { 547 // Process preferences in activity only if its not destroyed 548 return; 549 } 550 int currentTab = 0; 551 if (DBG) log("initializeSubscriptions:+"); 552 553 // Before updating the the active subscription list check 554 // if tab updating is needed as the list is changing. 555 List<SubscriptionInfo> sil = mSubscriptionManager.getActiveSubscriptionInfoList(); 556 MobileNetworkSettings.TabState state = isUpdateTabsNeeded(sil); 557 558 // Update to the active subscription list 559 mActiveSubInfos.clear(); 560 if (sil != null) { 561 mActiveSubInfos.addAll(sil); 562 // If there is only 1 sim then currenTab should represent slot no. of the sim. 563 if (sil.size() == 1) { 564 currentTab = sil.get(0).getSimSlotIndex(); 565 } 566 } 567 568 switch (state) { 569 case UPDATE: { 570 if (DBG) log("initializeSubscriptions: UPDATE"); 571 currentTab = mTabHost != null ? mTabHost.getCurrentTab() : 0; 572 573 mTabHost = (TabHost) getActivity().findViewById(android.R.id.tabhost); 574 mTabHost.setup(); 575 576 // Update the tabName. Since the mActiveSubInfos are in slot order 577 // we can iterate though the tabs and subscription info in one loop. But 578 // we need to handle the case where a slot may be empty. 579 580 Iterator<SubscriptionInfo> siIterator = mActiveSubInfos.listIterator(); 581 SubscriptionInfo si = siIterator.hasNext() ? siIterator.next() : null; 582 for (int simSlotIndex = 0; simSlotIndex < mActiveSubInfos.size(); 583 simSlotIndex++) { 584 String tabName; 585 if (si != null && si.getSimSlotIndex() == simSlotIndex) { 586 // Slot is not empty and we match 587 tabName = String.valueOf(si.getDisplayName()); 588 si = siIterator.hasNext() ? siIterator.next() : null; 589 } else { 590 // Slot is empty, set name to unknown 591 tabName = getResources().getString(R.string.unknown); 592 } 593 if (DBG) { 594 log("initializeSubscriptions:tab=" + simSlotIndex + " name=" + tabName); 595 } 596 597 mTabHost.addTab(buildTabSpec(String.valueOf(simSlotIndex), tabName)); 598 } 599 600 mTabHost.setOnTabChangedListener(mTabListener); 601 mTabHost.setCurrentTab(currentTab); 602 break; 603 } 604 case NO_TABS: { 605 if (DBG) log("initializeSubscriptions: NO_TABS"); 606 607 if (mTabHost != null) { 608 mTabHost.clearAllTabs(); 609 mTabHost = null; 610 } 611 break; 612 } 613 case DO_NOTHING: { 614 if (DBG) log("initializeSubscriptions: DO_NOTHING"); 615 if (mTabHost != null) { 616 currentTab = mTabHost.getCurrentTab(); 617 } 618 break; 619 } 620 } 621 updatePhone(currentTab); 622 updateBody(); 623 if (DBG) log("initializeSubscriptions:-"); 624 } 625 626 private MobileNetworkSettings.TabState isUpdateTabsNeeded(List<SubscriptionInfo> newSil) { 627 TabState state = MobileNetworkSettings.TabState.DO_NOTHING; 628 if (newSil == null) { 629 if (mActiveSubInfos.size() >= TAB_THRESHOLD) { 630 if (DBG) log("isUpdateTabsNeeded: NO_TABS, size unknown and was tabbed"); 631 state = MobileNetworkSettings.TabState.NO_TABS; 632 } 633 } else if (newSil.size() < TAB_THRESHOLD && mActiveSubInfos.size() >= TAB_THRESHOLD) { 634 if (DBG) log("isUpdateTabsNeeded: NO_TABS, size went to small"); 635 state = MobileNetworkSettings.TabState.NO_TABS; 636 } else if (newSil.size() >= TAB_THRESHOLD && mActiveSubInfos.size() < TAB_THRESHOLD) { 637 if (DBG) log("isUpdateTabsNeeded: UPDATE, size changed"); 638 state = MobileNetworkSettings.TabState.UPDATE; 639 } else if (newSil.size() >= TAB_THRESHOLD) { 640 Iterator<SubscriptionInfo> siIterator = mActiveSubInfos.iterator(); 641 for(SubscriptionInfo newSi : newSil) { 642 SubscriptionInfo curSi = siIterator.next(); 643 if (!newSi.getDisplayName().equals(curSi.getDisplayName())) { 644 if (DBG) log("isUpdateTabsNeeded: UPDATE, new name=" 645 + newSi.getDisplayName()); 646 state = MobileNetworkSettings.TabState.UPDATE; 647 break; 648 } 649 } 650 } 651 if (DBG) { 652 Log.i(LOG_TAG, "isUpdateTabsNeeded:- " + state 653 + " newSil.size()=" + ((newSil != null) ? newSil.size() : 0) 654 + " mActiveSubInfos.size()=" + mActiveSubInfos.size()); 655 } 656 return state; 657 } 658 659 private TabHost.OnTabChangeListener mTabListener = new TabHost.OnTabChangeListener() { 660 @Override 661 public void onTabChanged(String tabId) { 662 if (DBG) log("onTabChanged:"); 663 // The User has changed tab; update the body. 664 updatePhone(Integer.parseInt(tabId)); 665 updateBody(); 666 } 667 }; 668 669 private void updatePhone(int slotId) { 670 final SubscriptionInfo sir = mSubscriptionManager 671 .getActiveSubscriptionInfoForSimSlotIndex(slotId); 672 if (sir != null) { 673 int phoneId = SubscriptionManager.getPhoneId(sir.getSubscriptionId()); 674 if (SubscriptionManager.isValidPhoneId(phoneId)) { 675 mPhone = PhoneFactory.getPhone(phoneId); 676 } 677 } 678 if (mPhone == null) { 679 // Do the best we can 680 mPhone = PhoneGlobals.getPhone(); 681 } 682 Log.i(LOG_TAG, "updatePhone:- slotId=" + slotId + " sir=" + sir); 683 684 mImsMgr = ImsManager.getInstance(mPhone.getContext(), mPhone.getPhoneId()); 685 mTelephonyManager = new TelephonyManager(mPhone.getContext(), mPhone.getSubId()); 686 if (mImsMgr == null) { 687 log("updatePhone :: Could not get ImsManager instance!"); 688 } else if (DBG) { 689 log("updatePhone :: mImsMgr=" + mImsMgr); 690 } 691 692 mPhoneStateListener.updatePhone(); 693 } 694 695 private TabHost.TabContentFactory mEmptyTabContent = new TabHost.TabContentFactory() { 696 @Override 697 public View createTabContent(String tag) { 698 return new View(mTabHost.getContext()); 699 } 700 }; 701 702 private TabHost.TabSpec buildTabSpec(String tag, String title) { 703 return mTabHost.newTabSpec(tag).setIndicator(title).setContent( 704 mEmptyTabContent); 705 } 706 707 private void updateCurrentTab(Intent intent) { 708 int slotId = getSlotIdFromIntent(intent); 709 if (slotId >= 0 && mTabHost != null && mTabHost.getCurrentTab() != slotId) { 710 mTabHost.setCurrentTab(slotId); 711 } 712 } 713 714 @Override 715 public void onSaveInstanceState(Bundle outState) { 716 super.onSaveInstanceState(outState); 717 718 // If advanced fields are already expanded, we save it and expand it 719 // when it's re-created. 720 outState.putBoolean(EXPAND_ADVANCED_FIELDS, mExpandAdvancedFields); 721 } 722 723 @Override 724 public void onCreate(Bundle icicle) { 725 Log.i(LOG_TAG, "onCreate:+"); 726 super.onCreate(icicle); 727 728 final Activity activity = getActivity(); 729 if (activity == null || activity.isDestroyed()) { 730 Log.e(LOG_TAG, "onCreate:- with no valid activity."); 731 return; 732 } 733 734 mHandler = new MyHandler(); 735 mUm = (UserManager) activity.getSystemService(Context.USER_SERVICE); 736 mSubscriptionManager = SubscriptionManager.from(activity); 737 mTelephonyManager = (TelephonyManager) activity.getSystemService( 738 Context.TELEPHONY_SERVICE); 739 740 if (icicle != null) { 741 mExpandAdvancedFields = icicle.getBoolean(EXPAND_ADVANCED_FIELDS, false); 742 } else if (getActivity().getIntent().getBooleanExtra(EXPAND_EXTRA, false)) { 743 mExpandAdvancedFields = true; 744 } 745 746 bindNetworkQueryService(); 747 748 addPreferencesFromResource(R.xml.network_setting_fragment); 749 750 mButton4glte = (SwitchPreference)findPreference(BUTTON_4G_LTE_KEY); 751 mButton4glte.setOnPreferenceChangeListener(this); 752 753 mCallingCategory = (PreferenceCategory) findPreference(CATEGORY_CALLING_KEY); 754 mWiFiCallingPref = findPreference(BUTTON_WIFI_CALLING_KEY); 755 mVideoCallingPref = (SwitchPreference) findPreference(BUTTON_VIDEO_CALLING_KEY); 756 mMobileDataPref = (MobileDataPreference) findPreference(BUTTON_MOBILE_DATA_ENABLE_KEY); 757 mDataUsagePref = (DataUsagePreference) findPreference(BUTTON_DATA_USAGE_KEY); 758 759 try { 760 Context con = activity.createPackageContext("com.android.systemui", 0); 761 int id = con.getResources().getIdentifier("config_show4GForLTE", 762 "bool", "com.android.systemui"); 763 mShow4GForLTE = con.getResources().getBoolean(id); 764 } catch (PackageManager.NameNotFoundException e) { 765 Log.e(LOG_TAG, "NameNotFoundException for show4GFotLTE"); 766 mShow4GForLTE = false; 767 } 768 769 //get UI object references 770 PreferenceScreen prefSet = getPreferenceScreen(); 771 772 mButtonDataRoam = (RestrictedSwitchPreference) prefSet.findPreference( 773 BUTTON_ROAMING_KEY); 774 mButtonPreferredNetworkMode = (ListPreference) prefSet.findPreference( 775 BUTTON_PREFERED_NETWORK_MODE); 776 mButtonEnabledNetworks = (ListPreference) prefSet.findPreference( 777 BUTTON_ENABLED_NETWORKS_KEY); 778 mAdvancedOptions = (AdvancedOptionsPreference) prefSet.findPreference( 779 BUTTON_ADVANCED_OPTIONS_KEY); 780 mButtonDataRoam.setOnPreferenceChangeListener(this); 781 782 mLteDataServicePref = prefSet.findPreference(BUTTON_CDMA_LTE_DATA_SERVICE_KEY); 783 784 mEuiccSettingsPref = prefSet.findPreference(BUTTON_CARRIER_SETTINGS_EUICC_KEY); 785 mEuiccSettingsPref.setOnPreferenceChangeListener(this); 786 787 // Initialize mActiveSubInfo 788 int max = mSubscriptionManager.getActiveSubscriptionInfoCountMax(); 789 mActiveSubInfos = new ArrayList<SubscriptionInfo>(max); 790 791 IntentFilter intentFilter = new IntentFilter( 792 TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED); 793 activity.registerReceiver(mPhoneChangeReceiver, intentFilter); 794 795 activity.getContentResolver().registerContentObserver(ENFORCE_MANAGED_URI, false, 796 mDpcEnforcedContentObserver); 797 798 Log.i(LOG_TAG, "onCreate:-"); 799 } 800 801 @Override 802 public View onCreateView(LayoutInflater inflater, ViewGroup container, 803 Bundle savedInstanceState) { 804 return inflater.inflate(com.android.internal.R.layout.common_tab_settings, 805 container, false); 806 } 807 808 @Override 809 public void onActivityCreated(Bundle savedInstanceState) { 810 super.onActivityCreated(savedInstanceState); 811 if (mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS) 812 || !mUm.isSystemUser()) { 813 mUnavailable = true; 814 getActivity().setContentView(R.layout.telephony_disallowed_preference_screen); 815 } else { 816 initializeSubscriptions(); 817 updateCurrentTab(getActivity().getIntent()); 818 } 819 } 820 821 private class PhoneChangeReceiver extends BroadcastReceiver { 822 @Override 823 public void onReceive(Context context, Intent intent) { 824 Log.i(LOG_TAG, "onReceive:"); 825 // When the radio changes (ex: CDMA->GSM), refresh all options. 826 updateBody(); 827 } 828 } 829 830 private class DpcApnEnforcedObserver extends ContentObserver { 831 DpcApnEnforcedObserver() { 832 super(null); 833 } 834 835 @Override 836 public void onChange(boolean selfChange) { 837 Log.i(LOG_TAG, "DPC enforced onChange:"); 838 updateBody(); 839 } 840 } 841 842 @Override 843 public void onDestroy() { 844 unbindNetworkQueryService(); 845 super.onDestroy(); 846 if (getActivity() != null) { 847 getActivity().unregisterReceiver(mPhoneChangeReceiver); 848 getActivity().getContentResolver().unregisterContentObserver( 849 mDpcEnforcedContentObserver); 850 } 851 } 852 853 @Override 854 public void onResume() { 855 super.onResume(); 856 Log.i(LOG_TAG, "onResume:+"); 857 858 if (mUnavailable) { 859 Log.i(LOG_TAG, "onResume:- ignore mUnavailable == false"); 860 return; 861 } 862 863 // upon resumption from the sub-activity, make sure we re-enable the 864 // preferences. 865 getPreferenceScreen().setEnabled(true); 866 867 // Set UI state in onResume because a user could go home, launch some 868 // app to change this setting's backend, and re-launch this settings app 869 // and the UI state would be inconsistent with actual state 870 mButtonDataRoam.setChecked(mPhone.getDataRoamingEnabled()); 871 872 if (getPreferenceScreen().findPreference(BUTTON_PREFERED_NETWORK_MODE) != null 873 || getPreferenceScreen().findPreference(BUTTON_ENABLED_NETWORKS_KEY) != null) { 874 updatePreferredNetworkUIFromDb(); 875 } 876 877 mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); 878 879 // NOTE: Buttons will be enabled/disabled in mPhoneStateListener 880 updateEnhanced4gLteState(); 881 882 // Video calling and WiFi calling state might have changed. 883 updateCallingCategory(); 884 885 mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener); 886 887 Log.i(LOG_TAG, "onResume:-"); 888 889 } 890 891 private boolean hasActiveSubscriptions() { 892 return mActiveSubInfos.size() > 0; 893 } 894 895 private void updateBodyBasicFields(Activity activity, PreferenceScreen prefSet, 896 int phoneSubId, boolean hasActiveSubscriptions) { 897 Context context = activity.getApplicationContext(); 898 899 ActionBar actionBar = activity.getActionBar(); 900 if (actionBar != null) { 901 // android.R.id.home will be triggered in onOptionsItemSelected() 902 actionBar.setDisplayHomeAsUpEnabled(true); 903 } 904 905 prefSet.addPreference(mMobileDataPref); 906 prefSet.addPreference(mButtonDataRoam); 907 prefSet.addPreference(mDataUsagePref); 908 909 // Customized preferences needs to be initialized with subId. 910 mMobileDataPref.initialize(phoneSubId); 911 mDataUsagePref.initialize(phoneSubId); 912 913 mMobileDataPref.setEnabled(hasActiveSubscriptions); 914 mButtonDataRoam.setEnabled(hasActiveSubscriptions); 915 mDataUsagePref.setEnabled(hasActiveSubscriptions); 916 917 // Initialize states of mButtonDataRoam. 918 mButtonDataRoam.setChecked(mPhone.getDataRoamingEnabled()); 919 mButtonDataRoam.setDisabledByAdmin(false); 920 if (mButtonDataRoam.isEnabled()) { 921 if (RestrictedLockUtils.hasBaseUserRestriction(context, 922 UserManager.DISALLOW_DATA_ROAMING, UserHandle.myUserId())) { 923 mButtonDataRoam.setEnabled(false); 924 } else { 925 mButtonDataRoam.checkRestrictionAndSetDisabled( 926 UserManager.DISALLOW_DATA_ROAMING); 927 } 928 } 929 } 930 931 private void updateBody() { 932 final Activity activity = getActivity(); 933 final PreferenceScreen prefSet = getPreferenceScreen(); 934 final int phoneSubId = mPhone.getSubId(); 935 final boolean hasActiveSubscriptions = hasActiveSubscriptions(); 936 937 if (activity == null || activity.isDestroyed()) { 938 Log.e(LOG_TAG, "updateBody with no valid activity."); 939 return; 940 } 941 942 if (prefSet == null) { 943 Log.e(LOG_TAG, "updateBody with no null prefSet."); 944 return; 945 } 946 947 prefSet.removeAll(); 948 949 updateBodyBasicFields(activity, prefSet, phoneSubId, hasActiveSubscriptions); 950 951 if (mExpandAdvancedFields) { 952 updateBodyAdvancedFields(activity, prefSet, phoneSubId, hasActiveSubscriptions); 953 } else { 954 prefSet.addPreference(mAdvancedOptions); 955 } 956 } 957 958 private void updateBodyAdvancedFields(Activity activity, PreferenceScreen prefSet, 959 int phoneSubId, boolean hasActiveSubscriptions) { 960 boolean isLteOnCdma = mPhone.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE; 961 962 if (DBG) { 963 log("updateBody: isLteOnCdma=" + isLteOnCdma + " phoneSubId=" + phoneSubId); 964 } 965 966 prefSet.addPreference(mButtonPreferredNetworkMode); 967 prefSet.addPreference(mButtonEnabledNetworks); 968 prefSet.addPreference(mButton4glte); 969 970 if (showEuiccSettings(getActivity())) { 971 prefSet.addPreference(mEuiccSettingsPref); 972 String spn = mTelephonyManager.getSimOperatorName(); 973 if (TextUtils.isEmpty(spn)) { 974 mEuiccSettingsPref.setSummary(null); 975 } else { 976 mEuiccSettingsPref.setSummary(spn); 977 } 978 } 979 980 int settingsNetworkMode = android.provider.Settings.Global.getInt( 981 mPhone.getContext().getContentResolver(), 982 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId, 983 preferredNetworkMode); 984 985 PersistableBundle carrierConfig = 986 PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId()); 987 mIsGlobalCdma = isLteOnCdma 988 && carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_CDMA_CHOICES_BOOL); 989 if (carrierConfig.getBoolean( 990 CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL)) { 991 prefSet.removePreference(mButtonPreferredNetworkMode); 992 prefSet.removePreference(mButtonEnabledNetworks); 993 prefSet.removePreference(mLteDataServicePref); 994 } else if (carrierConfig.getBoolean(CarrierConfigManager 995 .KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL) 996 && !mPhone.getServiceState().getRoaming() 997 && mPhone.getServiceState().getDataRegState() 998 == ServiceState.STATE_IN_SERVICE) { 999 prefSet.removePreference(mButtonPreferredNetworkMode); 1000 prefSet.removePreference(mButtonEnabledNetworks); 1001 1002 final int phoneType = mPhone.getPhoneType(); 1003 if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) { 1004 updateCdmaOptions(this, prefSet, mPhone); 1005 } else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) { 1006 updateGsmUmtsOptions(this, prefSet, phoneSubId, mNetworkQueryService); 1007 } else { 1008 throw new IllegalStateException("Unexpected phone type: " + phoneType); 1009 } 1010 // Since pref is being hidden from user, set network mode to default 1011 // in case it is currently something else. That is possible if user 1012 // changed the setting while roaming and is now back to home network. 1013 settingsNetworkMode = preferredNetworkMode; 1014 } else if (carrierConfig.getBoolean( 1015 CarrierConfigManager.KEY_WORLD_PHONE_BOOL) == true) { 1016 prefSet.removePreference(mButtonEnabledNetworks); 1017 // set the listener for the mButtonPreferredNetworkMode list preference so we can issue 1018 // change Preferred Network Mode. 1019 mButtonPreferredNetworkMode.setOnPreferenceChangeListener(this); 1020 1021 updateCdmaOptions(this, prefSet, mPhone); 1022 updateGsmUmtsOptions(this, prefSet, phoneSubId, mNetworkQueryService); 1023 } else { 1024 prefSet.removePreference(mButtonPreferredNetworkMode); 1025 final int phoneType = mPhone.getPhoneType(); 1026 if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) { 1027 int lteForced = android.provider.Settings.Global.getInt( 1028 mPhone.getContext().getContentResolver(), 1029 android.provider.Settings.Global.LTE_SERVICE_FORCED + mPhone.getSubId(), 1030 0); 1031 1032 if (isLteOnCdma) { 1033 if (lteForced == 0) { 1034 mButtonEnabledNetworks.setEntries( 1035 R.array.enabled_networks_cdma_choices); 1036 mButtonEnabledNetworks.setEntryValues( 1037 R.array.enabled_networks_cdma_values); 1038 } else { 1039 switch (settingsNetworkMode) { 1040 case Phone.NT_MODE_CDMA: 1041 case Phone.NT_MODE_CDMA_NO_EVDO: 1042 case Phone.NT_MODE_EVDO_NO_CDMA: 1043 mButtonEnabledNetworks.setEntries( 1044 R.array.enabled_networks_cdma_no_lte_choices); 1045 mButtonEnabledNetworks.setEntryValues( 1046 R.array.enabled_networks_cdma_no_lte_values); 1047 break; 1048 case Phone.NT_MODE_GLOBAL: 1049 case Phone.NT_MODE_LTE_CDMA_AND_EVDO: 1050 case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA: 1051 case Phone.NT_MODE_LTE_ONLY: 1052 mButtonEnabledNetworks.setEntries( 1053 R.array.enabled_networks_cdma_only_lte_choices); 1054 mButtonEnabledNetworks.setEntryValues( 1055 R.array.enabled_networks_cdma_only_lte_values); 1056 break; 1057 default: 1058 mButtonEnabledNetworks.setEntries( 1059 R.array.enabled_networks_cdma_choices); 1060 mButtonEnabledNetworks.setEntryValues( 1061 R.array.enabled_networks_cdma_values); 1062 break; 1063 } 1064 } 1065 } 1066 updateCdmaOptions(this, prefSet, mPhone); 1067 1068 } else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) { 1069 if (isSupportTdscdma()) { 1070 mButtonEnabledNetworks.setEntries( 1071 R.array.enabled_networks_tdscdma_choices); 1072 mButtonEnabledNetworks.setEntryValues( 1073 R.array.enabled_networks_tdscdma_values); 1074 } else if (!carrierConfig.getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL) 1075 && !getResources().getBoolean(R.bool.config_enabled_lte)) { 1076 mButtonEnabledNetworks.setEntries( 1077 R.array.enabled_networks_except_gsm_lte_choices); 1078 mButtonEnabledNetworks.setEntryValues( 1079 R.array.enabled_networks_except_gsm_lte_values); 1080 } else if (!carrierConfig.getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL)) { 1081 int select = (mShow4GForLTE == true) ? 1082 R.array.enabled_networks_except_gsm_4g_choices 1083 : R.array.enabled_networks_except_gsm_choices; 1084 mButtonEnabledNetworks.setEntries(select); 1085 mButtonEnabledNetworks.setEntryValues( 1086 R.array.enabled_networks_except_gsm_values); 1087 } else if (!getResources().getBoolean(R.bool.config_enabled_lte)) { 1088 mButtonEnabledNetworks.setEntries( 1089 R.array.enabled_networks_except_lte_choices); 1090 mButtonEnabledNetworks.setEntryValues( 1091 R.array.enabled_networks_except_lte_values); 1092 } else if (mIsGlobalCdma) { 1093 mButtonEnabledNetworks.setEntries( 1094 R.array.enabled_networks_cdma_choices); 1095 mButtonEnabledNetworks.setEntryValues( 1096 R.array.enabled_networks_cdma_values); 1097 } else { 1098 int select = (mShow4GForLTE == true) ? R.array.enabled_networks_4g_choices 1099 : R.array.enabled_networks_choices; 1100 mButtonEnabledNetworks.setEntries(select); 1101 mButtonEnabledNetworks.setEntryValues( 1102 R.array.enabled_networks_values); 1103 } 1104 updateGsmUmtsOptions(this, prefSet, phoneSubId, mNetworkQueryService); 1105 } else { 1106 throw new IllegalStateException("Unexpected phone type: " + phoneType); 1107 } 1108 if (isWorldMode()) { 1109 mButtonEnabledNetworks.setEntries( 1110 R.array.preferred_network_mode_choices_world_mode); 1111 mButtonEnabledNetworks.setEntryValues( 1112 R.array.preferred_network_mode_values_world_mode); 1113 } 1114 mButtonEnabledNetworks.setOnPreferenceChangeListener(this); 1115 if (DBG) log("settingsNetworkMode: " + settingsNetworkMode); 1116 } 1117 1118 final boolean missingDataServiceUrl = TextUtils.isEmpty( 1119 android.provider.Settings.Global.getString(activity.getContentResolver(), 1120 android.provider.Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL)); 1121 if (!isLteOnCdma || missingDataServiceUrl) { 1122 prefSet.removePreference(mLteDataServicePref); 1123 } else { 1124 android.util.Log.d(LOG_TAG, "keep ltePref"); 1125 } 1126 1127 updateEnhanced4gLteState(); 1128 updateCallingCategory(); 1129 1130 // Enable link to CMAS app settings depending on the value in config.xml. 1131 final boolean isCellBroadcastAppLinkEnabled = activity.getResources().getBoolean( 1132 com.android.internal.R.bool.config_cellBroadcastAppLinks); 1133 if (!mUm.isAdminUser() || !isCellBroadcastAppLinkEnabled 1134 || mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_CELL_BROADCASTS)) { 1135 PreferenceScreen root = getPreferenceScreen(); 1136 Preference ps = findPreference(BUTTON_CELL_BROADCAST_SETTINGS); 1137 if (ps != null) { 1138 root.removePreference(ps); 1139 } 1140 } 1141 1142 /** 1143 * Listen to extra preference changes that need as Metrics events logging. 1144 */ 1145 if (prefSet.findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY) != null) { 1146 prefSet.findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY) 1147 .setOnPreferenceChangeListener(this); 1148 } 1149 1150 if (prefSet.findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY) != null) { 1151 prefSet.findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY) 1152 .setOnPreferenceChangeListener(this); 1153 } 1154 1155 // Get the networkMode from Settings.System and displays it 1156 mButtonEnabledNetworks.setValue(Integer.toString(settingsNetworkMode)); 1157 mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode)); 1158 UpdatePreferredNetworkModeSummary(settingsNetworkMode); 1159 UpdateEnabledNetworksValueAndSummary(settingsNetworkMode); 1160 // Display preferred network type based on what modem returns b/18676277 1161 mPhone.setPreferredNetworkType(settingsNetworkMode, mHandler 1162 .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE)); 1163 1164 /** 1165 * Enable/disable depending upon if there are any active subscriptions. 1166 * 1167 * I've decided to put this enable/disable code at the bottom as the 1168 * code above works even when there are no active subscriptions, thus 1169 * putting it afterwards is a smaller change. This can be refined later, 1170 * but you do need to remember that this all needs to work when subscriptions 1171 * change dynamically such as when hot swapping sims. 1172 */ 1173 boolean useVariant4glteTitle = carrierConfig.getBoolean( 1174 CarrierConfigManager.KEY_ENHANCED_4G_LTE_TITLE_VARIANT_BOOL); 1175 int enhanced4glteModeTitleId = useVariant4glteTitle ? 1176 R.string.enhanced_4g_lte_mode_title_variant : 1177 R.string.enhanced_4g_lte_mode_title; 1178 1179 mButtonPreferredNetworkMode.setEnabled(hasActiveSubscriptions); 1180 mButtonEnabledNetworks.setEnabled(hasActiveSubscriptions); 1181 mButton4glte.setTitle(enhanced4glteModeTitleId); 1182 mLteDataServicePref.setEnabled(hasActiveSubscriptions); 1183 Preference ps; 1184 ps = findPreference(BUTTON_CELL_BROADCAST_SETTINGS); 1185 if (ps != null) { 1186 ps.setEnabled(hasActiveSubscriptions); 1187 } 1188 ps = findPreference(CATEGORY_GSM_APN_EXPAND_KEY); 1189 if (ps != null) { 1190 ps.setEnabled(hasActiveSubscriptions); 1191 } 1192 ps = findPreference(CATEGORY_CDMA_APN_EXPAND_KEY); 1193 if (ps != null) { 1194 ps.setEnabled(hasActiveSubscriptions); 1195 } 1196 ps = findPreference(NetworkOperators.CATEGORY_NETWORK_OPERATORS_KEY); 1197 if (ps != null) { 1198 ps.setEnabled(hasActiveSubscriptions); 1199 } 1200 ps = findPreference(BUTTON_CARRIER_SETTINGS_KEY); 1201 if (ps != null) { 1202 ps.setEnabled(hasActiveSubscriptions); 1203 } 1204 ps = findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY); 1205 if (ps != null) { 1206 ps.setEnabled(hasActiveSubscriptions); 1207 } 1208 ps = findPreference(CATEGORY_CALLING_KEY); 1209 if (ps != null) { 1210 ps.setEnabled(hasActiveSubscriptions); 1211 } 1212 } 1213 1214 @Override 1215 public void onPause() { 1216 super.onPause(); 1217 if (DBG) log("onPause:+"); 1218 1219 mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); 1220 1221 mSubscriptionManager 1222 .removeOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener); 1223 if (DBG) log("onPause:-"); 1224 } 1225 1226 /** 1227 * Implemented to support onPreferenceChangeListener to look for preference 1228 * changes specifically on CLIR. 1229 * 1230 * @param preference is the preference to be changed, should be mButtonCLIR. 1231 * @param objValue should be the value of the selection, NOT its localized 1232 * display value. 1233 */ 1234 public boolean onPreferenceChange(Preference preference, Object objValue) { 1235 sendMetricsEventPreferenceChanged(getPreferenceScreen(), preference, objValue); 1236 1237 final int phoneSubId = mPhone.getSubId(); 1238 if (preference == mButtonPreferredNetworkMode) { 1239 //NOTE onPreferenceChange seems to be called even if there is no change 1240 //Check if the button value is changed from the System.Setting 1241 mButtonPreferredNetworkMode.setValue((String) objValue); 1242 int buttonNetworkMode; 1243 buttonNetworkMode = Integer.parseInt((String) objValue); 1244 int settingsNetworkMode = android.provider.Settings.Global.getInt( 1245 mPhone.getContext().getContentResolver(), 1246 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId, 1247 preferredNetworkMode); 1248 if (buttonNetworkMode != settingsNetworkMode) { 1249 int modemNetworkMode; 1250 // if new mode is invalid ignore it 1251 switch (buttonNetworkMode) { 1252 case Phone.NT_MODE_WCDMA_PREF: 1253 case Phone.NT_MODE_GSM_ONLY: 1254 case Phone.NT_MODE_WCDMA_ONLY: 1255 case Phone.NT_MODE_GSM_UMTS: 1256 case Phone.NT_MODE_CDMA: 1257 case Phone.NT_MODE_CDMA_NO_EVDO: 1258 case Phone.NT_MODE_EVDO_NO_CDMA: 1259 case Phone.NT_MODE_GLOBAL: 1260 case Phone.NT_MODE_LTE_CDMA_AND_EVDO: 1261 case Phone.NT_MODE_LTE_GSM_WCDMA: 1262 case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA: 1263 case Phone.NT_MODE_LTE_ONLY: 1264 case Phone.NT_MODE_LTE_WCDMA: 1265 case Phone.NT_MODE_TDSCDMA_ONLY: 1266 case Phone.NT_MODE_TDSCDMA_WCDMA: 1267 case Phone.NT_MODE_LTE_TDSCDMA: 1268 case Phone.NT_MODE_TDSCDMA_GSM: 1269 case Phone.NT_MODE_LTE_TDSCDMA_GSM: 1270 case Phone.NT_MODE_TDSCDMA_GSM_WCDMA: 1271 case Phone.NT_MODE_LTE_TDSCDMA_WCDMA: 1272 case Phone.NT_MODE_LTE_TDSCDMA_GSM_WCDMA: 1273 case Phone.NT_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA: 1274 case Phone.NT_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA: 1275 // This is one of the modes we recognize 1276 modemNetworkMode = buttonNetworkMode; 1277 break; 1278 default: 1279 loge("Invalid Network Mode (" +buttonNetworkMode+ ") chosen. Ignore."); 1280 return true; 1281 } 1282 1283 android.provider.Settings.Global.putInt( 1284 mPhone.getContext().getContentResolver(), 1285 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId, 1286 buttonNetworkMode ); 1287 //Set the modem network mode 1288 mPhone.setPreferredNetworkType(modemNetworkMode, mHandler 1289 .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE)); 1290 } 1291 } else if (preference == mButtonEnabledNetworks) { 1292 mButtonEnabledNetworks.setValue((String) objValue); 1293 int buttonNetworkMode; 1294 buttonNetworkMode = Integer.parseInt((String) objValue); 1295 if (DBG) log("buttonNetworkMode: " + buttonNetworkMode); 1296 int settingsNetworkMode = android.provider.Settings.Global.getInt( 1297 mPhone.getContext().getContentResolver(), 1298 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId, 1299 preferredNetworkMode); 1300 if (buttonNetworkMode != settingsNetworkMode) { 1301 int modemNetworkMode; 1302 // if new mode is invalid ignore it 1303 switch (buttonNetworkMode) { 1304 case Phone.NT_MODE_WCDMA_PREF: 1305 case Phone.NT_MODE_GSM_ONLY: 1306 case Phone.NT_MODE_LTE_GSM_WCDMA: 1307 case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA: 1308 case Phone.NT_MODE_CDMA: 1309 case Phone.NT_MODE_CDMA_NO_EVDO: 1310 case Phone.NT_MODE_LTE_CDMA_AND_EVDO: 1311 case Phone.NT_MODE_TDSCDMA_ONLY: 1312 case Phone.NT_MODE_TDSCDMA_WCDMA: 1313 case Phone.NT_MODE_LTE_TDSCDMA: 1314 case Phone.NT_MODE_TDSCDMA_GSM: 1315 case Phone.NT_MODE_LTE_TDSCDMA_GSM: 1316 case Phone.NT_MODE_TDSCDMA_GSM_WCDMA: 1317 case Phone.NT_MODE_LTE_TDSCDMA_WCDMA: 1318 case Phone.NT_MODE_LTE_TDSCDMA_GSM_WCDMA: 1319 case Phone.NT_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA: 1320 case Phone.NT_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA: 1321 // This is one of the modes we recognize 1322 modemNetworkMode = buttonNetworkMode; 1323 break; 1324 default: 1325 loge("Invalid Network Mode (" +buttonNetworkMode+ ") chosen. Ignore."); 1326 return true; 1327 } 1328 1329 UpdateEnabledNetworksValueAndSummary(buttonNetworkMode); 1330 1331 android.provider.Settings.Global.putInt( 1332 mPhone.getContext().getContentResolver(), 1333 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId, 1334 buttonNetworkMode ); 1335 //Set the modem network mode 1336 mPhone.setPreferredNetworkType(modemNetworkMode, mHandler 1337 .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE)); 1338 } 1339 } else if (preference == mButton4glte) { 1340 boolean enhanced4gMode = !mButton4glte.isChecked(); 1341 mButton4glte.setChecked(enhanced4gMode); 1342 mImsMgr.setEnhanced4gLteModeSetting(mButton4glte.isChecked()); 1343 } else if (preference == mButtonDataRoam) { 1344 if (DBG) log("onPreferenceTreeClick: preference == mButtonDataRoam."); 1345 1346 //normally called on the toggle click 1347 if (!mButtonDataRoam.isChecked()) { 1348 PersistableBundle carrierConfig = 1349 PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId()); 1350 if (carrierConfig != null && carrierConfig.getBoolean( 1351 CarrierConfigManager.KEY_DISABLE_CHARGE_INDICATION_BOOL)) { 1352 mPhone.setDataRoamingEnabled(true); 1353 MetricsLogger.action(getContext(), 1354 getMetricsEventCategory(getPreferenceScreen(), mButtonDataRoam), 1355 true); 1356 } else { 1357 // MetricsEvent with no value update. 1358 MetricsLogger.action(getContext(), 1359 getMetricsEventCategory(getPreferenceScreen(), mButtonDataRoam)); 1360 // First confirm with a warning dialog about charges 1361 mOkClicked = false; 1362 RoamingDialogFragment fragment = new RoamingDialogFragment(); 1363 fragment.setPhone(mPhone); 1364 fragment.show(getFragmentManager(), ROAMING_TAG); 1365 // Don't update the toggle unless the confirm button is actually pressed. 1366 return false; 1367 } 1368 } else { 1369 mPhone.setDataRoamingEnabled(false); 1370 MetricsLogger.action(getContext(), 1371 getMetricsEventCategory(getPreferenceScreen(), mButtonDataRoam), 1372 false); 1373 return true; 1374 } 1375 } else if (preference == mVideoCallingPref) { 1376 // If mButton4glte is not checked, mVideoCallingPref should be disabled. 1377 // So it only makes sense to call phoneMgr.enableVideoCalling if it's checked. 1378 if (mButton4glte.isChecked()) { 1379 mImsMgr.setVtSetting((boolean) objValue); 1380 return true; 1381 } else { 1382 loge("mVideoCallingPref should be disabled if mButton4glte is not checked."); 1383 mVideoCallingPref.setEnabled(false); 1384 return false; 1385 } 1386 } else if (preference == getPreferenceScreen() 1387 .findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY) 1388 || preference == getPreferenceScreen() 1389 .findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY)) { 1390 return true; 1391 } 1392 1393 updateBody(); 1394 // always let the preference setting proceed. 1395 return true; 1396 } 1397 1398 private boolean is4gLtePrefEnabled(PersistableBundle carrierConfig) { 1399 return (mTelephonyManager.getCallState(mPhone.getSubId()) 1400 == TelephonyManager.CALL_STATE_IDLE) 1401 && mImsMgr != null 1402 && mImsMgr.isNonTtyOrTtyOnVolteEnabled() 1403 && carrierConfig.getBoolean( 1404 CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL); 1405 } 1406 1407 private class MyHandler extends Handler { 1408 1409 static final int MESSAGE_SET_PREFERRED_NETWORK_TYPE = 0; 1410 1411 @Override 1412 public void handleMessage(Message msg) { 1413 switch (msg.what) { 1414 case MESSAGE_SET_PREFERRED_NETWORK_TYPE: 1415 handleSetPreferredNetworkTypeResponse(msg); 1416 break; 1417 } 1418 } 1419 1420 private void handleSetPreferredNetworkTypeResponse(Message msg) { 1421 final Activity activity = getActivity(); 1422 if (activity == null || activity.isDestroyed()) { 1423 // Access preferences of activity only if it is not destroyed 1424 // or if fragment is not attached to an activity. 1425 return; 1426 } 1427 1428 AsyncResult ar = (AsyncResult) msg.obj; 1429 final int phoneSubId = mPhone.getSubId(); 1430 1431 if (ar.exception == null) { 1432 int networkMode; 1433 if (getPreferenceScreen().findPreference( 1434 BUTTON_PREFERED_NETWORK_MODE) != null) { 1435 networkMode = Integer.parseInt(mButtonPreferredNetworkMode.getValue()); 1436 android.provider.Settings.Global.putInt( 1437 mPhone.getContext().getContentResolver(), 1438 android.provider.Settings.Global.PREFERRED_NETWORK_MODE 1439 + phoneSubId, 1440 networkMode ); 1441 } 1442 if (getPreferenceScreen().findPreference(BUTTON_ENABLED_NETWORKS_KEY) != null) { 1443 networkMode = Integer.parseInt(mButtonEnabledNetworks.getValue()); 1444 android.provider.Settings.Global.putInt( 1445 mPhone.getContext().getContentResolver(), 1446 android.provider.Settings.Global.PREFERRED_NETWORK_MODE 1447 + phoneSubId, 1448 networkMode ); 1449 } 1450 } else { 1451 Log.i(LOG_TAG, "handleSetPreferredNetworkTypeResponse:" + 1452 "exception in setting network mode."); 1453 updatePreferredNetworkUIFromDb(); 1454 } 1455 } 1456 } 1457 1458 private void updatePreferredNetworkUIFromDb() { 1459 final int phoneSubId = mPhone.getSubId(); 1460 1461 int settingsNetworkMode = android.provider.Settings.Global.getInt( 1462 mPhone.getContext().getContentResolver(), 1463 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId, 1464 preferredNetworkMode); 1465 1466 if (DBG) { 1467 log("updatePreferredNetworkUIFromDb: settingsNetworkMode = " + 1468 settingsNetworkMode); 1469 } 1470 1471 UpdatePreferredNetworkModeSummary(settingsNetworkMode); 1472 UpdateEnabledNetworksValueAndSummary(settingsNetworkMode); 1473 // changes the mButtonPreferredNetworkMode accordingly to settingsNetworkMode 1474 mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode)); 1475 } 1476 1477 private void UpdatePreferredNetworkModeSummary(int NetworkMode) { 1478 switch(NetworkMode) { 1479 case Phone.NT_MODE_TDSCDMA_GSM_WCDMA: 1480 mButtonPreferredNetworkMode.setSummary( 1481 R.string.preferred_network_mode_tdscdma_gsm_wcdma_summary); 1482 break; 1483 case Phone.NT_MODE_TDSCDMA_GSM: 1484 mButtonPreferredNetworkMode.setSummary( 1485 R.string.preferred_network_mode_tdscdma_gsm_summary); 1486 break; 1487 case Phone.NT_MODE_WCDMA_PREF: 1488 mButtonPreferredNetworkMode.setSummary( 1489 R.string.preferred_network_mode_wcdma_perf_summary); 1490 break; 1491 case Phone.NT_MODE_GSM_ONLY: 1492 mButtonPreferredNetworkMode.setSummary( 1493 R.string.preferred_network_mode_gsm_only_summary); 1494 break; 1495 case Phone.NT_MODE_TDSCDMA_WCDMA: 1496 mButtonPreferredNetworkMode.setSummary( 1497 R.string.preferred_network_mode_tdscdma_wcdma_summary); 1498 break; 1499 case Phone.NT_MODE_WCDMA_ONLY: 1500 mButtonPreferredNetworkMode.setSummary( 1501 R.string.preferred_network_mode_wcdma_only_summary); 1502 break; 1503 case Phone.NT_MODE_GSM_UMTS: 1504 mButtonPreferredNetworkMode.setSummary( 1505 R.string.preferred_network_mode_gsm_wcdma_summary); 1506 break; 1507 case Phone.NT_MODE_CDMA: 1508 switch (mPhone.getLteOnCdmaMode()) { 1509 case PhoneConstants.LTE_ON_CDMA_TRUE: 1510 mButtonPreferredNetworkMode.setSummary( 1511 R.string.preferred_network_mode_cdma_summary); 1512 break; 1513 case PhoneConstants.LTE_ON_CDMA_FALSE: 1514 default: 1515 mButtonPreferredNetworkMode.setSummary( 1516 R.string.preferred_network_mode_cdma_evdo_summary); 1517 break; 1518 } 1519 break; 1520 case Phone.NT_MODE_CDMA_NO_EVDO: 1521 mButtonPreferredNetworkMode.setSummary( 1522 R.string.preferred_network_mode_cdma_only_summary); 1523 break; 1524 case Phone.NT_MODE_EVDO_NO_CDMA: 1525 mButtonPreferredNetworkMode.setSummary( 1526 R.string.preferred_network_mode_evdo_only_summary); 1527 break; 1528 case Phone.NT_MODE_LTE_TDSCDMA: 1529 mButtonPreferredNetworkMode.setSummary( 1530 R.string.preferred_network_mode_lte_tdscdma_summary); 1531 break; 1532 case Phone.NT_MODE_LTE_ONLY: 1533 mButtonPreferredNetworkMode.setSummary( 1534 R.string.preferred_network_mode_lte_summary); 1535 break; 1536 case Phone.NT_MODE_LTE_TDSCDMA_GSM: 1537 mButtonPreferredNetworkMode.setSummary( 1538 R.string.preferred_network_mode_lte_tdscdma_gsm_summary); 1539 break; 1540 case Phone.NT_MODE_LTE_TDSCDMA_GSM_WCDMA: 1541 mButtonPreferredNetworkMode.setSummary( 1542 R.string.preferred_network_mode_lte_tdscdma_gsm_wcdma_summary); 1543 break; 1544 case Phone.NT_MODE_LTE_GSM_WCDMA: 1545 mButtonPreferredNetworkMode.setSummary( 1546 R.string.preferred_network_mode_lte_gsm_wcdma_summary); 1547 break; 1548 case Phone.NT_MODE_LTE_CDMA_AND_EVDO: 1549 mButtonPreferredNetworkMode.setSummary( 1550 R.string.preferred_network_mode_lte_cdma_evdo_summary); 1551 break; 1552 case Phone.NT_MODE_TDSCDMA_ONLY: 1553 mButtonPreferredNetworkMode.setSummary( 1554 R.string.preferred_network_mode_tdscdma_summary); 1555 break; 1556 case Phone.NT_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA: 1557 mButtonPreferredNetworkMode.setSummary( 1558 R.string.preferred_network_mode_lte_tdscdma_cdma_evdo_gsm_wcdma_summary); 1559 break; 1560 case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA: 1561 if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA || 1562 mIsGlobalCdma || 1563 isWorldMode()) { 1564 mButtonPreferredNetworkMode.setSummary( 1565 R.string.preferred_network_mode_global_summary); 1566 } else { 1567 mButtonPreferredNetworkMode.setSummary( 1568 R.string.preferred_network_mode_lte_summary); 1569 } 1570 break; 1571 case Phone.NT_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA: 1572 mButtonPreferredNetworkMode.setSummary( 1573 R.string.preferred_network_mode_tdscdma_cdma_evdo_gsm_wcdma_summary); 1574 break; 1575 case Phone.NT_MODE_GLOBAL: 1576 mButtonPreferredNetworkMode.setSummary( 1577 R.string.preferred_network_mode_cdma_evdo_gsm_wcdma_summary); 1578 break; 1579 case Phone.NT_MODE_LTE_TDSCDMA_WCDMA: 1580 mButtonPreferredNetworkMode.setSummary( 1581 R.string.preferred_network_mode_lte_tdscdma_wcdma_summary); 1582 break; 1583 case Phone.NT_MODE_LTE_WCDMA: 1584 mButtonPreferredNetworkMode.setSummary( 1585 R.string.preferred_network_mode_lte_wcdma_summary); 1586 break; 1587 default: 1588 mButtonPreferredNetworkMode.setSummary( 1589 R.string.preferred_network_mode_global_summary); 1590 } 1591 } 1592 1593 private void UpdateEnabledNetworksValueAndSummary(int NetworkMode) { 1594 switch (NetworkMode) { 1595 case Phone.NT_MODE_TDSCDMA_WCDMA: 1596 case Phone.NT_MODE_TDSCDMA_GSM_WCDMA: 1597 case Phone.NT_MODE_TDSCDMA_GSM: 1598 mButtonEnabledNetworks.setValue( 1599 Integer.toString(Phone.NT_MODE_TDSCDMA_GSM_WCDMA)); 1600 mButtonEnabledNetworks.setSummary(R.string.network_3G); 1601 break; 1602 case Phone.NT_MODE_WCDMA_ONLY: 1603 case Phone.NT_MODE_GSM_UMTS: 1604 case Phone.NT_MODE_WCDMA_PREF: 1605 if (!mIsGlobalCdma) { 1606 mButtonEnabledNetworks.setValue( 1607 Integer.toString(Phone.NT_MODE_WCDMA_PREF)); 1608 mButtonEnabledNetworks.setSummary(R.string.network_3G); 1609 } else { 1610 mButtonEnabledNetworks.setValue( 1611 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA)); 1612 mButtonEnabledNetworks.setSummary(R.string.network_global); 1613 } 1614 break; 1615 case Phone.NT_MODE_GSM_ONLY: 1616 if (!mIsGlobalCdma) { 1617 mButtonEnabledNetworks.setValue( 1618 Integer.toString(Phone.NT_MODE_GSM_ONLY)); 1619 mButtonEnabledNetworks.setSummary(R.string.network_2G); 1620 } else { 1621 mButtonEnabledNetworks.setValue( 1622 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA)); 1623 mButtonEnabledNetworks.setSummary(R.string.network_global); 1624 } 1625 break; 1626 case Phone.NT_MODE_LTE_GSM_WCDMA: 1627 if (isWorldMode()) { 1628 mButtonEnabledNetworks.setSummary( 1629 R.string.preferred_network_mode_lte_gsm_umts_summary); 1630 controlCdmaOptions(false); 1631 controlGsmOptions(true); 1632 break; 1633 } 1634 case Phone.NT_MODE_LTE_ONLY: 1635 case Phone.NT_MODE_LTE_WCDMA: 1636 if (!mIsGlobalCdma) { 1637 mButtonEnabledNetworks.setValue( 1638 Integer.toString(Phone.NT_MODE_LTE_GSM_WCDMA)); 1639 mButtonEnabledNetworks.setSummary((mShow4GForLTE == true) 1640 ? R.string.network_4G : R.string.network_lte); 1641 } else { 1642 mButtonEnabledNetworks.setValue( 1643 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA)); 1644 mButtonEnabledNetworks.setSummary(R.string.network_global); 1645 } 1646 break; 1647 case Phone.NT_MODE_LTE_CDMA_AND_EVDO: 1648 if (isWorldMode()) { 1649 mButtonEnabledNetworks.setSummary( 1650 R.string.preferred_network_mode_lte_cdma_summary); 1651 controlCdmaOptions(true); 1652 controlGsmOptions(false); 1653 } else { 1654 mButtonEnabledNetworks.setValue( 1655 Integer.toString(Phone.NT_MODE_LTE_CDMA_AND_EVDO)); 1656 mButtonEnabledNetworks.setSummary(R.string.network_lte); 1657 } 1658 break; 1659 case Phone.NT_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA: 1660 mButtonEnabledNetworks.setValue( 1661 Integer.toString(Phone.NT_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA)); 1662 mButtonEnabledNetworks.setSummary(R.string.network_3G); 1663 break; 1664 case Phone.NT_MODE_CDMA: 1665 case Phone.NT_MODE_EVDO_NO_CDMA: 1666 case Phone.NT_MODE_GLOBAL: 1667 mButtonEnabledNetworks.setValue( 1668 Integer.toString(Phone.NT_MODE_CDMA)); 1669 mButtonEnabledNetworks.setSummary(R.string.network_3G); 1670 break; 1671 case Phone.NT_MODE_CDMA_NO_EVDO: 1672 mButtonEnabledNetworks.setValue( 1673 Integer.toString(Phone.NT_MODE_CDMA_NO_EVDO)); 1674 mButtonEnabledNetworks.setSummary(R.string.network_1x); 1675 break; 1676 case Phone.NT_MODE_TDSCDMA_ONLY: 1677 mButtonEnabledNetworks.setValue( 1678 Integer.toString(Phone.NT_MODE_TDSCDMA_ONLY)); 1679 mButtonEnabledNetworks.setSummary(R.string.network_3G); 1680 break; 1681 case Phone.NT_MODE_LTE_TDSCDMA_GSM: 1682 case Phone.NT_MODE_LTE_TDSCDMA_GSM_WCDMA: 1683 case Phone.NT_MODE_LTE_TDSCDMA: 1684 case Phone.NT_MODE_LTE_TDSCDMA_WCDMA: 1685 case Phone.NT_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA: 1686 case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA: 1687 if (isSupportTdscdma()) { 1688 mButtonEnabledNetworks.setValue( 1689 Integer.toString(Phone.NT_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA)); 1690 mButtonEnabledNetworks.setSummary(R.string.network_lte); 1691 } else { 1692 if (isWorldMode()) { 1693 controlCdmaOptions(true); 1694 controlGsmOptions(false); 1695 } 1696 mButtonEnabledNetworks.setValue( 1697 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA)); 1698 if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA || 1699 mIsGlobalCdma || 1700 isWorldMode()) { 1701 mButtonEnabledNetworks.setSummary(R.string.network_global); 1702 } else { 1703 mButtonEnabledNetworks.setSummary((mShow4GForLTE == true) 1704 ? R.string.network_4G : R.string.network_lte); 1705 } 1706 } 1707 break; 1708 default: 1709 String errMsg = "Invalid Network Mode (" + NetworkMode + "). Ignore."; 1710 loge(errMsg); 1711 mButtonEnabledNetworks.setSummary(errMsg); 1712 } 1713 } 1714 1715 @Override 1716 public void onActivityResult(int requestCode, int resultCode, Intent data) { 1717 switch(requestCode) { 1718 case REQUEST_CODE_EXIT_ECM: 1719 Boolean isChoiceYes = data.getBooleanExtra( 1720 EmergencyCallbackModeExitDialog.EXTRA_EXIT_ECM_RESULT, false); 1721 if (isChoiceYes) { 1722 // If the phone exits from ECM mode, show the CDMA Options 1723 mCdmaOptions.showDialog(mClickedPreference); 1724 } else { 1725 // do nothing 1726 } 1727 break; 1728 1729 default: 1730 break; 1731 } 1732 } 1733 1734 private void updateWiFiCallState() { 1735 if (mWiFiCallingPref == null || mCallingCategory == null) { 1736 return; 1737 } 1738 1739 boolean removePref = false; 1740 final PhoneAccountHandle simCallManager = 1741 TelecomManager.from(getContext()).getSimCallManager(); 1742 1743 if (simCallManager != null) { 1744 Intent intent = PhoneAccountSettingsFragment.buildPhoneAccountConfigureIntent( 1745 getContext(), simCallManager); 1746 if (intent != null) { 1747 PackageManager pm = mPhone.getContext().getPackageManager(); 1748 List<ResolveInfo> resolutions = pm.queryIntentActivities(intent, 0); 1749 if (!resolutions.isEmpty()) { 1750 mWiFiCallingPref.setTitle(resolutions.get(0).loadLabel(pm)); 1751 mWiFiCallingPref.setSummary(null); 1752 mWiFiCallingPref.setIntent(intent); 1753 } else { 1754 removePref = true; 1755 } 1756 } else { 1757 removePref = true; 1758 } 1759 } else if (mImsMgr == null 1760 || !mImsMgr.isWfcEnabledByPlatform() 1761 || !mImsMgr.isWfcProvisionedOnDevice()) { 1762 removePref = true; 1763 } else { 1764 int resId = com.android.internal.R.string.wifi_calling_off_summary; 1765 if (mImsMgr.isWfcEnabledByUser()) { 1766 boolean isRoaming = mTelephonyManager.isNetworkRoaming(); 1767 int wfcMode = mImsMgr.getWfcMode(isRoaming); 1768 1769 switch (wfcMode) { 1770 case ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY: 1771 resId = com.android.internal.R.string.wfc_mode_wifi_only_summary; 1772 break; 1773 case ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED: 1774 resId = com.android.internal.R.string 1775 .wfc_mode_cellular_preferred_summary; 1776 break; 1777 case ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED: 1778 resId = com.android.internal.R.string.wfc_mode_wifi_preferred_summary; 1779 break; 1780 default: 1781 if (DBG) log("Unexpected WFC mode value: " + wfcMode); 1782 } 1783 } 1784 mWiFiCallingPref.setSummary(resId); 1785 } 1786 1787 if (removePref) { 1788 mCallingCategory.removePreference(mWiFiCallingPref); 1789 } else { 1790 mCallingCategory.addPreference(mWiFiCallingPref); 1791 mWiFiCallingPref.setEnabled(mTelephonyManager.getCallState(mPhone.getSubId()) 1792 == TelephonyManager.CALL_STATE_IDLE && hasActiveSubscriptions()); 1793 } 1794 } 1795 1796 private void updateEnhanced4gLteState() { 1797 if (mButton4glte == null) { 1798 return; 1799 } 1800 1801 PersistableBundle carrierConfig = PhoneGlobals.getInstance() 1802 .getCarrierConfigForSubId(mPhone.getSubId()); 1803 1804 try { 1805 if ((mImsMgr == null 1806 || mImsMgr.getImsServiceState() != ImsFeature.STATE_READY 1807 || !mImsMgr.isVolteEnabledByPlatform() 1808 || !mImsMgr.isVolteProvisionedOnDevice() 1809 || carrierConfig.getBoolean( 1810 CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL))) { 1811 getPreferenceScreen().removePreference(mButton4glte); 1812 } else { 1813 mButton4glte.setEnabled(is4gLtePrefEnabled(carrierConfig) 1814 && hasActiveSubscriptions()); 1815 boolean enh4glteMode = mImsMgr.isEnhanced4gLteModeSettingEnabledByUser() 1816 && mImsMgr.isNonTtyOrTtyOnVolteEnabled(); 1817 mButton4glte.setChecked(enh4glteMode); 1818 } 1819 } catch (ImsException ex) { 1820 log("Exception when trying to get ImsServiceStatus: " + ex); 1821 getPreferenceScreen().removePreference(mButton4glte); 1822 } 1823 } 1824 1825 private void updateVideoCallState() { 1826 if (mVideoCallingPref == null || mCallingCategory == null) { 1827 return; 1828 } 1829 1830 PersistableBundle carrierConfig = PhoneGlobals.getInstance() 1831 .getCarrierConfigForSubId(mPhone.getSubId()); 1832 1833 if (mImsMgr != null 1834 && mImsMgr.isVtEnabledByPlatform() 1835 && mImsMgr.isVtProvisionedOnDevice() 1836 && (carrierConfig.getBoolean( 1837 CarrierConfigManager.KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS) 1838 || mPhone.mDcTracker.isDataEnabled())) { 1839 mCallingCategory.addPreference(mVideoCallingPref); 1840 if (!mButton4glte.isChecked()) { 1841 mVideoCallingPref.setEnabled(false); 1842 mVideoCallingPref.setChecked(false); 1843 } else { 1844 mVideoCallingPref.setEnabled(mTelephonyManager.getCallState(mPhone.getSubId()) 1845 == TelephonyManager.CALL_STATE_IDLE && hasActiveSubscriptions()); 1846 mVideoCallingPref.setChecked(mImsMgr.isVtEnabledByUser()); 1847 mVideoCallingPref.setOnPreferenceChangeListener(this); 1848 } 1849 } else { 1850 mCallingCategory.removePreference(mVideoCallingPref); 1851 } 1852 } 1853 1854 private void updateCallingCategory() { 1855 if (mCallingCategory == null) { 1856 return; 1857 } 1858 1859 updateWiFiCallState(); 1860 updateVideoCallState(); 1861 1862 // If all items in calling category is removed, we remove it from 1863 // the screen. Otherwise we'll see title of the category but nothing 1864 // is in there. 1865 if (mCallingCategory.getPreferenceCount() == 0) { 1866 getPreferenceScreen().removePreference(mCallingCategory); 1867 } else { 1868 getPreferenceScreen().addPreference(mCallingCategory); 1869 } 1870 } 1871 1872 private static void log(String msg) { 1873 Log.d(LOG_TAG, msg); 1874 } 1875 1876 private static void loge(String msg) { 1877 Log.e(LOG_TAG, msg); 1878 } 1879 1880 @Override 1881 public boolean onOptionsItemSelected(MenuItem item) { 1882 final int itemId = item.getItemId(); 1883 if (itemId == android.R.id.home) { // See ActionBar#setDisplayHomeAsUpEnabled() 1884 // Commenting out "logical up" capability. This is a workaround for issue 5278083. 1885 // 1886 // Settings app may not launch this activity via UP_ACTIVITY_CLASS but the other 1887 // Activity that looks exactly same as UP_ACTIVITY_CLASS ("SubSettings" Activity). 1888 // At that moment, this Activity launches UP_ACTIVITY_CLASS on top of the Activity. 1889 // which confuses users. 1890 // TODO: introduce better mechanism for "up" capability here. 1891 /*Intent intent = new Intent(Intent.ACTION_MAIN); 1892 intent.setClassName(UP_ACTIVITY_PACKAGE, UP_ACTIVITY_CLASS); 1893 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 1894 startActivity(intent);*/ 1895 getActivity().finish(); 1896 return true; 1897 } 1898 return super.onOptionsItemSelected(item); 1899 } 1900 1901 private boolean isWorldMode() { 1902 boolean worldModeOn = false; 1903 final String configString = getResources().getString(R.string.config_world_mode); 1904 1905 if (!TextUtils.isEmpty(configString)) { 1906 String[] configArray = configString.split(";"); 1907 // Check if we have World mode configuration set to True only or config is set to True 1908 // and SIM GID value is also set and matches to the current SIM GID. 1909 if (configArray != null && 1910 ((configArray.length == 1 && configArray[0].equalsIgnoreCase("true")) 1911 || (configArray.length == 2 && !TextUtils.isEmpty(configArray[1]) 1912 && mTelephonyManager != null 1913 && configArray[1].equalsIgnoreCase( 1914 mTelephonyManager.getGroupIdLevel1())))) { 1915 worldModeOn = true; 1916 } 1917 } 1918 1919 Log.d(LOG_TAG, "isWorldMode=" + worldModeOn); 1920 1921 return worldModeOn; 1922 } 1923 1924 private void controlGsmOptions(boolean enable) { 1925 PreferenceScreen prefSet = getPreferenceScreen(); 1926 if (prefSet == null) { 1927 return; 1928 } 1929 1930 updateGsmUmtsOptions(this, prefSet, mPhone.getSubId(), mNetworkQueryService); 1931 1932 PreferenceCategory networkOperatorCategory = 1933 (PreferenceCategory) prefSet.findPreference( 1934 NetworkOperators.CATEGORY_NETWORK_OPERATORS_KEY); 1935 Preference carrierSettings = prefSet.findPreference(BUTTON_CARRIER_SETTINGS_KEY); 1936 if (networkOperatorCategory != null) { 1937 if (enable) { 1938 networkOperatorCategory.setEnabled(true); 1939 } else { 1940 prefSet.removePreference(networkOperatorCategory); 1941 } 1942 } 1943 if (carrierSettings != null) { 1944 prefSet.removePreference(carrierSettings); 1945 } 1946 } 1947 1948 private void controlCdmaOptions(boolean enable) { 1949 PreferenceScreen prefSet = getPreferenceScreen(); 1950 if (prefSet == null) { 1951 return; 1952 } 1953 updateCdmaOptions(this, prefSet, mPhone); 1954 CdmaSystemSelectListPreference systemSelect = 1955 (CdmaSystemSelectListPreference)prefSet.findPreference 1956 (BUTTON_CDMA_SYSTEM_SELECT_KEY); 1957 if (systemSelect != null) { 1958 systemSelect.setEnabled(enable); 1959 } 1960 } 1961 1962 private boolean isSupportTdscdma() { 1963 if (getResources().getBoolean(R.bool.config_support_tdscdma)) { 1964 return true; 1965 } 1966 1967 String operatorNumeric = mPhone.getServiceState().getOperatorNumeric(); 1968 String[] numericArray = getResources().getStringArray( 1969 R.array.config_support_tdscdma_roaming_on_networks); 1970 if (numericArray.length == 0 || operatorNumeric == null) { 1971 return false; 1972 } 1973 for (String numeric : numericArray) { 1974 if (operatorNumeric.equals(numeric)) { 1975 return true; 1976 } 1977 } 1978 return false; 1979 } 1980 1981 /** 1982 * Metrics events related methods. it takes care of all preferences possible in this 1983 * fragment(except a few that log on their own). It doesn't only include preferences in 1984 * network_setting_fragment.xml, but also those defined in GsmUmtsOptions and CdmaOptions. 1985 */ 1986 private void sendMetricsEventPreferenceClicked( 1987 PreferenceScreen preferenceScreen, Preference preference) { 1988 final int category = getMetricsEventCategory(preferenceScreen, preference); 1989 if (category == MetricsEvent.VIEW_UNKNOWN) { 1990 return; 1991 } 1992 1993 // Send MetricsEvent on click. It includes preferences other than SwitchPreferences, 1994 // which send MetricsEvent in onPreferenceChange. 1995 // For ListPreferences, we log it here without a value, only indicating it's clicked to 1996 // open the list dialog. When a value is chosen, another MetricsEvent is logged with 1997 // new value in onPreferenceChange. 1998 if (preference == mLteDataServicePref || preference == mDataUsagePref 1999 || preference == mEuiccSettingsPref || preference == mAdvancedOptions 2000 || preference == mWiFiCallingPref || preference == mButtonPreferredNetworkMode 2001 || preference == mButtonEnabledNetworks 2002 || preference == preferenceScreen.findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY) 2003 || preference == preferenceScreen.findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY) 2004 || preference == preferenceScreen.findPreference(BUTTON_GSM_APN_EXPAND_KEY) 2005 || preference == preferenceScreen.findPreference(BUTTON_CDMA_APN_EXPAND_KEY) 2006 || preference == preferenceScreen.findPreference(BUTTON_CARRIER_SETTINGS_KEY)) { 2007 MetricsLogger.action(getContext(), category); 2008 } 2009 } 2010 2011 private void sendMetricsEventPreferenceChanged( 2012 PreferenceScreen preferenceScreen, Preference preference, Object newValue) { 2013 final int category = getMetricsEventCategory(preferenceScreen, preference); 2014 if (category == MetricsEvent.VIEW_UNKNOWN) { 2015 return; 2016 } 2017 2018 // MetricsEvent logging with new value, for SwitchPreferences and ListPreferences. 2019 if (preference == mButton4glte || preference == mVideoCallingPref) { 2020 MetricsLogger.action(getContext(), category, (Boolean) newValue); 2021 } else if (preference == mButtonPreferredNetworkMode 2022 || preference == mButtonEnabledNetworks 2023 || preference == preferenceScreen 2024 .findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY) 2025 || preference == preferenceScreen 2026 .findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY)) { 2027 // Network select preference sends metrics event in its own listener. 2028 MetricsLogger.action(getContext(), category, Integer.valueOf((String) newValue)); 2029 } 2030 } 2031 2032 private int getMetricsEventCategory( 2033 PreferenceScreen preferenceScreen, Preference preference) { 2034 2035 if (preference == null) { 2036 return MetricsEvent.VIEW_UNKNOWN; 2037 } else if (preference == mMobileDataPref) { 2038 return MetricsEvent.ACTION_MOBILE_NETWORK_MOBILE_DATA_TOGGLE; 2039 } else if (preference == mButtonDataRoam) { 2040 return MetricsEvent.ACTION_MOBILE_NETWORK_DATA_ROAMING_TOGGLE; 2041 } else if (preference == mDataUsagePref) { 2042 return MetricsEvent.ACTION_MOBILE_NETWORK_DATA_USAGE; 2043 } else if (preference == mLteDataServicePref) { 2044 return MetricsEvent.ACTION_MOBILE_NETWORK_SET_UP_DATA_SERVICE; 2045 } else if (preference == mAdvancedOptions) { 2046 return MetricsEvent.ACTION_MOBILE_NETWORK_EXPAND_ADVANCED_FIELDS; 2047 } else if (preference == mButton4glte) { 2048 return MetricsEvent.ACTION_MOBILE_ENHANCED_4G_LTE_MODE_TOGGLE; 2049 } else if (preference == mButtonPreferredNetworkMode) { 2050 return MetricsEvent.ACTION_MOBILE_NETWORK_SELECT_PREFERRED_NETWORK; 2051 } else if (preference == mButtonEnabledNetworks) { 2052 return MetricsEvent.ACTION_MOBILE_NETWORK_SELECT_ENABLED_NETWORK; 2053 } else if (preference == mEuiccSettingsPref) { 2054 return MetricsEvent.ACTION_MOBILE_NETWORK_EUICC_SETTING; 2055 } else if (preference == mWiFiCallingPref) { 2056 return MetricsEvent.ACTION_MOBILE_NETWORK_WIFI_CALLING; 2057 } else if (preference == mVideoCallingPref) { 2058 return MetricsEvent.ACTION_MOBILE_NETWORK_VIDEO_CALLING_TOGGLE; 2059 } else if (preference == preferenceScreen 2060 .findPreference(NetworkOperators.BUTTON_AUTO_SELECT_KEY)) { 2061 return MetricsEvent.ACTION_MOBILE_NETWORK_AUTO_SELECT_NETWORK_TOGGLE; 2062 } else if (preference == preferenceScreen 2063 .findPreference(NetworkOperators.BUTTON_NETWORK_SELECT_KEY)) { 2064 return MetricsEvent.ACTION_MOBILE_NETWORK_MANUAL_SELECT_NETWORK; 2065 } else if (preference == preferenceScreen 2066 .findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY)) { 2067 return MetricsEvent.ACTION_MOBILE_NETWORK_CDMA_SYSTEM_SELECT; 2068 } else if (preference == preferenceScreen 2069 .findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY)) { 2070 return MetricsEvent.ACTION_MOBILE_NETWORK_CDMA_SUBSCRIPTION_SELECT; 2071 } else if (preference == preferenceScreen.findPreference(BUTTON_GSM_APN_EXPAND_KEY) 2072 || preference == preferenceScreen.findPreference(BUTTON_CDMA_APN_EXPAND_KEY)) { 2073 return MetricsEvent.ACTION_MOBILE_NETWORK_APN_SETTINGS; 2074 } else if (preference == preferenceScreen.findPreference(BUTTON_CARRIER_SETTINGS_KEY)) { 2075 return MetricsEvent.ACTION_MOBILE_NETWORK_CARRIER_SETTINGS; 2076 } else { 2077 return MetricsEvent.VIEW_UNKNOWN; 2078 } 2079 } 2080 2081 private void updateGsmUmtsOptions(PreferenceFragment prefFragment, 2082 PreferenceScreen prefScreen, final int subId, INetworkQueryService queryService) { 2083 // We don't want to re-create GsmUmtsOptions if already exists. Otherwise, the 2084 // preferences inside it will also be re-created which causes unexpected behavior. 2085 // For example, the open dialog gets dismissed or detached after pause / resume. 2086 if (mGsmUmtsOptions == null) { 2087 mGsmUmtsOptions = new GsmUmtsOptions(prefFragment, prefScreen, subId, queryService); 2088 } else { 2089 mGsmUmtsOptions.update(subId, queryService); 2090 } 2091 } 2092 2093 private void updateCdmaOptions(PreferenceFragment prefFragment, PreferenceScreen prefScreen, 2094 Phone phone) { 2095 // We don't want to re-create CdmaOptions if already exists. Otherwise, the preferences 2096 // inside it will also be re-created which causes unexpected behavior. For example, 2097 // the open dialog gets dismissed or detached after pause / resume. 2098 if (mCdmaOptions == null) { 2099 mCdmaOptions = new CdmaOptions(prefFragment, prefScreen, phone); 2100 } else { 2101 mCdmaOptions.update(phone); 2102 } 2103 } 2104 } 2105 } 2106 2107