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)
.queryAllAnomalies(timeAfterMs, AnomalyDatabaseHelper.State.NEW);
// Remove it if it doesn't have label or been restricted
highUsageApps.removeIf(
new AppLabelPredicate(context).or(new AppRestrictionPredicate(context)));
highUsageApps.removeIf(AppLabelPredicate.getInstance(context)
.or(AppRestrictionPredicate.getInstance(context)));
return highUsageApps;
}

View File

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

View File

@@ -16,7 +16,6 @@
package com.android.settings.fuelgauge.batterytip.tips;
import android.app.AppOpsManager;
import android.content.Context;
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
*/
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;
mAppOpsManager = context.getSystemService(AppOpsManager.class);
}
@Override

View File

@@ -27,9 +27,19 @@ import java.util.function.Predicate;
* {@link Predicate} for {@link AppInfo} to check whether it is restricted.
*/
public class AppRestrictionPredicate implements Predicate<AppInfo> {
private static AppRestrictionPredicate sInstance;
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);
}

View File

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

View File

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

View File

@@ -17,6 +17,7 @@
package com.android.settings.fuelgauge.batterytip;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
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.BatteryDatabaseManager;
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.RestrictAppTip;
import com.android.settings.testutils.BatteryTestUtils;
import com.android.settings.testutils.DatabaseTestUtils;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -86,6 +89,7 @@ public class RestrictAppDetectorTest {
mContext = spy(RuntimeEnvironment.application);
mPolicy = spy(new BatteryTipPolicy(mContext));
doReturn(mContext).when(mContext).getApplicationContext();
doReturn(mAppOpsManager).when(mContext).getSystemService(AppOpsManager.class);
doReturn(AppOpsManager.MODE_IGNORED).when(mAppOpsManager).checkOpNoThrow(
AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, RESTRICTED_UID, RESTRICTED_PACKAGE_NAME);
@@ -103,7 +107,12 @@ public class RestrictAppDetectorTest {
mRestrictAppDetector = new RestrictAppDetector(mContext, mPolicy);
mRestrictAppDetector.mBatteryDatabaseManager = mBatteryDatabaseManager;
}
@After
public void tearDown() {
BatteryTestUtils.clearStaticInstance(AppLabelPredicate.class, "sInstance");
BatteryTestUtils.clearStaticInstance(AppRestrictionPredicate.class, "sInstance");
}
@After

View File

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

View File

@@ -19,6 +19,8 @@ package com.android.settings.testutils;
import android.content.Intent;
import android.os.BatteryManager;
import java.lang.reflect.Field;
public class BatteryTestUtils {
public static Intent getChargingIntent() {
@@ -47,4 +49,15 @@ public class BatteryTestUtils {
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();
}
}
}