Merge "Add usage percentage and battery level into app relative metric" into sc-dev
This commit is contained in:
@@ -29,6 +29,7 @@ import android.text.Html;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.util.Pair;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import androidx.annotation.VisibleForTesting;
|
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.AppUtils;
|
||||||
import com.android.settingslib.applications.ApplicationsState;
|
import com.android.settingslib.applications.ApplicationsState;
|
||||||
import com.android.settingslib.core.AbstractPreferenceController;
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
|
||||||
import com.android.settingslib.utils.StringUtil;
|
import com.android.settingslib.utils.StringUtil;
|
||||||
import com.android.settingslib.widget.LayoutPreference;
|
import com.android.settingslib.widget.LayoutPreference;
|
||||||
import com.android.settingslib.widget.RadioButtonPreference;
|
import com.android.settingslib.widget.RadioButtonPreference;
|
||||||
@@ -114,7 +114,6 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
boolean enableTriState = true;
|
boolean enableTriState = true;
|
||||||
|
|
||||||
private MetricsFeatureProvider mMetricsFeatureProvider;
|
|
||||||
private AppButtonsPreferenceController mAppButtonsPreferenceController;
|
private AppButtonsPreferenceController mAppButtonsPreferenceController;
|
||||||
private BackgroundActivityPreferenceController mBackgroundActivityPreferenceController;
|
private BackgroundActivityPreferenceController mBackgroundActivityPreferenceController;
|
||||||
|
|
||||||
@@ -242,8 +241,6 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle icicle) {
|
public void onCreate(Bundle icicle) {
|
||||||
super.onCreate(icicle);
|
super.onCreate(icicle);
|
||||||
mMetricsFeatureProvider = FeatureFactory.getFactory(getContext())
|
|
||||||
.getMetricsFeatureProvider();
|
|
||||||
|
|
||||||
final String packageName = getArguments().getString(EXTRA_PACKAGE_NAME);
|
final String packageName = getArguments().getString(EXTRA_PACKAGE_NAME);
|
||||||
if (enableTriState) {
|
if (enableTriState) {
|
||||||
@@ -267,8 +264,11 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
|
|||||||
if (enableTriState) {
|
if (enableTriState) {
|
||||||
initPreferenceForTriState(getContext());
|
initPreferenceForTriState(getContext());
|
||||||
final String packageName = mBatteryOptimizeUtils.getPackageName();
|
final String packageName = mBatteryOptimizeUtils.getPackageName();
|
||||||
mMetricsFeatureProvider.action(getContext(),
|
FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider()
|
||||||
SettingsEnums.OPEN_APP_BATTERY_USAGE, packageName);
|
.action(
|
||||||
|
getContext(),
|
||||||
|
SettingsEnums.OPEN_APP_BATTERY_USAGE,
|
||||||
|
packageName);
|
||||||
} else {
|
} else {
|
||||||
initPreference(getContext());
|
initPreference(getContext());
|
||||||
}
|
}
|
||||||
@@ -433,8 +433,14 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
|
|||||||
metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_RESTRICTED;
|
metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_RESTRICTED;
|
||||||
}
|
}
|
||||||
if (metricCategory != 0) {
|
if (metricCategory != 0) {
|
||||||
mMetricsFeatureProvider.action(getContext(),
|
FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider()
|
||||||
metricCategory, mBatteryOptimizeUtils.getPackageName());
|
.action(
|
||||||
|
getContext(),
|
||||||
|
metricCategory,
|
||||||
|
new Pair(ConvertUtils.METRIC_KEY_PACKAGE,
|
||||||
|
mBatteryOptimizeUtils.getPackageName()),
|
||||||
|
new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE,
|
||||||
|
getArguments().getString(EXTRA_POWER_USAGE_PERCENT)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -27,6 +27,7 @@ import android.text.TextUtils;
|
|||||||
import android.text.format.DateFormat;
|
import android.text.format.DateFormat;
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
@@ -216,7 +217,9 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
|
|||||||
isAppEntry
|
isAppEntry
|
||||||
? SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM
|
? SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM
|
||||||
: SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_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",
|
Log.d(TAG, String.format("handleClick() label=%s key=%s isValid:%b\n%s",
|
||||||
diffEntry.getAppLabel(), histEntry.getKey(), isValidPackage, histEntry));
|
diffEntry.getAppLabel(), histEntry.getKey(), isValidPackage, histEntry));
|
||||||
if (isValidPackage) {
|
if (isValidPackage) {
|
||||||
|
@@ -258,7 +258,7 @@ public class BatteryDiffEntry {
|
|||||||
public String toString() {
|
public String toString() {
|
||||||
final StringBuilder builder = new StringBuilder()
|
final StringBuilder builder = new StringBuilder()
|
||||||
.append("BatteryDiffEntry{")
|
.append("BatteryDiffEntry{")
|
||||||
.append("\n\tname=" + getAppLabel())
|
.append("\n\tname=" + mAppLabel)
|
||||||
.append(String.format("\n\tconsume=%.2f%% %f/%f",
|
.append(String.format("\n\tconsume=%.2f%% %f/%f",
|
||||||
mPercentOfTotal, mConsumePower, mTotalConsumePower))
|
mPercentOfTotal, mConsumePower, mTotalConsumePower))
|
||||||
.append(String.format("\n\tforeground:%s background:%s",
|
.append(String.format("\n\tforeground:%s background:%s",
|
||||||
@@ -266,9 +266,9 @@ public class BatteryDiffEntry {
|
|||||||
/*withSeconds=*/ true, /*collapseTimeUnit=*/ false),
|
/*withSeconds=*/ true, /*collapseTimeUnit=*/ false),
|
||||||
StringUtil.formatElapsedTime(mContext, mBackgroundUsageTimeInMs,
|
StringUtil.formatElapsedTime(mContext, mBackgroundUsageTimeInMs,
|
||||||
/*withSeconds=*/ true, /*collapseTimeUnit=*/ false)))
|
/*withSeconds=*/ true, /*collapseTimeUnit=*/ false)))
|
||||||
.append(String.format("\n\tpackage:%s|%s uid:%d userId:%d",
|
.append(String.format("\n\tpackage:%s uid:%d userId:%d",
|
||||||
mBatteryHistEntry.mPackageName, getPackageName(),
|
mBatteryHistEntry.mPackageName, mBatteryHistEntry.mUid,
|
||||||
mBatteryHistEntry.mUid, mBatteryHistEntry.mUserId));
|
mBatteryHistEntry.mUserId));
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -47,6 +47,11 @@ public final class ConvertUtils {
|
|||||||
// Maximum total time value for each slot cumulative data at most 2 hours.
|
// 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;
|
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
|
@VisibleForTesting
|
||||||
static double PERCENTAGE_OF_TOTAL_THRESHOLD = 1f;
|
static double PERCENTAGE_OF_TOTAL_THRESHOLD = 1f;
|
||||||
|
|
||||||
|
@@ -33,6 +33,7 @@ import static org.mockito.Mockito.verify;
|
|||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import android.app.AppOpsManager;
|
import android.app.AppOpsManager;
|
||||||
|
import android.app.settings.SettingsEnums;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
@@ -41,6 +42,7 @@ import android.graphics.drawable.Drawable;
|
|||||||
import android.os.BatteryStats;
|
import android.os.BatteryStats;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
import androidx.loader.app.LoaderManager;
|
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.AppUtils;
|
||||||
import com.android.settingslib.applications.ApplicationsState;
|
import com.android.settingslib.applications.ApplicationsState;
|
||||||
import com.android.settingslib.applications.instantapps.InstantAppDataProvider;
|
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.core.lifecycle.Lifecycle;
|
||||||
import com.android.settingslib.widget.LayoutPreference;
|
import com.android.settingslib.widget.LayoutPreference;
|
||||||
import com.android.settingslib.widget.RadioButtonPreference;
|
import com.android.settingslib.widget.RadioButtonPreference;
|
||||||
@@ -129,6 +132,7 @@ public class AdvancedPowerUsageDetailTest {
|
|||||||
private AdvancedPowerUsageDetail mFragment;
|
private AdvancedPowerUsageDetail mFragment;
|
||||||
private SettingsActivity mTestActivity;
|
private SettingsActivity mTestActivity;
|
||||||
private FakeFeatureFactory mFeatureFactory;
|
private FakeFeatureFactory mFeatureFactory;
|
||||||
|
private MetricsFeatureProvider mMetricsFeatureProvider;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
@@ -137,6 +141,7 @@ public class AdvancedPowerUsageDetailTest {
|
|||||||
mContext = spy(RuntimeEnvironment.application);
|
mContext = spy(RuntimeEnvironment.application);
|
||||||
when(mContext.getPackageName()).thenReturn("foo");
|
when(mContext.getPackageName()).thenReturn("foo");
|
||||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||||
|
mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
|
||||||
|
|
||||||
mFragment = spy(new AdvancedPowerUsageDetail());
|
mFragment = spy(new AdvancedPowerUsageDetail());
|
||||||
doReturn(mContext).when(mFragment).getContext();
|
doReturn(mContext).when(mFragment).getContext();
|
||||||
@@ -751,5 +756,13 @@ public class AdvancedPowerUsageDetailTest {
|
|||||||
assertThat(mOptimizePreference.isChecked()).isTrue();
|
assertThat(mOptimizePreference.isChecked()).isTrue();
|
||||||
assertThat(mRestrictedPreference.isChecked()).isFalse();
|
assertThat(mRestrictedPreference.isChecked()).isFalse();
|
||||||
assertThat(mUnrestrictedPreference.isChecked()).isFalse();
|
assertThat(mUnrestrictedPreference.isChecked()).isFalse();
|
||||||
|
verify(mMetricsFeatureProvider)
|
||||||
|
.action(
|
||||||
|
mContext,
|
||||||
|
SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED,
|
||||||
|
(Pair<Integer, Object>[]) new Pair[] {
|
||||||
|
new Pair(ConvertUtils.METRIC_KEY_PACKAGE, null),
|
||||||
|
new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, "app label")
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -36,6 +36,7 @@ import android.content.res.Resources;
|
|||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.PreferenceCategory;
|
import androidx.preference.PreferenceCategory;
|
||||||
@@ -92,6 +93,7 @@ public final class BatteryChartPreferenceControllerTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
|
org.robolectric.shadows.ShadowSettings.set24HourTimeFormat(false);
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||||
mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
|
mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
|
||||||
@@ -361,7 +363,11 @@ public final class BatteryChartPreferenceControllerTest {
|
|||||||
.action(
|
.action(
|
||||||
mContext,
|
mContext,
|
||||||
SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM,
|
SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM,
|
||||||
mBatteryHistEntry.mPackageName);
|
(Pair<Integer, Object>[]) 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
|
@Test
|
||||||
@@ -378,7 +384,11 @@ public final class BatteryChartPreferenceControllerTest {
|
|||||||
.action(
|
.action(
|
||||||
mContext,
|
mContext,
|
||||||
SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM,
|
SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM,
|
||||||
mBatteryHistEntry.mPackageName);
|
(Pair<Integer, Object>[]) 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
|
@Test
|
||||||
|
@@ -55,6 +55,7 @@ public final class BatteryDiffEntryTest {
|
|||||||
@Mock private Drawable mockDrawable;
|
@Mock private Drawable mockDrawable;
|
||||||
@Mock private Drawable mockDrawable2;
|
@Mock private Drawable mockDrawable2;
|
||||||
@Mock private Drawable mockBadgedDrawable;
|
@Mock private Drawable mockBadgedDrawable;
|
||||||
|
@Mock private BatteryHistEntry mBatteryHistEntry;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
@@ -97,9 +98,9 @@ public final class BatteryDiffEntryTest {
|
|||||||
public void testComparator_sortCollectionsInDescOrder() {
|
public void testComparator_sortCollectionsInDescOrder() {
|
||||||
final List<BatteryDiffEntry> entryList = new ArrayList<>();
|
final List<BatteryDiffEntry> entryList = new ArrayList<>();
|
||||||
// Generates fake testing data.
|
// Generates fake testing data.
|
||||||
entryList.add(createBatteryDiffEntry(30, /*batteryHistEntry=*/ null));
|
entryList.add(createBatteryDiffEntry(30, mBatteryHistEntry));
|
||||||
entryList.add(createBatteryDiffEntry(20, /*batteryHistEntry=*/ null));
|
entryList.add(createBatteryDiffEntry(20, mBatteryHistEntry));
|
||||||
entryList.add(createBatteryDiffEntry(10, /*batteryHistEntry=*/ null));
|
entryList.add(createBatteryDiffEntry(10, mBatteryHistEntry));
|
||||||
Collections.sort(entryList, BatteryDiffEntry.COMPARATOR);
|
Collections.sort(entryList, BatteryDiffEntry.COMPARATOR);
|
||||||
|
|
||||||
assertThat(entryList.get(0).getPercentOfTotal()).isEqualTo(30);
|
assertThat(entryList.get(0).getPercentOfTotal()).isEqualTo(30);
|
||||||
|
Reference in New Issue
Block a user