From 499644b8a93c716a079318005f49ec3c6ae8f9fb Mon Sep 17 00:00:00 2001 From: Lei Yu Date: Mon, 2 Apr 2018 18:08:03 -0700 Subject: [PATCH] Hide uninstalled app in restrict app dialog Change-Id: Ic615d8b1150890e6ad0d393e410d0f5ab8648986 Fixes: 77429442 Test: RunSettingsRoboTests --- .../batterytip/detectors/RestrictAppDetector.java | 13 ++++++ .../detectors/RestrictAppDetectorTest.java | 53 ++++++++++++++++++---- 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java index 0bb1f17aa6..017cd3fbed 100644 --- a/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java +++ b/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java @@ -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 mAppInfoPredicate = new Predicate() { + @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 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 autoHandledApps = mBatteryDatabaseManager.queryAllAnomalies( oneDayBeforeMs, AnomalyDatabaseHelper.State.AUTO_HANDLED); + autoHandledApps.removeIf(mAppInfoPredicate); return new RestrictAppTip(autoHandledApps.isEmpty() ? BatteryTip.StateType.INVISIBLE : BatteryTip.StateType.HANDLED, autoHandledApps); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java index e8a79c56ae..23f08c0a6e 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetectorTest.java @@ -17,19 +17,25 @@ 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 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()).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()).when(mBatteryDatabaseManager) - .queryAllAnomalies(anyLong(), anyInt()); + .queryAllAnomalies(anyLong(), anyInt()); assertThat(mRestrictAppDetector.detect().getState()) - .isEqualTo(BatteryTip.StateType.INVISIBLE); + .isEqualTo(BatteryTip.StateType.INVISIBLE); } @Test -- 2.11.0