Created tabs for Multi-SIM Cellular Networks.
Bug: 18291246
Change-Id: If8e79056e7f7ffe897472f4b037e711e196c5332
diff --git a/res/layout/network_settings.xml b/res/layout/network_settings.xml
new file mode 100644
index 0000000..d2a4acc
--- /dev/null
+++ b/res/layout/network_settings.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@android:id/tabhost"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout
+ android:id="@+id/tabs_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:scrollbars="none"
+ android:fillViewport="true">
+
+ <TabWidget
+ android:id="@android:id/tabs"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ style="?android:attr/tabWidgetStyle" />
+
+ </HorizontalScrollView>
+
+ <!-- give an empty content area to make tabhost happy -->
+ <FrameLayout
+ android:id="@android:id/tabcontent"
+ android:layout_width="0dip"
+ android:layout_height="0dip" />
+
+ <ListView
+ android:id="@android:id/list"
+ android:layout_width="match_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:smoothScrollbar="false" />
+
+ </LinearLayout>
+
+</TabHost>
diff --git a/src/com/android/phone/MobileNetworkSettings.java b/src/com/android/phone/MobileNetworkSettings.java
index bbef032..306a653 100644
--- a/src/com/android/phone/MobileNetworkSettings.java
+++ b/src/com/android/phone/MobileNetworkSettings.java
@@ -20,9 +20,13 @@
import com.android.ims.ImsException;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.TelephonyProperties;
+import java.util.ArrayList;
+import java.util.List;
+
import android.app.ActionBar;
import android.app.AlertDialog;
import android.content.Context;
@@ -41,13 +45,22 @@
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
+import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
import android.preference.SwitchPreference;
+import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.MenuItem;
+import android.view.View;
+import android.widget.ListView;
+import android.widget.TabHost;
+import android.widget.TabHost.OnTabChangeListener;
+import android.widget.TabHost.TabContentFactory;
+import android.widget.TabHost.TabSpec;
+import android.widget.TabWidget;
/**
* "Mobile network settings" screen. This preference screen lets you
@@ -96,12 +109,17 @@
private Preference mLteDataServicePref;
private static final String iface = "rmnet0"; //TODO: this will go away
+ private List<SubscriptionInfo> mSelectableSubInfos = null;
private UserManager mUm;
private Phone mPhone;
private MyHandler mHandler;
private boolean mOkClicked;
+ private TabHost mTabHost;
+ private TabWidget mTabWidget;
+ private ListView mListView;
+
//GsmUmts options and Cdma options
GsmUmtsOptions mGsmUmtsOptions;
CdmaOptions mCdmaOptions;
@@ -137,6 +155,7 @@
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
/** TODO: Refactor and get rid of the if's using subclasses */
+ final int phoneSubId = mPhone.getSubId();
if (preference.getKey().equals(BUTTON_4G_LTE_KEY)) {
return true;
} else if (mGsmUmtsOptions != null &&
@@ -158,7 +177,8 @@
} else if (preference == mButtonPreferredNetworkMode) {
//displays the value taken from the Settings.System
int settingsNetworkMode = android.provider.Settings.Global.getInt(mPhone.getContext().
- getContentResolver(), android.provider.Settings.Global.PREFERRED_NETWORK_MODE,
+ getContentResolver(),
+ android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
preferredNetworkMode);
mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
return true;
@@ -182,7 +202,8 @@
return true;
} else if (preference == mButtonEnabledNetworks) {
int settingsNetworkMode = android.provider.Settings.Global.getInt(mPhone.getContext().
- getContentResolver(), android.provider.Settings.Global.PREFERRED_NETWORK_MODE,
+ getContentResolver(),
+ android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
preferredNetworkMode);
mButtonEnabledNetworks.setValue(Integer.toString(settingsNetworkMode));
return true;
@@ -206,10 +227,46 @@
android.provider.Settings.Global.ENHANCED_4G_MODE_ENABLED, value);
}
+ private OnTabChangeListener mTabListener = new OnTabChangeListener() {
+ @Override
+ public void onTabChanged(String tabId) {
+ final int slotId = Integer.parseInt(tabId);
+ final SubscriptionInfo sir = findRecordBySlotId(slotId);
+ mPhone = PhoneFactory.getPhone(SubscriptionManager.getPhoneId(sir.getSubscriptionId()));
+
+ // The User has changed tab; update the body.
+ updateBody();
+ }
+ };
+
+ private TabContentFactory mEmptyTabContent = new TabContentFactory() {
+ @Override
+ public View createTabContent(String tag) {
+ return new View(mTabHost.getContext());
+ }
+ };
+
+ private TabSpec buildTabSpec(String tag, String title) {
+ return mTabHost.newTabSpec(tag).setIndicator(title).setContent(
+ mEmptyTabContent);
+ }
+
@Override
protected void onCreate(Bundle icicle) {
setTheme(R.style.Theme_Material_Settings);
super.onCreate(icicle);
+ final Context context = getApplicationContext();
+
+ mSelectableSubInfos = new ArrayList<SubscriptionInfo>();
+ final TelephonyManager tm =
+ (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+
+ for (int i = 0; i < tm.getSimCount(); i++) {
+ SubscriptionInfo sir = findRecordBySlotId(i);
+ if (sir != null) {
+ mSelectableSubInfos.add(sir);
+ }
+ }
mPhone = PhoneGlobals.getPhone();
mHandler = new MyHandler();
@@ -250,11 +307,79 @@
mLteDataServicePref = prefSet.findPreference(BUTTON_CDMA_LTE_DATA_SERVICE_KEY);
+ if (mSelectableSubInfos.size() > 1) {
+ setContentView(R.layout.network_settings);
+
+ mTabHost = (TabHost) findViewById(android.R.id.tabhost);
+ mTabWidget = (TabWidget) findViewById(android.R.id.tabs);
+ mListView = (ListView) findViewById(android.R.id.list);
+
+ mTabHost.setup();
+ mTabHost.setOnTabChangedListener(mTabListener);
+ mTabHost.clearAllTabs();
+
+ for (int i = 0; i < mSelectableSubInfos.size(); i++) {
+ mTabHost.addTab(buildTabSpec(String.valueOf(i),
+ String.valueOf(mSelectableSubInfos.get(i).getDisplayName())));
+ }
+ }
+
+ updateBody();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ if (mUnavailable) {
+ return;
+ }
+
+ // upon resumption from the sub-activity, make sure we re-enable the
+ // preferences.
+ getPreferenceScreen().setEnabled(true);
+
+ // Set UI state in onResume because a user could go home, launch some
+ // app to change this setting's backend, and re-launch this settings app
+ // and the UI state would be inconsistent with actual state
+ mButtonDataRoam.setChecked(mPhone.getDataRoamingEnabled());
+
+ if (getPreferenceScreen().findPreference(BUTTON_PREFERED_NETWORK_MODE) != null) {
+ mPhone.getPreferredNetworkType(mHandler.obtainMessage(
+ MyHandler.MESSAGE_GET_PREFERRED_NETWORK_TYPE));
+ }
+
+ if (getPreferenceScreen().findPreference(BUTTON_ENABLED_NETWORKS_KEY) != null) {
+ mPhone.getPreferredNetworkType(mHandler.obtainMessage(
+ MyHandler.MESSAGE_GET_PREFERRED_NETWORK_TYPE));
+ }
+ }
+
+ private void updateBody() {
+ final Context context = getApplicationContext();
+ final TelephonyManager tm =
+ (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+ PreferenceScreen prefSet = getPreferenceScreen();
boolean isLteOnCdma = mPhone.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE;
+ final int phoneSubId = mPhone.getSubId();
+
+ if (prefSet != null) {
+ prefSet.removeAll();
+ prefSet.addPreference(mButtonDataRoam);
+ prefSet.addPreference(mButtonPreferredNetworkMode);
+ prefSet.addPreference(mButtonEnabledNetworks);
+ }
+
+ int settingsNetworkMode = android.provider.Settings.Global.getInt(
+ mPhone.getContext().getContentResolver(),
+ android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
+ preferredNetworkMode);
+
mIsGlobalCdma = isLteOnCdma && getResources().getBoolean(R.bool.config_show_cdma);
- int shouldHideCarrierSettings = android.provider.Settings.Global.getInt(mPhone.getContext().
- getContentResolver(), android.provider.Settings.Global.HIDE_CARRIER_NETWORK_SETTINGS, 0);
- if (shouldHideCarrierSettings == 1) {
+ int shouldHideCarrierSettings = android.provider.Settings.Global.getInt(
+ mPhone.getContext().getContentResolver(),
+ android.provider.Settings.Global.HIDE_CARRIER_NETWORK_SETTINGS, 0);
+ if (shouldHideCarrierSettings == 1 ) {
prefSet.removePreference(mButtonPreferredNetworkMode);
prefSet.removePreference(mButtonEnabledNetworks);
prefSet.removePreference(mLteDataServicePref);
@@ -264,11 +389,6 @@
// change Preferred Network Mode.
mButtonPreferredNetworkMode.setOnPreferenceChangeListener(this);
- //Get the networkMode from Settings.System and displays it
- int settingsNetworkMode = android.provider.Settings.Global.getInt(mPhone.getContext().
- getContentResolver(),android.provider.Settings.Global.PREFERRED_NETWORK_MODE,
- preferredNetworkMode);
- mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
mCdmaOptions = new CdmaOptions(this, prefSet, mPhone);
mGsmUmtsOptions = new GsmUmtsOptions(this, prefSet);
} else {
@@ -324,12 +444,7 @@
R.array.preferred_network_mode_values_world_mode);
}
mButtonEnabledNetworks.setOnPreferenceChangeListener(this);
- int settingsNetworkMode = android.provider.Settings.Global.getInt(
- mPhone.getContext().getContentResolver(),
- android.provider.Settings.Global.PREFERRED_NETWORK_MODE,
- preferredNetworkMode);
if (DBG) log("settingsNetworkMode: " + settingsNetworkMode);
- mButtonEnabledNetworks.setValue(Integer.toString(settingsNetworkMode));
}
final boolean missingDataServiceUrl = TextUtils.isEmpty(
@@ -367,34 +482,13 @@
root.removePreference(ps);
}
}
- }
- @Override
- protected void onResume() {
- super.onResume();
-
- if (mUnavailable) {
- return;
- }
-
- // upon resumption from the sub-activity, make sure we re-enable the
- // preferences.
- getPreferenceScreen().setEnabled(true);
-
- // Set UI state in onResume because a user could go home, launch some
- // app to change this setting's backend, and re-launch this settings app
- // and the UI state would be inconsistent with actual state
+ //Get the networkMode from Settings.System and displays it
mButtonDataRoam.setChecked(mPhone.getDataRoamingEnabled());
-
- if (getPreferenceScreen().findPreference(BUTTON_PREFERED_NETWORK_MODE) != null) {
- mPhone.getPreferredNetworkType(mHandler.obtainMessage(
- MyHandler.MESSAGE_GET_PREFERRED_NETWORK_TYPE));
- }
-
- if (getPreferenceScreen().findPreference(BUTTON_ENABLED_NETWORKS_KEY) != null) {
- mPhone.getPreferredNetworkType(mHandler.obtainMessage(
- MyHandler.MESSAGE_GET_PREFERRED_NETWORK_TYPE));
- }
+ mButtonEnabledNetworks.setValue(Integer.toString(settingsNetworkMode));
+ mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
+ UpdatePreferredNetworkModeSummary(settingsNetworkMode);
+ UpdateEnabledNetworksValueAndSummary(settingsNetworkMode);
}
@Override
@@ -411,6 +505,7 @@
* display value.
*/
public boolean onPreferenceChange(Preference preference, Object objValue) {
+ final int phoneSubId = mPhone.getSubId();
if (preference == mButtonPreferredNetworkMode) {
//NOTE onPreferenceChange seems to be called even if there is no change
//Check if the button value is changed from the System.Setting
@@ -419,7 +514,8 @@
buttonNetworkMode = Integer.valueOf((String) objValue).intValue();
int settingsNetworkMode = android.provider.Settings.Global.getInt(
mPhone.getContext().getContentResolver(),
- android.provider.Settings.Global.PREFERRED_NETWORK_MODE, preferredNetworkMode);
+ android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
+ preferredNetworkMode);
if (buttonNetworkMode != settingsNetworkMode) {
int modemNetworkMode;
// if new mode is invalid ignore it
@@ -448,7 +544,7 @@
UpdatePreferredNetworkModeSummary(buttonNetworkMode);
android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(),
- android.provider.Settings.Global.PREFERRED_NETWORK_MODE,
+ android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
buttonNetworkMode );
//Set the modem network mode
mPhone.setPreferredNetworkType(modemNetworkMode, mHandler
@@ -461,7 +557,8 @@
if (DBG) log("buttonNetworkMode: " + buttonNetworkMode);
int settingsNetworkMode = android.provider.Settings.Global.getInt(
mPhone.getContext().getContentResolver(),
- android.provider.Settings.Global.PREFERRED_NETWORK_MODE, preferredNetworkMode);
+ android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
+ preferredNetworkMode);
if (buttonNetworkMode != settingsNetworkMode) {
int modemNetworkMode;
// if new mode is invalid ignore it
@@ -484,7 +581,7 @@
UpdateEnabledNetworksValueAndSummary(buttonNetworkMode);
android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(),
- android.provider.Settings.Global.PREFERRED_NETWORK_MODE,
+ android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
buttonNetworkMode );
//Set the modem network mode
mPhone.setPreferredNetworkType(modemNetworkMode, mHandler
@@ -549,6 +646,7 @@
}
private void handleGetPreferredNetworkTypeResponse(Message msg) {
+ final int phoneSubId = mPhone.getSubId();
AsyncResult ar = (AsyncResult) msg.obj;
if (ar.exception == null) {
@@ -561,7 +659,7 @@
int settingsNetworkMode = android.provider.Settings.Global.getInt(
mPhone.getContext().getContentResolver(),
- android.provider.Settings.Global.PREFERRED_NETWORK_MODE,
+ android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
preferredNetworkMode);
if (DBG) {
@@ -615,17 +713,18 @@
private void handleSetPreferredNetworkTypeResponse(Message msg) {
AsyncResult ar = (AsyncResult) msg.obj;
+ final int phoneSubId = mPhone.getSubId();
if (ar.exception == null) {
int networkMode = Integer.valueOf(
mButtonPreferredNetworkMode.getValue()).intValue();
android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(),
- android.provider.Settings.Global.PREFERRED_NETWORK_MODE,
+ android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
networkMode );
networkMode = Integer.valueOf(
mButtonEnabledNetworks.getValue()).intValue();
android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(),
- android.provider.Settings.Global.PREFERRED_NETWORK_MODE,
+ android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
networkMode );
} else {
mPhone.getPreferredNetworkType(obtainMessage(MESSAGE_GET_PREFERRED_NETWORK_TYPE));
@@ -633,12 +732,13 @@
}
private void resetNetworkModeToDefault() {
+ final int phoneSubId = mPhone.getSubId();
//set the mButtonPreferredNetworkMode
mButtonPreferredNetworkMode.setValue(Integer.toString(preferredNetworkMode));
mButtonEnabledNetworks.setValue(Integer.toString(preferredNetworkMode));
//set the Settings.System
android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(),
- android.provider.Settings.Global.PREFERRED_NETWORK_MODE,
+ android.provider.Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId,
preferredNetworkMode );
//Set the Modem
mPhone.setPreferredNetworkType(preferredNetworkMode,
@@ -925,4 +1025,24 @@
systemSelect.setEnabled(enable);
}
}
+
+ /**
+ * finds a record with slotId.
+ * Since the number of SIMs are few, an array is fine.
+ */
+ public static SubscriptionInfo findRecordBySlotId(final int slotId) {
+ final List<SubscriptionInfo> subInfoList =
+ SubscriptionManager.getActiveSubscriptionInfoList();
+ final int subInfoLength = subInfoList.size();
+
+ for (int i = 0; i < subInfoLength; ++i) {
+ final SubscriptionInfo sir = subInfoList.get(i);
+ if (sir.getSimSlotIndex() == slotId) {
+ //Right now we take the first subscription on a SIM.
+ return sir;
+ }
+ }
+
+ return null;
+ }
}
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 8e79366..f0e37f2 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -1851,12 +1851,13 @@
@Override
public boolean setPreferredNetworkType(int networkType) {
enforceModifyPermissionOrCarrierPrivilege();
+ final int phoneSubId = mPhone.getSubId();
if (DBG) log("setPreferredNetworkType: type " + networkType);
Boolean success = (Boolean) sendRequest(CMD_SET_PREFERRED_NETWORK_TYPE, networkType);
if (DBG) log("setPreferredNetworkType: " + (success ? "ok" : "fail"));
if (success) {
Settings.Global.putInt(mPhone.getContext().getContentResolver(),
- Settings.Global.PREFERRED_NETWORK_MODE, networkType);
+ Settings.Global.PREFERRED_NETWORK_MODE + phoneSubId, networkType);
}
return success;
}