From 7e2978ab58fef6937d75cf219221eff79b06a6db Mon Sep 17 00:00:00 2001 From: Yi-Ling Chuang Date: Tue, 16 Jul 2019 00:51:52 +0800 Subject: [PATCH] Make EuiccService un-disable-able. Disabling the eSIM Manager could leave the device in a bad state, unable to address the eSIM, and possibly crash due to EuiccConnector failing to find an LPA to implement EuiccService. So here we do not allow users to disable this component. Fixes: 135644632 Test: robotest Change-Id: Ia4ea48b449f121edaff10531b7c975b09432a8f8 --- .../ApplicationFeatureProviderImpl.java | 7 ++ .../ApplicationFeatureProviderImplTest.java | 66 +++++++++++++++++-- 2 files changed, 68 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java index 1fd79971c80..c647b8d2137 100644 --- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java +++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java @@ -33,6 +33,7 @@ import android.text.TextUtils; import android.util.ArraySet; import com.android.internal.telephony.SmsApplication; +import com.android.internal.telephony.euicc.EuiccConnector; import com.android.settings.R; import java.util.ArrayList; @@ -141,6 +142,12 @@ public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvide keepEnabledPackages.add(defaultSms.getPackageName()); } + // Keep Euicc Service enabled. + final ComponentInfo euicc = EuiccConnector.findBestComponent(mPm); + if (euicc != null) { + keepEnabledPackages.add(euicc.packageName); + } + keepEnabledPackages.addAll(getEnabledPackageWhitelist()); final LocationManager locationManager = diff --git a/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java index fcb7518c270..12b93cd3f4b 100644 --- a/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java @@ -27,6 +27,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; +import android.content.pm.ComponentInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; @@ -36,11 +37,12 @@ import android.os.Build; import android.os.UserHandle; import android.os.UserManager; -import com.android.settings.R; +import com.android.internal.telephony.euicc.EuiccConnector; import com.android.settings.testutils.ApplicationTestUtils; import com.android.settingslib.testutils.shadow.ShadowDefaultDialerManager; import com.android.settingslib.testutils.shadow.ShadowSmsApplication; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -49,6 +51,8 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; import org.robolectric.shadows.ShadowApplication; import org.robolectric.util.ReflectionHelpers; @@ -105,6 +109,12 @@ public final class ApplicationFeatureProviderImplTest { mPackageManagerService, mDevicePolicyManager); } + @After + @Config(shadows = {ShadowEuiccConnector.class}) + public void tearDown() { + ShadowEuiccConnector.reset(); + } + private void verifyCalculateNumberOfPolicyInstalledApps(boolean async) { setUpUsersAndInstalledApps(); @@ -165,7 +175,7 @@ public final class ApplicationFeatureProviderImplTest { .thenReturn(PackageManager.INSTALL_REASON_POLICY); mAppCount = -1; - mProvider.calculateNumberOfAppsWithAdminGrantedPermissions(new String[] {PERMISSION}, async, + mProvider.calculateNumberOfAppsWithAdminGrantedPermissions(new String[]{PERMISSION}, async, (num) -> mAppCount = num); if (async) { ShadowApplication.runBackgroundTasks(); @@ -202,7 +212,7 @@ public final class ApplicationFeatureProviderImplTest { .thenReturn(PackageManager.INSTALL_REASON_POLICY); mAppList = null; - mProvider.listAppsWithAdminGrantedPermissions(new String[] {PERMISSION}, + mProvider.listAppsWithAdminGrantedPermissions(new String[]{PERMISSION}, (list) -> mAppList = list); assertThat(mAppList).isNotNull(); assertThat(mAppList.size()).isEqualTo(2); @@ -251,10 +261,10 @@ public final class ApplicationFeatureProviderImplTest { new ApplicationInfo(app2.activityInfo.applicationInfo))); assertThat(mProvider.findPersistentPreferredActivities(MAIN_USER_ID, - new Intent[] {viewIntent, editIntent, sendIntent})) + new Intent[]{viewIntent, editIntent, sendIntent})) .isEqualTo(expectedMainUserActivities); assertThat(mProvider.findPersistentPreferredActivities(MANAGED_PROFILE_ID, - new Intent[] {viewIntent, editIntent, sendIntent})) + new Intent[]{viewIntent, editIntent, sendIntent})) .isEqualTo(expectedManagedUserActivities); } @@ -282,6 +292,33 @@ public final class ApplicationFeatureProviderImplTest { assertThat(keepEnabledPackages).containsAllIn(expectedPackages); } + @Test + @Config(shadows = {ShadowSmsApplication.class, ShadowDefaultDialerManager.class, + ShadowEuiccConnector.class}) + public void getKeepEnabledPackages_hasEuiccComponent_shouldContainEuiccPackage() { + final String testDialer = "com.android.test.defaultdialer"; + final String testSms = "com.android.test.defaultsms"; + final String testLocationHistory = "com.android.test.location.history"; + final String testEuicc = "com.android.test.euicc"; + + ShadowSmsApplication.setDefaultSmsApplication(new ComponentName(testSms, "receiver")); + ShadowDefaultDialerManager.setDefaultDialerApplication(testDialer); + final ComponentInfo componentInfo = new ComponentInfo(); + componentInfo.packageName = testEuicc; + ShadowEuiccConnector.setBestComponent(componentInfo); + + // Spy the real context to mock LocationManager. + Context spyContext = spy(RuntimeEnvironment.application); + when(mLocationManager.getExtraLocationControllerPackage()).thenReturn(testLocationHistory); + when(spyContext.getSystemService(Context.LOCATION_SERVICE)).thenReturn(mLocationManager); + + ReflectionHelpers.setField(mProvider, "mContext", spyContext); + + final Set keepEnabledPackages = mProvider.getKeepEnabledPackages(); + + assertThat(keepEnabledPackages).contains(testEuicc); + } + @Test @Config(shadows = {ShadowSmsApplication.class, ShadowDefaultDialerManager.class}) public void getKeepEnabledPackages_shouldContainSettingsIntelligence() { @@ -354,4 +391,23 @@ public final class ApplicationFeatureProviderImplTest { resolveInfo.activityInfo = activityInfo; return resolveInfo; } + + @Implements(EuiccConnector.class) + public static class ShadowEuiccConnector { + + private static ComponentInfo sBestComponent; + + @Implementation + protected static ComponentInfo findBestComponent(PackageManager packageManager) { + return sBestComponent; + } + + public static void setBestComponent(ComponentInfo componentInfo) { + sBestComponent = componentInfo; + } + + public static void reset() { + sBestComponent = null; + } + } }