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

Commit 421c4e3e authored by Kevin Han's avatar Kevin Han Committed by Android (Google) Code Review
Browse files

Merge "Fix "X unused apps" string to match w/ unused apps" into sc-dev

parents 899845b1 53aaab09
Loading
Loading
Loading
Loading
+29 −1
Original line number Diff line number Diff line
@@ -16,26 +16,35 @@

package com.android.settings.applications;

import static android.app.usage.UsageStatsManager.INTERVAL_MONTHLY;
import static android.provider.DeviceConfig.NAMESPACE_APP_HIBERNATION;

import static com.android.settings.Utils.PROPERTY_APP_HIBERNATION_ENABLED;

import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.apphibernation.AppHibernationManager;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.provider.DeviceConfig;
import android.util.ArrayMap;

import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * A preference controller handling the logic for updating summary of hibernated apps.
 */
public final class HibernatedAppsPreferenceController extends BasePreferenceController {
    private static final String TAG = "HibernatedAppsPrefController";
    private static final String PROPERTY_HIBERNATION_UNUSED_THRESHOLD_MILLIS =
            "auto_revoke_unused_threshold_millis2";
    private static final long DEFAULT_UNUSED_THRESHOLD_MS = TimeUnit.DAYS.toMillis(90);

    public HibernatedAppsPreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
@@ -55,17 +64,36 @@ public final class HibernatedAppsPreferenceController extends BasePreferenceCont
    }

    private int getNumHibernated() {
        // TODO(b/187465752): Find a way to export this logic from PermissionController module
        final PackageManager pm = mContext.getPackageManager();
        final AppHibernationManager ahm = mContext.getSystemService(AppHibernationManager.class);
        final List<String> hibernatedPackages = ahm.getHibernatingPackagesForUser();
        int numHibernated = hibernatedPackages.size();

        // Also need to count packages that are auto revoked but not hibernated.
        final UsageStatsManager usm = mContext.getSystemService(UsageStatsManager.class);
        final long now = System.currentTimeMillis();
        final long unusedThreshold = DeviceConfig.getLong(DeviceConfig.NAMESPACE_PERMISSIONS,
                PROPERTY_HIBERNATION_UNUSED_THRESHOLD_MILLIS, DEFAULT_UNUSED_THRESHOLD_MS);
        final List<UsageStats> usageStatsList = usm.queryUsageStats(INTERVAL_MONTHLY,
                now - unusedThreshold, now);
        final Map<String, UsageStats> recentlyUsedPackages = new ArrayMap<>();
        for (UsageStats us : usageStatsList) {
            recentlyUsedPackages.put(us.mPackageName, us);
        }
        final List<PackageInfo> packages = pm.getInstalledPackages(
                PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.GET_PERMISSIONS);
        for (PackageInfo pi : packages) {
            final String packageName = pi.packageName;
            if (!hibernatedPackages.contains(packageName) && pi.requestedPermissions != null) {
            final UsageStats usageStats = recentlyUsedPackages.get(packageName);
            // Only count packages that have not been used recently as auto-revoked permissions may
            // stay revoked even after use if the user has not regranted them.
            final boolean usedRecently = (usageStats != null
                    && (now - usageStats.getLastTimeAnyComponentUsed() < unusedThreshold
                        || now - usageStats.getLastTimeVisible() < unusedThreshold));
            if (!hibernatedPackages.contains(packageName)
                    && pi.requestedPermissions != null
                    && !usedRecently) {
                for (String perm : pi.requestedPermissions) {
                    if ((pm.getPermissionFlags(perm, packageName, mContext.getUser())
                            & PackageManager.FLAG_PERMISSION_AUTO_REVOKED) != 0) {