Merge "Refactor Cdma preference in ECM"
diff --git a/res/xml/network_setting_fragment.xml b/res/xml/network_setting_fragment.xml
index 43cadab..f6b8bed 100644
--- a/res/xml/network_setting_fragment.xml
+++ b/res/xml/network_setting_fragment.xml
@@ -99,7 +99,7 @@
</PreferenceCategory>
- <ListPreference
+ <com.android.settings.network.telephony.cdma.CdmaListPreference
android:key="cdma_system_select_key"
android:title="@string/cdma_system_select_title"
android:summary="@string/cdma_system_select_summary"
@@ -108,7 +108,7 @@
android:dialogTitle="@string/cdma_system_select_dialogtitle"
settings:controller="com.android.settings.network.telephony.cdma.CdmaSystemSelectPreferenceController"/>
- <ListPreference
+ <com.android.settings.network.telephony.cdma.CdmaListPreference
android:key="cdma_subscription_key"
android:title="@string/cdma_subscription_title"
android:summary="@string/cdma_subscription_summary"
diff --git a/src/com/android/settings/network/telephony/MobileNetworkFragment.java b/src/com/android/settings/network/telephony/MobileNetworkFragment.java
index b31c1a1..4b1e27a 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkFragment.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkFragment.java
@@ -19,6 +19,7 @@
import static android.provider.Telephony.Carriers.ENFORCE_MANAGED_URI;
import android.app.ActionBar;
+import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -41,6 +42,7 @@
import android.util.Log;
import android.view.MenuItem;
+import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.FragmentActivity;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
@@ -73,6 +75,8 @@
private static final String LOG_TAG = "NetworkSettings";
private static final boolean DBG = true;
public static final int REQUEST_CODE_EXIT_ECM = 17;
+ @VisibleForTesting
+ static final String KEY_CLICKED_PREF = "key_clicked_pref";
//String keys for preference lookup
private static final String BUTTON_PREFERED_NETWORK_MODE = "preferred_network_mode_key";
@@ -123,9 +127,8 @@
//GsmUmts options and Cdma options
GsmUmtsOptions mGsmUmtsOptions;
- CdmaOptions mCdmaOptions;
- private Preference mClickedPreference;
+ private String mClickedPrefKey;
private boolean mShow4GForLTE;
private boolean mIsGlobalCdma;
private boolean mOnlyAutoSelectInHomeNW;
@@ -148,6 +151,7 @@
return true;
}
sendMetricsEventPreferenceClicked(getPreferenceScreen(), preference);
+ final String key = preference.getKey();
/** TODO: Refactor and get rid of the if's using subclasses */
if (preference.getKey().equals(BUTTON_4G_LTE_KEY)) {
@@ -155,16 +159,13 @@
} else if (mGsmUmtsOptions != null &&
mGsmUmtsOptions.preferenceTreeClick(preference) == true) {
return true;
- } else if (mCdmaOptions != null &&
- mCdmaOptions.preferenceTreeClick(preference) == true) {
+ } else if (TextUtils.equals(key, BUTTON_CDMA_SYSTEM_SELECT_KEY)
+ || TextUtils.equals(key, BUTTON_CDMA_SUBSCRIPTION_KEY)) {
if (mTelephonyManager.getEmergencyCallbackMode()) {
-
- mClickedPreference = preference;
-
- // In ECM mode launch ECM app dialog
startActivityForResult(
new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null),
REQUEST_CODE_EXIT_ECM);
+ mClickedPrefKey = key;
}
return true;
}
@@ -262,6 +263,15 @@
updatePhone();
Log.i(LOG_TAG, "onCreate:-");
+
+ onRestoreInstance(icicle);
+ }
+
+ @VisibleForTesting
+ void onRestoreInstance(Bundle icicle) {
+ if (icicle != null) {
+ mClickedPrefKey = icicle.getString(KEY_CLICKED_PREF);
+ }
}
@Override
@@ -342,6 +352,12 @@
return null;
}
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putString(KEY_CLICKED_PREF, mClickedPrefKey);
+ }
+
private boolean hasActiveSubscriptions() {
return mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID;
}
@@ -405,9 +421,7 @@
== ServiceState.STATE_IN_SERVICE) {
final int phoneType = mTelephonyManager.getPhoneType();
- if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {
- updateCdmaOptions(this, prefSet, mSubId);
- } else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
+ if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
updateGsmUmtsOptions(this, prefSet, phoneSubId);
} else {
throw new IllegalStateException("Unexpected phone type: " + phoneType);
@@ -420,7 +434,6 @@
// set the listener for the mButtonPreferredNetworkMode list preference so we can issue
// change Preferred Network Mode.
- updateCdmaOptions(this, prefSet, mSubId);
updateGsmUmtsOptions(this, prefSet, phoneSubId);
}
@@ -513,33 +526,17 @@
return true;
}
- private boolean is4gLtePrefEnabled(PersistableBundle carrierConfig) {
- return (mTelephonyManager.getCallState(mSubId)
- == TelephonyManager.CALL_STATE_IDLE)
- && mImsMgr != null
- && mImsMgr.isNonTtyOrTtyOnVolteEnabled()
- && carrierConfig.getBoolean(
- CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL);
- }
-
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CODE_EXIT_ECM:
- Boolean isChoiceYes = data.getBooleanExtra(
- EXTRA_EXIT_ECM_RESULT, false);
- if (isChoiceYes) {
- // If the phone exits from ECM mode, show the CDMA Options
- final String key = mClickedPreference.getKey();
- if (TextUtils.equals(key,
- mCdmaSystemSelectPreferenceController.getPreferenceKey())) {
- mCdmaSystemSelectPreferenceController.showDialog();
- } else if (TextUtils.equals(key,
- mCdmaSubscriptionPreferenceController.getPreferenceKey())) {
- mCdmaSubscriptionPreferenceController.showDialog();
+ if (resultCode != Activity.RESULT_CANCELED) {
+ // If the phone exits from ECM mode, show the CDMA
+ final Preference preference = getPreferenceScreen()
+ .findPreference(mClickedPrefKey);
+ if (preference != null) {
+ preference.performClick();
}
- } else {
- // do nothing
}
break;
@@ -624,14 +621,6 @@
}
}
- private void controlCdmaOptions(boolean enable) {
- PreferenceScreen prefSet = getPreferenceScreen();
- if (prefSet == null) {
- return;
- }
- updateCdmaOptions(this, prefSet, mSubId);
- }
-
private boolean isSupportTdscdma() {
if (getResources().getBoolean(R.bool.config_support_tdscdma)) {
return true;
@@ -733,16 +722,6 @@
}
}
- private void updateCdmaOptions(PreferenceFragmentCompat prefFragment, PreferenceScreen prefScreen,
- int subId) {
- // We don't want to re-create CdmaOptions if already exists. Otherwise, the preferences
- // inside it will also be re-created which causes unexpected behavior. For example,
- // the open dialog gets dismissed or detached after pause / resume.
- if (mCdmaOptions == null) {
- mCdmaOptions = new CdmaOptions(prefFragment, prefScreen, subId);
- }
- }
-
private static Intent buildPhoneAccountConfigureIntent(
Context context, PhoneAccountHandle accountHandle) {
Intent intent = buildConfigureIntent(
diff --git a/src/com/android/settings/network/telephony/cdma/CdmaBasePreferenceController.java b/src/com/android/settings/network/telephony/cdma/CdmaBasePreferenceController.java
index 3e9ebc6..6258f9d 100644
--- a/src/com/android/settings/network/telephony/cdma/CdmaBasePreferenceController.java
+++ b/src/com/android/settings/network/telephony/cdma/CdmaBasePreferenceController.java
@@ -82,6 +82,9 @@
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
+ if (mPreference instanceof CdmaListPreference) {
+ ((CdmaListPreference) mPreference).setSubId(mSubId);
+ }
}
/**
diff --git a/src/com/android/settings/network/telephony/cdma/CdmaListPreference.java b/src/com/android/settings/network/telephony/cdma/CdmaListPreference.java
new file mode 100644
index 0000000..14c7169
--- /dev/null
+++ b/src/com/android/settings/network/telephony/cdma/CdmaListPreference.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+package com.android.settings.network.telephony.cdma;
+
+import android.content.Context;
+import android.telephony.TelephonyManager;
+import android.util.AttributeSet;
+
+import androidx.preference.ListPreference;
+
+/**
+ * {@link ListPreference} that will launch ECM dialog when in ECM mode
+ */
+public class CdmaListPreference extends ListPreference {
+ private TelephonyManager mTelephonyManager;
+
+ public CdmaListPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onClick() {
+ // Only show dialog when it is not in ECM
+ if (mTelephonyManager == null || !mTelephonyManager.getEmergencyCallbackMode()) {
+ super.onClick();
+ }
+ }
+
+ public void setSubId(int subId) {
+ mTelephonyManager = TelephonyManager.from(getContext()).createForSubscriptionId(subId);
+ }
+}
diff --git a/src/com/android/settings/network/telephony/cdma/CdmaSubscriptionPreferenceController.java b/src/com/android/settings/network/telephony/cdma/CdmaSubscriptionPreferenceController.java
index eb14664..41bf3ef 100644
--- a/src/com/android/settings/network/telephony/cdma/CdmaSubscriptionPreferenceController.java
+++ b/src/com/android/settings/network/telephony/cdma/CdmaSubscriptionPreferenceController.java
@@ -77,14 +77,6 @@
return false;
}
- public void showDialog() {
- final int mode = Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.CDMA_SUBSCRIPTION_MODE, Phone.PREFERRED_CDMA_SUBSCRIPTION);
-
- mPreference.setValue(Integer.toString(mode));
- mPreferenceManager.showDialog(mPreference);
- }
-
@VisibleForTesting
boolean deviceSupportsNvAndRuim() {
// retrieve the list of subscription types supported by device.
diff --git a/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java b/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
index 95e5dae..4119c64 100644
--- a/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
+++ b/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
@@ -62,12 +62,6 @@
return false;
}
- public void showDialog() {
- if (!mTelephonyManager.getEmergencyCallbackMode()) {
- mPreferenceManager.showDialog(mPreference);
- }
- }
-
private void resetCdmaRoamingModeToDefault() {
final ListPreference listPreference = (ListPreference) mPreference;
//set the mButtonCdmaRoam
diff --git a/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaListPreferenceTest.java b/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaListPreferenceTest.java
new file mode 100644
index 0000000..8945649
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaListPreferenceTest.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2018 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.
+ */
+
+package com.android.settings.network.telephony.cdma;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.telephony.TelephonyManager;
+
+import androidx.preference.PreferenceManager;
+
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class CdmaListPreferenceTest {
+ private static final int SUB_ID = 2;
+
+ @Mock
+ private TelephonyManager mTelephonyManager;
+ @Mock
+ private PreferenceManager mPreferenceManager;
+
+ private CdmaListPreference mPreference;
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mContext = spy(RuntimeEnvironment.application);
+ doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
+ doReturn(mTelephonyManager).when(mContext).getSystemService(TelephonyManager.class);
+ doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
+
+ mPreference = spy(new CdmaListPreference(mContext, null));
+ mPreference.setSubId(SUB_ID);
+ }
+
+ @Test
+ public void onClick_inEcm_doNothing() {
+ doReturn(true).when(mTelephonyManager).getEmergencyCallbackMode();
+
+ mPreference.onClick();
+
+ verify(mPreferenceManager, never()).showDialog(mPreference);
+ }
+}