Home | History | Annotate | Download | only in phone
      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