Add extra log for battery tip.

For each visible battery tip, logs its type and state. For battery tip
with app list, also log that list:

1. HighUsageTip: apps that used too much battery
2. RestrictAppTip: apps with anomaly, also logs the anomaly type

Bug: 73888115
Test: RunSettingsRoboTests
Change-Id: I1b61eb1d793d979baab4864d2d652e12260b590d
This commit is contained in:
jackqdyulei
2018-03-02 16:33:59 -08:00
committed by Lei Yu
parent 7caecd36f7
commit 513ddb14a6
16 changed files with 231 additions and 17 deletions

View File

@@ -17,6 +17,7 @@
package com.android.settings.fuelgauge.batterytip;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
import static org.robolectric.Shadows.shadowOf;
@@ -29,7 +30,6 @@ import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip;
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowUtils;
@@ -67,7 +67,6 @@ public class BatteryTipDialogFragmentTest {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
FakeFeatureFactory.setupForTest();
List<AppInfo> highUsageTips = new ArrayList<>();
final AppInfo appInfo = new AppInfo.Builder()
@@ -102,7 +101,7 @@ public class BatteryTipDialogFragmentTest {
ShadowAlertDialog shadowDialog = shadowOf(dialog);
assertThat(shadowDialog.getMessage())
.isEqualTo(mContext.getString(R.string.battery_tip_dialog_message, "1h"));
.isEqualTo(mContext.getString(R.string.battery_tip_dialog_message, "1h"));
}
@Test
@@ -116,7 +115,7 @@ public class BatteryTipDialogFragmentTest {
assertThat(shadowDialog.getTitle()).isEqualTo("Restrict app?");
assertThat(shadowDialog.getMessage())
.isEqualTo(mContext.getString(R.string.battery_tip_restrict_app_dialog_message));
.isEqualTo(mContext.getString(R.string.battery_tip_restrict_app_dialog_message));
}
@Test
@@ -134,7 +133,7 @@ public class BatteryTipDialogFragmentTest {
assertThat(shadowDialog.getTitle()).isEqualTo("Restrict 2 apps?");
assertThat(shadowDialog.getMessage())
.isEqualTo(mContext.getString(R.string.battery_tip_restrict_app_dialog_message));
.isEqualTo(mContext.getString(R.string.battery_tip_restrict_app_dialog_message));
assertThat(shadowDialog.getView()).isNotNull();
}
@@ -150,6 +149,6 @@ public class BatteryTipDialogFragmentTest {
assertThat(shadowDialog.getTitle()).isEqualTo("Remove restriction for app?");
assertThat(shadowDialog.getMessage())
.isEqualTo(mContext.getString(R.string.battery_tip_unrestrict_app_dialog_message));
.isEqualTo(mContext.getString(R.string.battery_tip_unrestrict_app_dialog_message));
}
}

View File

@@ -119,9 +119,9 @@ public class BatteryTipPreferenceControllerTest {
public void testUpdateBatteryTips_logBatteryTip() {
mBatteryTipPreferenceController.updateBatteryTips(mOldBatteryTips);
verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class),
eq(MetricsProto.MetricsEvent.ACTION_BATTERY_TIP_SHOWN),
eq(BatteryTip.TipType.SUMMARY));
verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
MetricsProto.MetricsEvent.ACTION_SUMMARY_TIP,
BatteryTip.StateType.NEW);
}
@Test

View File

@@ -25,6 +25,7 @@ import android.support.v7.preference.Preference;
import com.android.settings.R;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
import org.junit.Test;
@@ -122,6 +123,11 @@ public class BatteryTipTest {
// do nothing
}
@Override
public void log(Context context, MetricsFeatureProvider metricsFeatureProvider) {
// do nothing
}
public final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public BatteryTip createFromParcel(Parcel in) {
return new TestBatteryTip(in);

View File

@@ -17,28 +17,38 @@ package com.android.settings.fuelgauge.batterytip.tips;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.verify;
import android.content.Context;
import android.os.Parcel;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
@RunWith(SettingsRobolectricTestRunner.class)
public class EarlyWarningTipTest {
@Mock
private MetricsFeatureProvider mMetricsFeatureProvider;
private Context mContext;
private EarlyWarningTip mEarlyWarningTip;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mEarlyWarningTip =
new EarlyWarningTip(BatteryTip.StateType.NEW, false /* powerSaveModeOn */);
new EarlyWarningTip(BatteryTip.StateType.NEW, false /* powerSaveModeOn */);
}
@Test
@@ -55,7 +65,7 @@ public class EarlyWarningTipTest {
@Test
public void testInfo_stateNew_displayPowerModeInfo() {
final EarlyWarningTip tip =
new EarlyWarningTip(BatteryTip.StateType.NEW, false /* powerModeOn */);
new EarlyWarningTip(BatteryTip.StateType.NEW, false /* powerModeOn */);
assertThat(tip.getTitle(mContext)).isEqualTo("Turn on Low Battery Mode");
assertThat(tip.getSummary(mContext)).isEqualTo("Extend your battery life");
@@ -65,7 +75,7 @@ public class EarlyWarningTipTest {
@Test
public void testInfo_stateHandled_displayPowerModeHandledInfo() {
final EarlyWarningTip tip =
new EarlyWarningTip(BatteryTip.StateType.HANDLED, false /* powerModeOn */);
new EarlyWarningTip(BatteryTip.StateType.HANDLED, false /* powerModeOn */);
assertThat(tip.getTitle(mContext)).isEqualTo("Low Battery Mode is on");
assertThat(tip.getSummary(mContext)).isEqualTo("Some features are limited");
@@ -75,7 +85,7 @@ public class EarlyWarningTipTest {
@Test
public void testUpdate_powerModeTurnedOn_typeBecomeHandled() {
final EarlyWarningTip nextTip =
new EarlyWarningTip(BatteryTip.StateType.INVISIBLE, true /* powerModeOn */);
new EarlyWarningTip(BatteryTip.StateType.INVISIBLE, true /* powerModeOn */);
mEarlyWarningTip.updateState(nextTip);
@@ -115,4 +125,12 @@ public class EarlyWarningTipTest {
assertThat(earlyWarningTip.getState()).isEqualTo(BatteryTip.StateType.INVISIBLE);
}
@Test
public void testLog() {
mEarlyWarningTip.log(mContext, mMetricsFeatureProvider);
verify(mMetricsFeatureProvider).action(mContext,
MetricsProto.MetricsEvent.ACTION_EARLY_WARNING_TIP, BatteryTip.StateType.NEW);
}
}

View File

@@ -17,16 +17,22 @@ package com.android.settings.fuelgauge.batterytip.tips;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.verify;
import android.content.Context;
import android.os.Parcel;
import android.text.format.DateUtils;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.fuelgauge.batterytip.AppInfo;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
@@ -38,14 +44,17 @@ public class HighUsageTipTest {
private static final String PACKAGE_NAME = "com.android.app";
private static final long SCREEN_TIME = 30 * DateUtils.MINUTE_IN_MILLIS;
@Mock
private MetricsFeatureProvider mMetricsFeatureProvider;
private Context mContext;
private HighUsageTip mBatteryTip;
private List<AppInfo> mUsageAppList;
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mUsageAppList = new ArrayList<>();
mUsageAppList.add(new AppInfo.Builder()
.setPackageName(PACKAGE_NAME)
@@ -80,4 +89,15 @@ public class HighUsageTipTest {
"type=2 state=0 { packageName=com.android.app,anomalyTypes={},screenTime=1800000 "
+ "}");
}
@Test
public void testLog_logAppInfo() {
mBatteryTip.log(mContext, mMetricsFeatureProvider);
verify(mMetricsFeatureProvider).action(mContext,
MetricsProto.MetricsEvent.ACTION_HIGH_USAGE_TIP, BatteryTip.StateType.NEW);
verify(mMetricsFeatureProvider).action(mContext,
MetricsProto.MetricsEvent.ACTION_HIGH_USAGE_TIP_LIST,
PACKAGE_NAME);
}
}

View File

@@ -16,16 +16,25 @@
package com.android.settings.fuelgauge.batterytip.tips;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Parcel;
import android.util.Pair;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.fuelgauge.batterytip.AppInfo;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
import org.junit.Test;
@@ -53,6 +62,8 @@ public class RestrictAppTipTest {
private ApplicationInfo mApplicationInfo;
@Mock
private PackageManager mPackageManager;
@Mock
private MetricsFeatureProvider mMetricsFeatureProvider;
@Before
public void setUp() throws Exception {
@@ -132,4 +143,30 @@ public class RestrictAppTipTest {
assertThat(mNewBatteryTip.toString()).isEqualTo(
"type=1 state=0 { packageName=com.android.app,anomalyTypes={0, 1},screenTime=0 }");
}
@Test
public void testLog_stateNew_logAppInfo() {
mNewBatteryTip.log(mContext, mMetricsFeatureProvider);
verify(mMetricsFeatureProvider).action(mContext,
MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP, BatteryTip.StateType.NEW);
verify(mMetricsFeatureProvider).action(mContext,
MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST,
PACKAGE_NAME,
Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, ANOMALY_WAKEUP));
verify(mMetricsFeatureProvider).action(mContext,
MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST,
PACKAGE_NAME,
Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, ANOMALY_WAKELOCK));
}
@Test
public void testLog_stateHandled_doNotLogAppInfo() {
mHandledBatteryTip.log(mContext, mMetricsFeatureProvider);
verify(mMetricsFeatureProvider).action(mContext,
MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP, BatteryTip.StateType.HANDLED);
verify(mMetricsFeatureProvider, never()).action(any(), anyInt(), anyString(), any());
}
}

View File

@@ -0,0 +1,56 @@
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.fuelgauge.batterytip.tips;
import static org.mockito.Mockito.verify;
import android.content.Context;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
@RunWith(SettingsRobolectricTestRunner.class)
public class SmartBatteryTipTest {
@Mock
private MetricsFeatureProvider mMetricsFeatureProvider;
private Context mContext;
private SmartBatteryTip mSmartBatteryTip;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mSmartBatteryTip = new SmartBatteryTip(BatteryTip.StateType.NEW);
}
@Test
public void testLog() {
mSmartBatteryTip.log(mContext, mMetricsFeatureProvider);
verify(mMetricsFeatureProvider).action(mContext,
MetricsProto.MetricsEvent.ACTION_SMART_BATTERY_TIP, BatteryTip.StateType.NEW);
}
}