diff --git a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java index 21bd4b73181..c117b9a22da 100644 --- a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java @@ -15,7 +15,6 @@ package com.android.settings.fuelgauge; import android.app.AppOpsManager; -import android.app.Fragment; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.os.UserManager; @@ -24,6 +23,7 @@ import android.support.v7.preference.Preference; import com.android.settings.R; import com.android.settings.Utils; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.fuelgauge.batterytip.AppInfo; import com.android.settings.fuelgauge.batterytip.BatteryTipDialogFragment; @@ -51,17 +51,17 @@ public class BackgroundActivityPreferenceController extends AbstractPreferenceCo DevicePolicyManagerWrapper mDpm; @VisibleForTesting BatteryUtils mBatteryUtils; - private Fragment mFragment; + private InstrumentedPreferenceFragment mFragment; private String mTargetPackage; private PowerWhitelistBackend mPowerWhitelistBackend; - public BackgroundActivityPreferenceController(Context context, Fragment fragment, - int uid, String packageName) { + public BackgroundActivityPreferenceController(Context context, + InstrumentedPreferenceFragment fragment, int uid, String packageName) { this(context, fragment, uid, packageName, PowerWhitelistBackend.getInstance()); } @VisibleForTesting - BackgroundActivityPreferenceController(Context context, Fragment fragment, + BackgroundActivityPreferenceController(Context context, InstrumentedPreferenceFragment fragment, int uid, String packageName, PowerWhitelistBackend backend) { super(context); mPowerWhitelistBackend = backend; @@ -137,7 +137,8 @@ public class BackgroundActivityPreferenceController extends AbstractPreferenceCo ? new UnrestrictAppTip(BatteryTip.StateType.NEW, appInfo) : new RestrictAppTip(BatteryTip.StateType.NEW, appInfo); - final BatteryTipDialogFragment dialogFragment = BatteryTipDialogFragment.newInstance(tip); + final BatteryTipDialogFragment dialogFragment = BatteryTipDialogFragment.newInstance(tip, + mFragment.getMetricsCategory()); dialogFragment.setTargetFragment(mFragment, 0 /* requestCode */); dialogFragment.show(mFragment.getFragmentManager(), TAG); } diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java index a7d542ca69e..2387463ca1c 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java @@ -51,15 +51,19 @@ public class BatteryTipDialogFragment extends InstrumentedDialogFragment impleme DialogInterface.OnClickListener { private static final String ARG_BATTERY_TIP = "battery_tip"; + private static final String ARG_METRICS_KEY = "metrics_key"; @VisibleForTesting BatteryTip mBatteryTip; + @VisibleForTesting + int mMetricsKey; - public static BatteryTipDialogFragment newInstance(BatteryTip batteryTip) { + public static BatteryTipDialogFragment newInstance(BatteryTip batteryTip, int metricsKey) { BatteryTipDialogFragment dialogFragment = new BatteryTipDialogFragment(); Bundle args = new Bundle(1); args.putParcelable(ARG_BATTERY_TIP, batteryTip); + args.putInt(ARG_METRICS_KEY, metricsKey); dialogFragment.setArguments(args); return dialogFragment; @@ -71,6 +75,7 @@ public class BatteryTipDialogFragment extends InstrumentedDialogFragment impleme final Context context = getContext(); mBatteryTip = bundle.getParcelable(ARG_BATTERY_TIP); + mMetricsKey = bundle.getInt(ARG_METRICS_KEY); switch (mBatteryTip.getType()) { case BatteryTip.TipType.SUMMARY: @@ -165,7 +170,7 @@ public class BatteryTipDialogFragment extends InstrumentedDialogFragment impleme (SettingsActivity) getActivity(), (InstrumentedPreferenceFragment) getTargetFragment()); if (action != null) { - action.handlePositiveAction(); + action.handlePositiveAction(mMetricsKey); } lsn.onBatteryTipHandled(mBatteryTip); } diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java index 9e4778222b6..76c65e011d5 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java @@ -118,14 +118,14 @@ public class BatteryTipPreferenceController extends BasePreferenceController { if (batteryTip != null) { if (batteryTip.shouldShowDialog()) { BatteryTipDialogFragment dialogFragment = BatteryTipDialogFragment.newInstance( - batteryTip); + batteryTip, mFragment.getMetricsCategory()); dialogFragment.setTargetFragment(mFragment, REQUEST_ANOMALY_ACTION); dialogFragment.show(mFragment.getFragmentManager(), TAG); } else { final BatteryTipAction action = BatteryTipUtils.getActionForBatteryTip(batteryTip, mSettingsActivity, mFragment); if (action != null) { - action.handlePositiveAction(); + action.handlePositiveAction(mFragment.getMetricsCategory()); } if (mBatteryTipListener != null) { mBatteryTipListener.onBatteryTipHandled(batteryTip); diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/BatterySaverAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/BatterySaverAction.java index 310d3f86534..bb526236bb9 100644 --- a/src/com/android/settings/fuelgauge/batterytip/actions/BatterySaverAction.java +++ b/src/com/android/settings/fuelgauge/batterytip/actions/BatterySaverAction.java @@ -19,6 +19,8 @@ package com.android.settings.fuelgauge.batterytip.actions; import android.content.Context; import android.os.PowerManager; +import com.android.internal.logging.nano.MetricsProto; + public class BatterySaverAction extends BatteryTipAction { private PowerManager mPowerManager; @@ -31,7 +33,9 @@ public class BatterySaverAction extends BatteryTipAction { * Handle the action when user clicks positive button */ @Override - public void handlePositiveAction() { + public void handlePositiveAction(int metricsKey) { mPowerManager.setPowerSaveMode(true); + mMetricsFeatureProvider.action(mContext, + MetricsProto.MetricsEvent.ACTION_TIP_TURN_ON_BATTERY_SAVER, metricsKey); } } diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/BatteryTipAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/BatteryTipAction.java index 1bf08b7b64d..0ae2c14bf88 100644 --- a/src/com/android/settings/fuelgauge/batterytip/actions/BatteryTipAction.java +++ b/src/com/android/settings/fuelgauge/batterytip/actions/BatteryTipAction.java @@ -18,6 +18,7 @@ package com.android.settings.fuelgauge.batterytip.actions; import android.content.Context; +import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; /** @@ -25,13 +26,15 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; */ public abstract class BatteryTipAction { protected Context mContext; + protected MetricsFeatureProvider mMetricsFeatureProvider; public BatteryTipAction(Context context) { mContext = context; + mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider(); } /** * Handle the action when user clicks positive button */ - public abstract void handlePositiveAction(); + public abstract void handlePositiveAction(int metricsKey); } diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/OpenRestrictAppFragmentAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/OpenRestrictAppFragmentAction.java index 77bf861ce3e..afb80f22886 100644 --- a/src/com/android/settings/fuelgauge/batterytip/actions/OpenRestrictAppFragmentAction.java +++ b/src/com/android/settings/fuelgauge/batterytip/actions/OpenRestrictAppFragmentAction.java @@ -18,6 +18,7 @@ package com.android.settings.fuelgauge.batterytip.actions; import android.app.Fragment; +import com.android.internal.logging.nano.MetricsProto; import com.android.settings.SettingsActivity; import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.fuelgauge.BatteryUtils; @@ -49,7 +50,9 @@ public class OpenRestrictAppFragmentAction extends BatteryTipAction { * Handle the action when user clicks positive button */ @Override - public void handlePositiveAction() { + public void handlePositiveAction(int metricsKey) { + mMetricsFeatureProvider.action(mContext, + MetricsProto.MetricsEvent.ACTION_TIP_OPEN_APP_RESTRICTION_PAGE, metricsKey); final List mAppInfos = mRestrictAppTip.getRestrictAppList(); RestrictedAppDetails.startRestrictedAppDetails(mSettingsActivity, mFragment, mAppInfos); diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java index 37f4b2a5bea..0009451f463 100644 --- a/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java +++ b/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java @@ -19,7 +19,10 @@ package com.android.settings.fuelgauge.batterytip.actions; import android.app.AppOpsManager; import android.content.Context; import android.support.annotation.VisibleForTesting; +import android.util.Pair; +import com.android.internal.logging.nano.MetricsProto; +import com.android.internal.util.CollectionUtils; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper; import com.android.settings.fuelgauge.batterytip.AppInfo; @@ -49,14 +52,28 @@ public class RestrictAppAction extends BatteryTipAction { * Handle the action when user clicks positive button */ @Override - public void handlePositiveAction() { + public void handlePositiveAction(int metricsKey) { final List appInfos = mRestrictAppTip.getRestrictAppList(); for (int i = 0, size = appInfos.size(); i < size; i++) { - final String packageName = appInfos.get(i).packageName; + final AppInfo appInfo = appInfos.get(i); + final String packageName = appInfo.packageName; // Force app standby, then app can't run in the background mBatteryUtils.setForceAppStandby(mBatteryUtils.getPackageUid(packageName), packageName, AppOpsManager.MODE_IGNORED); + if (CollectionUtils.isEmpty(appInfo.anomalyTypes)) { + // Only log context if there is no anomaly type + mMetricsFeatureProvider.action(mContext, + MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, packageName, + Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey)); + } else { + for (int type : appInfo.anomalyTypes) { + mMetricsFeatureProvider.action(mContext, + MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, packageName, + Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey), + Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, type)); + } + } } mBatteryDatabaseManager.updateAnomalies(appInfos, AnomalyDatabaseHelper.State.HANDLED); diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java index 750ece9b82b..48925917c0d 100644 --- a/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java +++ b/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java @@ -18,6 +18,7 @@ package com.android.settings.fuelgauge.batterytip.actions; import android.app.Fragment; +import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.core.SubSettingLauncher; @@ -38,7 +39,9 @@ public class SmartBatteryAction extends BatteryTipAction { * Handle the action when user clicks positive button */ @Override - public void handlePositiveAction() { + public void handlePositiveAction(int metricsKey) { + mMetricsFeatureProvider.action(mContext, + MetricsProto.MetricsEvent.ACTION_TIP_OPEN_SMART_BATTERY, metricsKey); new SubSettingLauncher(mSettingsActivity) .setSourceMetricsCategory(mFragment instanceof Instrumentable ? ((Instrumentable) mFragment).getMetricsCategory() diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java index 16812f69afa..fab7b01526b 100644 --- a/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java +++ b/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java @@ -18,7 +18,10 @@ package com.android.settings.fuelgauge.batterytip.actions; import android.app.AppOpsManager; import android.content.Context; +import android.support.annotation.VisibleForTesting; +import android.util.Pair; +import com.android.internal.logging.nano.MetricsProto; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip; @@ -27,7 +30,8 @@ import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip; */ public class UnrestrictAppAction extends BatteryTipAction { private UnrestrictAppTip mUnRestrictAppTip; - private BatteryUtils mBatteryUtils; + @VisibleForTesting + BatteryUtils mBatteryUtils; public UnrestrictAppAction(Context context, UnrestrictAppTip tip) { super(context); @@ -39,10 +43,13 @@ public class UnrestrictAppAction extends BatteryTipAction { * Handle the action when user clicks positive button */ @Override - public void handlePositiveAction() { + public void handlePositiveAction(int metricsKey) { final String packageName = mUnRestrictAppTip.getPackageName(); // Clear force app standby, then app can run in the background mBatteryUtils.setForceAppStandby(mBatteryUtils.getPackageUid(packageName), packageName, AppOpsManager.MODE_ALLOWED); + mMetricsFeatureProvider.action(mContext, + MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP, packageName, Pair.create( + MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey)); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java index 85e5b1e05a4..cc0cbe071b7 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java @@ -59,6 +59,7 @@ public class BatteryTipDialogFragmentTest { private static final String DISPLAY_NAME = "app"; private static final long SCREEN_TIME_MS = DateUtils.HOUR_IN_MILLIS; private static final long AVERAGE_TIME_MS = DateUtils.HOUR_IN_MILLIS; + private static final int METRICS_KEY = 1; private BatteryTipDialogFragment mDialogFragment; private Context mContext; @@ -102,7 +103,7 @@ public class BatteryTipDialogFragmentTest { public void testOnCreateDialog_highUsageTip_fireHighUsageDialog() { Robolectric.getForegroundThreadScheduler().pause(); - mDialogFragment = BatteryTipDialogFragment.newInstance(mHighUsageTip); + mDialogFragment = BatteryTipDialogFragment.newInstance(mHighUsageTip, METRICS_KEY); FragmentTestUtil.startFragment(mDialogFragment); @@ -117,7 +118,7 @@ public class BatteryTipDialogFragmentTest { @Test public void testOnCreateDialog_restrictOneAppTip_fireRestrictOneAppDialog() { - mDialogFragment = BatteryTipDialogFragment.newInstance(mRestrictedOneAppTip); + mDialogFragment = BatteryTipDialogFragment.newInstance(mRestrictedOneAppTip, METRICS_KEY); FragmentTestUtil.startFragment(mDialogFragment); @@ -134,7 +135,8 @@ public class BatteryTipDialogFragmentTest { public void testOnCreateDialog_restrictTwoAppsTip_fireRestrictTwoAppsDialog() { Robolectric.getForegroundThreadScheduler().pause(); - mDialogFragment = BatteryTipDialogFragment.newInstance(mRestrictTwoAppsTip); + mDialogFragment = BatteryTipDialogFragment.newInstance(mRestrictTwoAppsTip, METRICS_KEY); + FragmentTestUtil.startFragment(mDialogFragment); @@ -161,7 +163,7 @@ public class BatteryTipDialogFragmentTest { final RestrictAppTip restrictSixAppsTip = new RestrictAppTip(BatteryTip.StateType.NEW, appInfos); - mDialogFragment = BatteryTipDialogFragment.newInstance(restrictSixAppsTip); + mDialogFragment = BatteryTipDialogFragment.newInstance(restrictSixAppsTip, METRICS_KEY); FragmentTestUtil.startFragment(mDialogFragment); @@ -178,7 +180,8 @@ public class BatteryTipDialogFragmentTest { @Test public void testOnCreateDialog_unRestrictAppTip_fireUnRestrictDialog() { - mDialogFragment = BatteryTipDialogFragment.newInstance(mUnrestrictAppTip); + mDialogFragment = BatteryTipDialogFragment.newInstance(mUnrestrictAppTip, METRICS_KEY); + ShadowUtils.setApplicationLabel(PACKAGE_NAME, DISPLAY_NAME); FragmentTestUtil.startFragment(mDialogFragment); @@ -193,7 +196,7 @@ public class BatteryTipDialogFragmentTest { @Test public void testOnCreateDialog_summaryTipWithEstimation_fireDialogWithEstimation() { doReturn(AVERAGE_TIME_MS).when(mSummaryTip).getAverageTimeMs(); - mDialogFragment = BatteryTipDialogFragment.newInstance(mSummaryTip); + mDialogFragment = BatteryTipDialogFragment.newInstance(mSummaryTip, METRICS_KEY); FragmentTestUtil.startFragment(mDialogFragment); @@ -207,7 +210,7 @@ public class BatteryTipDialogFragmentTest { @Test public void testOnCreateDialog_summaryTipWithoutEstimation_fireDialogWithoutEstimation() { - mDialogFragment = BatteryTipDialogFragment.newInstance(mSummaryTip); + mDialogFragment = BatteryTipDialogFragment.newInstance(mSummaryTip, METRICS_KEY); FragmentTestUtil.startFragment(mDialogFragment); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java index 0ac94c01082..c69cb6ff80e 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java @@ -37,6 +37,7 @@ import android.text.format.DateUtils; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.SettingsActivity; +import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.SummaryTip; import com.android.settings.testutils.FakeFeatureFactory; @@ -70,6 +71,8 @@ public class BatteryTipPreferenceControllerTest { private SettingsActivity mSettingsActivity; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private PreferenceManager mPreferenceManager; + @Mock + private InstrumentedPreferenceFragment mFragment; private Context mContext; private PreferenceGroup mPreferenceGroup; @@ -98,7 +101,7 @@ public class BatteryTipPreferenceControllerTest { mNewBatteryTips.add(new SummaryTip(BatteryTip.StateType.INVISIBLE, AVERAGE_TIME_MS)); mBatteryTipPreferenceController = new BatteryTipPreferenceController(mContext, KEY_PREF, - mSettingsActivity, null, mBatteryTipListener); + mSettingsActivity, mFragment, mBatteryTipListener); mBatteryTipPreferenceController.mPreferenceGroup = mPreferenceGroup; mBatteryTipPreferenceController.mPrefContext = mContext; } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java index 8934dfaecc2..0e067653915 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java @@ -20,12 +20,16 @@ import static org.mockito.Matchers.eq; import static org.mockito.Mockito.verify; import android.app.AppOpsManager; +import android.content.Context; +import android.util.Pair; +import com.android.internal.logging.nano.MetricsProto; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.batterytip.AppInfo; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; import com.android.settings.testutils.DatabaseTestUtils; +import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.After; @@ -44,21 +48,32 @@ public class RestrictAppActionTest { private static final String PACKAGE_NAME_1 = "com.android.app1"; private static final String PACKAGE_NAME_2 = "com.android.app2"; + private static final int ANOMALY_WAKEUP = 0; + private static final int ANOMALY_BT = 1; + private static final int METRICS_KEY = 1; @Mock private BatteryUtils mBatteryUtils; private RestrictAppAction mRestrictAppAction; + private FakeFeatureFactory mFeatureFactory; @Before public void setUp() { MockitoAnnotations.initMocks(this); final List mAppInfos = new ArrayList<>(); - mAppInfos.add(new AppInfo.Builder().setPackageName(PACKAGE_NAME_1).build()); - mAppInfos.add(new AppInfo.Builder().setPackageName(PACKAGE_NAME_2).build()); + mAppInfos.add(new AppInfo.Builder() + .setPackageName(PACKAGE_NAME_1) + .build()); + mAppInfos.add(new AppInfo.Builder() + .setPackageName(PACKAGE_NAME_2) + .addAnomalyType(ANOMALY_BT) + .addAnomalyType(ANOMALY_WAKEUP) + .build()); + mFeatureFactory = FakeFeatureFactory.setupForTest(); mRestrictAppAction = new RestrictAppAction(RuntimeEnvironment.application, - new RestrictAppTip(BatteryTip.StateType.NEW, mAppInfos)); + new RestrictAppTip(BatteryTip.StateType.NEW, mAppInfos)); mRestrictAppAction.mBatteryUtils = mBatteryUtils; } @@ -69,11 +84,22 @@ public class RestrictAppActionTest { @Test public void testHandlePositiveAction() { - mRestrictAppAction.handlePositiveAction(); + mRestrictAppAction.handlePositiveAction(METRICS_KEY); verify(mBatteryUtils) - .setForceAppStandby(anyInt(), eq(PACKAGE_NAME_1), eq(AppOpsManager.MODE_IGNORED)); + .setForceAppStandby(anyInt(), eq(PACKAGE_NAME_1), eq(AppOpsManager.MODE_IGNORED)); verify(mBatteryUtils) - .setForceAppStandby(anyInt(), eq(PACKAGE_NAME_2), eq(AppOpsManager.MODE_IGNORED)); + .setForceAppStandby(anyInt(), eq(PACKAGE_NAME_2), eq(AppOpsManager.MODE_IGNORED)); + verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application, + MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, PACKAGE_NAME_1, Pair.create( + MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY)); + verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application, + MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, PACKAGE_NAME_2, + Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY), + Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_WAKEUP)); + verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application, + MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, PACKAGE_NAME_2, + Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY), + Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_BT)); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java new file mode 100644 index 00000000000..f1763249111 --- /dev/null +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java @@ -0,0 +1,80 @@ +/* + * 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.actions; + +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.verify; + +import android.app.AppOpsManager; +import android.util.Pair; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.fuelgauge.BatteryUtils; +import com.android.settings.fuelgauge.batterytip.AppInfo; +import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; +import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip; +import com.android.settings.testutils.DatabaseTestUtils; +import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +import org.junit.After; +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 UnrestrictAppActionTest { + + private static final String PACKAGE_NAME_1 = "com.android.app1"; + private static final int METRICS_KEY = 1; + + @Mock + private BatteryUtils mBatteryUtils; + private UnrestrictAppAction mUnrestrictAppAction; + private FakeFeatureFactory mFeatureFactory; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + final AppInfo appInfo = new AppInfo.Builder().setPackageName(PACKAGE_NAME_1).build(); + mFeatureFactory = FakeFeatureFactory.setupForTest(); + + mUnrestrictAppAction = new UnrestrictAppAction(RuntimeEnvironment.application, + new UnrestrictAppTip(BatteryTip.StateType.NEW, appInfo)); + mUnrestrictAppAction.mBatteryUtils = mBatteryUtils; + } + + @After + public void cleanUp() { + DatabaseTestUtils.clearDb(RuntimeEnvironment.application); + } + + @Test + public void testHandlePositiveAction() { + mUnrestrictAppAction.handlePositiveAction(METRICS_KEY); + + verify(mBatteryUtils) + .setForceAppStandby(anyInt(), eq(PACKAGE_NAME_1), eq(AppOpsManager.MODE_ALLOWED)); + verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application, + MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP, PACKAGE_NAME_1, Pair.create( + MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY)); + } +}