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(