Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 314fa4be authored by Jeff Davidson's avatar Jeff Davidson
Browse files

Always regrant default permissions even if app is enabled.

We can safely skip the call to setApplicationEnabledSetting in this
case, but we should still call grantDefaultPermissions to ensure that
we re-evaluate defaults when the carrier privilege rules has changed.

This fixes userdebug OTAs where the permissions are cleared, as we
were not re-granting them after the SIM was inserted, but it is safer
in general.

Bug: 22088420
Change-Id: Ied518653790e1fbf026cd3f0ec4de22e3b21f0ba
parent 03540ca9
Loading
Loading
Loading
Loading
+16 −9
Original line number Diff line number Diff line
@@ -86,15 +86,22 @@ public final class CarrierAppUtils {
                boolean hasPrivileges =
                        telephonyManager.checkCarrierPrivilegesForPackageAnyPhone(packageName) ==
                                TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
                if (hasPrivileges
                        && (ai.enabledSetting == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
                if (hasPrivileges) {
                    if (ai.enabledSetting == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
                            || ai.enabledSetting ==
                                PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED)) {
                    Slog.i(TAG, "Update state(" + packageName + "): ENABLED for user " + userId);
                                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) {
                        Slog.i(TAG, "Update state(" + packageName + "): ENABLED for user "
                                + userId);
                        anyAppsEnabled = true;
                        packageManager.setApplicationEnabledSetting(packageName,
                                PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0, userId,
                                callingPackage);
                    } else if (ai.enabledSetting ==
                            PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
                        // If we're already enabled, don't bother re-enabling, but treat the app as
                        // enabled so that we re-grant default permissions in case they were lost.
                        anyAppsEnabled = true;
                    }
                } else if (!hasPrivileges
                        && ai.enabledSetting == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
                    Slog.i(TAG, "Update state(" + packageName + "): DISABLED_UNTIL_USED for user "
+11 −1
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ public class CarrierAppUtilsTest extends InstrumentationTestCase {
        Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting(
                Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(),
                Mockito.anyString());
        Mockito.verify(mPackageManager, Mockito.never()).grantDefaultPermissions(Mockito.anyInt());
        Mockito.verifyNoMoreInteractions(mTelephonyManager);
    }

@@ -73,6 +74,7 @@ public class CarrierAppUtilsTest extends InstrumentationTestCase {
        Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting(
                Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(),
                Mockito.anyString());
        Mockito.verify(mPackageManager, Mockito.never()).grantDefaultPermissions(Mockito.anyInt());
        Mockito.verifyNoMoreInteractions(mTelephonyManager);
    }

@@ -92,6 +94,7 @@ public class CarrierAppUtilsTest extends InstrumentationTestCase {
        Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting(
                Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(),
                Mockito.anyString());
        Mockito.verify(mPackageManager, Mockito.never()).grantDefaultPermissions(Mockito.anyInt());
    }

    /** Configured app has privileges, but was disabled - should do nothing. */
@@ -109,9 +112,10 @@ public class CarrierAppUtilsTest extends InstrumentationTestCase {
        Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting(
                Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(),
                Mockito.anyString());
        Mockito.verify(mPackageManager, Mockito.never()).grantDefaultPermissions(Mockito.anyInt());
    }

    /** Configured app has privileges, and is already enabled - should do nothing. */
    /** Configured app has privileges, and is already enabled - should only grant permissions. */
    public void testDisableCarrierAppsUntilPrivileged_HasPrivileges_Enabled() throws Exception {
        ApplicationInfo appInfo = new ApplicationInfo();
        appInfo.packageName = CARRIER_APP;
@@ -126,6 +130,7 @@ public class CarrierAppUtilsTest extends InstrumentationTestCase {
        Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting(
                Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(),
                Mockito.anyString());
        Mockito.verify(mPackageManager).grantDefaultPermissions(USER_ID);
    }

    /** Configured app has privileges, and is in the default state - should enable. */
@@ -180,6 +185,7 @@ public class CarrierAppUtilsTest extends InstrumentationTestCase {
        Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting(
                Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(),
                Mockito.anyString());
        Mockito.verify(mPackageManager, Mockito.never()).grantDefaultPermissions(Mockito.anyInt());
    }

    /** Configured app has no privileges, and was disabled - should do nothing. */
@@ -197,6 +203,7 @@ public class CarrierAppUtilsTest extends InstrumentationTestCase {
        Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting(
                Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(),
                Mockito.anyString());
        Mockito.verify(mPackageManager, Mockito.never()).grantDefaultPermissions(Mockito.anyInt());
    }

    /** Configured app has no privileges, and is explicitly enabled - should do nothing. */
@@ -214,6 +221,7 @@ public class CarrierAppUtilsTest extends InstrumentationTestCase {
        Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting(
                Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(),
                Mockito.anyString());
        Mockito.verify(mPackageManager, Mockito.never()).grantDefaultPermissions(Mockito.anyInt());
    }

    /** Configured app has no privileges, and is in the default state - should disable until use. */
@@ -231,6 +239,7 @@ public class CarrierAppUtilsTest extends InstrumentationTestCase {
        Mockito.verify(mPackageManager).setApplicationEnabledSetting(
                CARRIER_APP, PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED, 0, USER_ID,
                CALLING_PACKAGE);
        Mockito.verify(mPackageManager, Mockito.never()).grantDefaultPermissions(Mockito.anyInt());
    }

    /** Configured app has no privileges, and is disabled until used - should do nothing. */
@@ -249,6 +258,7 @@ public class CarrierAppUtilsTest extends InstrumentationTestCase {
        Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting(
                Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(),
                Mockito.anyString());
        Mockito.verify(mPackageManager, Mockito.never()).grantDefaultPermissions(Mockito.anyInt());
    }
}