blob: ee380803957efb9b3ad5b99b561d8f19ddf7dc7e [file] [log] [blame]
Santos Cordon7d4ddf62013-07-10 11:58:08 -07001/*
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
17package com.android.phone;
18
PauloftheWest5f907c32014-07-25 07:10:44 -070019import com.android.ims.ImsManager;
20import com.android.ims.ImsException;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070021import com.android.internal.telephony.Phone;
22import com.android.internal.telephony.PhoneConstants;
PauloftheWest3c6ce5e2014-11-03 07:09:47 -080023import com.android.internal.telephony.PhoneFactory;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070024import com.android.internal.telephony.TelephonyIntents;
25import com.android.internal.telephony.TelephonyProperties;
26
PauloftheWest3c6ce5e2014-11-03 07:09:47 -080027import java.util.ArrayList;
28import java.util.List;
29
Santos Cordon7d4ddf62013-07-10 11:58:08 -070030import android.app.ActionBar;
31import android.app.AlertDialog;
32import android.content.Context;
33import android.content.DialogInterface;
34import android.content.Intent;
PauloftheWest5f907c32014-07-25 07:10:44 -070035import android.content.SharedPreferences;
Sungmin Choi21270372013-09-17 17:19:51 -070036import android.content.pm.PackageManager.NameNotFoundException;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070037import android.net.Uri;
38import android.os.AsyncResult;
39import android.os.Bundle;
40import android.os.Handler;
41import android.os.Message;
42import android.os.SystemProperties;
PauloftheWest5f907c32014-07-25 07:10:44 -070043import android.os.UserHandle;
Julia Reynoldsa4ca38a2014-05-12 16:51:26 -040044import android.os.UserManager;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070045import android.preference.ListPreference;
46import android.preference.Preference;
47import android.preference.PreferenceActivity;
PauloftheWest3c6ce5e2014-11-03 07:09:47 -080048import android.preference.PreferenceGroup;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070049import android.preference.PreferenceScreen;
PauloftheWest5f907c32014-07-25 07:10:44 -070050import android.preference.SwitchPreference;
PauloftheWest3c6ce5e2014-11-03 07:09:47 -080051import android.telephony.SubscriptionInfo;
Derek Tan89e89d42014-07-08 17:00:10 -070052import android.telephony.SubscriptionManager;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070053import android.telephony.TelephonyManager;
54import android.text.TextUtils;
55import android.util.Log;
56import android.view.MenuItem;
PauloftheWest3c6ce5e2014-11-03 07:09:47 -080057import android.view.View;
58import android.widget.ListView;
59import android.widget.TabHost;
60import android.widget.TabHost.OnTabChangeListener;
61import android.widget.TabHost.TabContentFactory;
62import android.widget.TabHost.TabSpec;
63import android.widget.TabWidget;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070064
65/**
66 * "Mobile network settings" screen. This preference screen lets you
67 * enable/disable mobile data, and control data roaming and other
68 * network-specific mobile data features. It's used on non-voice-capable
69 * tablets as well as regular phone devices.
70 *
71 * Note that this PreferenceActivity is part of the phone app, even though
72 * you reach it from the "Wireless & Networks" section of the main
73 * Settings app. It's not part of the "Call settings" hierarchy that's
74 * available from the Phone app (see CallFeaturesSetting for that.)
75 */
76public class MobileNetworkSettings extends PreferenceActivity
77 implements DialogInterface.OnClickListener,
78 DialogInterface.OnDismissListener, Preference.OnPreferenceChangeListener{
79
80 // debug data
81 private static final String LOG_TAG = "NetworkSettings";
Sungmin Choi21270372013-09-17 17:19:51 -070082 private static final boolean DBG = true;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070083 public static final int REQUEST_CODE_EXIT_ECM = 17;
84
85 //String keys for preference lookup
Santos Cordon7d4ddf62013-07-10 11:58:08 -070086 private static final String BUTTON_PREFERED_NETWORK_MODE = "preferred_network_mode_key";
87 private static final String BUTTON_ROAMING_KEY = "button_roaming_key";
88 private static final String BUTTON_CDMA_LTE_DATA_SERVICE_KEY = "cdma_lte_data_service_key";
Sungmin Choi21270372013-09-17 17:19:51 -070089 private static final String BUTTON_ENABLED_NETWORKS_KEY = "enabled_networks_key";
PauloftheWest5f907c32014-07-25 07:10:44 -070090 private static final String BUTTON_4G_LTE_KEY = "enhanced_4g_lte";
91 private static final String BUTTON_CELL_BROADCAST_SETTINGS = "cell_broadcast_settings";
Rohit Sisodia (a21406)dfa04102014-11-05 16:42:24 -060092 private static final String BUTTON_APN_EXPAND_KEY = "button_apn_key";
93 private static final String BUTTON_OPERATOR_SELECTION_EXPAND_KEY = "button_carrier_sel_key";
94 private static final String BUTTON_CARRIER_SETTINGS_KEY = "carrier_settings_key";
95 private static final String BUTTON_CDMA_SYSTEM_SELECT_KEY = "cdma_system_select_key";
Santos Cordon7d4ddf62013-07-10 11:58:08 -070096
97 static final int preferredNetworkMode = Phone.PREFERRED_NT_MODE;
98
99 //Information about logical "up" Activity
100 private static final String UP_ACTIVITY_PACKAGE = "com.android.settings";
101 private static final String UP_ACTIVITY_CLASS =
102 "com.android.settings.Settings$WirelessSettingsActivity";
103
104 //UI objects
105 private ListPreference mButtonPreferredNetworkMode;
Sungmin Choi21270372013-09-17 17:19:51 -0700106 private ListPreference mButtonEnabledNetworks;
PauloftheWest5f907c32014-07-25 07:10:44 -0700107 private SwitchPreference mButtonDataRoam;
108 private SwitchPreference mButton4glte;
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700109 private Preference mLteDataServicePref;
110
111 private static final String iface = "rmnet0"; //TODO: this will go away
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800112 private List<SubscriptionInfo> mSelectableSubInfos = null;
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700113
Julia Reynoldsa4ca38a2014-05-12 16:51:26 -0400114 private UserManager mUm;
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700115 private Phone mPhone;
116 private MyHandler mHandler;
117 private boolean mOkClicked;
118
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800119 private TabHost mTabHost;
120 private TabWidget mTabWidget;
121 private ListView mListView;
122
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700123 //GsmUmts options and Cdma options
124 GsmUmtsOptions mGsmUmtsOptions;
125 CdmaOptions mCdmaOptions;
126
127 private Preference mClickedPreference;
Sungmin Choi21270372013-09-17 17:19:51 -0700128 private boolean mShow4GForLTE;
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700129 private boolean mIsGlobalCdma;
Julia Reynoldsa4ca38a2014-05-12 16:51:26 -0400130 private boolean mUnavailable;
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700131
132 //This is a method implemented for DialogInterface.OnClickListener.
133 // Used to dismiss the dialogs when they come up.
134 public void onClick(DialogInterface dialog, int which) {
135 if (which == DialogInterface.BUTTON_POSITIVE) {
136 mPhone.setDataRoamingEnabled(true);
137 mOkClicked = true;
138 } else {
139 // Reset the toggle
140 mButtonDataRoam.setChecked(false);
141 }
142 }
143
PauloftheWest5f907c32014-07-25 07:10:44 -0700144 @Override
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700145 public void onDismiss(DialogInterface dialog) {
146 // Assuming that onClick gets called first
PauloftheWestadc65072014-09-09 11:32:13 -0700147 mButtonDataRoam.setChecked(mOkClicked);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700148 }
149
150 /**
151 * Invoked on each preference click in this hierarchy, overrides
152 * PreferenceActivity's implementation. Used to make sure we track the
153 * preference click events.
154 */
155 @Override
156 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
157 /** TODO: Refactor and get rid of the if's using subclasses */
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800158 final int phoneSubId = mPhone.getSubId();
PauloftheWest5f907c32014-07-25 07:10:44 -0700159 if (preference.getKey().equals(BUTTON_4G_LTE_KEY)) {
160 return true;
161 } else if (mGsmUmtsOptions != null &&
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700162 mGsmUmtsOptions.preferenceTreeClick(preference) == true) {
163 return true;
164 } else if (mCdmaOptions != null &&
165 mCdmaOptions.preferenceTreeClick(preference) == true) {
166 if (Boolean.parseBoolean(
167 SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) {
168
169 mClickedPreference = preference;
170
171 // In ECM mode launch ECM app dialog
172 startActivityForResult(
173 new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null),
174 REQUEST_CODE_EXIT_ECM);
175 }
176 return true;
177 } else if (preference == mButtonPreferredNetworkMode) {
178 //displays the value taken from the Settings.System
179 int settingsNetworkMode = android.provider.Settings.Global.getInt(mPhone.getContext().
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800180 getContentResolver(),
181 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700182 preferredNetworkMode);
183 mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
184 return true;
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700185 } else if (preference == mLteDataServicePref) {
186 String tmpl = android.provider.Settings.Global.getString(getContentResolver(),
187 android.provider.Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL);
188 if (!TextUtils.isEmpty(tmpl)) {
189 TelephonyManager tm = (TelephonyManager) getSystemService(
190 Context.TELEPHONY_SERVICE);
191 String imsi = tm.getSubscriberId();
192 if (imsi == null) {
193 imsi = "";
194 }
195 final String url = TextUtils.isEmpty(tmpl) ? null
196 : TextUtils.expandTemplate(tmpl, imsi).toString();
197 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
198 startActivity(intent);
199 } else {
200 android.util.Log.e(LOG_TAG, "Missing SETUP_PREPAID_DATA_SERVICE_URL");
201 }
202 return true;
Sungmin Choi21270372013-09-17 17:19:51 -0700203 } else if (preference == mButtonEnabledNetworks) {
204 int settingsNetworkMode = android.provider.Settings.Global.getInt(mPhone.getContext().
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800205 getContentResolver(),
206 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
Sungmin Choi21270372013-09-17 17:19:51 -0700207 preferredNetworkMode);
208 mButtonEnabledNetworks.setValue(Integer.toString(settingsNetworkMode));
209 return true;
PauloftheWestadc65072014-09-09 11:32:13 -0700210 } else if (preference == mButtonDataRoam) {
211 // Do not disable the preference screen if the user clicks Data roaming.
212 return true;
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700213 } else {
214 // if the button is anything but the simple toggle preference,
215 // we'll need to disable all preferences to reject all click
216 // events until the sub-activity's UI comes up.
217 preferenceScreen.setEnabled(false);
218 // Let the intents be launched by the Preference manager
219 return false;
220 }
221 }
222
PauloftheWest5f907c32014-07-25 07:10:44 -0700223 private void setIMS(boolean turnOn) {
Libin.Tang@motorola.comac00bb22014-10-10 15:06:21 -0500224 int value = (turnOn) ? 1:0;
225 android.provider.Settings.Global.putInt(
226 mPhone.getContext().getContentResolver(),
Etan Cohen7c8f52b2014-10-22 15:14:55 -0700227 android.provider.Settings.Global.ENHANCED_4G_MODE_ENABLED, value);
PauloftheWest5f907c32014-07-25 07:10:44 -0700228 }
229
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800230 private OnTabChangeListener mTabListener = new OnTabChangeListener() {
231 @Override
232 public void onTabChanged(String tabId) {
233 final int slotId = Integer.parseInt(tabId);
234 final SubscriptionInfo sir = findRecordBySlotId(slotId);
235 mPhone = PhoneFactory.getPhone(SubscriptionManager.getPhoneId(sir.getSubscriptionId()));
236
237 // The User has changed tab; update the body.
238 updateBody();
239 }
240 };
241
242 private TabContentFactory mEmptyTabContent = new TabContentFactory() {
243 @Override
244 public View createTabContent(String tag) {
245 return new View(mTabHost.getContext());
246 }
247 };
248
249 private TabSpec buildTabSpec(String tag, String title) {
250 return mTabHost.newTabSpec(tag).setIndicator(title).setContent(
251 mEmptyTabContent);
252 }
253
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700254 @Override
255 protected void onCreate(Bundle icicle) {
PauloftheWest5f907c32014-07-25 07:10:44 -0700256 setTheme(R.style.Theme_Material_Settings);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700257 super.onCreate(icicle);
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800258 final Context context = getApplicationContext();
259
260 mSelectableSubInfos = new ArrayList<SubscriptionInfo>();
261 final TelephonyManager tm =
262 (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
263
264 for (int i = 0; i < tm.getSimCount(); i++) {
265 SubscriptionInfo sir = findRecordBySlotId(i);
266 if (sir != null) {
267 mSelectableSubInfos.add(sir);
268 }
269 }
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700270
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700271 mPhone = PhoneGlobals.getPhone();
272 mHandler = new MyHandler();
Julia Reynoldsa4ca38a2014-05-12 16:51:26 -0400273 mUm = (UserManager) getSystemService(Context.USER_SERVICE);
274
275 if (mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
276 mUnavailable = true;
277 setContentView(R.layout.telephony_disallowed_preference_screen);
278 return;
279 }
280
281 addPreferencesFromResource(R.xml.network_setting);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700282
PauloftheWest5f907c32014-07-25 07:10:44 -0700283 mButton4glte = (SwitchPreference)findPreference(BUTTON_4G_LTE_KEY);
284
285 mButton4glte.setOnPreferenceChangeListener(this);
Etan Cohen46b0a812014-08-18 15:43:29 -0700286 mButton4glte.setChecked(ImsManager.isEnhanced4gLteModeSettingEnabledByUser(this));
PauloftheWest5f907c32014-07-25 07:10:44 -0700287
Sungmin Choi21270372013-09-17 17:19:51 -0700288 try {
289 Context con = createPackageContext("com.android.systemui", 0);
290 int id = con.getResources().getIdentifier("config_show4GForLTE",
291 "bool", "com.android.systemui");
292 mShow4GForLTE = con.getResources().getBoolean(id);
293 } catch (NameNotFoundException e) {
294 loge("NameNotFoundException for show4GFotLTE");
295 mShow4GForLTE = false;
296 }
297
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700298 //get UI object references
299 PreferenceScreen prefSet = getPreferenceScreen();
300
PauloftheWest5f907c32014-07-25 07:10:44 -0700301 mButtonDataRoam = (SwitchPreference) prefSet.findPreference(BUTTON_ROAMING_KEY);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700302 mButtonPreferredNetworkMode = (ListPreference) prefSet.findPreference(
303 BUTTON_PREFERED_NETWORK_MODE);
Sungmin Choi21270372013-09-17 17:19:51 -0700304 mButtonEnabledNetworks = (ListPreference) prefSet.findPreference(
305 BUTTON_ENABLED_NETWORKS_KEY);
PauloftheWest5f907c32014-07-25 07:10:44 -0700306 mButtonDataRoam.setOnPreferenceChangeListener(this);
Sungmin Choi21270372013-09-17 17:19:51 -0700307
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700308 mLteDataServicePref = prefSet.findPreference(BUTTON_CDMA_LTE_DATA_SERVICE_KEY);
309
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800310 if (mSelectableSubInfos.size() > 1) {
311 setContentView(R.layout.network_settings);
312
313 mTabHost = (TabHost) findViewById(android.R.id.tabhost);
314 mTabWidget = (TabWidget) findViewById(android.R.id.tabs);
315 mListView = (ListView) findViewById(android.R.id.list);
316
317 mTabHost.setup();
318 mTabHost.setOnTabChangedListener(mTabListener);
319 mTabHost.clearAllTabs();
320
321 for (int i = 0; i < mSelectableSubInfos.size(); i++) {
322 mTabHost.addTab(buildTabSpec(String.valueOf(i),
323 String.valueOf(mSelectableSubInfos.get(i).getDisplayName())));
324 }
325 }
326
327 updateBody();
328 }
329
330 @Override
331 protected void onResume() {
332 super.onResume();
333
334 if (mUnavailable) {
335 return;
336 }
337
338 // upon resumption from the sub-activity, make sure we re-enable the
339 // preferences.
340 getPreferenceScreen().setEnabled(true);
341
342 // Set UI state in onResume because a user could go home, launch some
343 // app to change this setting's backend, and re-launch this settings app
344 // and the UI state would be inconsistent with actual state
345 mButtonDataRoam.setChecked(mPhone.getDataRoamingEnabled());
346
347 if (getPreferenceScreen().findPreference(BUTTON_PREFERED_NETWORK_MODE) != null) {
348 mPhone.getPreferredNetworkType(mHandler.obtainMessage(
349 MyHandler.MESSAGE_GET_PREFERRED_NETWORK_TYPE));
350 }
351
352 if (getPreferenceScreen().findPreference(BUTTON_ENABLED_NETWORKS_KEY) != null) {
353 mPhone.getPreferredNetworkType(mHandler.obtainMessage(
354 MyHandler.MESSAGE_GET_PREFERRED_NETWORK_TYPE));
355 }
356 }
357
358 private void updateBody() {
359 final Context context = getApplicationContext();
360 final TelephonyManager tm =
361 (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
362 PreferenceScreen prefSet = getPreferenceScreen();
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700363 boolean isLteOnCdma = mPhone.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE;
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800364 final int phoneSubId = mPhone.getSubId();
365
366 if (prefSet != null) {
367 prefSet.removeAll();
368 prefSet.addPreference(mButtonDataRoam);
369 prefSet.addPreference(mButtonPreferredNetworkMode);
370 prefSet.addPreference(mButtonEnabledNetworks);
PauloftheWeste3c2f8f2014-11-13 16:01:43 -0800371 prefSet.addPreference(mButton4glte);
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800372 }
373
374 int settingsNetworkMode = android.provider.Settings.Global.getInt(
375 mPhone.getContext().getContentResolver(),
376 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
377 preferredNetworkMode);
378
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700379 mIsGlobalCdma = isLteOnCdma && getResources().getBoolean(R.bool.config_show_cdma);
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800380 int shouldHideCarrierSettings = android.provider.Settings.Global.getInt(
381 mPhone.getContext().getContentResolver(),
382 android.provider.Settings.Global.HIDE_CARRIER_NETWORK_SETTINGS, 0);
383 if (shouldHideCarrierSettings == 1 ) {
Derek Tan89e89d42014-07-08 17:00:10 -0700384 prefSet.removePreference(mButtonPreferredNetworkMode);
385 prefSet.removePreference(mButtonEnabledNetworks);
386 prefSet.removePreference(mLteDataServicePref);
387 } else if (getResources().getBoolean(R.bool.world_phone) == true) {
Sungmin Choi21270372013-09-17 17:19:51 -0700388 prefSet.removePreference(mButtonEnabledNetworks);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700389 // set the listener for the mButtonPreferredNetworkMode list preference so we can issue
390 // change Preferred Network Mode.
391 mButtonPreferredNetworkMode.setOnPreferenceChangeListener(this);
392
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700393 mCdmaOptions = new CdmaOptions(this, prefSet, mPhone);
394 mGsmUmtsOptions = new GsmUmtsOptions(this, prefSet);
395 } else {
Sungmin Choi4e9f0aa2013-09-17 17:27:24 -0700396 prefSet.removePreference(mButtonPreferredNetworkMode);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700397 int phoneType = mPhone.getPhoneType();
398 if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {
Sungmin Choi21270372013-09-17 17:19:51 -0700399 if (isLteOnCdma) {
400 mButtonEnabledNetworks.setEntries(
401 R.array.enabled_networks_cdma_choices);
402 mButtonEnabledNetworks.setEntryValues(
403 R.array.enabled_networks_cdma_values);
404 }
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700405 mCdmaOptions = new CdmaOptions(this, prefSet, mPhone);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700406 } else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
Sungmin Choi21270372013-09-17 17:19:51 -0700407 if (!getResources().getBoolean(R.bool.config_prefer_2g)
408 && !getResources().getBoolean(R.bool.config_enabled_lte)) {
409 mButtonEnabledNetworks.setEntries(
410 R.array.enabled_networks_except_gsm_lte_choices);
411 mButtonEnabledNetworks.setEntryValues(
412 R.array.enabled_networks_except_gsm_lte_values);
413 } else if (!getResources().getBoolean(R.bool.config_prefer_2g)) {
414 int select = (mShow4GForLTE == true) ?
415 R.array.enabled_networks_except_gsm_4g_choices
416 : R.array.enabled_networks_except_gsm_choices;
417 mButtonEnabledNetworks.setEntries(select);
418 mButtonEnabledNetworks.setEntryValues(
419 R.array.enabled_networks_except_gsm_values);
420 } else if (!getResources().getBoolean(R.bool.config_enabled_lte)) {
421 mButtonEnabledNetworks.setEntries(
422 R.array.enabled_networks_except_lte_choices);
423 mButtonEnabledNetworks.setEntryValues(
424 R.array.enabled_networks_except_lte_values);
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700425 } else if (mIsGlobalCdma) {
Sungmin Choi21270372013-09-17 17:19:51 -0700426 mButtonEnabledNetworks.setEntries(
427 R.array.enabled_networks_cdma_choices);
428 mButtonEnabledNetworks.setEntryValues(
429 R.array.enabled_networks_cdma_values);
430 } else {
431 int select = (mShow4GForLTE == true) ? R.array.enabled_networks_4g_choices
432 : R.array.enabled_networks_choices;
433 mButtonEnabledNetworks.setEntries(select);
434 mButtonEnabledNetworks.setEntryValues(
435 R.array.enabled_networks_values);
436 }
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700437 mGsmUmtsOptions = new GsmUmtsOptions(this, prefSet);
438 } else {
439 throw new IllegalStateException("Unexpected phone type: " + phoneType);
440 }
Rohit Sisodia (a21406)3a4447b2014-10-10 14:05:11 -0500441 if (isWorldMode()) {
442 mButtonEnabledNetworks.setEntries(
443 R.array.preferred_network_mode_choices_world_mode);
444 mButtonEnabledNetworks.setEntryValues(
445 R.array.preferred_network_mode_values_world_mode);
446 }
Sungmin Choi21270372013-09-17 17:19:51 -0700447 mButtonEnabledNetworks.setOnPreferenceChangeListener(this);
Sungmin Choi21270372013-09-17 17:19:51 -0700448 if (DBG) log("settingsNetworkMode: " + settingsNetworkMode);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700449 }
450
451 final boolean missingDataServiceUrl = TextUtils.isEmpty(
452 android.provider.Settings.Global.getString(getContentResolver(),
453 android.provider.Settings.Global.SETUP_PREPAID_DATA_SERVICE_URL));
454 if (!isLteOnCdma || missingDataServiceUrl) {
455 prefSet.removePreference(mLteDataServicePref);
456 } else {
457 android.util.Log.d(LOG_TAG, "keep ltePref");
458 }
459
Etan Cohenf5f0dae2014-09-04 17:33:06 -0700460 // Enable enhanced 4G LTE mode settings depending on whether exists on platform
Etan Cohen4afb0a62014-10-23 18:51:20 -0700461 if (!ImsManager.isVolteEnabledByPlatform(this)) {
Hyejin Kimf830f762014-08-12 14:38:12 +0900462 Preference pref = prefSet.findPreference(BUTTON_4G_LTE_KEY);
463 if (pref != null) {
464 prefSet.removePreference(pref);
465 }
466 }
467
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700468 ActionBar actionBar = getActionBar();
469 if (actionBar != null) {
470 // android.R.id.home will be triggered in onOptionsItemSelected()
471 actionBar.setDisplayHomeAsUpEnabled(true);
472 }
PauloftheWest5f907c32014-07-25 07:10:44 -0700473
474 final boolean isSecondaryUser = UserHandle.myUserId() != UserHandle.USER_OWNER;
475 // Enable link to CMAS app settings depending on the value in config.xml.
476 final boolean isCellBroadcastAppLinkEnabled = this.getResources().getBoolean(
477 com.android.internal.R.bool.config_cellBroadcastAppLinks);
478 if (isSecondaryUser || !isCellBroadcastAppLinkEnabled
479 || mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_CELL_BROADCASTS)) {
480 PreferenceScreen root = getPreferenceScreen();
481 Preference ps = findPreference(BUTTON_CELL_BROADCAST_SETTINGS);
482 if (ps != null) {
483 root.removePreference(ps);
484 }
485 }
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700486
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800487 //Get the networkMode from Settings.System and displays it
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700488 mButtonDataRoam.setChecked(mPhone.getDataRoamingEnabled());
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800489 mButtonEnabledNetworks.setValue(Integer.toString(settingsNetworkMode));
490 mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
491 UpdatePreferredNetworkModeSummary(settingsNetworkMode);
492 UpdateEnabledNetworksValueAndSummary(settingsNetworkMode);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700493 }
494
495 @Override
496 protected void onPause() {
497 super.onPause();
498 }
499
500 /**
501 * Implemented to support onPreferenceChangeListener to look for preference
502 * changes specifically on CLIR.
503 *
504 * @param preference is the preference to be changed, should be mButtonCLIR.
505 * @param objValue should be the value of the selection, NOT its localized
506 * display value.
507 */
508 public boolean onPreferenceChange(Preference preference, Object objValue) {
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800509 final int phoneSubId = mPhone.getSubId();
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700510 if (preference == mButtonPreferredNetworkMode) {
511 //NOTE onPreferenceChange seems to be called even if there is no change
512 //Check if the button value is changed from the System.Setting
513 mButtonPreferredNetworkMode.setValue((String) objValue);
514 int buttonNetworkMode;
515 buttonNetworkMode = Integer.valueOf((String) objValue).intValue();
516 int settingsNetworkMode = android.provider.Settings.Global.getInt(
517 mPhone.getContext().getContentResolver(),
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800518 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
519 preferredNetworkMode);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700520 if (buttonNetworkMode != settingsNetworkMode) {
521 int modemNetworkMode;
522 // if new mode is invalid ignore it
523 switch (buttonNetworkMode) {
524 case Phone.NT_MODE_WCDMA_PREF:
525 case Phone.NT_MODE_GSM_ONLY:
526 case Phone.NT_MODE_WCDMA_ONLY:
527 case Phone.NT_MODE_GSM_UMTS:
528 case Phone.NT_MODE_CDMA:
529 case Phone.NT_MODE_CDMA_NO_EVDO:
530 case Phone.NT_MODE_EVDO_NO_CDMA:
531 case Phone.NT_MODE_GLOBAL:
532 case Phone.NT_MODE_LTE_CDMA_AND_EVDO:
533 case Phone.NT_MODE_LTE_GSM_WCDMA:
Jake Hambye994d462014-02-03 13:10:13 -0800534 case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA:
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700535 case Phone.NT_MODE_LTE_ONLY:
536 case Phone.NT_MODE_LTE_WCDMA:
537 // This is one of the modes we recognize
538 modemNetworkMode = buttonNetworkMode;
539 break;
540 default:
541 loge("Invalid Network Mode (" + buttonNetworkMode + ") chosen. Ignore.");
542 return true;
543 }
544
545 UpdatePreferredNetworkModeSummary(buttonNetworkMode);
546
547 android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(),
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800548 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700549 buttonNetworkMode );
550 //Set the modem network mode
551 mPhone.setPreferredNetworkType(modemNetworkMode, mHandler
552 .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));
553 }
Sungmin Choi21270372013-09-17 17:19:51 -0700554 } else if (preference == mButtonEnabledNetworks) {
555 mButtonEnabledNetworks.setValue((String) objValue);
556 int buttonNetworkMode;
557 buttonNetworkMode = Integer.valueOf((String) objValue).intValue();
558 if (DBG) log("buttonNetworkMode: " + buttonNetworkMode);
559 int settingsNetworkMode = android.provider.Settings.Global.getInt(
560 mPhone.getContext().getContentResolver(),
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800561 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
562 preferredNetworkMode);
Sungmin Choi21270372013-09-17 17:19:51 -0700563 if (buttonNetworkMode != settingsNetworkMode) {
564 int modemNetworkMode;
565 // if new mode is invalid ignore it
566 switch (buttonNetworkMode) {
567 case Phone.NT_MODE_WCDMA_PREF:
568 case Phone.NT_MODE_GSM_ONLY:
569 case Phone.NT_MODE_LTE_GSM_WCDMA:
Jake Hambye994d462014-02-03 13:10:13 -0800570 case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA:
Sungmin Choi21270372013-09-17 17:19:51 -0700571 case Phone.NT_MODE_CDMA:
572 case Phone.NT_MODE_CDMA_NO_EVDO:
573 case Phone.NT_MODE_LTE_CDMA_AND_EVDO:
574 // This is one of the modes we recognize
575 modemNetworkMode = buttonNetworkMode;
576 break;
577 default:
578 loge("Invalid Network Mode (" + buttonNetworkMode + ") chosen. Ignore.");
579 return true;
580 }
581
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700582 UpdateEnabledNetworksValueAndSummary(buttonNetworkMode);
Sungmin Choi21270372013-09-17 17:19:51 -0700583
584 android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(),
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800585 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
Sungmin Choi21270372013-09-17 17:19:51 -0700586 buttonNetworkMode );
587 //Set the modem network mode
588 mPhone.setPreferredNetworkType(modemNetworkMode, mHandler
589 .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));
590 }
PauloftheWest5f907c32014-07-25 07:10:44 -0700591 } else if (preference == mButton4glte) {
Etan Cohencaeb3712014-08-21 14:56:53 -0700592 SwitchPreference ltePref = (SwitchPreference)preference;
593 ltePref.setChecked(!ltePref.isChecked());
594 setIMS(ltePref.isChecked());
595
PauloftheWest5f907c32014-07-25 07:10:44 -0700596 ImsManager imsMan = ImsManager.getInstance(getBaseContext(),
597 SubscriptionManager.getDefaultVoiceSubId());
PauloftheWest5f907c32014-07-25 07:10:44 -0700598 if (imsMan != null) {
Etan Cohencaeb3712014-08-21 14:56:53 -0700599
Etan Cohene76b88d2014-08-08 16:00:20 -0700600 try {
601 imsMan.setAdvanced4GMode(ltePref.isChecked());
602 } catch (ImsException ie) {
603 // do nothing
604 }
PauloftheWest5f907c32014-07-25 07:10:44 -0700605 }
606 } else if (preference == mButtonDataRoam) {
607 if (DBG) log("onPreferenceTreeClick: preference == mButtonDataRoam.");
608
609 //normally called on the toggle click
610 if (!mButtonDataRoam.isChecked()) {
611 // First confirm with a warning dialog about charges
612 mOkClicked = false;
613 new AlertDialog.Builder(this).setMessage(
614 getResources().getString(R.string.roaming_warning))
615 .setTitle(android.R.string.dialog_alert_title)
616 .setIconAttribute(android.R.attr.alertDialogIcon)
617 .setPositiveButton(android.R.string.yes, this)
618 .setNegativeButton(android.R.string.no, this)
619 .show()
620 .setOnDismissListener(this);
621 } else {
622 mPhone.setDataRoamingEnabled(false);
623 }
624 return true;
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700625 }
626
627 // always let the preference setting proceed.
628 return true;
629 }
630
631 private class MyHandler extends Handler {
632
633 static final int MESSAGE_GET_PREFERRED_NETWORK_TYPE = 0;
634 static final int MESSAGE_SET_PREFERRED_NETWORK_TYPE = 1;
635
636 @Override
637 public void handleMessage(Message msg) {
638 switch (msg.what) {
639 case MESSAGE_GET_PREFERRED_NETWORK_TYPE:
640 handleGetPreferredNetworkTypeResponse(msg);
641 break;
642
643 case MESSAGE_SET_PREFERRED_NETWORK_TYPE:
644 handleSetPreferredNetworkTypeResponse(msg);
645 break;
646 }
647 }
648
649 private void handleGetPreferredNetworkTypeResponse(Message msg) {
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800650 final int phoneSubId = mPhone.getSubId();
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700651 AsyncResult ar = (AsyncResult) msg.obj;
652
653 if (ar.exception == null) {
654 int modemNetworkMode = ((int[])ar.result)[0];
655
656 if (DBG) {
657 log ("handleGetPreferredNetworkTypeResponse: modemNetworkMode = " +
658 modemNetworkMode);
659 }
660
661 int settingsNetworkMode = android.provider.Settings.Global.getInt(
662 mPhone.getContext().getContentResolver(),
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800663 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700664 preferredNetworkMode);
665
666 if (DBG) {
667 log("handleGetPreferredNetworkTypeReponse: settingsNetworkMode = " +
668 settingsNetworkMode);
669 }
670
671 //check that modemNetworkMode is from an accepted value
672 if (modemNetworkMode == Phone.NT_MODE_WCDMA_PREF ||
673 modemNetworkMode == Phone.NT_MODE_GSM_ONLY ||
674 modemNetworkMode == Phone.NT_MODE_WCDMA_ONLY ||
675 modemNetworkMode == Phone.NT_MODE_GSM_UMTS ||
676 modemNetworkMode == Phone.NT_MODE_CDMA ||
677 modemNetworkMode == Phone.NT_MODE_CDMA_NO_EVDO ||
678 modemNetworkMode == Phone.NT_MODE_EVDO_NO_CDMA ||
679 modemNetworkMode == Phone.NT_MODE_GLOBAL ||
680 modemNetworkMode == Phone.NT_MODE_LTE_CDMA_AND_EVDO ||
681 modemNetworkMode == Phone.NT_MODE_LTE_GSM_WCDMA ||
Jake Hambye994d462014-02-03 13:10:13 -0800682 modemNetworkMode == Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA ||
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700683 modemNetworkMode == Phone.NT_MODE_LTE_ONLY ||
684 modemNetworkMode == Phone.NT_MODE_LTE_WCDMA) {
685 if (DBG) {
686 log("handleGetPreferredNetworkTypeResponse: if 1: modemNetworkMode = " +
687 modemNetworkMode);
688 }
689
Junda Liu468d7842014-06-24 15:56:12 -0700690 //check changes in modemNetworkMode
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700691 if (modemNetworkMode != settingsNetworkMode) {
692 if (DBG) {
693 log("handleGetPreferredNetworkTypeResponse: if 2: " +
694 "modemNetworkMode != settingsNetworkMode");
695 }
696
697 settingsNetworkMode = modemNetworkMode;
698
699 if (DBG) { log("handleGetPreferredNetworkTypeResponse: if 2: " +
700 "settingsNetworkMode = " + settingsNetworkMode);
701 }
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700702 }
703
704 UpdatePreferredNetworkModeSummary(modemNetworkMode);
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700705 UpdateEnabledNetworksValueAndSummary(modemNetworkMode);
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700706 // changes the mButtonPreferredNetworkMode accordingly to modemNetworkMode
707 mButtonPreferredNetworkMode.setValue(Integer.toString(modemNetworkMode));
708 } else {
709 if (DBG) log("handleGetPreferredNetworkTypeResponse: else: reset to default");
710 resetNetworkModeToDefault();
711 }
712 }
713 }
714
715 private void handleSetPreferredNetworkTypeResponse(Message msg) {
716 AsyncResult ar = (AsyncResult) msg.obj;
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800717 final int phoneSubId = mPhone.getSubId();
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700718
719 if (ar.exception == null) {
720 int networkMode = Integer.valueOf(
721 mButtonPreferredNetworkMode.getValue()).intValue();
722 android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(),
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800723 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700724 networkMode );
Sungmin Choi21270372013-09-17 17:19:51 -0700725 networkMode = Integer.valueOf(
726 mButtonEnabledNetworks.getValue()).intValue();
727 android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(),
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800728 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
Sungmin Choi21270372013-09-17 17:19:51 -0700729 networkMode );
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700730 } else {
731 mPhone.getPreferredNetworkType(obtainMessage(MESSAGE_GET_PREFERRED_NETWORK_TYPE));
732 }
733 }
734
735 private void resetNetworkModeToDefault() {
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800736 final int phoneSubId = mPhone.getSubId();
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700737 //set the mButtonPreferredNetworkMode
738 mButtonPreferredNetworkMode.setValue(Integer.toString(preferredNetworkMode));
Sungmin Choi21270372013-09-17 17:19:51 -0700739 mButtonEnabledNetworks.setValue(Integer.toString(preferredNetworkMode));
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700740 //set the Settings.System
741 android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(),
PauloftheWest3c6ce5e2014-11-03 07:09:47 -0800742 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700743 preferredNetworkMode );
744 //Set the Modem
745 mPhone.setPreferredNetworkType(preferredNetworkMode,
746 this.obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));
747 }
748 }
749
750 private void UpdatePreferredNetworkModeSummary(int NetworkMode) {
751 switch(NetworkMode) {
752 case Phone.NT_MODE_WCDMA_PREF:
753 mButtonPreferredNetworkMode.setSummary(
754 R.string.preferred_network_mode_wcdma_perf_summary);
755 break;
756 case Phone.NT_MODE_GSM_ONLY:
757 mButtonPreferredNetworkMode.setSummary(
758 R.string.preferred_network_mode_gsm_only_summary);
759 break;
760 case Phone.NT_MODE_WCDMA_ONLY:
761 mButtonPreferredNetworkMode.setSummary(
762 R.string.preferred_network_mode_wcdma_only_summary);
763 break;
764 case Phone.NT_MODE_GSM_UMTS:
765 mButtonPreferredNetworkMode.setSummary(
766 R.string.preferred_network_mode_gsm_wcdma_summary);
767 break;
768 case Phone.NT_MODE_CDMA:
769 switch (mPhone.getLteOnCdmaMode()) {
770 case PhoneConstants.LTE_ON_CDMA_TRUE:
771 mButtonPreferredNetworkMode.setSummary(
772 R.string.preferred_network_mode_cdma_summary);
773 break;
774 case PhoneConstants.LTE_ON_CDMA_FALSE:
775 default:
776 mButtonPreferredNetworkMode.setSummary(
777 R.string.preferred_network_mode_cdma_evdo_summary);
778 break;
779 }
780 break;
781 case Phone.NT_MODE_CDMA_NO_EVDO:
782 mButtonPreferredNetworkMode.setSummary(
783 R.string.preferred_network_mode_cdma_only_summary);
784 break;
785 case Phone.NT_MODE_EVDO_NO_CDMA:
786 mButtonPreferredNetworkMode.setSummary(
787 R.string.preferred_network_mode_evdo_only_summary);
788 break;
789 case Phone.NT_MODE_LTE_ONLY:
790 mButtonPreferredNetworkMode.setSummary(
791 R.string.preferred_network_mode_lte_summary);
792 break;
793 case Phone.NT_MODE_LTE_GSM_WCDMA:
794 mButtonPreferredNetworkMode.setSummary(
795 R.string.preferred_network_mode_lte_gsm_wcdma_summary);
796 break;
797 case Phone.NT_MODE_LTE_CDMA_AND_EVDO:
798 mButtonPreferredNetworkMode.setSummary(
799 R.string.preferred_network_mode_lte_cdma_evdo_summary);
800 break;
Jake Hambye994d462014-02-03 13:10:13 -0800801 case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA:
Amit Mahajanf85c95a2014-11-07 14:49:19 -0800802 if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
Amit Mahajanaf65e4f2014-11-05 15:25:11 -0800803 mButtonPreferredNetworkMode.setSummary(
804 R.string.preferred_network_mode_global_summary);
805 } else {
806 mButtonPreferredNetworkMode.setSummary(
807 R.string.preferred_network_mode_lte_summary);
808 }
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700809 break;
810 case Phone.NT_MODE_GLOBAL:
811 mButtonPreferredNetworkMode.setSummary(
812 R.string.preferred_network_mode_cdma_evdo_gsm_wcdma_summary);
813 break;
814 case Phone.NT_MODE_LTE_WCDMA:
815 mButtonPreferredNetworkMode.setSummary(
816 R.string.preferred_network_mode_lte_wcdma_summary);
817 break;
818 default:
819 mButtonPreferredNetworkMode.setSummary(
820 R.string.preferred_network_mode_global_summary);
821 }
822 }
823
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700824 private void UpdateEnabledNetworksValueAndSummary(int NetworkMode) {
825 switch (NetworkMode) {
826 case Phone.NT_MODE_WCDMA_ONLY:
827 case Phone.NT_MODE_GSM_UMTS:
Sungmin Choi21270372013-09-17 17:19:51 -0700828 case Phone.NT_MODE_WCDMA_PREF:
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700829 if (!mIsGlobalCdma) {
830 mButtonEnabledNetworks.setValue(
831 Integer.toString(Phone.NT_MODE_WCDMA_PREF));
Sungmin Choib0449b32013-10-14 17:22:38 -0700832 mButtonEnabledNetworks.setSummary(R.string.network_3G);
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700833 } else {
834 mButtonEnabledNetworks.setValue(
Jake Hambye994d462014-02-03 13:10:13 -0800835 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA));
Sungmin Choib0449b32013-10-14 17:22:38 -0700836 mButtonEnabledNetworks.setSummary(R.string.network_global);
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700837 }
Sungmin Choi21270372013-09-17 17:19:51 -0700838 break;
839 case Phone.NT_MODE_GSM_ONLY:
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700840 if (!mIsGlobalCdma) {
841 mButtonEnabledNetworks.setValue(
842 Integer.toString(Phone.NT_MODE_GSM_ONLY));
Sungmin Choib0449b32013-10-14 17:22:38 -0700843 mButtonEnabledNetworks.setSummary(R.string.network_2G);
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700844 } else {
845 mButtonEnabledNetworks.setValue(
Jake Hambye994d462014-02-03 13:10:13 -0800846 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA));
Sungmin Choib0449b32013-10-14 17:22:38 -0700847 mButtonEnabledNetworks.setSummary(R.string.network_global);
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700848 }
Sungmin Choi21270372013-09-17 17:19:51 -0700849 break;
850 case Phone.NT_MODE_LTE_GSM_WCDMA:
Rohit Sisodia (a21406)dfa04102014-11-05 16:42:24 -0600851 if (isWorldMode()) {
Rohit Sisodia (a21406)3a4447b2014-10-10 14:05:11 -0500852 mButtonEnabledNetworks.setSummary(
853 R.string.preferred_network_mode_lte_gsm_umts_summary);
Rohit Sisodia (a21406)dfa04102014-11-05 16:42:24 -0600854 controlCdmaOptions(false);
855 controlGsmOptions(true);
Rohit Sisodia (a21406)3a4447b2014-10-10 14:05:11 -0500856 break;
857 }
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700858 case Phone.NT_MODE_LTE_ONLY:
859 case Phone.NT_MODE_LTE_WCDMA:
860 if (!mIsGlobalCdma) {
861 mButtonEnabledNetworks.setValue(
862 Integer.toString(Phone.NT_MODE_LTE_GSM_WCDMA));
Sungmin Choib0449b32013-10-14 17:22:38 -0700863 mButtonEnabledNetworks.setSummary((mShow4GForLTE == true)
864 ? R.string.network_4G : R.string.network_lte);
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700865 } else {
866 mButtonEnabledNetworks.setValue(
Jake Hambye994d462014-02-03 13:10:13 -0800867 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA));
Sungmin Choib0449b32013-10-14 17:22:38 -0700868 mButtonEnabledNetworks.setSummary(R.string.network_global);
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700869 }
Sungmin Choi21270372013-09-17 17:19:51 -0700870 break;
871 case Phone.NT_MODE_LTE_CDMA_AND_EVDO:
Rohit Sisodia (a21406)dfa04102014-11-05 16:42:24 -0600872 if (isWorldMode()) {
Rohit Sisodia (a21406)3a4447b2014-10-10 14:05:11 -0500873 mButtonEnabledNetworks.setSummary(
874 R.string.preferred_network_mode_lte_cdma_summary);
Rohit Sisodia (a21406)dfa04102014-11-05 16:42:24 -0600875 controlCdmaOptions(true);
876 controlGsmOptions(false);
Rohit Sisodia (a21406)3a4447b2014-10-10 14:05:11 -0500877 } else {
878 mButtonEnabledNetworks.setValue(
879 Integer.toString(Phone.NT_MODE_LTE_CDMA_AND_EVDO));
880 mButtonEnabledNetworks.setSummary(R.string.network_lte);
881 }
Sungmin Choi21270372013-09-17 17:19:51 -0700882 break;
883 case Phone.NT_MODE_CDMA:
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700884 case Phone.NT_MODE_EVDO_NO_CDMA:
Sungmin Choi21270372013-09-17 17:19:51 -0700885 case Phone.NT_MODE_GLOBAL:
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700886 mButtonEnabledNetworks.setValue(
887 Integer.toString(Phone.NT_MODE_CDMA));
Sungmin Choib0449b32013-10-14 17:22:38 -0700888 mButtonEnabledNetworks.setSummary(R.string.network_3G);
Sungmin Choi21270372013-09-17 17:19:51 -0700889 break;
890 case Phone.NT_MODE_CDMA_NO_EVDO:
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700891 mButtonEnabledNetworks.setValue(
892 Integer.toString(Phone.NT_MODE_CDMA_NO_EVDO));
Sungmin Choib0449b32013-10-14 17:22:38 -0700893 mButtonEnabledNetworks.setSummary(R.string.network_1x);
Sungmin Choi21270372013-09-17 17:19:51 -0700894 break;
Jake Hambye994d462014-02-03 13:10:13 -0800895 case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA:
Rohit Sisodia (a21406)dfa04102014-11-05 16:42:24 -0600896 if (isWorldMode()) {
897 controlCdmaOptions(true);
898 controlGsmOptions(false);
899 }
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700900 mButtonEnabledNetworks.setValue(
Jake Hambye994d462014-02-03 13:10:13 -0800901 Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA));
Amit Mahajanf85c95a2014-11-07 14:49:19 -0800902 if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
Amit Mahajanaf65e4f2014-11-05 15:25:11 -0800903 mButtonEnabledNetworks.setSummary(R.string.network_global);
904 } else {
905 mButtonEnabledNetworks.setSummary((mShow4GForLTE == true)
906 ? R.string.network_4G : R.string.network_lte);
907 }
Sungmin Choi21270372013-09-17 17:19:51 -0700908 break;
909 default:
Sungmin Choi6bb4d442013-10-15 22:54:10 -0700910 String errMsg = "Invalid Network Mode (" + NetworkMode + "). Ignore.";
911 loge(errMsg);
912 mButtonEnabledNetworks.setSummary(errMsg);
Sungmin Choi21270372013-09-17 17:19:51 -0700913 }
914 }
915
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700916 @Override
917 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
918 switch(requestCode) {
919 case REQUEST_CODE_EXIT_ECM:
920 Boolean isChoiceYes =
921 data.getBooleanExtra(EmergencyCallbackModeExitDialog.EXTRA_EXIT_ECM_RESULT, false);
922 if (isChoiceYes) {
923 // If the phone exits from ECM mode, show the CDMA Options
924 mCdmaOptions.showDialog(mClickedPreference);
925 } else {
926 // do nothing
927 }
928 break;
929
930 default:
931 break;
932 }
933 }
934
935 private static void log(String msg) {
936 Log.d(LOG_TAG, msg);
937 }
938
939 private static void loge(String msg) {
940 Log.e(LOG_TAG, msg);
941 }
942
943 @Override
944 public boolean onOptionsItemSelected(MenuItem item) {
945 final int itemId = item.getItemId();
946 if (itemId == android.R.id.home) { // See ActionBar#setDisplayHomeAsUpEnabled()
947 // Commenting out "logical up" capability. This is a workaround for issue 5278083.
948 //
949 // Settings app may not launch this activity via UP_ACTIVITY_CLASS but the other
950 // Activity that looks exactly same as UP_ACTIVITY_CLASS ("SubSettings" Activity).
951 // At that moment, this Activity launches UP_ACTIVITY_CLASS on top of the Activity.
952 // which confuses users.
953 // TODO: introduce better mechanism for "up" capability here.
954 /*Intent intent = new Intent(Intent.ACTION_MAIN);
955 intent.setClassName(UP_ACTIVITY_PACKAGE, UP_ACTIVITY_CLASS);
956 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
957 startActivity(intent);*/
958 finish();
959 return true;
960 }
961 return super.onOptionsItemSelected(item);
962 }
Rohit Sisodia (a21406)3a4447b2014-10-10 14:05:11 -0500963
964 private boolean isWorldMode() {
965 boolean worldModeOn = false;
966 final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
967 final String configString = getResources().getString(R.string.config_world_mode);
968
969 if (!TextUtils.isEmpty(configString)) {
970 String[] configArray = configString.split(";");
971 // Check if we have World mode configuration set to True only or config is set to True
972 // and SIM GID value is also set and matches to the current SIM GID.
973 if (configArray != null &&
974 ((configArray.length == 1 && configArray[0].equalsIgnoreCase("true")) ||
975 (configArray.length == 2 && !TextUtils.isEmpty(configArray[1]) &&
976 tm != null && configArray[1].equalsIgnoreCase(tm.getGroupIdLevel1())))) {
977 worldModeOn = true;
978 }
979 }
980
981 if (DBG) {
982 log("World mode is set to" + worldModeOn);
983 }
984
985 return worldModeOn;
986 }
Rohit Sisodia (a21406)dfa04102014-11-05 16:42:24 -0600987
988 private void controlGsmOptions(boolean enable) {
989 PreferenceScreen prefSet = getPreferenceScreen();
990 if (prefSet == null) {
991 return;
992 }
993
994 if (enable && mGsmUmtsOptions == null) {
995 mGsmUmtsOptions = new GsmUmtsOptions(this, prefSet);
996 }
997 PreferenceScreen apnExpand =
998 (PreferenceScreen) prefSet.findPreference(BUTTON_APN_EXPAND_KEY);
999 PreferenceScreen operatorSelectionExpand =
1000 (PreferenceScreen) prefSet.findPreference(BUTTON_OPERATOR_SELECTION_EXPAND_KEY);
1001 PreferenceScreen carrierSettings =
1002 (PreferenceScreen) prefSet.findPreference(BUTTON_CARRIER_SETTINGS_KEY);
1003 if (apnExpand != null) {
1004 apnExpand.setEnabled(enable);
1005 }
1006 if (operatorSelectionExpand != null) {
1007 operatorSelectionExpand.setEnabled(enable);
1008 }
1009 if (carrierSettings != null) {
1010 prefSet.removePreference(carrierSettings);
1011 }
1012 }
1013
1014 private void controlCdmaOptions(boolean enable) {
1015 PreferenceScreen prefSet = getPreferenceScreen();
1016 if (prefSet == null) {
1017 return;
1018 }
1019 if (enable && mCdmaOptions == null) {
1020 mCdmaOptions = new CdmaOptions(this, prefSet, mPhone);
1021 }
1022 CdmaSystemSelectListPreference systemSelect =
1023 (CdmaSystemSelectListPreference)prefSet.findPreference
1024 (BUTTON_CDMA_SYSTEM_SELECT_KEY);
1025 if (systemSelect != null) {
1026 systemSelect.setEnabled(enable);
1027 }
1028 }
PauloftheWest3c6ce5e2014-11-03 07:09:47 -08001029
1030 /**
1031 * finds a record with slotId.
1032 * Since the number of SIMs are few, an array is fine.
1033 */
1034 public static SubscriptionInfo findRecordBySlotId(final int slotId) {
1035 final List<SubscriptionInfo> subInfoList =
1036 SubscriptionManager.getActiveSubscriptionInfoList();
1037 final int subInfoLength = subInfoList.size();
1038
1039 for (int i = 0; i < subInfoLength; ++i) {
1040 final SubscriptionInfo sir = subInfoList.get(i);
1041 if (sir.getSimSlotIndex() == slotId) {
1042 //Right now we take the first subscription on a SIM.
1043 return sir;
1044 }
1045 }
1046
1047 return null;
1048 }
Santos Cordon7d4ddf62013-07-10 11:58:08 -07001049}