diff --git a/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java b/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java index 00ffebd8c6c..12f5b8c79dc 100644 --- a/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java +++ b/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java @@ -31,6 +31,7 @@ import com.android.internal.os.BatteryStatsHelper; import com.android.settings.Utils; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.anomaly.Anomaly; +import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy; import java.util.ArrayList; import java.util.List; @@ -40,17 +41,24 @@ import java.util.List; */ public class WakeLockAnomalyDetector implements AnomalyDetector { private static final String TAG = "WakeLockAnomalyChecker"; - // TODO: get threshold form server side - private static final long WAKE_LOCK_THRESHOLD_MS = 2 * DateUtils.MINUTE_IN_MILLIS; private PackageManager mPackageManager; private Context mContext; @VisibleForTesting BatteryUtils mBatteryUtils; + @VisibleForTesting + long mWakeLockThresholdMs; public WakeLockAnomalyDetector(Context context) { + this(context, new AnomalyDetectionPolicy(context)); + } + + @VisibleForTesting + WakeLockAnomalyDetector(Context context, AnomalyDetectionPolicy policy) { mContext = context; mPackageManager = context.getPackageManager(); mBatteryUtils = BatteryUtils.getInstance(context); + + mWakeLockThresholdMs = policy.wakeLockThreshold; } @Override @@ -82,7 +90,7 @@ public class WakeLockAnomalyDetector implements AnomalyDetector { // Report it if wakelock time is too long and it is not a hidden batterysipper // TODO: add more attributes to detect wakelock anomaly - if (maxPartialWakeLockMs > WAKE_LOCK_THRESHOLD_MS + if (maxPartialWakeLockMs > mWakeLockThresholdMs && !mBatteryUtils.shouldHideSipper(sipper)) { final String packageName = mBatteryUtils.getPackageName(uid.getUid()); final CharSequence displayName = Utils.getApplicationLabel(mContext, diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyLoaderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyLoaderTest.java index 843b747d736..e6c995511a3 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyLoaderTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyLoaderTest.java @@ -49,6 +49,7 @@ public class AnomalyLoaderTest { private Context mContext; @Mock private BatteryStatsHelper mBatteryStatsHelper; + @Mock private WakeLockAnomalyDetector mWakeLockAnomalyDetector; private Anomaly mWakeLockAnomaly; private List mWakeLockAnomalies; @@ -62,7 +63,6 @@ public class AnomalyLoaderTest { FakeFeatureFactory.setupForTest(mContext); mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); - mWakeLockAnomalyDetector = spy(new WakeLockAnomalyDetector(mContext)); mWakeLockAnomalies = new ArrayList<>(); mWakeLockAnomaly = new Anomaly.Builder() .setType(Anomaly.AnomalyType.WAKE_LOCK) diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java index 6303b180af2..d8652e51a05 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java @@ -22,6 +22,7 @@ import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.fuelgauge.anomaly.action.ForceStopAction; import com.android.settings.fuelgauge.anomaly.checker.WakeLockAnomalyDetector; +import com.android.settings.testutils.shadow.ShadowKeyValueListParserWrapperImpl; import org.junit.Before; import org.junit.Test; @@ -30,7 +31,8 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @RunWith(SettingsRobolectricTestRunner.class) -@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows = { + ShadowKeyValueListParserWrapperImpl.class}) public class AnomalyUtilsTest { private AnomalyUtils mAnomalyUtils; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java index 70107836343..b5a4def4ee5 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java @@ -39,6 +39,7 @@ import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.anomaly.Anomaly; +import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy; import org.junit.Before; import org.junit.Test; @@ -47,6 +48,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; import java.util.List; @@ -54,8 +56,9 @@ import java.util.List; @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class WakeLockAnomalyDetectorTest { - private static final long ANOMALY_WAKELOCK_TIME_MS = DateUtils.HOUR_IN_MILLIS; + private static final long ANOMALY_WAKELOCK_TIME_MS = 2 * DateUtils.HOUR_IN_MILLIS; private static final long NORMAL_WAKELOCK_TIME_MS = DateUtils.SECOND_IN_MILLIS; + private static final long WAKELOCK_THRESHOLD_MS = DateUtils.HOUR_IN_MILLIS; private static final int ANOMALY_UID = 111; private static final int NORMAL_UID = 222; @Mock @@ -82,6 +85,8 @@ public class WakeLockAnomalyDetectorTest { private PackageManager mPackageManager; @Mock private ApplicationInfo mApplicationInfo; + @Mock + private AnomalyDetectionPolicy mPolicy; private ArrayMap mAnomalyWakelocks; private ArrayMap mNormalWakelocks; @@ -94,6 +99,7 @@ public class WakeLockAnomalyDetectorTest { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); + ReflectionHelpers.setField(mPolicy, "wakeLockThreshold", WAKELOCK_THRESHOLD_MS); doReturn(false).when(mBatteryUtils).shouldHideSipper(any()); doReturn(mPackageManager).when(mContext).getPackageManager(); @@ -118,7 +124,7 @@ public class WakeLockAnomalyDetectorTest { mUsageList.add(mNormalSipper); doReturn(mUsageList).when(mBatteryStatsHelper).getUsageList(); - mWakelockAnomalyDetector = spy(new WakeLockAnomalyDetector(mContext)); + mWakelockAnomalyDetector = spy(new WakeLockAnomalyDetector(mContext, mPolicy)); mWakelockAnomalyDetector.mBatteryUtils = mBatteryUtils; doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector).getTotalDurationMs( eq(mAnomalyTimer), anyLong()); @@ -137,4 +143,9 @@ public class WakeLockAnomalyDetectorTest { assertThat(mAnomalies).containsExactly(anomaly); } + + @Test + public void testContainsThresholdFromPolicy() { + assertThat(mWakelockAnomalyDetector.mWakeLockThresholdMs).isEqualTo(WAKELOCK_THRESHOLD_MS); + } } diff --git a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java index 195e0075ecd..873b408a6b6 100644 --- a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java +++ b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java @@ -37,6 +37,7 @@ import com.android.settings.core.PreferenceController; import com.android.settings.dashboard.SummaryLoader; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.XmlTestUtils; +import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowSecureSettings; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.LifecycleObserver; diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowKeyValueListParserWrapperImpl.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowKeyValueListParserWrapperImpl.java new file mode 100644 index 00000000000..0af9c304942 --- /dev/null +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowKeyValueListParserWrapperImpl.java @@ -0,0 +1,20 @@ +package com.android.settings.testutils.shadow; + +import com.android.settings.fuelgauge.anomaly.KeyValueListParserWrapperImpl; + +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; + +/** + * Shadow for {@link KeyValueListParserWrapperImpl} so we could implement + * {@link #getBoolean(String, boolean)} that doesn't support in the current + * robolectric + */ +@Implements(KeyValueListParserWrapperImpl.class) +public class ShadowKeyValueListParserWrapperImpl { + + @Implementation + public boolean getBoolean(String key, boolean defaultValue) { + return defaultValue; + } +}