OSDN Git Service

Add method to check if app has launcher activity
authorLei Yu <jackqdyulei@google.com>
Tue, 10 Apr 2018 21:38:46 +0000 (14:38 -0700)
committerLei Yu <jackqdyulei@google.com>
Thu, 12 Apr 2018 17:01:42 +0000 (10:01 -0700)
This method should only used for system apps.

Change-Id: Id4109d8e223933269b8dae3aaa91b8a9186c527c
Fixes: 77477987
Test: RunSettingsRoboTests

src/com/android/settings/fuelgauge/BatteryUtils.java
tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java

index 2643971..111b279 100644 (file)
@@ -21,7 +21,7 @@ import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
-import android.os.BatteryManager;
+import android.content.pm.ResolveInfo;
 import android.os.BatteryStats;
 import android.os.Bundle;
 import android.os.Build;
@@ -34,6 +34,7 @@ import android.support.annotation.Nullable;
 import android.support.annotation.StringRes;
 import android.support.annotation.VisibleForTesting;
 import android.support.annotation.WorkerThread;
+import android.text.TextUtils;
 import android.text.format.DateUtils;
 import android.util.Log;
 import android.util.SparseLongArray;
@@ -545,8 +546,8 @@ public class BatteryUtils {
             return true;
         }
 
-        return isSystemUid(uid) || isSystemApp(mPackageManager, packageNames)
-                || powerWhitelistBackend.isSysWhitelistedExceptIdle(packageNames);
+        return isSystemUid(uid) || powerWhitelistBackend.isSysWhitelistedExceptIdle(packageNames)
+                || (isSystemApp(mPackageManager, packageNames) && !hasLauncherEntry(packageNames));
     }
 
     private boolean isSystemUid(int uid) {
@@ -569,5 +570,30 @@ public class BatteryUtils {
 
         return false;
     }
+
+    private boolean hasLauncherEntry(String[] packageNames) {
+        final Intent launchIntent = new Intent(Intent.ACTION_MAIN, null);
+        launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
+
+        // If we do not specify MATCH_DIRECT_BOOT_AWARE or
+        // MATCH_DIRECT_BOOT_UNAWARE, system will derive and update the flags
+        // according to the user's lock state. When the user is locked,
+        // components
+        // with ComponentInfo#directBootAware == false will be filtered. We should
+        // explicitly include both direct boot aware and unaware components here.
+        final List<ResolveInfo> resolveInfos = mPackageManager.queryIntentActivities(launchIntent,
+                PackageManager.MATCH_DISABLED_COMPONENTS
+                        | PackageManager.MATCH_DIRECT_BOOT_AWARE
+                        | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
+                        | PackageManager.MATCH_SYSTEM_ONLY);
+        for (int i = 0, size = resolveInfos.size(); i < size; i++) {
+            final ResolveInfo resolveInfo = resolveInfos.get(i);
+            if (ArrayUtils.contains(packageNames, resolveInfo.activityInfo.packageName)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
 }
 
index aba86c6..772bb8d 100644 (file)
@@ -37,8 +37,10 @@ import static org.mockito.Mockito.when;
 
 import android.app.AppOpsManager;
 import android.content.Context;
+import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.os.BatteryStats;
 import android.os.Build;
 import android.os.Bundle;
@@ -575,7 +577,22 @@ public class BatteryUtilsTest {
     }
 
     @Test
-    public void testShouldHideAnomaly_systemApp_returnTrue() {
+    public void testShouldHideAnomaly_systemAppWithLauncher_returnTrue() {
+        final List<ResolveInfo> resolveInfos = new ArrayList<>();
+        final ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.activityInfo = new ActivityInfo();
+        resolveInfo.activityInfo.packageName = HIGH_SDK_PACKAGE;
+
+        doReturn(resolveInfos).when(mPackageManager).queryIntentActivities(any(), anyInt());
+        doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
+        mHighApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
+
+        assertThat(mBatteryUtils.shouldHideAnomaly(mPowerWhitelistBackend, UID)).isTrue();
+    }
+
+    @Test
+    public void testShouldHideAnomaly_systemAppWithoutLauncher_returnTrue() {
+        doReturn(new ArrayList<>()).when(mPackageManager).queryIntentActivities(any(), anyInt());
         doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
         mHighApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;