diff options
author | Hunter Knepshield <hknepshield@google.com> | 2020-06-18 17:01:01 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-06-18 17:01:01 +0000 |
commit | c84c469250ce09887e0d45e987d76e5f47fa4dd5 (patch) | |
tree | 02e8679e83475ca1e68c079c245566401af8a2c2 | |
parent | 48f424f0f7df9b1609d01538092eb9fed05d19ac (diff) | |
parent | b2839fc8a0b56d22deca36e6c8a4a9e1f15d652d (diff) | |
download | telephony-c84c469250ce09887e0d45e987d76e5f47fa4dd5.tar.gz |
Merge "Add testing for new carrier-associated app behaviors." into rvc-dev
-rw-r--r-- | tests/telephonytests/src/com/android/internal/telephony/CarrierAppUtilsTest.java | 374 |
1 files changed, 364 insertions, 10 deletions
diff --git a/tests/telephonytests/src/com/android/internal/telephony/CarrierAppUtilsTest.java b/tests/telephonytests/src/com/android/internal/telephony/CarrierAppUtilsTest.java index 766a40fa50..a0e5b3319f 100644 --- a/tests/telephonytests/src/com/android/internal/telephony/CarrierAppUtilsTest.java +++ b/tests/telephonytests/src/com/android/internal/telephony/CarrierAppUtilsTest.java @@ -19,7 +19,9 @@ package com.android.internal.telephony; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.os.Build; import android.os.Bundle; +import android.os.CarrierAssociatedAppEntry; import android.os.UserHandle; import android.provider.Settings; import android.telephony.TelephonyManager; @@ -52,12 +54,9 @@ public class CarrierAppUtilsTest { } private static final String ASSOCIATED_APP = "com.example.associated"; - private static final ArrayMap<String, List<String>> ASSOCIATED_APPS = new ArrayMap<>(); - static { - List<String> associatedAppList = new ArrayList<>(); - associatedAppList.add(ASSOCIATED_APP); - ASSOCIATED_APPS.put(CARRIER_APP, associatedAppList); - } + private static final ArrayMap<String, List<CarrierAssociatedAppEntry>> ASSOCIATED_APPS = + makeAssociatedApp(CARRIER_APP, ASSOCIATED_APP, + CarrierAssociatedAppEntry.SDK_UNSPECIFIED); private static final int USER_ID = 12345; private static final String CALLING_PACKAGE = "phone"; @@ -67,6 +66,16 @@ public class CarrierAppUtilsTest { private SettingsMockContentProvider mContentProvider; private MockContentResolver mContentResolver; + private static ArrayMap<String, List<CarrierAssociatedAppEntry>> makeAssociatedApp( + String carrierAppPackage, String associatedAppPackage, int associatedAppAddedInSdk) { + ArrayMap<String, List<CarrierAssociatedAppEntry>> result = new ArrayMap<>(); + List<CarrierAssociatedAppEntry> associatedAppList = new ArrayList<>(); + associatedAppList.add( + new CarrierAssociatedAppEntry(associatedAppPackage, associatedAppAddedInSdk)); + result.put(carrierAppPackage, associatedAppList); + return result; + } + @Before public void setUp() throws Exception { System.setProperty("dexmaker.dexcache", @@ -288,7 +297,8 @@ public class CarrierAppUtilsTest { throws Exception { // Enabling should be done even if this isn't the first run. Settings.Secure.putIntForUser( - mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED, 1, USER_ID); + mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED, Build.VERSION.SDK_INT, + USER_ID); ApplicationInfo appInfo = new ApplicationInfo(); appInfo.packageName = CARRIER_APP; appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; @@ -701,10 +711,11 @@ public class CarrierAppUtilsTest { * disabling has already occurred - should only uninstall configured app. */ @Test @SmallTest - public void testDisableCarrierAppsUntilPrivileged_NoPrivileges_Associated_Default_AlreadyRun() + public void testDisableCarrierAppsUntilPrivileged_NoPrivileges_Associated_Default_HandledSdk() throws Exception { Settings.Secure.putIntForUser( - mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED, 1, USER_ID); + mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED, Build.VERSION.SDK_INT, + USER_ID); ApplicationInfo appInfo = new ApplicationInfo(); appInfo.packageName = CARRIER_APP; appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; @@ -718,7 +729,152 @@ public class CarrierAppUtilsTest { .thenReturn(appInfo); ApplicationInfo associatedAppInfo = new ApplicationInfo(); associatedAppInfo.packageName = ASSOCIATED_APP; - associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM; + associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; + associatedAppInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; + Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP, + PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS + | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS + | PackageManager.MATCH_SYSTEM_ONLY)) + .thenReturn(associatedAppInfo); + Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) + .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS); + // Different associated app SDK than usual. + CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager, + mContentResolver, USER_ID, CARRIER_APPS, + makeAssociatedApp(CARRIER_APP, ASSOCIATED_APP, Build.VERSION.SDK_INT), mContext); + Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP, + PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN); + Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN); + Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP, + PackageManager.SYSTEM_APP_STATE_UNINSTALLED); + Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_INSTALLED); + Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_UNINSTALLED); + } + + /** + * Configured app has no privileges, and is in the default state along with associated app, and + * disabling has already occurred - should only uninstall configured app. + */ + @Test @SmallTest + public void testDCAUP_NoPrivileges_Associated_Default_HandledSdk_AssociatedSdkUnspecified() + throws Exception { + Settings.Secure.putIntForUser( + mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED, Build.VERSION.SDK_INT, + USER_ID); + ApplicationInfo appInfo = new ApplicationInfo(); + appInfo.packageName = CARRIER_APP; + appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; + Mockito.when(mPackageManager + .getApplicationEnabledSetting(Mockito.anyString())) + .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT); + Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, + PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS + | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS + | PackageManager.MATCH_SYSTEM_ONLY)) + .thenReturn(appInfo); + ApplicationInfo associatedAppInfo = new ApplicationInfo(); + associatedAppInfo.packageName = ASSOCIATED_APP; + associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; + associatedAppInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; + Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP, + PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS + | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS + | PackageManager.MATCH_SYSTEM_ONLY)) + .thenReturn(associatedAppInfo); + Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) + .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS); + // Using SDK_UNSPECIFIED for the associated app's addedInSdk. + CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager, + mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext); + Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP, + PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN); + Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN); + Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP, + PackageManager.SYSTEM_APP_STATE_UNINSTALLED); + Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_INSTALLED); + Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_UNINSTALLED); + } + + /** + * Configured app has no privileges, and is in the default state along with associated app, and + * disabling has not yet occurred on this SDK level - should uninstall both since the associated + * app's SDK matches. + */ + @Test @SmallTest + public void testDCAUP_NoPrivileges_Associated_Default_NewSdk_AssociatedSdkCurrent() + throws Exception { + Settings.Secure.putIntForUser( + mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED, + Build.VERSION.SDK_INT - 1, USER_ID); + ApplicationInfo appInfo = new ApplicationInfo(); + appInfo.packageName = CARRIER_APP; + appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; + Mockito.when(mPackageManager + .getApplicationEnabledSetting(Mockito.anyString())) + .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT); + Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, + PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS + | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS + | PackageManager.MATCH_SYSTEM_ONLY)) + .thenReturn(appInfo); + ApplicationInfo associatedAppInfo = new ApplicationInfo(); + associatedAppInfo.packageName = ASSOCIATED_APP; + associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; + associatedAppInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; + Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP, + PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS + | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS + | PackageManager.MATCH_SYSTEM_ONLY)) + .thenReturn(associatedAppInfo); + Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) + .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS); + // Different associated app SDK than usual. + CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager, + mContentResolver, USER_ID, CARRIER_APPS, + makeAssociatedApp(CARRIER_APP, ASSOCIATED_APP, Build.VERSION.SDK_INT), mContext); + Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP, + PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN); + Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN); + Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP, + PackageManager.SYSTEM_APP_STATE_UNINSTALLED); + Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_INSTALLED); + Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_UNINSTALLED); + } + + /** + * Configured app has no privileges, and is in the default state along with associated app, and + * disabling has not yet occurred on the current SDK - should only uninstall configured app + * since the associated app's SDK isn't specified but we've already run at least once. + */ + @Test @SmallTest + public void testDCAUP_NoPrivileges_Associated_Default_NewSdk_AssociatedSdkUnspecified() + throws Exception { + Settings.Secure.putIntForUser( + mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED, + Build.VERSION.SDK_INT - 1, USER_ID); + ApplicationInfo appInfo = new ApplicationInfo(); + appInfo.packageName = CARRIER_APP; + appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; + Mockito.when(mPackageManager + .getApplicationEnabledSetting(Mockito.anyString())) + .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT); + Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, + PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS + | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS + | PackageManager.MATCH_SYSTEM_ONLY)) + .thenReturn(appInfo); + ApplicationInfo associatedAppInfo = new ApplicationInfo(); + associatedAppInfo.packageName = ASSOCIATED_APP; + associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; associatedAppInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP, PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS @@ -727,6 +883,7 @@ public class CarrierAppUtilsTest { .thenReturn(associatedAppInfo); Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS); + // Using SDK_UNSPECIFIED for the associated app's addedInSdk. CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager, mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext); Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP, @@ -741,6 +898,203 @@ public class CarrierAppUtilsTest { PackageManager.SYSTEM_APP_STATE_UNINSTALLED); } + /** + * Configured app has no privileges, and is in the default state along with associated app, and + * disabling has not yet occurred on the current SDK - should only uninstall configured app + * since the associated app's SDK doesn't match. + */ + @Test @SmallTest + public void testDCAUP_NoPrivileges_Associated_Default_NewSdk_AssociatedSdkTooLow() + throws Exception { + Settings.Secure.putIntForUser( + mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED, + Build.VERSION.SDK_INT - 1, USER_ID); + ApplicationInfo appInfo = new ApplicationInfo(); + appInfo.packageName = CARRIER_APP; + appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; + Mockito.when(mPackageManager + .getApplicationEnabledSetting(Mockito.anyString())) + .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT); + Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, + PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS + | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS + | PackageManager.MATCH_SYSTEM_ONLY)) + .thenReturn(appInfo); + ApplicationInfo associatedAppInfo = new ApplicationInfo(); + associatedAppInfo.packageName = ASSOCIATED_APP; + associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; + associatedAppInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; + Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP, + PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS + | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS + | PackageManager.MATCH_SYSTEM_ONLY)) + .thenReturn(associatedAppInfo); + Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) + .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS); + // Different associated app SDK than usual. + CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager, + mContentResolver, USER_ID, CARRIER_APPS, + makeAssociatedApp(CARRIER_APP, ASSOCIATED_APP, Build.VERSION.SDK_INT - 1), + mContext); + Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP, + PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN); + Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN); + Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP, + PackageManager.SYSTEM_APP_STATE_UNINSTALLED); + Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_INSTALLED); + Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_UNINSTALLED); + } + + /** + * Configured app has no privileges, and is in the default state along with associated app, and + * disabling has not yet occurred on this SDK level - should uninstall both since the associated + * app's SDK is newer than the last evaluation. + * + * While this case is expected to feel somewhat strange, it effectively simulates skipping a + * whole SDK level in a single OTA. For example, the device is on P. A new associated app is + * added on Q, but the user doesn't take the OTA. Then, they take the R OTA, at which point the + * associated app should still be disabled if there's no corresponding SIM, because its SDK + * level is newer than our last round of evaluation. + */ + @Test @SmallTest + public void testDCAUP_NoPrivileges_Associated_Default_NewSdk_AssociatedSdkInRange() + throws Exception { + Settings.Secure.putIntForUser( + mContentResolver, Settings.Secure.CARRIER_APPS_HANDLED, + Build.VERSION.SDK_INT - 2, USER_ID); + ApplicationInfo appInfo = new ApplicationInfo(); + appInfo.packageName = CARRIER_APP; + appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; + Mockito.when(mPackageManager + .getApplicationEnabledSetting(Mockito.anyString())) + .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT); + Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, + PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS + | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS + | PackageManager.MATCH_SYSTEM_ONLY)) + .thenReturn(appInfo); + ApplicationInfo associatedAppInfo = new ApplicationInfo(); + associatedAppInfo.packageName = ASSOCIATED_APP; + associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; + associatedAppInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; + Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP, + PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS + | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS + | PackageManager.MATCH_SYSTEM_ONLY)) + .thenReturn(associatedAppInfo); + Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) + .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS); + // Different associated app SDK than usual. + CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager, + mContentResolver, USER_ID, CARRIER_APPS, + makeAssociatedApp(CARRIER_APP, ASSOCIATED_APP, Build.VERSION.SDK_INT - 1), + mContext); + Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP, + PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN); + Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN); + Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP, + PackageManager.SYSTEM_APP_STATE_UNINSTALLED); + Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_INSTALLED); + Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_UNINSTALLED); + } + + /** + * Configured app has no privileges, and is in the default state along with associated app, and + * disabling has not yet occurred ever - should uninstall both regardless of associated app's + * SDK. + */ + @Test @SmallTest + public void testDCAUP_NoPrivileges_Associated_Default_FirstRun_AssociatedSdkCurrent() + throws Exception { + ApplicationInfo appInfo = new ApplicationInfo(); + appInfo.packageName = CARRIER_APP; + appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; + Mockito.when(mPackageManager + .getApplicationEnabledSetting(Mockito.anyString())) + .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT); + Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, + PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS + | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS + | PackageManager.MATCH_SYSTEM_ONLY)) + .thenReturn(appInfo); + ApplicationInfo associatedAppInfo = new ApplicationInfo(); + associatedAppInfo.packageName = ASSOCIATED_APP; + associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; + associatedAppInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; + Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP, + PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS + | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS + | PackageManager.MATCH_SYSTEM_ONLY)) + .thenReturn(associatedAppInfo); + Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) + .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS); + // Different associated app SDK than usual. + CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager, + mContentResolver, USER_ID, CARRIER_APPS, + makeAssociatedApp(CARRIER_APP, ASSOCIATED_APP, Build.VERSION.SDK_INT), mContext); + Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP, + PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN); + Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN); + Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP, + PackageManager.SYSTEM_APP_STATE_UNINSTALLED); + Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_INSTALLED); + Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_UNINSTALLED); + } + + /** + * Configured app has no privileges, and is in the default state along with associated app, and + * disabling has not yet occurred ever - should uninstall both regardless of associated app's + * SDK. + */ + @Test @SmallTest + public void testDCAUP_NoPrivileges_Associated_Default_FirstRun_AssociatedSdkUnspecified() + throws Exception { + ApplicationInfo appInfo = new ApplicationInfo(); + appInfo.packageName = CARRIER_APP; + appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; + Mockito.when(mPackageManager + .getApplicationEnabledSetting(Mockito.anyString())) + .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT); + Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, + PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS + | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS + | PackageManager.MATCH_SYSTEM_ONLY)) + .thenReturn(appInfo); + ApplicationInfo associatedAppInfo = new ApplicationInfo(); + associatedAppInfo.packageName = ASSOCIATED_APP; + associatedAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_INSTALLED; + associatedAppInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; + Mockito.when(mPackageManager.getApplicationInfo(ASSOCIATED_APP, + PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS + | PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS + | PackageManager.MATCH_SYSTEM_ONLY)) + .thenReturn(associatedAppInfo); + Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) + .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS); + // Using SDK_UNSPECIFIED for the associated app's addedInSdk. + CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mTelephonyManager, + mContentResolver, USER_ID, CARRIER_APPS, ASSOCIATED_APPS, mContext); + Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP, + PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN); + Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_HIDDEN_UNTIL_INSTALLED_HIDDEN); + Mockito.verify(mPackageManager).setSystemAppState(CARRIER_APP, + PackageManager.SYSTEM_APP_STATE_UNINSTALLED); + Mockito.verify(mPackageManager, Mockito.never()).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_INSTALLED); + Mockito.verify(mPackageManager).setSystemAppState(ASSOCIATED_APP, + PackageManager.SYSTEM_APP_STATE_UNINSTALLED); + } + /** Telephony is not initialized, and app is in the default state - should uninstall it. */ @Test @SmallTest public void testDisableCarrierAppsUntilPrivileged_NullPrivileges_Default() throws Exception { |