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
This commit is contained in:
Jeff Davidson
2017-05-19 17:03:32 -07:00
parent 47a7d102c6
commit f1c13fa820
2 changed files with 86 additions and 3 deletions

View File

@@ -23,6 +23,7 @@ import android.accounts.AccountManager;
import android.accounts.AuthenticatorDescription; import android.accounts.AuthenticatorDescription;
import android.app.Activity; import android.app.Activity;
import android.app.FragmentManager; import android.app.FragmentManager;
import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@@ -34,6 +35,7 @@ import android.os.Environment;
import android.os.SystemProperties; import android.os.SystemProperties;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.provider.Settings;
import android.support.annotation.VisibleForTesting; import android.support.annotation.VisibleForTesting;
import android.telephony.euicc.EuiccManager; import android.telephony.euicc.EuiccManager;
import android.util.Log; import android.util.Log;
@@ -208,9 +210,7 @@ public class MasterClear extends OptionsMenuFragment
}); });
} }
EuiccManager euiccManager = if (showWipeEuicc()) {
(EuiccManager) getActivity().getSystemService(Context.EUICC_SERVICE);
if (euiccManager.isEnabled()) {
mEsimStorageContainer.setOnClickListener(new View.OnClickListener() { mEsimStorageContainer.setOnClickListener(new View.OnClickListener() {
@Override @Override
@@ -244,6 +244,30 @@ public class MasterClear extends OptionsMenuFragment
mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener); 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 @VisibleForTesting
boolean hasReachedBottom(final ScrollView scrollView) { boolean hasReachedBottom(final ScrollView scrollView) {
if (scrollView.getChildCount() < 1) { if (scrollView.getChildCount() < 1) {

View File

@@ -17,13 +17,18 @@
package com.android.settings; package com.android.settings;
import static com.google.common.truth.Truth.assertThat; 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.spy;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf; import static org.robolectric.Shadows.shadowOf;
import android.app.Activity; import android.app.Activity;
import android.app.Fragment; import android.app.Fragment;
import android.content.ContentResolver;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.CheckBox; import android.widget.CheckBox;
@@ -82,6 +87,60 @@ public class MasterClearTest {
when(mScrollView.getChildCount()).thenReturn(1); when(mScrollView.getChildCount()).thenReturn(1);
} }
@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 @Test
public void testShowFinalConfirmation_EraseEsimChecked() { public void testShowFinalConfirmation_EraseEsimChecked() {
ActivityForTest testActivity = new ActivityForTest(); ActivityForTest testActivity = new ActivityForTest();