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

Commit 68431cf8 authored by Varun Shah's avatar Varun Shah Committed by Automerger Merge Worker
Browse files

Merge "Update deletion conditions for a package's UsageStats." into rvc-dev am: 06c59736

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16222704

Change-Id: I8d86dd21a78900698780d3e0bd2fc82eb745ff23
parents 6bdebc2a 06c59736
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.app.admin;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.content.ComponentName;
import android.content.Intent;
@@ -75,6 +77,13 @@ public abstract class DevicePolicyManagerInternal {
    public abstract void addOnCrossProfileWidgetProvidersChangeListener(
            OnCrossProfileWidgetProvidersChangeListener listener);

    /**
     * @param userHandle the handle of the user whose profile owner is being fetched.
     * @return the configured supervision app if it exists and is the device owner or policy owner.
     */
    public abstract @Nullable ComponentName getProfileOwnerOrDeviceOwnerSupervisionComponent(
            @NonNull UserHandle userHandle);

    /**
     * Checks if an app with given uid is an active device admin of its user and has the policy
     * specified.
+7 −0
Original line number Diff line number Diff line
@@ -12466,6 +12466,13 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
            }
        }
        @Override
        public @Nullable ComponentName getProfileOwnerOrDeviceOwnerSupervisionComponent(
                @NonNull UserHandle userHandle) {
            return DevicePolicyManagerService.this.getProfileOwnerOrDeviceOwnerSupervisionComponent(
                    userHandle);
        }
        @Override
        public boolean isActiveAdminWithPolicy(int uid, int reqPolicy) {
            synchronized (getLockObject()) {
+21 −5
Original line number Diff line number Diff line
@@ -338,6 +338,7 @@ public class UsageStatsService extends SystemService implements
        if (userId == UserHandle.USER_SYSTEM) {
            UsageStatsIdleService.scheduleUpdateMappingsJob(getContext());
        }
        final boolean deleteObsoleteData = shouldDeleteObsoleteData(UserHandle.of(userId));
        synchronized (mLock) {
            // Create a user unlocked event to report
            final Event unlockEvent = new Event(USER_UNLOCKED, SystemClock.elapsedRealtime());
@@ -355,7 +356,7 @@ public class UsageStatsService extends SystemService implements
            boolean needToFlush = !pendingEvents.isEmpty();

            initializeUserUsageStatsServiceLocked(userId, System.currentTimeMillis(),
                    installedPackages);
                    installedPackages, deleteObsoleteData);
            mUserUnlockedStates.put(userId, true);
            final UserUsageStatsService userService = getUserUsageStatsServiceLocked(userId);
            if (userService == null) {
@@ -550,13 +551,13 @@ public class UsageStatsService extends SystemService implements
     * when the user is initially unlocked.
     */
    private void initializeUserUsageStatsServiceLocked(int userId, long currentTimeMillis,
            HashMap<String, Long> installedPackages) {
            HashMap<String, Long> installedPackages, boolean deleteObsoleteData) {
        final File usageStatsDir = new File(Environment.getDataSystemCeDirectory(userId),
                "usagestats");
        final UserUsageStatsService service = new UserUsageStatsService(getContext(), userId,
                usageStatsDir, this);
        try {
            service.init(currentTimeMillis, installedPackages);
            service.init(currentTimeMillis, installedPackages, deleteObsoleteData);
            mUserState.put(userId, service);
        } catch (Exception e) {
            if (mUserManager.isUserUnlocked(userId)) {
@@ -1014,6 +1015,10 @@ public class UsageStatsService extends SystemService implements
     * Called by the Binder stub.
     */
    private boolean updatePackageMappingsData() {
        // don't update the mappings if a profile user is defined
        if (!shouldDeleteObsoleteData(UserHandle.SYSTEM)) {
            return true; // return true so job scheduler doesn't reschedule the job
        }
        // fetch the installed packages outside the lock so it doesn't block package manager.
        final HashMap<String, Long> installedPkgs = getInstalledPackages(UserHandle.USER_SYSTEM);
        synchronized (mLock) {
@@ -1139,6 +1144,13 @@ public class UsageStatsService extends SystemService implements
        }
    }

    private boolean shouldDeleteObsoleteData(UserHandle userHandle) {
        final DevicePolicyManagerInternal dpmInternal = getDpmInternal();
        // If a profile owner is not defined for the given user, obsolete data should be deleted
        return dpmInternal == null
                || dpmInternal.getProfileOwnerOrDeviceOwnerSupervisionComponent(userHandle) == null;
    }

    private String buildFullToken(String packageName, String token) {
        final StringBuilder sb = new StringBuilder(packageName.length() + token.length() + 1);
        sb.append(packageName);
@@ -2309,8 +2321,12 @@ public class UsageStatsService extends SystemService implements
    private class MyPackageMonitor extends PackageMonitor {
        @Override
        public void onPackageRemoved(String packageName, int uid) {
            mHandler.obtainMessage(MSG_PACKAGE_REMOVED, getChangingUserId(), 0, packageName)
            final int changingUserId = getChangingUserId();
            // Only remove the package's data if a profile owner is not defined for the user
            if (shouldDeleteObsoleteData(UserHandle.of(changingUserId))) {
                mHandler.obtainMessage(MSG_PACKAGE_REMOVED, changingUserId, 0, packageName)
                        .sendToTarget();
            }
            super.onPackageRemoved(packageName, uid);
        }
    }
+6 −4
Original line number Diff line number Diff line
@@ -115,8 +115,9 @@ class UserUsageStatsService {
        mSystemTimeSnapshot = System.currentTimeMillis();
    }

    void init(final long currentTimeMillis, HashMap<String, Long> installedPackages) {
        readPackageMappingsLocked(installedPackages);
    void init(final long currentTimeMillis, HashMap<String, Long> installedPackages,
            boolean deleteObsoleteData) {
        readPackageMappingsLocked(installedPackages, deleteObsoleteData);
        mDatabase.init(currentTimeMillis);
        if (mDatabase.wasUpgradePerformed()) {
            mDatabase.prunePackagesDataOnUpgrade(installedPackages);
@@ -180,12 +181,13 @@ class UserUsageStatsService {
        return mDatabase.onPackageRemoved(packageName, timeRemoved);
    }

    private void readPackageMappingsLocked(HashMap<String, Long> installedPackages) {
    private void readPackageMappingsLocked(HashMap<String, Long> installedPackages,
            boolean deleteObsoleteData) {
        mDatabase.readMappingsLocked();
        // Package mappings for the system user are updated after 24 hours via a job scheduled by
        // UsageStatsIdleService to ensure restored data is not lost on first boot. Additionally,
        // this makes user service initialization a little quicker on subsequent boots.
        if (mUserId != UserHandle.USER_SYSTEM) {
        if (mUserId != UserHandle.USER_SYSTEM && deleteObsoleteData) {
            updatePackageMappingsLocked(installedPackages);
        }
    }