From 1e887c17e20f505cb521faae626253afee5fa552 Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Wed, 6 Sep 2017 14:18:29 -0700 Subject: [PATCH] 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 --- .../android/settings/fuelgauge/BatteryEntry.java | 21 ++++++++++---- .../settings/fuelgauge/BatteryEntryTest.java | 33 +++++++++++++++++++++- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryEntry.java b/src/com/android/settings/fuelgauge/BatteryEntry.java index aa7125282f..7a18cd0fa9 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 632d54926a..a461f46633 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); + } } -- 2.11.0