OSDN Git Service

Hide uninstalled app in restrict app dialog
authorLei Yu <jackqdyulei@google.com>
Tue, 3 Apr 2018 01:08:03 +0000 (18:08 -0700)
committerLei Yu <jackqdyulei@google.com>
Tue, 3 Apr 2018 21:14:50 +0000 (14:14 -0700)
Change-Id: Ic615d8b1150890e6ad0d393e410d0f5ab8648986
Fixes: 77429442
Test: RunSettingsRoboTests

src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java
tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java

index 0bb1f17..017cd3f 100644 (file)
@@ -20,6 +20,7 @@ import android.content.Context;
 import android.support.annotation.VisibleForTesting;
 import android.text.format.DateUtils;
 
+import com.android.settings.Utils;
 import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
 import com.android.settings.fuelgauge.batterytip.AppInfo;
 import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
@@ -29,6 +30,7 @@ import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Predicate;
 
 /**
  * Detector whether to show summary tip. This detector should be executed as the last
@@ -40,8 +42,17 @@ public class RestrictAppDetector implements BatteryTipDetector {
     private BatteryTipPolicy mPolicy;
     @VisibleForTesting
     BatteryDatabaseManager mBatteryDatabaseManager;
+    private Context mContext;
+
+    private Predicate<AppInfo> mAppInfoPredicate = new Predicate<AppInfo>() {
+        @Override
+        public boolean test(AppInfo appInfo) {
+            return Utils.getApplicationLabel(mContext, appInfo.packageName) == null;
+        }
+    };
 
     public RestrictAppDetector(Context context, BatteryTipPolicy policy) {
+        mContext = context;
         mPolicy = policy;
         mBatteryDatabaseManager = BatteryDatabaseManager.getInstance(context);
     }
@@ -56,6 +67,7 @@ public class RestrictAppDetector implements BatteryTipDetector {
             final long oneDayBeforeMs = System.currentTimeMillis() - DateUtils.DAY_IN_MILLIS;
             final List<AppInfo> highUsageApps = mBatteryDatabaseManager.queryAllAnomalies(
                     oneDayBeforeMs, AnomalyDatabaseHelper.State.NEW);
+            highUsageApps.removeIf(mAppInfoPredicate);
             if (!highUsageApps.isEmpty()) {
                 // If there are new anomalies, show them
                 return new RestrictAppTip(BatteryTip.StateType.NEW, highUsageApps);
@@ -63,6 +75,7 @@ public class RestrictAppDetector implements BatteryTipDetector {
                 // Otherwise, show auto-handled one if it exists
                 final List<AppInfo> autoHandledApps = mBatteryDatabaseManager.queryAllAnomalies(
                         oneDayBeforeMs, AnomalyDatabaseHelper.State.AUTO_HANDLED);
+                autoHandledApps.removeIf(mAppInfoPredicate);
                 return new RestrictAppTip(autoHandledApps.isEmpty() ? BatteryTip.StateType.INVISIBLE
                         : BatteryTip.StateType.HANDLED, autoHandledApps);
             }
index e8a79c5..23f08c0 100644 (file)
 package com.android.settings.fuelgauge.batterytip.detectors;
 
 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.anyLong;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.spy;
 
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
 
 import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
 import com.android.settings.fuelgauge.batterytip.AppInfo;
 import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
 import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
 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.SettingsRobolectricTestRunner;
 
@@ -48,24 +54,40 @@ import java.util.List;
 public class RestrictAppDetectorTest {
 
     private static final String PACKAGE_NAME = "com.android.app";
+    private static final String UNINSTALLED_PACKAGE_NAME = "com.android.uninstalled";
     private Context mContext;
     private BatteryTipPolicy mPolicy;
     private RestrictAppDetector mRestrictAppDetector;
     private List<AppInfo> mAppInfoList;
+    private AppInfo mAppInfo;
     @Mock
     private BatteryDatabaseManager mBatteryDatabaseManager;
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private ApplicationInfo mApplicationInfo;
 
     @Before
-    public void setUp() {
+    public void setUp() throws PackageManager.NameNotFoundException {
         MockitoAnnotations.initMocks(this);
 
         mAppInfoList = new ArrayList<>();
-        mAppInfoList.add(new AppInfo.Builder().setPackageName(PACKAGE_NAME).build());
+        mAppInfo = new AppInfo.Builder()
+                .setPackageName(PACKAGE_NAME)
+                .build();
+        mAppInfoList.add(mAppInfo);
 
-        mContext = RuntimeEnvironment.application;
+        mContext = spy(RuntimeEnvironment.application);
         mPolicy = spy(new BatteryTipPolicy(mContext));
         mRestrictAppDetector = new RestrictAppDetector(mContext, mPolicy);
         mRestrictAppDetector.mBatteryDatabaseManager = mBatteryDatabaseManager;
+
+        doReturn(mPackageManager).when(mContext).getPackageManager();
+        doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(eq(PACKAGE_NAME),
+                anyInt());
+        doReturn(PACKAGE_NAME).when(mApplicationInfo).loadLabel(any());
+        doThrow(new PackageManager.NameNotFoundException()).when(
+                mPackageManager).getApplicationInfo(eq(UNINSTALLED_PACKAGE_NAME), anyInt());
     }
 
     @After
@@ -76,7 +98,7 @@ public class RestrictAppDetectorTest {
     @Test
     public void testDetect_hasAnomaly_tipNew() {
         doReturn(mAppInfoList).when(mBatteryDatabaseManager)
-            .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.NEW));
+                .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.NEW));
 
         assertThat(mRestrictAppDetector.detect().getState()).isEqualTo(BatteryTip.StateType.NEW);
     }
@@ -84,21 +106,34 @@ public class RestrictAppDetectorTest {
     @Test
     public void testDetect_hasAutoHandledAnomaly_tipHandled() {
         doReturn(new ArrayList<AppInfo>()).when(mBatteryDatabaseManager)
-            .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.NEW));
+                .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.NEW));
         doReturn(mAppInfoList).when(mBatteryDatabaseManager)
-            .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.AUTO_HANDLED));
+                .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.AUTO_HANDLED));
 
         assertThat(mRestrictAppDetector.detect().getState())
-            .isEqualTo(BatteryTip.StateType.HANDLED);
+                .isEqualTo(BatteryTip.StateType.HANDLED);
+    }
+
+    @Test
+    public void testDetect_hasUninstalledAnomaly_removeIt() {
+        mAppInfoList.add(new AppInfo.Builder()
+                .setPackageName(UNINSTALLED_PACKAGE_NAME)
+                .build());
+        doReturn(mAppInfoList).when(mBatteryDatabaseManager)
+                .queryAllAnomalies(anyLong(), eq(AnomalyDatabaseHelper.State.NEW));
+
+        final RestrictAppTip restrictAppTip = (RestrictAppTip) mRestrictAppDetector.detect();
+        assertThat(restrictAppTip.getState()).isEqualTo(BatteryTip.StateType.NEW);
+        assertThat(restrictAppTip.getRestrictAppList()).containsExactly(mAppInfo);
     }
 
     @Test
     public void testDetect_noAnomaly_tipInvisible() {
         doReturn(new ArrayList<AppInfo>()).when(mBatteryDatabaseManager)
-            .queryAllAnomalies(anyLong(), anyInt());
+                .queryAllAnomalies(anyLong(), anyInt());
 
         assertThat(mRestrictAppDetector.detect().getState())
-            .isEqualTo(BatteryTip.StateType.INVISIBLE);
+                .isEqualTo(BatteryTip.StateType.INVISIBLE);
     }
 
     @Test