OSDN Git Service

Add sanity check method for BatteryTip
authorLei Yu <jackqdyulei@google.com>
Mon, 9 Jul 2018 21:53:55 +0000 (14:53 -0700)
committerjackqdyulei <jackqdyulei@google.com>
Wed, 11 Jul 2018 01:06:17 +0000 (18:06 -0700)
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

src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java
src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java
tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java

index 2632795..0a9a4c7 100644 (file)
@@ -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);
index 496320f..61a1157 100644 (file)
@@ -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;
@@ -134,6 +135,14 @@ public abstract class BatteryTip implements Comparable<BatteryTip>, 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
      */
     public abstract void log(Context context, MetricsFeatureProvider metricsFeatureProvider);
index 818a467..bf2dd72 100644 (file)
@@ -107,6 +107,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,
                 mState);
index e2c80df..cab8913 100644 (file)
@@ -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<AppInfo> 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);
@@ -174,6 +184,29 @@ public class RestrictAppTipTest {
     }
 
     @Test
+    public void sanityCheck_appUninstalled_stateInvisible() {
+        final List<AppInfo> 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<AppInfo> 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(
                 "type=1 state=0 { packageName=com.android.app,anomalyTypes={0, 1},screenTime=0 }");