diff --git a/res/values/strings.xml b/res/values/strings.xml index 27e449fe5ae..4b0e2e6c45c 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6627,10 +6627,14 @@ Refresh - + Mediaserver App optimization + + Tethering + + Removed apps Battery Saver diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java index 1ecde443dce..9e1bbb3cb06 100644 --- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java @@ -243,7 +243,8 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro continue; } - final UserHandle userHandle = new UserHandle(UserHandle.getUserId(entry.getUid())); + final int uid = entry.getUid(); + final UserHandle userHandle = new UserHandle(UserHandle.getUserId(uid)); final Drawable badgedIcon = mUserManager.getBadgedIconForUser(entry.getIcon(), userHandle); final CharSequence contentDescription = mUserManager.getBadgedLabelForUser( @@ -261,6 +262,8 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro pref.setOrder(i + 1); pref.setPercent(percentOfTotal); pref.shouldShowAnomalyIcon(false); + pref.setEnabled(uid != BatteryUtils.UID_TETHERING + && uid != BatteryUtils.UID_REMOVED_APPS); setUsageSummary(pref, entry); addedSome = true; mAppListGroup.addPreference(pref); diff --git a/src/com/android/settings/fuelgauge/BatteryDiffEntry.java b/src/com/android/settings/fuelgauge/BatteryDiffEntry.java index 5ef111005f0..403f79cffa4 100644 --- a/src/com/android/settings/fuelgauge/BatteryDiffEntry.java +++ b/src/com/android/settings/fuelgauge/BatteryDiffEntry.java @@ -153,13 +153,16 @@ public class BatteryDiffEntry { case ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY: return true; case ConvertUtils.CONSUMER_TYPE_UID_BATTERY: - if (mBatteryHistEntry.mIsHidden) { + final int uid = (int) mBatteryHistEntry.mUid; + if (mBatteryHistEntry.mIsHidden + || uid == BatteryUtils.UID_REMOVED_APPS + || uid == BatteryUtils.UID_TETHERING) { return true; } final boolean combineSystemComponents = mContext.getResources().getBoolean( R.bool.config_battery_combine_system_components); - return combineSystemComponents && isSystemUid((int) mBatteryHistEntry.mUid); + return combineSystemComponents && isSystemUid(uid); } return false; } diff --git a/src/com/android/settings/fuelgauge/BatteryEntry.java b/src/com/android/settings/fuelgauge/BatteryEntry.java index c9acc4c46ca..518dc96693b 100644 --- a/src/com/android/settings/fuelgauge/BatteryEntry.java +++ b/src/com/android/settings/fuelgauge/BatteryEntry.java @@ -550,6 +550,10 @@ public class BatteryEntry { Drawable icon = context.getDrawable(R.drawable.ic_power_system); if (uid == 0) { name = context.getResources().getString(R.string.process_kernel_label); + } else if (uid == BatteryUtils.UID_REMOVED_APPS) { + name = context.getResources().getString(R.string.process_removed_apps); + } else if (uid == BatteryUtils.UID_TETHERING) { + name = context.getResources().getString(R.string.process_network_tethering); } else if ("mediaserver".equals(name)) { name = context.getResources().getString(R.string.process_mediaserver_label); } else if ("dex2oat".equals(name) || "dex2oat32".equals(name) || diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java index 67ffa7d4520..29c2fc96d86 100644 --- a/src/com/android/settings/fuelgauge/BatteryUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryUtils.java @@ -65,6 +65,10 @@ import java.util.List; public class BatteryUtils { public static final int UID_NULL = -1; public static final int SDK_NULL = -1; + /** Special UID value for data usage by removed apps. */ + public static final int UID_REMOVED_APPS = -4; + /** Special UID value for data usage by tethering. */ + public static final int UID_TETHERING = -5; @Retention(RetentionPolicy.SOURCE) @IntDef({StatusType.SCREEN_USAGE, @@ -188,7 +192,10 @@ public class BatteryUtils { */ boolean shouldHideUidBatteryConsumerUnconditionally(UidBatteryConsumer consumer, String[] packages) { - return consumer.getUid() < 0 || isHiddenSystemModule(packages); + final int uid = consumer.getUid(); + return uid == UID_TETHERING + ? false + : uid < 0 || isHiddenSystemModule(packages); } /** diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java index 5e69b8fb05b..46773c96622 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java @@ -26,6 +26,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Resources; +import android.os.Process; import android.os.UserManager; import android.text.format.DateUtils; @@ -101,13 +102,22 @@ public class BatteryAppListPreferenceControllerTest { } @Test - public void testSetUsageSummary_timeLessThanOneMinute_DoNotSetSummary() { + public void testSetUsageSummary_timeLessThanOneMinute_doNotSetSummary() { when(mBatteryEntry.getTimeInForegroundMs()).thenReturn(59 * DateUtils.SECOND_IN_MILLIS); mPreferenceController.setUsageSummary(mPreference, mBatteryEntry); assertThat(mPreference.getSummary()).isNull(); } + @Test + public void testSetUsageSummary_systemProcessUid_doNotSetSummary() { + when(mBatteryEntry.getTimeInForegroundMs()).thenReturn(DateUtils.MINUTE_IN_MILLIS); + when(mBatteryEntry.getUid()).thenReturn(Process.SYSTEM_UID); + + mPreferenceController.setUsageSummary(mPreference, mBatteryEntry); + assertThat(mPreference.getSummary()).isNull(); + } + @Test public void testSetUsageSummary_timeMoreThanOneMinute_normalApp_setScreenSummary() { when(mBatteryEntry.getTimeInForegroundMs()).thenReturn(2 * DateUtils.MINUTE_IN_MILLIS); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java index 710d0653a4e..6ea13901eef 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java @@ -357,6 +357,24 @@ public final class BatteryDiffEntryTest { assertThat(entry.isSystemEntry()).isFalse(); } + @Test + public void testIsSystemEntry_uidBatteryWithTetheringProcess_returnTrue() { + final BatteryDiffEntry entry = + createBatteryDiffEntry( + ConvertUtils.CONSUMER_TYPE_UID_BATTERY, + /*uid=*/ BatteryUtils.UID_TETHERING, /*isHidden=*/ false); + assertThat(entry.isSystemEntry()).isTrue(); + } + + @Test + public void testIsSystemEntry_uidBatteryWithRemovedAppsProcess_returnTrue() { + final BatteryDiffEntry entry = + createBatteryDiffEntry( + ConvertUtils.CONSUMER_TYPE_UID_BATTERY, + /*uid=*/ BatteryUtils.UID_REMOVED_APPS, /*isHidden=*/ false); + assertThat(entry.isSystemEntry()).isTrue(); + } + @Test public void testUpdateRestrictionFlagState_updateFlagAsExpected() throws Exception { final String expectedAppLabel = "fake app label"; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java index 966bc701ced..707a658c569 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java @@ -278,6 +278,22 @@ public class BatteryEntryTest { assertNameAndIcon("dex2oat", R.string.process_dex2oat_label); } + @Test + public void getNameAndIconFromUid_tetheringUid_rerturnExpectedName() { + final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUid( + mContext, /* name */ null, /* uid */ BatteryUtils.UID_TETHERING); + + assertThat(nameAndIcon.mName).isEqualTo(getString(R.string.process_network_tethering)); + } + + @Test + public void getNameAndIconFromUid_removedAppsUid_rerturnExpectedName() { + final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUid( + mContext, /* name */ null, /* uid */ BatteryUtils.UID_REMOVED_APPS); + + assertThat(nameAndIcon.mName).isEqualTo(getString(R.string.process_removed_apps)); + } + @Test public void getNameAndIconFromPowerComponent_rerturnExpectedNameAndIcon() { assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY,