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,