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

Commit c67e95c7 authored by Jing Ji's avatar Jing Ji Committed by Android (Google) Code Review
Browse files

Merge "Clean up the AppRestrictionController instance after each test." into tm-dev

parents 7ccea83f bf003d47
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -1531,7 +1531,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>

            if (excessive) {
                if (DEBUG_BACKGROUND_BATTERY_TRACKER) {
                    Slog.i(TAG, "Excessive background current drain " + uid
                    Slog.i(TAG, "Excessive background current drain " + uid + " "
                            + usage + " (" + usage.percentageToString() + " ) over "
                            + TimeUtils.formatDuration(mBgCurrentDrainWindowMs));
                }
@@ -1542,7 +1542,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
                }
            } else {
                if (DEBUG_BACKGROUND_BATTERY_TRACKER) {
                    Slog.i(TAG, "Background current drain backs to normal " + uid
                    Slog.i(TAG, "Background current drain backs to normal " + uid + " "
                            + usage + " (" + usage.percentageToString() + " ) over "
                            + TimeUtils.formatDuration(mBgCurrentDrainWindowMs));
                }
+107 −86
Original line number Diff line number Diff line
@@ -87,7 +87,6 @@ import android.app.ActivityManager;
import android.app.ActivityManager.RestrictionLevel;
import android.app.ActivityManagerInternal;
import android.app.ActivityManagerInternal.AppBackgroundRestrictionListener;
import android.app.ActivityThread;
import android.app.AppOpsManager;
import android.app.IActivityManager;
import android.app.IUidObserver;
@@ -257,6 +256,89 @@ public final class AppRestrictionController {

    final ActivityManagerService mActivityManagerService;

    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            switch (intent.getAction()) {
                case Intent.ACTION_PACKAGE_ADDED: {
                    if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
                        final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
                        if (uid >= 0) {
                            onUidAdded(uid);
                        }
                    }
                }
                // fall through.
                case Intent.ACTION_PACKAGE_CHANGED: {
                    final String pkgName = intent.getData().getSchemeSpecificPart();
                    final String[] cmpList = intent.getStringArrayExtra(
                            Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST);
                    // If this is PACKAGE_ADDED (cmpList == null), or if it's a whole-package
                    // enable/disable event (cmpList is just the package name itself), drop
                    // our carrier privileged app & system-app caches and let them refresh
                    if (cmpList == null
                            || (cmpList.length == 1 && pkgName.equals(cmpList[0]))) {
                        clearCarrierPrivilegedApps();
                    }
                } break;
                case Intent.ACTION_PACKAGE_FULLY_REMOVED: {
                    final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
                    final Uri data = intent.getData();
                    String ssp;
                    if (uid >= 0 && data != null
                            && (ssp = data.getSchemeSpecificPart()) != null) {
                        onPackageRemoved(ssp, uid);
                    }
                } break;
                case Intent.ACTION_UID_REMOVED: {
                    if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
                        final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
                        if (uid >= 0) {
                            onUidRemoved(uid);
                        }
                    }
                } break;
                case Intent.ACTION_USER_ADDED: {
                    final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
                    if (userId >= 0) {
                        onUserAdded(userId);
                    }
                } break;
                case Intent.ACTION_USER_STARTED: {
                    final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
                    if (userId >= 0) {
                        onUserStarted(userId);
                    }
                } break;
                case Intent.ACTION_USER_STOPPED: {
                    final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
                    if (userId >= 0) {
                        onUserStopped(userId);
                    }
                } break;
                case Intent.ACTION_USER_REMOVED: {
                    final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
                    if (userId >= 0) {
                        onUserRemoved(userId);
                    }
                } break;
            }
        }
    };

    private final BroadcastReceiver mBootReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            switch (intent.getAction()) {
                case Intent.ACTION_LOCKED_BOOT_COMPLETED: {
                    onLockedBootCompleted();
                } break;
            }
        }
    };

    /**
     * The restriction levels that each package is on, the levels here are defined in
     * {@link android.app.ActivityManager.RESTRICTION_LEVEL_*}.
@@ -804,7 +886,7 @@ public final class AppRestrictionController {

    void onSystemReady() {
        DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                ActivityThread.currentApplication().getMainExecutor(), mConstantsObserver);
                mBgExecutor, mConstantsObserver);
        mConstantsObserver.start();
        initBgRestrictionExemptioFromSysConfig();
        initRestrictionStates();
@@ -830,6 +912,13 @@ public final class AppRestrictionController {
        initRestrictionStates();
    }

    @VisibleForTesting
    void tearDown() {
        DeviceConfig.removeOnPropertiesChangedListener(mConstantsObserver);
        unregisterForUidObservers();
        unregisterForSystemBroadcasts();
    }

    private void initBgRestrictionExemptioFromSysConfig() {
        mBgRestrictionExemptioFromSysConfig =
                SystemConfig.getInstance().getBgRestrictionExemption();
@@ -912,6 +1001,14 @@ public final class AppRestrictionController {
        }
    }

    private void unregisterForUidObservers() {
        try {
            mInjector.getIActivityManager().unregisterUidObserver(mUidObserver);
        } catch (RemoteException e) {
            // Intra-process call, it won't happen.
        }
    }

    /**
     * Called when initializing a user.
     */
@@ -2147,104 +2244,28 @@ public final class AppRestrictionController {
    }

    private void registerForSystemBroadcasts() {
        final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                final String action = intent.getAction();
                switch (intent.getAction()) {
                    case Intent.ACTION_PACKAGE_ADDED: {
                        if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
                            final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
                            if (uid >= 0) {
                                onUidAdded(uid);
                            }
                        }
                    }
                    // fall through.
                    case Intent.ACTION_PACKAGE_CHANGED: {
                        final String pkgName = intent.getData().getSchemeSpecificPart();
                        final String[] cmpList = intent.getStringArrayExtra(
                                Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST);
                        // If this is PACKAGE_ADDED (cmpList == null), or if it's a whole-package
                        // enable/disable event (cmpList is just the package name itself), drop
                        // our carrier privileged app & system-app caches and let them refresh
                        if (cmpList == null
                                || (cmpList.length == 1 && pkgName.equals(cmpList[0]))) {
                            clearCarrierPrivilegedApps();
                        }
                    } break;
                    case Intent.ACTION_PACKAGE_FULLY_REMOVED: {
                        final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
                        final Uri data = intent.getData();
                        String ssp;
                        if (uid >= 0 && data != null
                                && (ssp = data.getSchemeSpecificPart()) != null) {
                            onPackageRemoved(ssp, uid);
                        }
                    } break;
                    case Intent.ACTION_UID_REMOVED: {
                        if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
                            final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
                            if (uid >= 0) {
                                onUidRemoved(uid);
                            }
                        }
                    } break;
                    case Intent.ACTION_USER_ADDED: {
                        final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
                        if (userId >= 0) {
                            onUserAdded(userId);
                        }
                    } break;
                    case Intent.ACTION_USER_STARTED: {
                        final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
                        if (userId >= 0) {
                            onUserStarted(userId);
                        }
                    } break;
                    case Intent.ACTION_USER_STOPPED: {
                        final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
                        if (userId >= 0) {
                            onUserStopped(userId);
                        }
                    } break;
                    case Intent.ACTION_USER_REMOVED: {
                        final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
                        if (userId >= 0) {
                            onUserRemoved(userId);
                        }
                    } break;
                }
            }
        };
        final IntentFilter packageFilter = new IntentFilter();
        packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
        packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
        packageFilter.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED);
        packageFilter.addDataScheme("package");
        mContext.registerReceiverForAllUsers(broadcastReceiver, packageFilter, null, mBgHandler);
        mContext.registerReceiverForAllUsers(mBroadcastReceiver, packageFilter, null, mBgHandler);
        final IntentFilter userFilter = new IntentFilter();
        userFilter.addAction(Intent.ACTION_USER_ADDED);
        userFilter.addAction(Intent.ACTION_USER_REMOVED);
        userFilter.addAction(Intent.ACTION_UID_REMOVED);
        mContext.registerReceiverForAllUsers(broadcastReceiver, userFilter, null, mBgHandler);
        final BroadcastReceiver bootReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                final String action = intent.getAction();
                switch (intent.getAction()) {
                    case Intent.ACTION_LOCKED_BOOT_COMPLETED: {
                        onLockedBootCompleted();
                    } break;
                }
            }
        };
        mContext.registerReceiverForAllUsers(mBroadcastReceiver, userFilter, null, mBgHandler);
        final IntentFilter bootFilter = new IntentFilter();
        bootFilter.addAction(Intent.ACTION_LOCKED_BOOT_COMPLETED);
        mContext.registerReceiverAsUser(bootReceiver, UserHandle.SYSTEM,
        mContext.registerReceiverAsUser(mBootReceiver, UserHandle.SYSTEM,
                bootFilter, null, mBgHandler);
    }

    private void unregisterForSystemBroadcasts() {
        mContext.unregisterReceiver(mBroadcastReceiver);
        mContext.unregisterReceiver(mBootReceiver);
    }

    void forEachTracker(Consumer<BaseAppStateTracker> sink) {
        for (int i = 0, size = mAppStateTrackers.size(); i < size; i++) {
            sink.accept(mAppStateTrackers.get(i));
+14 −0
Original line number Diff line number Diff line
@@ -345,6 +345,7 @@ public final class BackgroundRestrictionTest {

    @After
    public void tearDown() {
        mBgRestrictionController.tearDown();
        mBgRestrictionController.getBackgroundHandlerThread().quitSafely();
    }

@@ -561,6 +562,7 @@ public final class BackgroundRestrictionTest {
        DeviceConfigSession<Float> bgCurrentDrainRestrictedBucketThreshold = null;
        DeviceConfigSession<Float> bgCurrentDrainBgRestrictedThreshold = null;
        DeviceConfigSession<Boolean> bgPromptFgsWithNotiToBgRestricted = null;
        DeviceConfigSession<Long> bgNotificationMinInterval = null;

        mBgRestrictionController.addAppBackgroundRestrictionListener(listener);

@@ -615,6 +617,13 @@ public final class BackgroundRestrictionTest {
                            R.bool.config_bg_prompt_fgs_with_noti_to_bg_restricted));
            bgPromptFgsWithNotiToBgRestricted.set(true);

            bgNotificationMinInterval = new DeviceConfigSession<>(
                    DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
                    ConstantsObserver.KEY_BG_ABUSIVE_NOTIFICATION_MINIMAL_INTERVAL,
                    DeviceConfig::getLong,
                    ConstantsObserver.DEFAULT_BG_ABUSIVE_NOTIFICATION_MINIMAL_INTERVAL_MS);
            bgNotificationMinInterval.set(windowMs);

            mCurrentTimeMillis = 10_000L;
            doReturn(mCurrentTimeMillis - windowMs).when(stats).getStatsStartTimestamp();
            doReturn(mCurrentTimeMillis).when(stats).getStatsEndTimestamp();
@@ -754,6 +763,7 @@ public final class BackgroundRestrictionTest {
            // Sleep a while and set a higher drain
            Thread.sleep(windowMs);
            clearInvocations(mInjector.getAppStandbyInternal());
            clearInvocations(mInjector.getNotificationManager());
            clearInvocations(mBgRestrictionController);

            // We're not going to prompt the user if the abusive app has a FGS with notification.
@@ -794,6 +804,7 @@ public final class BackgroundRestrictionTest {
            mAppFGSTracker.onForegroundServiceNotificationUpdated(
                    testPkgName, testUid, -notificationId);
            clearInvocations(mInjector.getAppStandbyInternal());
            clearInvocations(mInjector.getNotificationManager());
            clearInvocations(mBgRestrictionController);

            runTestBgCurrentDrainMonitorOnce(listener, stats, uids,
@@ -832,6 +843,7 @@ public final class BackgroundRestrictionTest {
            // Now we'll prompt the user even it has a FGS with notification.
            bgPromptFgsWithNotiToBgRestricted.set(true);
            clearInvocations(mInjector.getAppStandbyInternal());
            clearInvocations(mInjector.getNotificationManager());
            clearInvocations(mBgRestrictionController);

            runTestBgCurrentDrainMonitorOnce(listener, stats, uids,
@@ -899,6 +911,7 @@ public final class BackgroundRestrictionTest {
            closeIfNotNull(bgCurrentDrainRestrictedBucketThreshold);
            closeIfNotNull(bgCurrentDrainBgRestrictedThreshold);
            closeIfNotNull(bgPromptFgsWithNotiToBgRestricted);
            closeIfNotNull(bgNotificationMinInterval);
        }
    }

@@ -1921,6 +1934,7 @@ public final class BackgroundRestrictionTest {
                    .checkUidPermission(uid, perm);
            mInjector.getAppPermissionTracker().onPermissionsChanged(uid);
        }
        waitForIdleHandler(mBgRestrictionController.getBackgroundHandler());
        runExemptionTestOnce(
                packageName, uid, pid, serviceType, sleepMs, stopAfterSleep,
                perm, mediaControllers, topStateChanges, resetFGSTracker, false,