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

Commit c94d03b6 authored by Sudheer Shanka's avatar Sudheer Shanka
Browse files

Check package permission for the correct userId.

Previously, we were always checking the permission state
in the system user, rather than the user associated
with the standby bucket decision.

Bug: 383505585
Test: atest android.app.cts.ActivityManagerTest#testBroadcastReceiverLRUPosition
Flag: EXEMPT bugfix
Change-Id: I71b5d376b074f743b0ce8469a1098a513a964f2e
parent 748a8dfd
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ import static com.android.server.SystemService.PHASE_BOOT_COMPLETED;
import static com.android.server.SystemService.PHASE_SYSTEM_SERVICES_READY;
import static com.android.server.usage.AppIdleHistory.STANDBY_BUCKET_UNKNOWN;

import android.Manifest;
import android.annotation.CurrentTimeMillisLong;
import android.annotation.DurationMillisLong;
import android.annotation.NonNull;
@@ -100,6 +101,7 @@ import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
import android.permission.PermissionManager;
import android.provider.DeviceConfig;
import android.provider.Settings.Global;
import android.telephony.TelephonyManager;
@@ -1523,8 +1525,8 @@ public class AppStandbyController
            return STANDBY_BUCKET_ACTIVE;
        }

        if (mPackageManager.checkPermission(android.Manifest.permission.ACCESS_BACKGROUND_LOCATION,
                packageName) == PERMISSION_GRANTED) {
        if (mSystemServicesReady
                && mInjector.isBackgroundLocationPermissionGranted(packageName, userId)) {
            return STANDBY_BUCKET_FREQUENT;
        }

@@ -2636,6 +2638,7 @@ public class AppStandbyController
        private IBatteryStats mBatteryStats;
        private BatteryManager mBatteryManager;
        private PackageManagerInternal mPackageManagerInternal;
        private PermissionManager mPermissionManager;
        private DisplayManager mDisplayManager;
        private PowerManager mPowerManager;
        private IDeviceIdleController mDeviceIdleController;
@@ -2675,6 +2678,7 @@ public class AppStandbyController
                mBatteryStats = IBatteryStats.Stub.asInterface(
                        ServiceManager.getService(BatteryStats.SERVICE_NAME));
                mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
                mPermissionManager = mContext.getSystemService(PermissionManager.class);
                mDisplayManager = (DisplayManager) mContext.getSystemService(
                        Context.DISPLAY_SERVICE);
                mPowerManager = mContext.getSystemService(PowerManager.class);
@@ -2710,10 +2714,6 @@ public class AppStandbyController
            return SystemClock.elapsedRealtime();
        }

        long currentTimeMillis() {
            return System.currentTimeMillis();
        }

        boolean isAppIdleEnabled() {
            final boolean buildFlag = mContext.getResources().getBoolean(
                    com.android.internal.R.bool.config_enableAutoPowerModes);
@@ -2754,6 +2754,14 @@ public class AppStandbyController
            return mAlarmManagerInternal.shouldGetBucketElevation(packageName, uid);
        }

        boolean isBackgroundLocationPermissionGranted(@NonNull String packageName,
                @UserIdInt int userId) {
            final int result = mPermissionManager.checkPackageNamePermission(
                    Manifest.permission.ACCESS_BACKGROUND_LOCATION,
                    packageName, Context.DEVICE_ID_DEFAULT, userId);
            return result == PERMISSION_GRANTED;
        }

        void updatePowerWhitelistCache() {
            try {
                // Don't call out to DeviceIdleController with the lock held.
+15 −20
Original line number Diff line number Diff line
@@ -45,7 +45,6 @@ import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RESTRICTED;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;

import static com.android.server.usage.AppStandbyController.DEFAULT_ELAPSED_TIME_THRESHOLDS;
import static com.android.server.usage.AppStandbyController.DEFAULT_SCREEN_TIME_THRESHOLDS;
@@ -58,12 +57,11 @@ import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue;
import static org.mockito.AdditionalMatchers.not;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.intThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
@@ -245,6 +243,7 @@ public class AppStandbyControllerTests {
        List<UserHandle> mCrossProfileTargets = Collections.emptyList();
        boolean mDeviceIdleMode = false;
        Set<Pair<String, Integer>> mClockApps = new ArraySet<>();
        Set<Pair<String, Integer>> mBgLocationGrantedApps = new ArraySet<>();
        DeviceConfig.Properties.Builder mSettingsBuilder =
                new DeviceConfig.Properties.Builder(DeviceConfig.NAMESPACE_APP_STANDBY)
                        .setLong("screen_threshold_active", 0)
@@ -280,11 +279,6 @@ public class AppStandbyControllerTests {
            return mElapsedRealtime;
        }

        @Override
        long currentTimeMillis() {
            return mElapsedRealtime;
        }

        @Override
        boolean isAppIdleEnabled() {
            return mIsAppIdleEnabled;
@@ -310,6 +304,11 @@ public class AppStandbyControllerTests {
            return mClockApps.contains(Pair.create(packageName, uid));
        }

        @Override
        boolean isBackgroundLocationPermissionGranted(String packageName, int userId) {
            return mBgLocationGrantedApps.contains(Pair.create(packageName, userId));
        }

        @Override
        PackageManagerInternal getPackageManagerInternal() {
            return mPackageManagerInternal;
@@ -393,6 +392,10 @@ public class AppStandbyControllerTests {

        // Internal methods

        void addBgLocationGrantedApps(String packageName, int userId) {
            mBgLocationGrantedApps.add(Pair.create(packageName, userId));
        }

        void setDisplayOn(boolean on) {
            mDisplayOn = on;
            if (mDisplayListener != null) {
@@ -484,18 +487,9 @@ public class AppStandbyControllerTests {
                doReturn(pkg.applicationInfo).when(mockPm)
                        .getApplicationInfo(eq(pkg.packageName), anyInt());

                if (pkg.packageName.equals(PACKAGE_BACKGROUND_LOCATION)) {
                    doReturn(PERMISSION_GRANTED).when(mockPm).checkPermission(
                            eq(android.Manifest.permission.ACCESS_BACKGROUND_LOCATION),
                            eq(pkg.packageName));
                    doReturn(PERMISSION_DENIED).when(mockPm).checkPermission(
                            not(eq(android.Manifest.permission.ACCESS_BACKGROUND_LOCATION)),
                            eq(pkg.packageName));
                } else {
                doReturn(PERMISSION_DENIED).when(mockPm).checkPermission(anyString(),
                        eq(pkg.packageName));
            }
            }
        } catch (PackageManager.NameNotFoundException nnfe) {}
    }

@@ -2077,6 +2071,7 @@ public class AppStandbyControllerTests {
     */
    @Test
    public void testBackgroundLocationBucket() throws Exception {
        mInjector.addBgLocationGrantedApps(PACKAGE_BACKGROUND_LOCATION, USER_ID);
        reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime,
                PACKAGE_BACKGROUND_LOCATION);
        waitAndAssertBucket(STANDBY_BUCKET_ACTIVE, PACKAGE_BACKGROUND_LOCATION);