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
This commit is contained in:
@@ -6629,10 +6629,14 @@
|
|||||||
<!-- Menu label for refreshing with latest usage numbers -->
|
<!-- Menu label for refreshing with latest usage numbers -->
|
||||||
<string name="menu_stats_refresh">Refresh</string>
|
<string name="menu_stats_refresh">Refresh</string>
|
||||||
|
|
||||||
<!-- Label for mediaserver process in battery usage -->
|
<!-- Label for mediaserver process in battery usage [CHAR_LIMIT=NONE] -->
|
||||||
<string name="process_mediaserver_label">Mediaserver</string>
|
<string name="process_mediaserver_label">Mediaserver</string>
|
||||||
<!-- Label for dex2oat process in battery usage used for the optimization of one or more apps -->
|
<!-- Label for dex2oat process in battery usage used for the optimization of one or more apps -->
|
||||||
<string name="process_dex2oat_label">App optimization</string>
|
<string name="process_dex2oat_label">App optimization</string>
|
||||||
|
<!-- Label for network tethering UID label in battery usage [CHAR_LIMIT=NONE] -->
|
||||||
|
<string name="process_network_tethering">Tethering</string>
|
||||||
|
<!-- Label for removed apps UID lablel in battery usage [CHAR_LIMIT=NONE] -->
|
||||||
|
<string name="process_removed_apps">Removed apps</string>
|
||||||
|
|
||||||
<!-- Battery saver: Label for feature, title + menu item [CHAR_LIMIT=40] -->
|
<!-- Battery saver: Label for feature, title + menu item [CHAR_LIMIT=40] -->
|
||||||
<string name="battery_saver">Battery Saver</string>
|
<string name="battery_saver">Battery Saver</string>
|
||||||
|
@@ -243,7 +243,8 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro
|
|||||||
continue;
|
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(),
|
final Drawable badgedIcon = mUserManager.getBadgedIconForUser(entry.getIcon(),
|
||||||
userHandle);
|
userHandle);
|
||||||
final CharSequence contentDescription = mUserManager.getBadgedLabelForUser(
|
final CharSequence contentDescription = mUserManager.getBadgedLabelForUser(
|
||||||
@@ -261,6 +262,8 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro
|
|||||||
pref.setOrder(i + 1);
|
pref.setOrder(i + 1);
|
||||||
pref.setPercent(percentOfTotal);
|
pref.setPercent(percentOfTotal);
|
||||||
pref.shouldShowAnomalyIcon(false);
|
pref.shouldShowAnomalyIcon(false);
|
||||||
|
pref.setEnabled(uid != BatteryUtils.UID_TETHERING
|
||||||
|
&& uid != BatteryUtils.UID_REMOVED_APPS);
|
||||||
setUsageSummary(pref, entry);
|
setUsageSummary(pref, entry);
|
||||||
addedSome = true;
|
addedSome = true;
|
||||||
mAppListGroup.addPreference(pref);
|
mAppListGroup.addPreference(pref);
|
||||||
|
@@ -153,13 +153,16 @@ public class BatteryDiffEntry {
|
|||||||
case ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY:
|
case ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY:
|
||||||
return true;
|
return true;
|
||||||
case ConvertUtils.CONSUMER_TYPE_UID_BATTERY:
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
final boolean combineSystemComponents =
|
final boolean combineSystemComponents =
|
||||||
mContext.getResources().getBoolean(
|
mContext.getResources().getBoolean(
|
||||||
R.bool.config_battery_combine_system_components);
|
R.bool.config_battery_combine_system_components);
|
||||||
return combineSystemComponents && isSystemUid((int) mBatteryHistEntry.mUid);
|
return combineSystemComponents && isSystemUid(uid);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@@ -550,6 +550,10 @@ public class BatteryEntry {
|
|||||||
Drawable icon = context.getDrawable(R.drawable.ic_power_system);
|
Drawable icon = context.getDrawable(R.drawable.ic_power_system);
|
||||||
if (uid == 0) {
|
if (uid == 0) {
|
||||||
name = context.getResources().getString(R.string.process_kernel_label);
|
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)) {
|
} else if ("mediaserver".equals(name)) {
|
||||||
name = context.getResources().getString(R.string.process_mediaserver_label);
|
name = context.getResources().getString(R.string.process_mediaserver_label);
|
||||||
} else if ("dex2oat".equals(name) || "dex2oat32".equals(name) ||
|
} else if ("dex2oat".equals(name) || "dex2oat32".equals(name) ||
|
||||||
|
@@ -65,6 +65,10 @@ import java.util.List;
|
|||||||
public class BatteryUtils {
|
public class BatteryUtils {
|
||||||
public static final int UID_NULL = -1;
|
public static final int UID_NULL = -1;
|
||||||
public static final int SDK_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)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
@IntDef({StatusType.SCREEN_USAGE,
|
@IntDef({StatusType.SCREEN_USAGE,
|
||||||
@@ -188,7 +192,10 @@ public class BatteryUtils {
|
|||||||
*/
|
*/
|
||||||
boolean shouldHideUidBatteryConsumerUnconditionally(UidBatteryConsumer consumer,
|
boolean shouldHideUidBatteryConsumerUnconditionally(UidBatteryConsumer consumer,
|
||||||
String[] packages) {
|
String[] packages) {
|
||||||
return consumer.getUid() < 0 || isHiddenSystemModule(packages);
|
final int uid = consumer.getUid();
|
||||||
|
return uid == UID_TETHERING
|
||||||
|
? false
|
||||||
|
: uid < 0 || isHiddenSystemModule(packages);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -26,6 +26,7 @@ import static org.mockito.Mockito.when;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
|
import android.os.Process;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
|
|
||||||
@@ -101,13 +102,22 @@ public class BatteryAppListPreferenceControllerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSetUsageSummary_timeLessThanOneMinute_DoNotSetSummary() {
|
public void testSetUsageSummary_timeLessThanOneMinute_doNotSetSummary() {
|
||||||
when(mBatteryEntry.getTimeInForegroundMs()).thenReturn(59 * DateUtils.SECOND_IN_MILLIS);
|
when(mBatteryEntry.getTimeInForegroundMs()).thenReturn(59 * DateUtils.SECOND_IN_MILLIS);
|
||||||
|
|
||||||
mPreferenceController.setUsageSummary(mPreference, mBatteryEntry);
|
mPreferenceController.setUsageSummary(mPreference, mBatteryEntry);
|
||||||
assertThat(mPreference.getSummary()).isNull();
|
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
|
@Test
|
||||||
public void testSetUsageSummary_timeMoreThanOneMinute_normalApp_setScreenSummary() {
|
public void testSetUsageSummary_timeMoreThanOneMinute_normalApp_setScreenSummary() {
|
||||||
when(mBatteryEntry.getTimeInForegroundMs()).thenReturn(2 * DateUtils.MINUTE_IN_MILLIS);
|
when(mBatteryEntry.getTimeInForegroundMs()).thenReturn(2 * DateUtils.MINUTE_IN_MILLIS);
|
||||||
|
@@ -357,6 +357,24 @@ public final class BatteryDiffEntryTest {
|
|||||||
assertThat(entry.isSystemEntry()).isFalse();
|
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
|
@Test
|
||||||
public void testUpdateRestrictionFlagState_updateFlagAsExpected() throws Exception {
|
public void testUpdateRestrictionFlagState_updateFlagAsExpected() throws Exception {
|
||||||
final String expectedAppLabel = "fake app label";
|
final String expectedAppLabel = "fake app label";
|
||||||
|
@@ -278,6 +278,22 @@ public class BatteryEntryTest {
|
|||||||
assertNameAndIcon("dex2oat", R.string.process_dex2oat_label);
|
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
|
@Test
|
||||||
public void getNameAndIconFromPowerComponent_rerturnExpectedNameAndIcon() {
|
public void getNameAndIconFromPowerComponent_rerturnExpectedNameAndIcon() {
|
||||||
assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY,
|
assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY,
|
||||||
|
Reference in New Issue
Block a user