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
This commit is contained in:
Lei Yu
2018-07-09 14:53:55 -07:00
committed by jackqdyulei
parent 636cc6caf9
commit b07d1f34c6
4 changed files with 54 additions and 0 deletions

View 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);

View 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;
@@ -133,6 +134,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
*/

View File

@@ -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,

View 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);
@@ -173,6 +183,29 @@ public class RestrictAppTipTest {
assertThat(mInvisibleBatteryTip.getRestrictAppList()).containsExactly(mAppInfo);
}
@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(