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

Commit a5a8be55 authored by Kweku Adams's avatar Kweku Adams Committed by Automerger Merge Worker
Browse files

Merge "Offload initial headless app query to handler thread." into rvc-dev am:...

Merge "Offload initial headless app query to handler thread." into rvc-dev am: bcdd5c53 am: fcf71753

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

Change-Id: I8652003e400b9c5bcc962ca74f2d86d71bcba56d
parents 5d5648f4 fcf71753
Loading
Loading
Loading
Loading
+33 −17
Original line number Original line Diff line number Diff line
@@ -233,7 +233,7 @@ public class AppStandbyController implements AppStandbyInternal {
     * Set of system apps that are headless (don't have any declared activities, enabled or
     * Set of system apps that are headless (don't have any declared activities, enabled or
     * disabled). Presence in this map indicates that the app is a headless system app.
     * disabled). Presence in this map indicates that the app is a headless system app.
     */
     */
    @GuardedBy("mAppIdleLock")
    @GuardedBy("mHeadlessSystemApps")
    private final ArrayMap<String, Boolean> mHeadlessSystemApps = new ArrayMap<>();
    private final ArrayMap<String, Boolean> mHeadlessSystemApps = new ArrayMap<>();


    private final CountDownLatch mAdminDataAvailableLatch = new CountDownLatch(1);
    private final CountDownLatch mAdminDataAvailableLatch = new CountDownLatch(1);
@@ -447,7 +447,8 @@ public class AppStandbyController implements AppStandbyInternal {
                userFileExists = mAppIdleHistory.userFileExists(UserHandle.USER_SYSTEM);
                userFileExists = mAppIdleHistory.userFileExists(UserHandle.USER_SYSTEM);
            }
            }


            loadHeadlessSystemAppCache();
            // Offload to handler thread to avoid boottime impact.
            mHandler.post(this::loadHeadlessSystemAppCache);


            if (mPendingInitializeDefaults || !userFileExists) {
            if (mPendingInitializeDefaults || !userFileExists) {
                initializeDefaultsForSystemApps(UserHandle.USER_SYSTEM);
                initializeDefaultsForSystemApps(UserHandle.USER_SYSTEM);
@@ -1121,8 +1122,10 @@ public class AppStandbyController implements AppStandbyInternal {
    }
    }


    private boolean isHeadlessSystemApp(String packageName) {
    private boolean isHeadlessSystemApp(String packageName) {
        synchronized (mHeadlessSystemApps) {
            return mHeadlessSystemApps.containsKey(packageName);
            return mHeadlessSystemApps.containsKey(packageName);
        }
        }
    }


    @Override
    @Override
    public boolean isAppIdleFiltered(String packageName, int appId, int userId,
    public boolean isAppIdleFiltered(String packageName, int appId, int userId,
@@ -1697,19 +1700,24 @@ public class AppStandbyController implements AppStandbyInternal {
                    userId);
                    userId);
            evaluateSystemAppException(pi);
            evaluateSystemAppException(pi);
        } catch (PackageManager.NameNotFoundException e) {
        } catch (PackageManager.NameNotFoundException e) {
            synchronized (mHeadlessSystemApps) {
                mHeadlessSystemApps.remove(packageName);
                mHeadlessSystemApps.remove(packageName);
            }
            }
        }
        }
    }


    private void evaluateSystemAppException(@Nullable PackageInfo pkgInfo) {
    /** Returns true if the exception status changed. */
        if (pkgInfo.applicationInfo != null && pkgInfo.applicationInfo.isSystemApp()) {
    private boolean evaluateSystemAppException(@Nullable PackageInfo pkgInfo) {
            synchronized (mAppIdleLock) {
        if (pkgInfo == null || pkgInfo.applicationInfo == null
                || !pkgInfo.applicationInfo.isSystemApp()) {
            return false;
        }
        synchronized (mHeadlessSystemApps) {
            if (pkgInfo.activities == null || pkgInfo.activities.length == 0) {
            if (pkgInfo.activities == null || pkgInfo.activities.length == 0) {
                // Headless system app.
                // Headless system app.
                    mHeadlessSystemApps.put(pkgInfo.packageName, true);
                return mHeadlessSystemApps.put(pkgInfo.packageName, true) == null;
            } else {
            } else {
                    mHeadlessSystemApps.remove(pkgInfo.packageName);
                return mHeadlessSystemApps.remove(pkgInfo.packageName) != null;
                }
            }
            }
        }
        }
    }
    }
@@ -1754,7 +1762,12 @@ public class AppStandbyController implements AppStandbyInternal {
                UserHandle.USER_SYSTEM);
                UserHandle.USER_SYSTEM);
        final int packageCount = packages.size();
        final int packageCount = packages.size();
        for (int i = 0; i < packageCount; i++) {
        for (int i = 0; i < packageCount; i++) {
            evaluateSystemAppException(packages.get(i));
            PackageInfo pkgInfo = packages.get(i);
            if (pkgInfo != null && evaluateSystemAppException(pkgInfo)) {
                mHandler.obtainMessage(MSG_CHECK_PACKAGE_IDLE_STATE,
                        UserHandle.USER_SYSTEM, -1, pkgInfo.packageName)
                    .sendToTarget();
            }
        }
        }
    }
    }


@@ -1852,10 +1865,13 @@ public class AppStandbyController implements AppStandbyInternal {
        pw.println();
        pw.println();


        pw.println("mHeadlessSystemApps=[");
        pw.println("mHeadlessSystemApps=[");
        synchronized (mHeadlessSystemApps) {
            for (int i = mHeadlessSystemApps.size() - 1; i >= 0; --i) {
            for (int i = mHeadlessSystemApps.size() - 1; i >= 0; --i) {
                pw.print("  ");
                pw.print(mHeadlessSystemApps.keyAt(i));
                pw.print(mHeadlessSystemApps.keyAt(i));
                pw.println(",");
                pw.println(",");
            }
            }
        }
        pw.println("]");
        pw.println("]");
        pw.println();
        pw.println();
    }
    }