• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
onClick(DialogInterface dialog, int which)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
onDismiss(DialogInterface dialog)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
onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)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 
setIMS(boolean turnOn)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
onCreate(Bundle icicle)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
onResume()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
onPause()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      */
onPreferenceChange(Preference preference, Object objValue)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
handleMessage(Message msg)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 
handleGetPreferredNetworkTypeResponse(Message msg)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 
handleSetPreferredNetworkTypeResponse(Message msg)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 
resetNetworkModeToDefault()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 
UpdatePreferredNetworkModeSummary(int NetworkMode)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 
UpdateEnabledNetworksValueAndSummary(int NetworkMode)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
onActivityResult(int requestCode, int resultCode, Intent data)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 
log(String msg)795     private static void log(String msg) {
796         Log.d(LOG_TAG, msg);
797     }
798 
loge(String msg)799     private static void loge(String msg) {
800         Log.e(LOG_TAG, msg);
801     }
802 
803     @Override
onOptionsItemSelected(MenuItem item)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