OSDN Git Service

Hide "Wipe eUICC" option when it isn't useful.
authorJeff Davidson <jpd@google.com>
Sat, 20 May 2017 00:03:32 +0000 (17:03 -0700)
committerJeff Davidson <jpd@google.com>
Wed, 24 May 2017 23:20:58 +0000 (16:20 -0700)
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
tests/robotests/src/com/android/settings/MasterClearTest.java

index 77c6091..dc4c995 100644 (file)
@@ -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.
+     *
+     * <p>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) {
index 98b33d3..9af2b5f 100644 (file)
 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);