From be10538a09755d46e8a27431c9d2472d5198504f Mon Sep 17 00:00:00 2001 From: ykhung Date: Wed, 4 May 2022 23:57:15 +0800 Subject: [PATCH] Support special tethering and removed apps UID in the usage list There is a special UID for network data tethering usage, we will handle it in a special case to avoid the current rule considering it as an invalid UID case without showing in the usage list. We will disable the click behavior to protect the optimization mode page first. Bug: 227395125 Test: make RunSettingsRoboTests -j56 ROBOTEST_FILTER="com.android.settings.fuelgauge" Change-Id: I8d96473d382ebc3253748cce8345d6f2261a233d --- res/values/strings.xml | 6 +++++- .../BatteryAppListPreferenceController.java | 5 ++++- .../settings/fuelgauge/BatteryDiffEntry.java | 7 +++++-- .../settings/fuelgauge/BatteryEntry.java | 4 ++++ .../settings/fuelgauge/BatteryUtils.java | 9 ++++++++- ...BatteryAppListPreferenceControllerTest.java | 12 +++++++++++- .../fuelgauge/BatteryDiffEntryTest.java | 18 ++++++++++++++++++ .../settings/fuelgauge/BatteryEntryTest.java | 16 ++++++++++++++++ 8 files changed, 71 insertions(+), 6 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 2d4a5442a7e..8c8d2dc9515 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6629,10 +6629,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,