Make system item has a consistent name.

In battery settings, the system item contains many packages. In old
behaviour it will use the first package(which has legal name and icon)
to represent this item. This behaviour is not consistent.

In this cl, we always use package "android" to extract name and icon
if it is system item.

Bug: 65090883
Test: RunSettingsRoboTests
Change-Id: Ibb7f85c06ab1745867f1eaa666cea32c8d3295a6
diff --git a/src/com/android/settings/fuelgauge/BatteryEntry.java b/src/com/android/settings/fuelgauge/BatteryEntry.java
index aa71252..7a18cd0 100644
--- a/src/com/android/settings/fuelgauge/BatteryEntry.java
+++ b/src/com/android/settings/fuelgauge/BatteryEntry.java
@@ -26,6 +26,7 @@
 import android.content.pm.UserInfo;
 import android.graphics.drawable.Drawable;
 import android.os.Handler;
+import android.os.Process;
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.os.UserManager;
@@ -47,6 +48,7 @@
     public static final int MSG_REPORT_FULLY_DRAWN = 2;
 
     private static final String TAG = "BatteryEntry";
+    private static final String PACKAGE_SYSTEM = "android";
 
     static final HashMap<String,UidToDetail> sUidCache = new HashMap<String,UidToDetail>();
 
@@ -268,9 +270,11 @@
         if (sipper.mPackages == null) {
             sipper.mPackages = pm.getPackagesForUid(uid);
         }
-        if (sipper.mPackages != null) {
-            String[] packageLabels = new String[sipper.mPackages.length];
-            System.arraycopy(sipper.mPackages, 0, packageLabels, 0, sipper.mPackages.length);
+
+        final String[] packages = extractPackagesFromSipper(sipper);
+        if (packages != null) {
+            String[] packageLabels = new String[packages.length];
+            System.arraycopy(packages, 0, packageLabels, 0, packages.length);
 
             // Convert package names to user-facing labels where possible
             IPackageManager ipm = AppGlobals.getPackageManager();
@@ -289,7 +293,7 @@
                         packageLabels[i] = label.toString();
                     }
                     if (ai.icon != 0) {
-                        defaultPackageName = sipper.mPackages[i];
+                        defaultPackageName = packages[i];
                         icon = ai.loadIcon(pm);
                         break;
                     }
@@ -303,7 +307,7 @@
                 name = packageLabels[0];
             } else {
                 // Look for an official name for this UID.
-                for (String pkgName : sipper.mPackages) {
+                for (String pkgName : packages) {
                     try {
                         final PackageInfo pi = ipm.getPackageInfo(pkgName, 0 /* no flags */, userId);
                         if (pi == null) {
@@ -349,4 +353,11 @@
             sHandler.sendMessage(sHandler.obtainMessage(MSG_UPDATE_NAME_ICON, this));
         }
     }
+
+    String[] extractPackagesFromSipper(BatterySipper sipper) {
+        // Only use system package if uid is system uid, so it could find a consistent name and icon
+        return sipper.getUid() == Process.SYSTEM_UID
+                ? new String[]{PACKAGE_SYSTEM}
+                : sipper.mPackages;
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
index 632d549..a461f46 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
@@ -21,6 +21,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.Handler;
+import android.os.Process;
 import android.os.UserManager;
 
 import com.android.internal.os.BatterySipper;
@@ -46,9 +47,12 @@
 public class BatteryEntryTest {
 
     private static final int APP_UID = 123;
+    private static final int SYSTEM_UID = Process.SYSTEM_UID;
     private static final String APP_DEFAULT_PACKAGE_NAME = "com.android.test";
     private static final String APP_LABEL = "Test App Name";
     private static final String HIGH_DRAIN_PACKAGE = "com.android.test.screen";
+    private static final String ANDROID_PACKAGE = "android";
+    private static final String[] SYSTEM_PACKAGES = {HIGH_DRAIN_PACKAGE, ANDROID_PACKAGE};
 
     @Rule public MockitoRule mocks = MockitoJUnit.rule();
 
@@ -84,6 +88,18 @@
         return sipper;
     }
 
+    private BatteryEntry createBatteryEntryForSystem() {
+        return new BatteryEntry(mockContext, mockHandler, mockUserManager, createSipperForSystem());
+    }
+
+    private BatterySipper createSipperForSystem() {
+        BatterySipper sipper =
+                new BatterySipper(DrainType.APP, new FakeUid(SYSTEM_UID), 0 /* power use */);
+        sipper.packageWithHighestDrain = HIGH_DRAIN_PACKAGE;
+        sipper.mPackages = SYSTEM_PACKAGES;
+        return sipper;
+    }
+
     @Test
     public void batteryEntryForApp_shouldSetDefaultPackageNameAndLabel() throws Exception {
         BatteryEntry entry = createBatteryEntryForApp();
@@ -118,7 +134,22 @@
             new String[]{APP_DEFAULT_PACKAGE_NAME, "package2", "package3"});
 
         BatteryEntry entry = createBatteryEntryForApp();
-        
+
         assertThat(entry.getLabel()).isEqualTo(HIGH_DRAIN_PACKAGE);
     }
+
+    @Test
+    public void extractPackageFromSipper_systemSipper_returnSystemPackage() {
+        BatteryEntry entry = createBatteryEntryForSystem();
+
+        assertThat(entry.extractPackagesFromSipper(entry.sipper)).isEqualTo(
+                new String[]{ANDROID_PACKAGE});
+    }
+
+    @Test
+    public void extractPackageFromSipper_normalSipper_returnDefaultPakcage() {
+        BatteryEntry entry = createBatteryEntryForApp();
+
+        assertThat(entry.extractPackagesFromSipper(entry.sipper)).isEqualTo(entry.sipper.mPackages);
+    }
 }