From f1c13fa82037c879ae0e3c6d1e0d69fa620e69e7 Mon Sep 17 00:00:00 2001 From: Jeff Davidson Date: Fri, 19 May 2017 17:03:32 -0700 Subject: [PATCH] Hide "Wipe eUICC" option when it isn't useful. If a user never downloaded a profile onto their eUICC, there's no reason to offer the wipe option, and it would only cause confusion. But show the option nonetheless if developer options are enabled. Bug: 38460669 Test: TreeHugger / Unit test / Manual verification Change-Id: I51fb7b9e75c4f9a46ee0b24e64bddfafcbd48b14 --- src/com/android/settings/MasterClear.java | 30 +++++++++-- .../src/com/android/settings/MasterClearTest.java | 59 ++++++++++++++++++++++ 2 files changed, 86 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/MasterClear.java b/src/com/android/settings/MasterClear.java index 77c6091a56..dc4c995999 100644 --- a/src/com/android/settings/MasterClear.java +++ b/src/com/android/settings/MasterClear.java @@ -23,6 +23,7 @@ import android.accounts.AccountManager; import android.accounts.AuthenticatorDescription; import android.app.Activity; import android.app.FragmentManager; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -34,6 +35,7 @@ import android.os.Environment; import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; +import android.provider.Settings; import android.support.annotation.VisibleForTesting; import android.telephony.euicc.EuiccManager; import android.util.Log; @@ -208,9 +210,7 @@ public class MasterClear extends OptionsMenuFragment }); } - EuiccManager euiccManager = - (EuiccManager) getActivity().getSystemService(Context.EUICC_SERVICE); - if (euiccManager.isEnabled()) { + if (showWipeEuicc()) { mEsimStorageContainer.setOnClickListener(new View.OnClickListener() { @Override @@ -244,6 +244,30 @@ public class MasterClear extends OptionsMenuFragment mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener); } + /** + * Whether to show the checkbox to wipe the eUICC. + * + *

We show the checkbox on any device which supports eUICC as long as either the eUICC was + * ever provisioned (that is, at least one profile was ever downloaded onto it), or if the user + * has enabled development mode. + */ + @VisibleForTesting + boolean showWipeEuicc() { + Context context = getContext(); + if (!isEuiccEnabled(context)) { + return false; + } + ContentResolver cr = context.getContentResolver(); + return Settings.Global.getInt(cr, Settings.Global.EUICC_PROVISIONED, 0) != 0 + || Settings.Global.getInt(cr, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0; + } + + @VisibleForTesting + protected boolean isEuiccEnabled(Context context) { + EuiccManager euiccManager = (EuiccManager) context.getSystemService(Context.EUICC_SERVICE); + return euiccManager.isEnabled(); + } + @VisibleForTesting boolean hasReachedBottom(final ScrollView scrollView) { if (scrollView.getChildCount() < 1) { diff --git a/tests/robotests/src/com/android/settings/MasterClearTest.java b/tests/robotests/src/com/android/settings/MasterClearTest.java index 98b33d3c21..9af2b5f1d2 100644 --- a/tests/robotests/src/com/android/settings/MasterClearTest.java +++ b/tests/robotests/src/com/android/settings/MasterClearTest.java @@ -17,13 +17,18 @@ package com.android.settings; import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; import android.app.Activity; import android.app.Fragment; +import android.content.ContentResolver; import android.os.Bundle; +import android.provider.Settings; import android.view.LayoutInflater; import android.view.View; import android.widget.CheckBox; @@ -83,6 +88,60 @@ public class MasterClearTest { } @Test + public void testShowWipeEuicc_euiccDisabled() { + prepareEuiccState( + false /* isEuiccEnabled */, true /* isEuiccProvisioned */, + true /* isDevelopmentSettingsEnabled */); + assertThat(mMasterClear.showWipeEuicc()).isFalse(); + } + + @Test + public void testShowWipeEuicc_euiccEnabled_unprovisioned() { + prepareEuiccState( + true /* isEuiccEnabled */, false /* isEuiccProvisioned */, + false /* isDevelopmentSettingsEnabled */); + assertThat(mMasterClear.showWipeEuicc()).isFalse(); + } + + @Test + public void testShowWipeEuicc_euiccEnabled_provisioned() { + prepareEuiccState( + true /* isEuiccEnabled */, true /* isEuiccProvisioned */, + false /* isDevelopmentSettingsEnabled */); + assertThat(mMasterClear.showWipeEuicc()).isTrue(); + } + + @Test + public void testShowWipeEuicc_euiccEnabled_developmentSettingsEnabled() { + prepareEuiccState( + true /* isEuiccEnabled */, false /* isEuiccProvisioned */, + true /* isDevelopmentSettingsEnabled */); + assertThat(mMasterClear.showWipeEuicc()).isTrue(); + } + + @Test + public void testShowWipeEuicc_euiccEnabled_provisioned_developmentSettingsEnabled() { + prepareEuiccState( + true /* isEuiccEnabled */, true /* isEuiccProvisioned */, + true /* isDevelopmentSettingsEnabled */); + assertThat(mMasterClear.showWipeEuicc()).isTrue(); + } + + private void prepareEuiccState( + boolean isEuiccEnabled, + boolean isEuiccProvisioned, + boolean isDevelopmentSettingsEnabled) { + doReturn(mActivity).when(mMasterClear).getContext(); + doReturn(isEuiccEnabled).when(mMasterClear).isEuiccEnabled(any()); + ContentResolver cr = mActivity.getContentResolver(); + Settings.Global.putInt( + cr, android.provider.Settings.Global.EUICC_PROVISIONED, isEuiccProvisioned ? 1 : 0); + Settings.Global.putInt( + cr, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, + isDevelopmentSettingsEnabled ? 1 : 0); + } + + @Test public void testShowFinalConfirmation_EraseEsimChecked() { ActivityForTest testActivity = new ActivityForTest(); when(mMasterClear.getActivity()).thenReturn(testActivity); -- 2.11.0