From 646c1a2e5aa0a1d27de1bfe18c0905ef42a6f291 Mon Sep 17 00:00:00 2001 From: ykhung Date: Thu, 20 May 2021 16:48:31 +0800 Subject: [PATCH] Add usage percentage and battery level into app relative metric Reference the table from PM requested: https://docs.google.com/spreadsheets/d/1TC_6MLVMvOS0p1ic0wPfQ-19AOuY8Kc8FUJdqaQSM4I/edit?ts=6098b296#gid=0 Bug: 188505537 Test: make SettingsRoboTests Change-Id: Ia31ada9438f120fe6f29b59b67dc4de6636c11e1 --- .../fuelgauge/AdvancedPowerUsageDetail.java | 22 ++++++++++++------- .../BatteryChartPreferenceController.java | 5 ++++- .../settings/fuelgauge/BatteryDiffEntry.java | 8 +++---- .../settings/fuelgauge/ConvertUtils.java | 5 +++++ .../AdvancedPowerUsageDetailTest.java | 13 +++++++++++ .../BatteryChartPreferenceControllerTest.java | 18 +++++++++++---- .../fuelgauge/BatteryDiffEntryTest.java | 7 +++--- 7 files changed, 58 insertions(+), 20 deletions(-) diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index 965994d34a6..cd0c114381c 100644 --- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java @@ -29,6 +29,7 @@ import android.text.Html; import android.text.TextUtils; import android.text.format.DateUtils; import android.util.Log; +import android.util.Pair; import android.view.View; import androidx.annotation.VisibleForTesting; @@ -49,7 +50,6 @@ import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.core.AbstractPreferenceController; -import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.utils.StringUtil; import com.android.settingslib.widget.LayoutPreference; import com.android.settingslib.widget.RadioButtonPreference; @@ -114,7 +114,6 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements @VisibleForTesting boolean enableTriState = true; - private MetricsFeatureProvider mMetricsFeatureProvider; private AppButtonsPreferenceController mAppButtonsPreferenceController; private BackgroundActivityPreferenceController mBackgroundActivityPreferenceController; @@ -242,8 +241,6 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); - mMetricsFeatureProvider = FeatureFactory.getFactory(getContext()) - .getMetricsFeatureProvider(); final String packageName = getArguments().getString(EXTRA_PACKAGE_NAME); if (enableTriState) { @@ -267,8 +264,11 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements if (enableTriState) { initPreferenceForTriState(getContext()); final String packageName = mBatteryOptimizeUtils.getPackageName(); - mMetricsFeatureProvider.action(getContext(), - SettingsEnums.OPEN_APP_BATTERY_USAGE, packageName); + FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider() + .action( + getContext(), + SettingsEnums.OPEN_APP_BATTERY_USAGE, + packageName); } else { initPreference(getContext()); } @@ -433,8 +433,14 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_RESTRICTED; } if (metricCategory != 0) { - mMetricsFeatureProvider.action(getContext(), - metricCategory, mBatteryOptimizeUtils.getPackageName()); + FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider() + .action( + getContext(), + metricCategory, + new Pair(ConvertUtils.METRIC_KEY_PACKAGE, + mBatteryOptimizeUtils.getPackageName()), + new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, + getArguments().getString(EXTRA_POWER_USAGE_PERCENT))); } } diff --git a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java index 88b8fa90cc6..2ac55e75d1b 100644 --- a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java @@ -27,6 +27,7 @@ import android.text.TextUtils; import android.text.format.DateFormat; import android.text.format.DateUtils; import android.util.Log; +import android.util.Pair; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; @@ -216,7 +217,9 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll isAppEntry ? SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM : SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM, - packageName); + new Pair(ConvertUtils.METRIC_KEY_PACKAGE, packageName), + new Pair(ConvertUtils.METRIC_KEY_BATTERY_LEVEL, histEntry.mBatteryLevel), + new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, powerPref.getPercent())); Log.d(TAG, String.format("handleClick() label=%s key=%s isValid:%b\n%s", diffEntry.getAppLabel(), histEntry.getKey(), isValidPackage, histEntry)); if (isValidPackage) { diff --git a/src/com/android/settings/fuelgauge/BatteryDiffEntry.java b/src/com/android/settings/fuelgauge/BatteryDiffEntry.java index 81ad5bec87c..5ed1cf52a74 100644 --- a/src/com/android/settings/fuelgauge/BatteryDiffEntry.java +++ b/src/com/android/settings/fuelgauge/BatteryDiffEntry.java @@ -258,7 +258,7 @@ public class BatteryDiffEntry { public String toString() { final StringBuilder builder = new StringBuilder() .append("BatteryDiffEntry{") - .append("\n\tname=" + getAppLabel()) + .append("\n\tname=" + mAppLabel) .append(String.format("\n\tconsume=%.2f%% %f/%f", mPercentOfTotal, mConsumePower, mTotalConsumePower)) .append(String.format("\n\tforeground:%s background:%s", @@ -266,9 +266,9 @@ public class BatteryDiffEntry { /*withSeconds=*/ true, /*collapseTimeUnit=*/ false), StringUtil.formatElapsedTime(mContext, mBackgroundUsageTimeInMs, /*withSeconds=*/ true, /*collapseTimeUnit=*/ false))) - .append(String.format("\n\tpackage:%s|%s uid:%d userId:%d", - mBatteryHistEntry.mPackageName, getPackageName(), - mBatteryHistEntry.mUid, mBatteryHistEntry.mUserId)); + .append(String.format("\n\tpackage:%s uid:%d userId:%d", + mBatteryHistEntry.mPackageName, mBatteryHistEntry.mUid, + mBatteryHistEntry.mUserId)); return builder.toString(); } diff --git a/src/com/android/settings/fuelgauge/ConvertUtils.java b/src/com/android/settings/fuelgauge/ConvertUtils.java index df9374de6f1..82133ee89fe 100644 --- a/src/com/android/settings/fuelgauge/ConvertUtils.java +++ b/src/com/android/settings/fuelgauge/ConvertUtils.java @@ -47,6 +47,11 @@ public final class ConvertUtils { // Maximum total time value for each slot cumulative data at most 2 hours. private static final float TOTAL_TIME_THRESHOLD = DateUtils.HOUR_IN_MILLIS * 2; + // Keys for metric metadata. + static final int METRIC_KEY_PACKAGE = 1; + static final int METRIC_KEY_BATTERY_LEVEL = 2; + static final int METRIC_KEY_BATTERY_USAGE = 3; + @VisibleForTesting static double PERCENTAGE_OF_TOTAL_THRESHOLD = 1f; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java index e5ca4e3f8be..ba978b99abe 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java @@ -33,6 +33,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AppOpsManager; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; @@ -41,6 +42,7 @@ import android.graphics.drawable.Drawable; import android.os.BatteryStats; import android.os.Bundle; import android.os.UserHandle; +import android.util.Pair; import androidx.fragment.app.FragmentActivity; import androidx.loader.app.LoaderManager; @@ -56,6 +58,7 @@ import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.instantapps.InstantAppDataProvider; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.widget.LayoutPreference; import com.android.settingslib.widget.RadioButtonPreference; @@ -129,6 +132,7 @@ public class AdvancedPowerUsageDetailTest { private AdvancedPowerUsageDetail mFragment; private SettingsActivity mTestActivity; private FakeFeatureFactory mFeatureFactory; + private MetricsFeatureProvider mMetricsFeatureProvider; @Before public void setUp() { @@ -137,6 +141,7 @@ public class AdvancedPowerUsageDetailTest { mContext = spy(RuntimeEnvironment.application); when(mContext.getPackageName()).thenReturn("foo"); mFeatureFactory = FakeFeatureFactory.setupForTest(); + mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider; mFragment = spy(new AdvancedPowerUsageDetail()); doReturn(mContext).when(mFragment).getContext(); @@ -751,5 +756,13 @@ public class AdvancedPowerUsageDetailTest { assertThat(mOptimizePreference.isChecked()).isTrue(); assertThat(mRestrictedPreference.isChecked()).isFalse(); assertThat(mUnrestrictedPreference.isChecked()).isFalse(); + verify(mMetricsFeatureProvider) + .action( + mContext, + SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED, + (Pair[]) new Pair[] { + new Pair(ConvertUtils.METRIC_KEY_PACKAGE, null), + new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, "app label") + }); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java index 7caa32edf02..9e2f65d6f3a 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java @@ -36,6 +36,7 @@ import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.text.format.DateUtils; +import android.util.Pair; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; @@ -92,6 +93,7 @@ public final class BatteryChartPreferenceControllerTest { @Before public void setUp() { + org.robolectric.shadows.ShadowSettings.set24HourTimeFormat(false); MockitoAnnotations.initMocks(this); mFeatureFactory = FakeFeatureFactory.setupForTest(); mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider; @@ -361,7 +363,11 @@ public final class BatteryChartPreferenceControllerTest { .action( mContext, SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM, - mBatteryHistEntry.mPackageName); + (Pair[]) new Pair[] { + new Pair(ConvertUtils.METRIC_KEY_PACKAGE, null), + new Pair(ConvertUtils.METRIC_KEY_BATTERY_LEVEL, 0), + new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, null) + }); } @Test @@ -378,7 +384,11 @@ public final class BatteryChartPreferenceControllerTest { .action( mContext, SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM, - mBatteryHistEntry.mPackageName); + (Pair[]) new Pair[] { + new Pair(ConvertUtils.METRIC_KEY_PACKAGE, null), + new Pair(ConvertUtils.METRIC_KEY_BATTERY_LEVEL, 0), + new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, null) + }); } @Test @@ -560,13 +570,13 @@ public final class BatteryChartPreferenceControllerTest { verify(mBatteryChartPreferenceController.mAppListPrefGroup) .setTitle(captor.capture()); assertThat(captor.getValue()) - .isEqualTo("App usage for 4 pm-7 am"); + .isEqualTo("App usage for 4 pm - 7 am"); // Verifies the title in the expandable divider. captor = ArgumentCaptor.forClass(String.class); verify(mBatteryChartPreferenceController.mExpandDividerPreference) .setTitle(captor.capture()); assertThat(captor.getValue()) - .isEqualTo("System usage for 4 pm-7 am"); + .isEqualTo("System usage for 4 pm - 7 am"); } @Test diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java index 58e2b4eeafe..586016399b3 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java @@ -55,6 +55,7 @@ public final class BatteryDiffEntryTest { @Mock private Drawable mockDrawable; @Mock private Drawable mockDrawable2; @Mock private Drawable mockBadgedDrawable; + @Mock private BatteryHistEntry mBatteryHistEntry; @Before public void setUp() { @@ -97,9 +98,9 @@ public final class BatteryDiffEntryTest { public void testComparator_sortCollectionsInDescOrder() { final List entryList = new ArrayList<>(); // Generates fake testing data. - entryList.add(createBatteryDiffEntry(30, /*batteryHistEntry=*/ null)); - entryList.add(createBatteryDiffEntry(20, /*batteryHistEntry=*/ null)); - entryList.add(createBatteryDiffEntry(10, /*batteryHistEntry=*/ null)); + entryList.add(createBatteryDiffEntry(30, mBatteryHistEntry)); + entryList.add(createBatteryDiffEntry(20, mBatteryHistEntry)); + entryList.add(createBatteryDiffEntry(10, mBatteryHistEntry)); Collections.sort(entryList, BatteryDiffEntry.COMPARATOR); assertThat(entryList.get(0).getPercentOfTotal()).isEqualTo(30);