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 com.android.ims.ImsManager; 20 import com.android.ims.ImsException; 21 import com.android.internal.telephony.Phone; 22 import com.android.internal.telephony.PhoneConstants; 23 import com.android.internal.telephony.TelephonyIntents; 24 import com.android.internal.telephony.TelephonyProperties; 25 26 import android.app.ActionBar; 27 import android.app.AlertDialog; 28 import android.content.Context; 29 import android.content.DialogInterface; 30 import android.content.Intent; 31 import android.content.SharedPreferences; 32 import android.content.pm.PackageManager.NameNotFoundException; 33 import android.net.Uri; 34 import android.os.AsyncResult; 35 import android.os.Bundle; 36 import android.os.Handler; 37 import android.os.Message; 38 import android.os.SystemProperties; 39 import android.os.UserHandle; 40 import android.os.UserManager; 41 import android.preference.ListPreference; 42 import android.preference.Preference; 43 import android.preference.PreferenceActivity; 44 import android.preference.PreferenceScreen; 45 import android.preference.SwitchPreference; 46 import android.telephony.SubscriptionManager; 47 import android.telephony.TelephonyManager; 48 import android.text.TextUtils; 49 import android.util.Log; 50 import android.view.MenuItem; 51 52 /** 53 * "Mobile network settings" screen. This preference screen lets you 54 * enable/disable mobile data, and control data roaming and other 55 * network-specific mobile data features. It's used on non-voice-capable 56 * tablets as well as regular phone devices. 57 * 58 * Note that this PreferenceActivity is part of the phone app, even though 59 * you reach it from the "Wireless & Networks" section of the main 60 * Settings app. It's not part of the "Call settings" hierarchy that's 61 * available from the Phone app (see CallFeaturesSetting for that.) 62 */ 63 public class MobileNetworkSettings extends PreferenceActivity 64 implements DialogInterface.OnClickListener, 65 DialogInterface.OnDismissListener, Preference.OnPreferenceChangeListener{ 66 67 // debug data 68 private static final String LOG_TAG = "NetworkSettings"; 69 private static final boolean DBG = true; 70 public static final int REQUEST_CODE_EXIT_ECM = 17; 71 72 //String keys for preference lookup 73 private static final String BUTTON_PREFERED_NETWORK_MODE = "preferred_network_mode_key"; 74 private static final String BUTTON_ROAMING_KEY = "button_roaming_key"; 75 private static final String BUTTON_CDMA_LTE_DATA_SERVICE_KEY = "cdma_lte_data_service_key"; 76 private static final String BUTTON_ENABLED_NETWORKS_KEY = "enabled_networks_key"; 77 private static final String BUTTON_4G_LTE_KEY = "enhanced_4g_lte"; 78 private static final String BUTTON_CELL_BROADCAST_SETTINGS = "cell_broadcast_settings"; 79 80 static final int preferredNetworkMode = Phone.PREFERRED_NT_MODE; 81 82 //Information about logical "up" Activity 83 private static final String UP_ACTIVITY_PACKAGE = "com.android.settings"; 84 private static final String UP_ACTIVITY_CLASS = 85 "com.android.settings.Settings$WirelessSettingsActivity"; 86 87 //UI objects 88 private ListPreference mButtonPreferredNetworkMode; 89 private ListPreference mButtonEnabledNetworks; 90 private SwitchPreference mButtonDataRoam; 91 private SwitchPreference mButton4glte; 92 private Preference mLteDataServicePref; 93 94 private static final String iface = "rmnet0"; //TODO: this will go away 95 96 private UserManager mUm; 97 private Phone mPhone; 98 private MyHandler mHandler; 99 private boolean mOkClicked; 100 101 //GsmUmts options and Cdma options 102 GsmUmtsOptions mGsmUmtsOptions; 103 CdmaOptions mCdmaOptions; 104 105 private Preference mClickedPreference; 106 private boolean mShow4GForLTE; 107 private boolean mIsGlobalCdma; 108 private boolean mUnavailable; 109 110 //This is a method implemented for DialogInterface.OnClickListener. 111 // Used to dismiss the dialogs when they come up. 112 public void onClick(DialogInterface dialog, int which) { 113 if (which == DialogInterface.BUTTON_POSITIVE) { 114 mPhone.setDataRoamingEnabled(true); 115 mOkClicked = true; 116 } else { 117 // Reset the toggle 118 mButtonDataRoam.setChecked(false); 119 } 120 } 121 122 @Override 123 public void onDismiss(DialogInterface dialog) { 124 // Assuming that onClick gets called first 125 mButtonDataRoam.setChecked(mOkClicked); 126 } 127 128 /** 129 * Invoked on each preference click in this hierarchy, overrides 130 * PreferenceActivity's implementation. Used to make sure we track the 131 * preference click events. 132 */ 133 @Override 134 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 135 /** TODO: Refactor and get rid of the if's using subclasses */ 136 if (preference.getKey().equals(BUTTON_4G_LTE_KEY)) { 137 return true; 138 } else if (mGsmUmtsOptions != null && 139 mGsmUmtsOptions.preferenceTreeClick(preference) == true) { 140 return true; 141 } else if (mCdmaOptions != null && 142 mCdmaOptions.preferenceTreeClick(preference) == true) { 143 if (Boolean.parseBoolean( 144 SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) { 145 146 mClickedPreference = preference; 147 148 // In ECM mode launch ECM app dialog 149 startActivityForResult( 150 new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null), 151 REQUEST_CODE_EXIT_ECM); 152 } 153 return true; 154 } else if (preference == mButtonPreferredNetworkMode) { 155 //displays the value taken from the Settings.System 156 int settingsNetworkMode = android.provider.Settings.Global.getInt(mPhone.getContext(). 157 getContentResolver(), android.provider.Settings.Global.PREFERRED_NETWORK_MODE, 158 preferredNetworkMode); 159 mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode)); 160 return true; 161 } else if (preference == mLteDataServicePref) { 162 String tmpl = android.provider.Settings.Global.getString(getContentResolver(), 163 android.provider.Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL); 164 if (!TextUtils.isEmpty(tmpl)) { 165 TelephonyManager tm = (TelephonyManager) getSystemService( 166 Context.TELEPHONY_SERVICE); 167 String imsi = tm.getSubscriberId(); 168 if (imsi == null) { 169 imsi = ""; 170 } 171 final String url = TextUtils.isEmpty(tmpl) ? null 172 : TextUtils.expandTemplate(tmpl, imsi).toString(); 173 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 174 startActivity(intent); 175 } else { 176 android.util.Log.e(LOG_TAG, "Missing SETUP_PREPAID_DATA_SERVICE_URL"); 177 } 178 return true; 179 } else if (preference == mButtonEnabledNetworks) { 180 int settingsNetworkMode = android.provider.Settings.Global.getInt(mPhone.getContext(). 181 getContentResolver(), android.provider.Settings.Global.PREFERRED_NETWORK_MODE, 182 preferredNetworkMode); 183 mButtonEnabledNetworks.setValue(Integer.toString(settingsNetworkMode)); 184 return true; 185 } else if (preference == mButtonDataRoam) { 186 // Do not disable the preference screen if the user clicks Data roaming. 187 return true; 188 } else { 189 // if the button is anything but the simple toggle preference, 190 // we'll need to disable all preferences to reject all click 191 // events until the sub-activity's UI comes up. 192 preferenceScreen.setEnabled(false); 193 // Let the intents be launched by the Preference manager 194 return false; 195 } 196 } 197 198 private void setIMS(boolean turnOn) { 199 SharedPreferences imsPref = 200 getSharedPreferences(ImsManager.IMS_SHARED_PREFERENCES, Context.MODE_WORLD_READABLE); 201 202 imsPref.edit().putBoolean(ImsManager.KEY_IMS_ON, turnOn).commit(); 203 } 204 205 @Override 206 protected void onCreate(Bundle icicle) { 207 setTheme(R.style.Theme_Material_Settings); 208 super.onCreate(icicle); 209 210 mPhone = PhoneGlobals.getPhone(); 211 mHandler = new MyHandler(); 212 mUm = (UserManager) getSystemService(Context.USER_SERVICE); 213 214 if (mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) { 215 mUnavailable = true; 216 setContentView(R.layout.telephony_disallowed_preference_screen); 217 return; 218 } 219 220 addPreferencesFromResource(R.xml.network_setting); 221 222 mButton4glte = (SwitchPreference)findPreference(BUTTON_4G_LTE_KEY); 223 224 mButton4glte.setOnPreferenceChangeListener(this); 225 mButton4glte.setChecked(ImsManager.isEnhanced4gLteModeSettingEnabledByUser(this)); 226 227 try { 228 Context con = createPackageContext("com.android.systemui", 0); 229 int id = con.getResources().getIdentifier("config_show4GForLTE", 230 "bool", "com.android.systemui"); 231 mShow4GForLTE = con.getResources().getBoolean(id); 232 } catch (NameNotFoundException e) { 233 loge("NameNotFoundException for show4GFotLTE"); 234 mShow4GForLTE = false; 235 } 236 237 //get UI object references 238 PreferenceScreen prefSet = getPreferenceScreen(); 239 240 mButtonDataRoam = (SwitchPreference) prefSet.findPreference(BUTTON_ROAMING_KEY); 241 mButtonPreferredNetworkMode = (ListPreference) prefSet.findPreference( 242 BUTTON_PREFERED_NETWORK_MODE); 243 mButtonEnabledNetworks = (ListPreference) prefSet.findPreference( 244 BUTTON_ENABLED_NETWORKS_KEY); 245 mButtonDataRoam.setOnPreferenceChangeListener(this); 246 247 mLteDataServicePref = prefSet.findPreference(BUTTON_CDMA_LTE_DATA_SERVICE_KEY); 248 249 boolean isLteOnCdma = mPhone.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE; 250 mIsGlobalCdma = isLteOnCdma && getResources().getBoolean(R.bool.config_show_cdma); 251 TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 252 if (tm.getSimplifiedNetworkSettingsEnabledForSubscriber(SubscriptionManager.getDefaultSubId())) { 253 prefSet.removePreference(mButtonPreferredNetworkMode); 254 prefSet.removePreference(mButtonEnabledNetworks); 255 prefSet.removePreference(mLteDataServicePref); 256 } else if (getResources().getBoolean(R.bool.world_phone) == true) { 257 prefSet.removePreference(mButtonEnabledNetworks); 258 // set the listener for the mButtonPreferredNetworkMode list preference so we can issue 259 // change Preferred Network Mode. 260 mButtonPreferredNetworkMode.setOnPreferenceChangeListener(this); 261 262 //Get the networkMode from Settings.System and displays it 263 int settingsNetworkMode = android.provider.Settings.Global.getInt(mPhone.getContext(). 264 getContentResolver(),android.provider.Settings.Global.PREFERRED_NETWORK_MODE, 265 preferredNetworkMode); 266 mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode)); 267 mCdmaOptions = new CdmaOptions(this, prefSet, mPhone); 268 mGsmUmtsOptions = new GsmUmtsOptions(this, prefSet); 269 } else { 270 prefSet.removePreference(mButtonPreferredNetworkMode); 271 int phoneType = mPhone.getPhoneType(); 272 if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) { 273 if (isLteOnCdma) { 274 mButtonEnabledNetworks.setEntries( 275 R.array.enabled_networks_cdma_choices); 276 mButtonEnabledNetworks.setEntryValues( 277 R.array.enabled_networks_cdma_values); 278 } 279 mCdmaOptions = new CdmaOptions(this, prefSet, mPhone); 280 } else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) { 281 if (!getResources().getBoolean(R.bool.config_prefer_2g) 282 && !getResources().getBoolean(R.bool.config_enabled_lte)) { 283 mButtonEnabledNetworks.setEntries( 284 R.array.enabled_networks_except_gsm_lte_choices); 285 mButtonEnabledNetworks.setEntryValues( 286 R.array.enabled_networks_except_gsm_lte_values); 287 } else if (!getResources().getBoolean(R.bool.config_prefer_2g)) { 288 int select = (mShow4GForLTE == true) ? 289 R.array.enabled_networks_except_gsm_4g_choices 290 : R.array.enabled_networks_except_gsm_choices; 291 mButtonEnabledNetworks.setEntries(select); 292 mButtonEnabledNetworks.setEntryValues( 293 R.array.enabled_networks_except_gsm_values); 294 } else if (!getResources().getBoolean(R.bool.config_enabled_lte)) { 295 mButtonEnabledNetworks.setEntries( 296 R.array.enabled_networks_except_lte_choices); 297 mButtonEnabledNetworks.setEntryValues( 298 R.array.enabled_networks_except_lte_values); 299 } else if (mIsGlobalCdma) { 300 mButtonEnabledNetworks.setEntries( 301 R.array.enabled_networks_cdma_choices); 302 mButtonEnabledNetworks.setEntryValues( 303 R.array.enabled_networks_cdma_values); 304 } else { 305 int select = (mShow4GForLTE == true) ? R.array.enabled_networks_4g_choices 306 : R.array.enabled_networks_choices; 307 mButtonEnabledNetworks.setEntries(select); 308 mButtonEnabledNetworks.setEntryValues( 309 R.array.enabled_networks_values); 310 } 311 mGsmUmtsOptions = new GsmUmtsOptions(this, prefSet); 312 } else { 313 throw new IllegalStateException("Unexpected phone type: " + phoneType); 314 } 315 mButtonEnabledNetworks.setOnPreferenceChangeListener(this); 316 int settingsNetworkMode = android.provider.Settings.Global.getInt( 317 mPhone.getContext().getContentResolver(), 318 android.provider.Settings.Global.PREFERRED_NETWORK_MODE, 319 preferredNetworkMode); 320 if (DBG) log("settingsNetworkMode: " + settingsNetworkMode); 321 mButtonEnabledNetworks.setValue(Integer.toString(settingsNetworkMode)); 322 } 323 324 final boolean missingDataServiceUrl = TextUtils.isEmpty( 325 android.provider.Settings.Global.getString(getContentResolver(), 326 android.provider.Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL)); 327 if (!isLteOnCdma || missingDataServiceUrl) { 328 prefSet.removePreference(mLteDataServicePref); 329 } else { 330 android.util.Log.d(LOG_TAG, "keep ltePref"); 331 } 332 333 // Enable enhanced 4G LTE mode settings depending on whether exists on platform 334 if (!ImsManager.isEnhanced4gLteModeSettingEnabledByPlatform(this)) { 335 Preference pref = prefSet.findPreference(BUTTON_4G_LTE_KEY); 336 if (pref != null) { 337 prefSet.removePreference(pref); 338 } 339 } 340 341 ActionBar actionBar = getActionBar(); 342 if (actionBar != null) { 343 // android.R.id.home will be triggered in onOptionsItemSelected() 344 actionBar.setDisplayHomeAsUpEnabled(true); 345 } 346 347 final boolean isSecondaryUser = UserHandle.myUserId() != UserHandle.USER_OWNER; 348 // Enable link to CMAS app settings depending on the value in config.xml. 349 final boolean isCellBroadcastAppLinkEnabled = this.getResources().getBoolean( 350 com.android.internal.R.bool.config_cellBroadcastAppLinks); 351 if (isSecondaryUser || !isCellBroadcastAppLinkEnabled 352 || mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_CELL_BROADCASTS)) { 353 PreferenceScreen root = getPreferenceScreen(); 354 Preference ps = findPreference(BUTTON_CELL_BROADCAST_SETTINGS); 355 if (ps != null) { 356 root.removePreference(ps); 357 } 358 } 359 } 360 361 @Override 362 protected void onResume() { 363 super.onResume(); 364 365 if (mUnavailable) { 366 return; 367 } 368 369 // upon resumption from the sub-activity, make sure we re-enable the 370 // preferences. 371 getPreferenceScreen().setEnabled(true); 372 373 // Set UI state in onResume because a user could go home, launch some 374 // app to change this setting's backend, and re-launch this settings app 375 // and the UI state would be inconsistent with actual state 376 mButtonDataRoam.setChecked(mPhone.getDataRoamingEnabled()); 377 378 if (getPreferenceScreen().findPreference(BUTTON_PREFERED_NETWORK_MODE) != null) { 379 mPhone.getPreferredNetworkType(mHandler.obtainMessage( 380 MyHandler.MESSAGE_GET_PREFERRED_NETWORK_TYPE)); 381 } 382 383 if (getPreferenceScreen().findPreference(BUTTON_ENABLED_NETWORKS_KEY) != null) { 384 mPhone.getPreferredNetworkType(mHandler.obtainMessage( 385 MyHandler.MESSAGE_GET_PREFERRED_NETWORK_TYPE)); 386 } 387 } 388 389 @Override 390 protected void onPause() { 391 super.onPause(); 392 } 393 394 /** 395 * Implemented to support onPreferenceChangeListener to look for preference 396 * changes specifically on CLIR. 397 * 398 * @param preference is the preference to be changed, should be mButtonCLIR. 399 * @param objValue should be the value of the selection, NOT its localized 400 * display value. 401 */ 402 public boolean onPreferenceChange(Preference preference, Object objValue) { 403 if (preference == mButtonPreferredNetworkMode) { 404 //NOTE onPreferenceChange seems to be called even if there is no change 405 //Check if the button value is changed from the System.Setting 406 mButtonPreferredNetworkMode.setValue((String) objValue); 407 int buttonNetworkMode; 408 buttonNetworkMode = Integer.valueOf((String) objValue).intValue(); 409 int settingsNetworkMode = android.provider.Settings.Global.getInt( 410 mPhone.getContext().getContentResolver(), 411 android.provider.Settings.Global.PREFERRED_NETWORK_MODE, preferredNetworkMode); 412 if (buttonNetworkMode != settingsNetworkMode) { 413 int modemNetworkMode; 414 // if new mode is invalid ignore it 415 switch (buttonNetworkMode) { 416 case Phone.NT_MODE_WCDMA_PREF: 417 case Phone.NT_MODE_GSM_ONLY: 418 case Phone.NT_MODE_WCDMA_ONLY: 419 case Phone.NT_MODE_GSM_UMTS: 420 case Phone.NT_MODE_CDMA: 421 case Phone.NT_MODE_CDMA_NO_EVDO: 422 case Phone.NT_MODE_EVDO_NO_CDMA: 423 case Phone.NT_MODE_GLOBAL: 424 case Phone.NT_MODE_LTE_CDMA_AND_EVDO: 425 case Phone.NT_MODE_LTE_GSM_WCDMA: 426 case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA: 427 case Phone.NT_MODE_LTE_ONLY: 428 case Phone.NT_MODE_LTE_WCDMA: 429 // This is one of the modes we recognize 430 modemNetworkMode = buttonNetworkMode; 431 break; 432 default: 433 loge("Invalid Network Mode (" + buttonNetworkMode + ") chosen. Ignore."); 434 return true; 435 } 436 437 UpdatePreferredNetworkModeSummary(buttonNetworkMode); 438 439 android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(), 440 android.provider.Settings.Global.PREFERRED_NETWORK_MODE, 441 buttonNetworkMode ); 442 //Set the modem network mode 443 mPhone.setPreferredNetworkType(modemNetworkMode, mHandler 444 .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE)); 445 } 446 } else if (preference == mButtonEnabledNetworks) { 447 mButtonEnabledNetworks.setValue((String) objValue); 448 int buttonNetworkMode; 449 buttonNetworkMode = Integer.valueOf((String) objValue).intValue(); 450 if (DBG) log("buttonNetworkMode: " + buttonNetworkMode); 451 int settingsNetworkMode = android.provider.Settings.Global.getInt( 452 mPhone.getContext().getContentResolver(), 453 android.provider.Settings.Global.PREFERRED_NETWORK_MODE, preferredNetworkMode); 454 if (buttonNetworkMode != settingsNetworkMode) { 455 int modemNetworkMode; 456 // if new mode is invalid ignore it 457 switch (buttonNetworkMode) { 458 case Phone.NT_MODE_WCDMA_PREF: 459 case Phone.NT_MODE_GSM_ONLY: 460 case Phone.NT_MODE_LTE_GSM_WCDMA: 461 case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA: 462 case Phone.NT_MODE_CDMA: 463 case Phone.NT_MODE_CDMA_NO_EVDO: 464 case Phone.NT_MODE_LTE_CDMA_AND_EVDO: 465 // This is one of the modes we recognize 466 modemNetworkMode = buttonNetworkMode; 467 break; 468 default: 469 loge("Invalid Network Mode (" + buttonNetworkMode + ") chosen. Ignore."); 470 return true; 471 } 472 473 UpdateEnabledNetworksValueAndSummary(buttonNetworkMode); 474 475 android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(), 476 android.provider.Settings.Global.PREFERRED_NETWORK_MODE, 477 buttonNetworkMode ); 478 //Set the modem network mode 479 mPhone.setPreferredNetworkType(modemNetworkMode, mHandler 480 .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE)); 481 } 482 } else if (preference == mButton4glte) { 483 SwitchPreference ltePref = (SwitchPreference)preference; 484 ltePref.setChecked(!ltePref.isChecked()); 485 setIMS(ltePref.isChecked()); 486 487 ImsManager imsMan = ImsManager.getInstance(getBaseContext(), 488 SubscriptionManager.getDefaultVoiceSubId()); 489 if (imsMan != null) { 490 491 try { 492 imsMan.setAdvanced4GMode(ltePref.isChecked()); 493 } catch (ImsException ie) { 494 // do nothing 495 } 496 } 497 } else if (preference == mButtonDataRoam) { 498 if (DBG) log("onPreferenceTreeClick: preference == mButtonDataRoam."); 499 500 //normally called on the toggle click 501 if (!mButtonDataRoam.isChecked()) { 502 // First confirm with a warning dialog about charges 503 mOkClicked = false; 504 new AlertDialog.Builder(this).setMessage( 505 getResources().getString(R.string.roaming_warning)) 506 .setTitle(android.R.string.dialog_alert_title) 507 .setIconAttribute(android.R.attr.alertDialogIcon) 508 .setPositiveButton(android.R.string.yes, this) 509 .setNegativeButton(android.R.string.no, this) 510 .show() 511 .setOnDismissListener(this); 512 } else { 513 mPhone.setDataRoamingEnabled(false); 514 } 515 return true; 516 } 517 518 // always let the preference setting proceed. 519 return true; 520 } 521 522 private class MyHandler extends Handler { 523 524 static final int MESSAGE_GET_PREFERRED_NETWORK_TYPE = 0; 525 static final int MESSAGE_SET_PREFERRED_NETWORK_TYPE = 1; 526 527 @Override 528 public void handleMessage(Message msg) { 529 switch (msg.what) { 530 case MESSAGE_GET_PREFERRED_NETWORK_TYPE: 531 handleGetPreferredNetworkTypeResponse(msg); 532 break; 533 534 case MESSAGE_SET_PREFERRED_NETWORK_TYPE: 535 handleSetPreferredNetworkTypeResponse(msg); 536 break; 537 } 538 } 539 540 private void handleGetPreferredNetworkTypeResponse(Message msg) { 541 AsyncResult ar = (AsyncResult) msg.obj; 542 543 if (ar.exception == null) { 544 int modemNetworkMode = ((int[])ar.result)[0]; 545 546 if (DBG) { 547 log ("handleGetPreferredNetworkTypeResponse: modemNetworkMode = " + 548 modemNetworkMode); 549 } 550 551 int settingsNetworkMode = android.provider.Settings.Global.getInt( 552 mPhone.getContext().getContentResolver(), 553 android.provider.Settings.Global.PREFERRED_NETWORK_MODE, 554 preferredNetworkMode); 555 556 if (DBG) { 557 log("handleGetPreferredNetworkTypeReponse: settingsNetworkMode = " + 558 settingsNetworkMode); 559 } 560 561 //check that modemNetworkMode is from an accepted value 562 if (modemNetworkMode == Phone.NT_MODE_WCDMA_PREF || 563 modemNetworkMode == Phone.NT_MODE_GSM_ONLY || 564 modemNetworkMode == Phone.NT_MODE_WCDMA_ONLY || 565 modemNetworkMode == Phone.NT_MODE_GSM_UMTS || 566 modemNetworkMode == Phone.NT_MODE_CDMA || 567 modemNetworkMode == Phone.NT_MODE_CDMA_NO_EVDO || 568 modemNetworkMode == Phone.NT_MODE_EVDO_NO_CDMA || 569 modemNetworkMode == Phone.NT_MODE_GLOBAL || 570 modemNetworkMode == Phone.NT_MODE_LTE_CDMA_AND_EVDO || 571 modemNetworkMode == Phone.NT_MODE_LTE_GSM_WCDMA || 572 modemNetworkMode == Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA || 573 modemNetworkMode == Phone.NT_MODE_LTE_ONLY || 574 modemNetworkMode == Phone.NT_MODE_LTE_WCDMA) { 575 if (DBG) { 576 log("handleGetPreferredNetworkTypeResponse: if 1: modemNetworkMode = " + 577 modemNetworkMode); 578 } 579 580 //check changes in modemNetworkMode 581 if (modemNetworkMode != settingsNetworkMode) { 582 if (DBG) { 583 log("handleGetPreferredNetworkTypeResponse: if 2: " + 584 "modemNetworkMode != settingsNetworkMode"); 585 } 586 587 settingsNetworkMode = modemNetworkMode; 588 589 if (DBG) { log("handleGetPreferredNetworkTypeResponse: if 2: " + 590 "settingsNetworkMode = " + settingsNetworkMode); 591 } 592 } 593 594 UpdatePreferredNetworkModeSummary(modemNetworkMode); 595 UpdateEnabledNetworksValueAndSummary(modemNetworkMode); 596 // changes the mButtonPreferredNetworkMode accordingly to modemNetworkMode 597 mButtonPreferredNetworkMode.setValue(Integer.toString(modemNetworkMode)); 598 } else { 599 if (DBG) log("handleGetPreferredNetworkTypeResponse: else: reset to default"); 600 resetNetworkModeToDefault(); 601 } 602 } 603 } 604 605 private void handleSetPreferredNetworkTypeResponse(Message msg) { 606 AsyncResult ar = (AsyncResult) msg.obj; 607 608 if (ar.exception == null) { 609 int networkMode = Integer.valueOf( 610 mButtonPreferredNetworkMode.getValue()).intValue(); 611 android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(), 612 android.provider.Settings.Global.PREFERRED_NETWORK_MODE, 613 networkMode ); 614 networkMode = Integer.valueOf( 615 mButtonEnabledNetworks.getValue()).intValue(); 616 android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(), 617 android.provider.Settings.Global.PREFERRED_NETWORK_MODE, 618 networkMode ); 619 } else { 620 mPhone.getPreferredNetworkType(obtainMessage(MESSAGE_GET_PREFERRED_NETWORK_TYPE)); 621 } 622 } 623 624 private void resetNetworkModeToDefault() { 625 //set the mButtonPreferredNetworkMode 626 mButtonPreferredNetworkMode.setValue(Integer.toString(preferredNetworkMode)); 627 mButtonEnabledNetworks.setValue(Integer.toString(preferredNetworkMode)); 628 //set the Settings.System 629 android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(), 630 android.provider.Settings.Global.PREFERRED_NETWORK_MODE, 631 preferredNetworkMode ); 632 //Set the Modem 633 mPhone.setPreferredNetworkType(preferredNetworkMode, 634 this.obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE)); 635 } 636 } 637 638 private void UpdatePreferredNetworkModeSummary(int NetworkMode) { 639 switch(NetworkMode) { 640 case Phone.NT_MODE_WCDMA_PREF: 641 mButtonPreferredNetworkMode.setSummary( 642 R.string.preferred_network_mode_wcdma_perf_summary); 643 break; 644 case Phone.NT_MODE_GSM_ONLY: 645 mButtonPreferredNetworkMode.setSummary( 646 R.string.preferred_network_mode_gsm_only_summary); 647 break; 648 case Phone.NT_MODE_WCDMA_ONLY: 649 mButtonPreferredNetworkMode.setSummary( 650 R.string.preferred_network_mode_wcdma_only_summary); 651 break; 652 case Phone.NT_MODE_GSM_UMTS: 653 mButtonPreferredNetworkMode.setSummary( 654 R.string.preferred_network_mode_gsm_wcdma_summary); 655 break; 656 case Phone.NT_MODE_CDMA: 657 switch (mPhone.getLteOnCdmaMode()) { 658 case PhoneConstants.LTE_ON_CDMA_TRUE: 659 mButtonPreferredNetworkMode.setSummary( 660 R.string.preferred_network_mode_cdma_summary); 661 break; 662 case PhoneConstants.LTE_ON_CDMA_FALSE: 663 default: 664 mButtonPreferredNetworkMode.setSummary( 665 R.string.preferred_network_mode_cdma_evdo_summary); 666 break; 667 } 668 break; 669 case Phone.NT_MODE_CDMA_NO_EVDO: 670 mButtonPreferredNetworkMode.setSummary( 671 R.string.preferred_network_mode_cdma_only_summary); 672 break; 673 case Phone.NT_MODE_EVDO_NO_CDMA: 674 mButtonPreferredNetworkMode.setSummary( 675 R.string.preferred_network_mode_evdo_only_summary); 676 break; 677 case Phone.NT_MODE_LTE_ONLY: 678 mButtonPreferredNetworkMode.setSummary( 679 R.string.preferred_network_mode_lte_summary); 680 break; 681 case Phone.NT_MODE_LTE_GSM_WCDMA: 682 mButtonPreferredNetworkMode.setSummary( 683 R.string.preferred_network_mode_lte_gsm_wcdma_summary); 684 break; 685 case Phone.NT_MODE_LTE_CDMA_AND_EVDO: 686 mButtonPreferredNetworkMode.setSummary( 687 R.string.preferred_network_mode_lte_cdma_evdo_summary); 688 break; 689 case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA: 690 mButtonPreferredNetworkMode.setSummary( 691 R.string.preferred_network_mode_global_summary); 692 break; 693 case Phone.NT_MODE_GLOBAL: 694 mButtonPreferredNetworkMode.setSummary( 695 R.string.preferred_network_mode_cdma_evdo_gsm_wcdma_summary); 696 break; 697 case Phone.NT_MODE_LTE_WCDMA: 698 mButtonPreferredNetworkMode.setSummary( 699 R.string.preferred_network_mode_lte_wcdma_summary); 700 break; 701 default: 702 mButtonPreferredNetworkMode.setSummary( 703 R.string.preferred_network_mode_global_summary); 704 } 705 } 706 707 private void UpdateEnabledNetworksValueAndSummary(int NetworkMode) { 708 switch (NetworkMode) { 709 case Phone.NT_MODE_WCDMA_ONLY: 710 case Phone.NT_MODE_GSM_UMTS: 711 case Phone.NT_MODE_WCDMA_PREF: 712 if (!mIsGlobalCdma) { 713 mButtonEnabledNetworks.setValue( 714 Integer.toString(Phone.NT_MODE_WCDMA_PREF)); 715 mButtonEnabledNetworks.setSummary(R.string.network_3G); 716 } else { 717 mButtonEnabledNetworks.setValue( 718 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA)); 719 mButtonEnabledNetworks.setSummary(R.string.network_global); 720 } 721 break; 722 case Phone.NT_MODE_GSM_ONLY: 723 if (!mIsGlobalCdma) { 724 mButtonEnabledNetworks.setValue( 725 Integer.toString(Phone.NT_MODE_GSM_ONLY)); 726 mButtonEnabledNetworks.setSummary(R.string.network_2G); 727 } else { 728 mButtonEnabledNetworks.setValue( 729 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA)); 730 mButtonEnabledNetworks.setSummary(R.string.network_global); 731 } 732 break; 733 case Phone.NT_MODE_LTE_GSM_WCDMA: 734 case Phone.NT_MODE_LTE_ONLY: 735 case Phone.NT_MODE_LTE_WCDMA: 736 if (!mIsGlobalCdma) { 737 mButtonEnabledNetworks.setValue( 738 Integer.toString(Phone.NT_MODE_LTE_GSM_WCDMA)); 739 mButtonEnabledNetworks.setSummary((mShow4GForLTE == true) 740 ? R.string.network_4G : R.string.network_lte); 741 } else { 742 mButtonEnabledNetworks.setValue( 743 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA)); 744 mButtonEnabledNetworks.setSummary(R.string.network_global); 745 } 746 break; 747 case Phone.NT_MODE_LTE_CDMA_AND_EVDO: 748 mButtonEnabledNetworks.setValue( 749 Integer.toString(Phone.NT_MODE_LTE_CDMA_AND_EVDO)); 750 mButtonEnabledNetworks.setSummary(R.string.network_lte); 751 break; 752 case Phone.NT_MODE_CDMA: 753 case Phone.NT_MODE_EVDO_NO_CDMA: 754 case Phone.NT_MODE_GLOBAL: 755 mButtonEnabledNetworks.setValue( 756 Integer.toString(Phone.NT_MODE_CDMA)); 757 mButtonEnabledNetworks.setSummary(R.string.network_3G); 758 break; 759 case Phone.NT_MODE_CDMA_NO_EVDO: 760 mButtonEnabledNetworks.setValue( 761 Integer.toString(Phone.NT_MODE_CDMA_NO_EVDO)); 762 mButtonEnabledNetworks.setSummary(R.string.network_1x); 763 break; 764 case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA: 765 mButtonEnabledNetworks.setValue( 766 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA)); 767 mButtonEnabledNetworks.setSummary(R.string.network_global); 768 break; 769 default: 770 String errMsg = "Invalid Network Mode (" + NetworkMode + "). Ignore."; 771 loge(errMsg); 772 mButtonEnabledNetworks.setSummary(errMsg); 773 } 774 } 775 776 @Override 777 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 778 switch(requestCode) { 779 case REQUEST_CODE_EXIT_ECM: 780 Boolean isChoiceYes = 781 data.getBooleanExtra(EmergencyCallbackModeExitDialog.EXTRA_EXIT_ECM_RESULT, false); 782 if (isChoiceYes) { 783 // If the phone exits from ECM mode, show the CDMA Options 784 mCdmaOptions.showDialog(mClickedPreference); 785 } else { 786 // do nothing 787 } 788 break; 789 790 default: 791 break; 792 } 793 } 794 795 private static void log(String msg) { 796 Log.d(LOG_TAG, msg); 797 } 798 799 private static void loge(String msg) { 800 Log.e(LOG_TAG, msg); 801 } 802 803 @Override 804 public boolean onOptionsItemSelected(MenuItem item) { 805 final int itemId = item.getItemId(); 806 if (itemId == android.R.id.home) { // See ActionBar#setDisplayHomeAsUpEnabled() 807 // Commenting out "logical up" capability. This is a workaround for issue 5278083. 808 // 809 // Settings app may not launch this activity via UP_ACTIVITY_CLASS but the other 810 // Activity that looks exactly same as UP_ACTIVITY_CLASS ("SubSettings" Activity). 811 // At that moment, this Activity launches UP_ACTIVITY_CLASS on top of the Activity. 812 // which confuses users. 813 // TODO: introduce better mechanism for "up" capability here. 814 /*Intent intent = new Intent(Intent.ACTION_MAIN); 815 intent.setClassName(UP_ACTIVITY_PACKAGE, UP_ACTIVITY_CLASS); 816 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 817 startActivity(intent);*/ 818 finish(); 819 return true; 820 } 821 return super.onOptionsItemSelected(item); 822 } 823 } 824