diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java index dfb7f974e5f..8debf6bcd4a 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java @@ -136,8 +136,8 @@ public class BatteryTipUtils { final List 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; } diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java index bda0073ab85..927a04ed184 100644 --- a/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java +++ b/src/com/android/settings/fuelgauge/batterytip/detectors/RestrictAppDetector.java @@ -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 diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/AppLabelPredicate.java b/src/com/android/settings/fuelgauge/batterytip/tips/AppLabelPredicate.java index 13a2452bb23..1444b12b4ee 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/AppLabelPredicate.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/AppLabelPredicate.java @@ -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 { - 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 diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/AppRestrictionPredicate.java b/src/com/android/settings/fuelgauge/batterytip/tips/AppRestrictionPredicate.java index 3650fe38e2c..43a4d900e28 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/AppRestrictionPredicate.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/AppRestrictionPredicate.java @@ -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 { + + 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); } diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java index 8a2d86dd31f..0d91c7437d6 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java @@ -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; } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java index b0d6a7dce49..3ada030de41 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoaderTest.java @@ -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 batteryTips = mBatteryTipLoader.loadInBackground(); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java index 459c4e2a03f..3882e8c0e85 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java @@ -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; 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 9b0007b55ca..179f2a1586c 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 @@ -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 diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java index 5c8b7d9acb7..dd3e281d09c 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java @@ -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(); diff --git a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java index 2bdab279f6a..eed20099d40 100644 --- a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java +++ b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java @@ -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(); + } + } + }