From b07d1f34c62cea7863d928c0f33a16d48a8dffc9 Mon Sep 17 00:00:00 2001 From: Lei Yu Date: Mon, 9 Jul 2018 14:53:55 -0700 Subject: [PATCH] Add sanity check method for BatteryTip This method is used to check whether data in battery tip is still valid. If not, try recover the data or dismiss the tip. Change-Id: Idc9e4d49f99e33d3f5e82e694dc78227fc1da41c Fixes: 111218723 Test: RunSettingsRoboTests --- .../BatteryTipPreferenceController.java | 1 + .../fuelgauge/batterytip/tips/BatteryTip.java | 9 +++++ .../batterytip/tips/RestrictAppTip.java | 11 +++++++ .../batterytip/tips/RestrictAppTipTest.java | 33 +++++++++++++++++++ 4 files changed, 54 insertions(+) diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java index 263279575a2..0a9a4c75259 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java @@ -107,6 +107,7 @@ public class BatteryTipPreferenceController extends BasePreferenceController { mPreferenceGroup.removeAll(); for (int i = 0, size = batteryTips.size(); i < size; i++) { final BatteryTip batteryTip = mBatteryTips.get(i); + batteryTip.sanityCheck(mContext); if (batteryTip.getState() != BatteryTip.StateType.INVISIBLE) { final Preference preference = batteryTip.buildPreference(mPrefContext); mBatteryTipMap.put(preference.getKey(), batteryTip); diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java index 496320f0d01..61a11577e25 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java @@ -16,6 +16,7 @@ package com.android.settings.fuelgauge.batterytip.tips; +import android.content.ContentResolver; import android.content.Context; import android.os.Parcel; import android.os.Parcelable; @@ -133,6 +134,14 @@ public abstract class BatteryTip implements Comparable, Parcelable { */ public abstract void updateState(BatteryTip tip); + /** + * Check whether data is still make sense. If not, try recover. + * @param context used to do sanity check + */ + public void sanityCheck(Context context) { + // do nothing + } + /** * Log the battery tip */ diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java index 818a46757df..bf2dd720b19 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java @@ -106,6 +106,17 @@ public class RestrictAppTip extends BatteryTip { } } + @Override + public void sanityCheck(Context context) { + super.sanityCheck(context); + + // Set it invisible if there is no valid app + mRestrictAppList.removeIf(new AppLabelPredicate(context)); + if (mRestrictAppList.isEmpty()) { + mState = StateType.INVISIBLE; + } + } + @Override public void log(Context context, MetricsFeatureProvider metricsFeatureProvider) { metricsFeatureProvider.action(context, MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP, diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java index e2c80df9a1f..cab8913c17a 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java @@ -21,6 +21,7 @@ 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.doThrow; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -51,6 +52,7 @@ import java.util.List; @RunWith(SettingsRobolectricTestRunner.class) public class RestrictAppTipTest { private static final String PACKAGE_NAME = "com.android.app"; + private static final String UNINSTALL_PACKAGE_NAME = "com.android.app.unintall"; private static final String DISPLAY_NAME = "app"; private static final int ANOMALY_WAKEUP = 0; private static final int ANOMALY_WAKELOCK = 1; @@ -61,6 +63,7 @@ public class RestrictAppTipTest { private RestrictAppTip mInvisibleBatteryTip; private List mUsageAppList; private AppInfo mAppInfo; + private AppInfo mUninstallAppInfo; @Mock private ApplicationInfo mApplicationInfo; @Mock @@ -76,6 +79,9 @@ public class RestrictAppTipTest { doReturn(mPackageManager).when(mContext).getPackageManager(); doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(PACKAGE_NAME, PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_ANY_USER); + doThrow(new PackageManager.NameNotFoundException()).when(mPackageManager) + .getApplicationInfo(UNINSTALL_PACKAGE_NAME, + PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_ANY_USER); doReturn(DISPLAY_NAME).when(mApplicationInfo).loadLabel(mPackageManager); mAppInfo = new AppInfo.Builder() @@ -83,6 +89,10 @@ public class RestrictAppTipTest { .addAnomalyType(ANOMALY_WAKEUP) .addAnomalyType(ANOMALY_WAKELOCK) .build(); + mUninstallAppInfo = new AppInfo.Builder() + .setPackageName(UNINSTALL_PACKAGE_NAME) + .addAnomalyType(ANOMALY_WAKEUP) + .build(); mUsageAppList = new ArrayList<>(); mUsageAppList.add(mAppInfo); mNewBatteryTip = new RestrictAppTip(BatteryTip.StateType.NEW, mUsageAppList); @@ -173,6 +183,29 @@ public class RestrictAppTipTest { assertThat(mInvisibleBatteryTip.getRestrictAppList()).containsExactly(mAppInfo); } + @Test + public void sanityCheck_appUninstalled_stateInvisible() { + final List appInfos = new ArrayList<>(); + appInfos.add(mUninstallAppInfo); + final BatteryTip batteryTip = new RestrictAppTip(BatteryTip.StateType.NEW, appInfos); + + batteryTip.sanityCheck(mContext); + + assertThat(batteryTip.getState()).isEqualTo(BatteryTip.StateType.INVISIBLE); + } + + @Test + public void sanityCheck_twoRestrictedAppsWhileUninstallOne_stateVisible() { + final List appInfos = new ArrayList<>(); + appInfos.add(mAppInfo); + appInfos.add(mUninstallAppInfo); + final BatteryTip batteryTip = new RestrictAppTip(BatteryTip.StateType.NEW, appInfos); + + batteryTip.sanityCheck(mContext); + + assertThat(batteryTip.getState()).isEqualTo(BatteryTip.StateType.NEW); + } + @Test public void toString_containsAppData() { assertThat(mNewBatteryTip.toString()).isEqualTo(