Make app predicates singleton

1. AppLabelPredicate
2. AppRestrictionPredicate

Change-Id: I1fd8611c5dd7ffa6318bcb23de7a973c111910b6
Fixes: 111323520
Test: RunSettingsRoboTests
This commit is contained in:
jackqdyulei
2018-07-18 13:06:11 -07:00
parent d3e18dcf0a
commit 341ad63da7
10 changed files with 70 additions and 11 deletions

View File

@@ -136,8 +136,8 @@ public class BatteryTipUtils {
final List<AppInfo> highUsageApps = BatteryDatabaseManager.getInstance(context) final List<AppInfo> highUsageApps = BatteryDatabaseManager.getInstance(context)
.queryAllAnomalies(timeAfterMs, AnomalyDatabaseHelper.State.NEW); .queryAllAnomalies(timeAfterMs, AnomalyDatabaseHelper.State.NEW);
// Remove it if it doesn't have label or been restricted // Remove it if it doesn't have label or been restricted
highUsageApps.removeIf( highUsageApps.removeIf(AppLabelPredicate.getInstance(context)
new AppLabelPredicate(context).or(new AppRestrictionPredicate(context))); .or(AppRestrictionPredicate.getInstance(context)));
return highUsageApps; return highUsageApps;
} }

View File

@@ -53,8 +53,8 @@ public class RestrictAppDetector implements BatteryTipDetector {
mContext = context; mContext = context;
mPolicy = policy; mPolicy = policy;
mBatteryDatabaseManager = BatteryDatabaseManager.getInstance(context); mBatteryDatabaseManager = BatteryDatabaseManager.getInstance(context);
mAppRestrictionPredicate = new AppRestrictionPredicate(context); mAppRestrictionPredicate = AppRestrictionPredicate.getInstance(context);
mAppLabelPredicate = new AppLabelPredicate(context); mAppLabelPredicate = AppLabelPredicate.getInstance(context);
} }
@Override @Override

View File

@@ -16,7 +16,6 @@
package com.android.settings.fuelgauge.batterytip.tips; package com.android.settings.fuelgauge.batterytip.tips;
import android.app.AppOpsManager;
import android.content.Context; import android.content.Context;
import com.android.settings.Utils; import com.android.settings.Utils;
@@ -28,12 +27,20 @@ import java.util.function.Predicate;
* {@link Predicate} for {@link AppInfo} to check whether it has label * {@link Predicate} for {@link AppInfo} to check whether it has label
*/ */
public class AppLabelPredicate implements Predicate<AppInfo> { public class AppLabelPredicate implements Predicate<AppInfo> {
private Context mContext;
private AppOpsManager mAppOpsManager;
public AppLabelPredicate(Context context) { private static AppLabelPredicate sInstance;
private Context mContext;
public static AppLabelPredicate getInstance(Context context) {
if (sInstance == null) {
sInstance = new AppLabelPredicate(context.getApplicationContext());
}
return sInstance;
}
private AppLabelPredicate(Context context) {
mContext = context; mContext = context;
mAppOpsManager = context.getSystemService(AppOpsManager.class);
} }
@Override @Override

View File

@@ -27,9 +27,19 @@ import java.util.function.Predicate;
* {@link Predicate} for {@link AppInfo} to check whether it is restricted. * {@link Predicate} for {@link AppInfo} to check whether it is restricted.
*/ */
public class AppRestrictionPredicate implements Predicate<AppInfo> { public class AppRestrictionPredicate implements Predicate<AppInfo> {
private static AppRestrictionPredicate sInstance;
private AppOpsManager mAppOpsManager; private AppOpsManager mAppOpsManager;
public AppRestrictionPredicate(Context context) { public static AppRestrictionPredicate getInstance(Context context) {
if (sInstance == null) {
sInstance = new AppRestrictionPredicate(context.getApplicationContext());
}
return sInstance;
}
private AppRestrictionPredicate(Context context) {
mAppOpsManager = context.getSystemService(AppOpsManager.class); mAppOpsManager = context.getSystemService(AppOpsManager.class);
} }

View File

@@ -112,7 +112,7 @@ public class RestrictAppTip extends BatteryTip {
super.sanityCheck(context); super.sanityCheck(context);
// Set it invisible if there is no valid app // Set it invisible if there is no valid app
mRestrictAppList.removeIf(new AppLabelPredicate(context)); mRestrictAppList.removeIf(AppLabelPredicate.getInstance(context));
if (mRestrictAppList.isEmpty()) { if (mRestrictAppList.isEmpty()) {
mState = StateType.INVISIBLE; mState = StateType.INVISIBLE;
} }

View File

@@ -28,9 +28,13 @@ import android.os.PowerManager;
import com.android.internal.os.BatteryStatsHelper; import com.android.internal.os.BatteryStatsHelper;
import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.BatteryInfo;
import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.fuelgauge.batterytip.tips.AppLabelPredicate;
import com.android.settings.fuelgauge.batterytip.tips.AppRestrictionPredicate;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.testutils.BatteryTestUtils;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -77,6 +81,12 @@ public class BatteryTipLoaderTest {
mBatteryTipLoader.mBatteryUtils = mBatteryUtils; mBatteryTipLoader.mBatteryUtils = mBatteryUtils;
} }
@After
public void tearDown() {
BatteryTestUtils.clearStaticInstance(AppLabelPredicate.class, "sInstance");
BatteryTestUtils.clearStaticInstance(AppRestrictionPredicate.class, "sInstance");
}
@Test @Test
public void testLoadBackground_containsAllTipsWithOrder() { public void testLoadBackground_containsAllTipsWithOrder() {
final List<BatteryTip> batteryTips = mBatteryTipLoader.loadInBackground(); final List<BatteryTip> batteryTips = mBatteryTipLoader.loadInBackground();

View File

@@ -17,6 +17,7 @@
package com.android.settings.fuelgauge.batterytip; package com.android.settings.fuelgauge.batterytip;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;

View File

@@ -34,8 +34,11 @@ import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
import com.android.settings.fuelgauge.batterytip.AppInfo; import com.android.settings.fuelgauge.batterytip.AppInfo;
import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager; import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy; import com.android.settings.fuelgauge.batterytip.BatteryTipPolicy;
import com.android.settings.fuelgauge.batterytip.tips.AppLabelPredicate;
import com.android.settings.fuelgauge.batterytip.tips.AppRestrictionPredicate;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
import com.android.settings.testutils.BatteryTestUtils;
import com.android.settings.testutils.DatabaseTestUtils; import com.android.settings.testutils.DatabaseTestUtils;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -86,6 +89,7 @@ public class RestrictAppDetectorTest {
mContext = spy(RuntimeEnvironment.application); mContext = spy(RuntimeEnvironment.application);
mPolicy = spy(new BatteryTipPolicy(mContext)); mPolicy = spy(new BatteryTipPolicy(mContext));
doReturn(mContext).when(mContext).getApplicationContext();
doReturn(mAppOpsManager).when(mContext).getSystemService(AppOpsManager.class); doReturn(mAppOpsManager).when(mContext).getSystemService(AppOpsManager.class);
doReturn(AppOpsManager.MODE_IGNORED).when(mAppOpsManager).checkOpNoThrow( doReturn(AppOpsManager.MODE_IGNORED).when(mAppOpsManager).checkOpNoThrow(
AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, RESTRICTED_UID, RESTRICTED_PACKAGE_NAME); AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, RESTRICTED_UID, RESTRICTED_PACKAGE_NAME);
@@ -103,7 +107,12 @@ public class RestrictAppDetectorTest {
mRestrictAppDetector = new RestrictAppDetector(mContext, mPolicy); mRestrictAppDetector = new RestrictAppDetector(mContext, mPolicy);
mRestrictAppDetector.mBatteryDatabaseManager = mBatteryDatabaseManager; mRestrictAppDetector.mBatteryDatabaseManager = mBatteryDatabaseManager;
}
@After
public void tearDown() {
BatteryTestUtils.clearStaticInstance(AppLabelPredicate.class, "sInstance");
BatteryTestUtils.clearStaticInstance(AppRestrictionPredicate.class, "sInstance");
} }
@After @After

View File

@@ -34,9 +34,11 @@ import android.util.Pair;
import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.fuelgauge.batterytip.AppInfo; import com.android.settings.fuelgauge.batterytip.AppInfo;
import com.android.settings.testutils.BatteryTestUtils;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -74,6 +76,7 @@ public class RestrictAppTipTest {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application); mContext = spy(RuntimeEnvironment.application);
doReturn(mContext).when(mContext).getApplicationContext();
doReturn(mPackageManager).when(mContext).getPackageManager(); doReturn(mPackageManager).when(mContext).getPackageManager();
doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(PACKAGE_NAME, doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(PACKAGE_NAME,
PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_ANY_USER); PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_ANY_USER);
@@ -98,6 +101,12 @@ public class RestrictAppTipTest {
mInvisibleBatteryTip = new RestrictAppTip(BatteryTip.StateType.INVISIBLE, new ArrayList<>()); mInvisibleBatteryTip = new RestrictAppTip(BatteryTip.StateType.INVISIBLE, new ArrayList<>());
} }
@After
public void tearDown() {
BatteryTestUtils.clearStaticInstance(AppLabelPredicate.class, "sInstance");
BatteryTestUtils.clearStaticInstance(AppRestrictionPredicate.class, "sInstance");
}
@Test @Test
public void parcelable() { public void parcelable() {
Parcel parcel = Parcel.obtain(); Parcel parcel = Parcel.obtain();

View File

@@ -19,6 +19,8 @@ package com.android.settings.testutils;
import android.content.Intent; import android.content.Intent;
import android.os.BatteryManager; import android.os.BatteryManager;
import java.lang.reflect.Field;
public class BatteryTestUtils { public class BatteryTestUtils {
public static Intent getChargingIntent() { public static Intent getChargingIntent() {
@@ -47,4 +49,15 @@ public class BatteryTestUtils {
return intent; return intent;
} }
public static void clearStaticInstance(Class clazz, String fieldName) {
Field instance;
try {
instance = clazz.getDeclaredField(fieldName);
instance.setAccessible(true);
instance.set(null, null);
} catch (Exception e) {
throw new RuntimeException();
}
}
} }