diff options
author | Kweku Adams <kwekua@google.com> | 2020-06-16 11:59:37 -0700 |
---|---|---|
committer | Kweku Adams <kwekua@google.com> | 2020-06-17 11:12:41 -0700 |
commit | f197eef1086dab24fbd17c6af6c1a22c2eb27c9b (patch) | |
tree | b62af38cf2da9240821a3f59b05147448b87eb80 /apex/jobscheduler | |
parent | e0ba6d9dffc533e4c175d693e54f55290a8141de (diff) |
Retrieve direct boot aware activities.
Immediately on boot (before a user is unlocked), PackageManager only
returns components that are direct boot aware. If we don't specify that
direct boot unaware components be returned as well, then ASC will think
all system apps are headless.
Also switching the cache from an ArrayMap to an ArraySet because there's
no need for the boolean value.
Bug: 155761007
Test: manually verify that apps with launcher activities aren't in the headless app list
Test: atest CtsUsageStatsTestCases:UsageStatsTest
Test: atest FrameworksServicesTests:AppIdleHistoryTests
Test: atest FrameworksServicesTests:AppStandbyControllerTests
Change-Id: Ieec648226d0d5a32197647af286c2cd4c167dd8b
Diffstat (limited to 'apex/jobscheduler')
-rw-r--r-- | apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java index 062108757349..5712f9358f82 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -93,7 +93,6 @@ import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings.Global; import android.telephony.TelephonyManager; -import android.util.ArrayMap; import android.util.ArraySet; import android.util.KeyValueListParser; import android.util.Slog; @@ -205,6 +204,10 @@ public class AppStandbyController implements AppStandbyInternal { */ private static final long WAIT_FOR_ADMIN_DATA_TIMEOUT_MS = 10_000; + private static final int HEADLESS_APP_CHECK_FLAGS = + PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE + | PackageManager.GET_ACTIVITIES | PackageManager.MATCH_DISABLED_COMPONENTS; + // To name the lock for stack traces static class Lock {} @@ -234,7 +237,7 @@ public class AppStandbyController implements AppStandbyInternal { * disabled). Presence in this map indicates that the app is a headless system app. */ @GuardedBy("mHeadlessSystemApps") - private final ArrayMap<String, Boolean> mHeadlessSystemApps = new ArrayMap<>(); + private final ArraySet<String> mHeadlessSystemApps = new ArraySet<>(); private final CountDownLatch mAdminDataAvailableLatch = new CountDownLatch(1); @@ -1123,7 +1126,7 @@ public class AppStandbyController implements AppStandbyInternal { private boolean isHeadlessSystemApp(String packageName) { synchronized (mHeadlessSystemApps) { - return mHeadlessSystemApps.containsKey(packageName); + return mHeadlessSystemApps.contains(packageName); } } @@ -1695,9 +1698,8 @@ public class AppStandbyController implements AppStandbyInternal { return; } try { - PackageInfo pi = mPackageManager.getPackageInfoAsUser(packageName, - PackageManager.GET_ACTIVITIES | PackageManager.MATCH_DISABLED_COMPONENTS, - userId); + PackageInfo pi = mPackageManager.getPackageInfoAsUser( + packageName, HEADLESS_APP_CHECK_FLAGS, userId); evaluateSystemAppException(pi); } catch (PackageManager.NameNotFoundException e) { synchronized (mHeadlessSystemApps) { @@ -1709,15 +1711,16 @@ public class AppStandbyController implements AppStandbyInternal { /** Returns true if the exception status changed. */ private boolean evaluateSystemAppException(@Nullable PackageInfo pkgInfo) { if (pkgInfo == null || pkgInfo.applicationInfo == null - || !pkgInfo.applicationInfo.isSystemApp()) { + || (!pkgInfo.applicationInfo.isSystemApp() + && !pkgInfo.applicationInfo.isUpdatedSystemApp())) { return false; } synchronized (mHeadlessSystemApps) { if (pkgInfo.activities == null || pkgInfo.activities.length == 0) { // Headless system app. - return mHeadlessSystemApps.put(pkgInfo.packageName, true) == null; + return mHeadlessSystemApps.add(pkgInfo.packageName); } else { - return mHeadlessSystemApps.remove(pkgInfo.packageName) != null; + return mHeadlessSystemApps.remove(pkgInfo.packageName); } } } @@ -1758,8 +1761,7 @@ public class AppStandbyController implements AppStandbyInternal { private void loadHeadlessSystemAppCache() { Slog.d(TAG, "Loading headless system app cache. appIdleEnabled=" + mAppIdleEnabled); final List<PackageInfo> packages = mPackageManager.getInstalledPackagesAsUser( - PackageManager.GET_ACTIVITIES | PackageManager.MATCH_DISABLED_COMPONENTS, - UserHandle.USER_SYSTEM); + HEADLESS_APP_CHECK_FLAGS, UserHandle.USER_SYSTEM); final int packageCount = packages.size(); for (int i = 0; i < packageCount; i++) { PackageInfo pkgInfo = packages.get(i); @@ -1868,7 +1870,7 @@ public class AppStandbyController implements AppStandbyInternal { synchronized (mHeadlessSystemApps) { for (int i = mHeadlessSystemApps.size() - 1; i >= 0; --i) { pw.print(" "); - pw.print(mHeadlessSystemApps.keyAt(i)); + pw.print(mHeadlessSystemApps.valueAt(i)); pw.println(","); } } |