diff --git a/src/com/android/settings/fuelgauge/BatteryEntry.java b/src/com/android/settings/fuelgauge/BatteryEntry.java index aa7125282f5..7a18cd0fa94 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.PackageManager.NameNotFoundException; 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 class BatteryEntry { 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 sUidCache = new HashMap(); @@ -268,9 +270,11 @@ public class BatteryEntry { 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 @@ public class BatteryEntry { packageLabels[i] = label.toString(); } if (ai.icon != 0) { - defaultPackageName = sipper.mPackages[i]; + defaultPackageName = packages[i]; icon = ai.loadIcon(pm); break; } @@ -303,7 +307,7 @@ public class BatteryEntry { 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 @@ public class BatteryEntry { 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 632d54926a7..a461f466331 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.ApplicationInfo; 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 @@ import static org.mockito.Mockito.when; 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 @@ public class BatteryEntryTest { 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 @@ public class BatteryEntryTest { 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); + } }