Merge "Hook up the anomaly policy to wakelockanomaly"
This commit is contained in:
committed by
Android (Google) Code Review
commit
ef949e39dc
@@ -31,6 +31,7 @@ import com.android.internal.os.BatteryStatsHelper;
|
|||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
import com.android.settings.fuelgauge.BatteryUtils;
|
import com.android.settings.fuelgauge.BatteryUtils;
|
||||||
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
||||||
|
import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -40,17 +41,24 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class WakeLockAnomalyDetector implements AnomalyDetector {
|
public class WakeLockAnomalyDetector implements AnomalyDetector {
|
||||||
private static final String TAG = "WakeLockAnomalyChecker";
|
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 PackageManager mPackageManager;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
BatteryUtils mBatteryUtils;
|
BatteryUtils mBatteryUtils;
|
||||||
|
@VisibleForTesting
|
||||||
|
long mWakeLockThresholdMs;
|
||||||
|
|
||||||
public WakeLockAnomalyDetector(Context context) {
|
public WakeLockAnomalyDetector(Context context) {
|
||||||
|
this(context, new AnomalyDetectionPolicy(context));
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
WakeLockAnomalyDetector(Context context, AnomalyDetectionPolicy policy) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mPackageManager = context.getPackageManager();
|
mPackageManager = context.getPackageManager();
|
||||||
mBatteryUtils = BatteryUtils.getInstance(context);
|
mBatteryUtils = BatteryUtils.getInstance(context);
|
||||||
|
|
||||||
|
mWakeLockThresholdMs = policy.wakeLockThreshold;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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
|
// Report it if wakelock time is too long and it is not a hidden batterysipper
|
||||||
// TODO: add more attributes to detect wakelock anomaly
|
// TODO: add more attributes to detect wakelock anomaly
|
||||||
if (maxPartialWakeLockMs > WAKE_LOCK_THRESHOLD_MS
|
if (maxPartialWakeLockMs > mWakeLockThresholdMs
|
||||||
&& !mBatteryUtils.shouldHideSipper(sipper)) {
|
&& !mBatteryUtils.shouldHideSipper(sipper)) {
|
||||||
final String packageName = mBatteryUtils.getPackageName(uid.getUid());
|
final String packageName = mBatteryUtils.getPackageName(uid.getUid());
|
||||||
final CharSequence displayName = Utils.getApplicationLabel(mContext,
|
final CharSequence displayName = Utils.getApplicationLabel(mContext,
|
||||||
|
@@ -49,6 +49,7 @@ public class AnomalyLoaderTest {
|
|||||||
private Context mContext;
|
private Context mContext;
|
||||||
@Mock
|
@Mock
|
||||||
private BatteryStatsHelper mBatteryStatsHelper;
|
private BatteryStatsHelper mBatteryStatsHelper;
|
||||||
|
@Mock
|
||||||
private WakeLockAnomalyDetector mWakeLockAnomalyDetector;
|
private WakeLockAnomalyDetector mWakeLockAnomalyDetector;
|
||||||
private Anomaly mWakeLockAnomaly;
|
private Anomaly mWakeLockAnomaly;
|
||||||
private List<Anomaly> mWakeLockAnomalies;
|
private List<Anomaly> mWakeLockAnomalies;
|
||||||
@@ -62,7 +63,6 @@ public class AnomalyLoaderTest {
|
|||||||
FakeFeatureFactory.setupForTest(mContext);
|
FakeFeatureFactory.setupForTest(mContext);
|
||||||
mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
|
mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
|
||||||
|
|
||||||
mWakeLockAnomalyDetector = spy(new WakeLockAnomalyDetector(mContext));
|
|
||||||
mWakeLockAnomalies = new ArrayList<>();
|
mWakeLockAnomalies = new ArrayList<>();
|
||||||
mWakeLockAnomaly = new Anomaly.Builder()
|
mWakeLockAnomaly = new Anomaly.Builder()
|
||||||
.setType(Anomaly.AnomalyType.WAKE_LOCK)
|
.setType(Anomaly.AnomalyType.WAKE_LOCK)
|
||||||
|
@@ -22,6 +22,7 @@ import com.android.settings.SettingsRobolectricTestRunner;
|
|||||||
import com.android.settings.TestConfig;
|
import com.android.settings.TestConfig;
|
||||||
import com.android.settings.fuelgauge.anomaly.action.ForceStopAction;
|
import com.android.settings.fuelgauge.anomaly.action.ForceStopAction;
|
||||||
import com.android.settings.fuelgauge.anomaly.checker.WakeLockAnomalyDetector;
|
import com.android.settings.fuelgauge.anomaly.checker.WakeLockAnomalyDetector;
|
||||||
|
import com.android.settings.testutils.shadow.ShadowKeyValueListParserWrapperImpl;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -30,7 +31,8 @@ import org.robolectric.RuntimeEnvironment;
|
|||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
@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 {
|
public class AnomalyUtilsTest {
|
||||||
private AnomalyUtils mAnomalyUtils;
|
private AnomalyUtils mAnomalyUtils;
|
||||||
|
|
||||||
|
@@ -39,6 +39,7 @@ import com.android.settings.SettingsRobolectricTestRunner;
|
|||||||
import com.android.settings.TestConfig;
|
import com.android.settings.TestConfig;
|
||||||
import com.android.settings.fuelgauge.BatteryUtils;
|
import com.android.settings.fuelgauge.BatteryUtils;
|
||||||
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
import com.android.settings.fuelgauge.anomaly.Anomaly;
|
||||||
|
import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -47,6 +48,7 @@ import org.mockito.Mock;
|
|||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
|
import org.robolectric.util.ReflectionHelpers;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -54,8 +56,9 @@ import java.util.List;
|
|||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||||
public class WakeLockAnomalyDetectorTest {
|
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 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 ANOMALY_UID = 111;
|
||||||
private static final int NORMAL_UID = 222;
|
private static final int NORMAL_UID = 222;
|
||||||
@Mock
|
@Mock
|
||||||
@@ -82,6 +85,8 @@ public class WakeLockAnomalyDetectorTest {
|
|||||||
private PackageManager mPackageManager;
|
private PackageManager mPackageManager;
|
||||||
@Mock
|
@Mock
|
||||||
private ApplicationInfo mApplicationInfo;
|
private ApplicationInfo mApplicationInfo;
|
||||||
|
@Mock
|
||||||
|
private AnomalyDetectionPolicy mPolicy;
|
||||||
|
|
||||||
private ArrayMap<String, BatteryStats.Uid.Wakelock> mAnomalyWakelocks;
|
private ArrayMap<String, BatteryStats.Uid.Wakelock> mAnomalyWakelocks;
|
||||||
private ArrayMap<String, BatteryStats.Uid.Wakelock> mNormalWakelocks;
|
private ArrayMap<String, BatteryStats.Uid.Wakelock> mNormalWakelocks;
|
||||||
@@ -94,6 +99,7 @@ public class WakeLockAnomalyDetectorTest {
|
|||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
|
|
||||||
mContext = spy(RuntimeEnvironment.application);
|
mContext = spy(RuntimeEnvironment.application);
|
||||||
|
ReflectionHelpers.setField(mPolicy, "wakeLockThreshold", WAKELOCK_THRESHOLD_MS);
|
||||||
|
|
||||||
doReturn(false).when(mBatteryUtils).shouldHideSipper(any());
|
doReturn(false).when(mBatteryUtils).shouldHideSipper(any());
|
||||||
doReturn(mPackageManager).when(mContext).getPackageManager();
|
doReturn(mPackageManager).when(mContext).getPackageManager();
|
||||||
@@ -118,7 +124,7 @@ public class WakeLockAnomalyDetectorTest {
|
|||||||
mUsageList.add(mNormalSipper);
|
mUsageList.add(mNormalSipper);
|
||||||
doReturn(mUsageList).when(mBatteryStatsHelper).getUsageList();
|
doReturn(mUsageList).when(mBatteryStatsHelper).getUsageList();
|
||||||
|
|
||||||
mWakelockAnomalyDetector = spy(new WakeLockAnomalyDetector(mContext));
|
mWakelockAnomalyDetector = spy(new WakeLockAnomalyDetector(mContext, mPolicy));
|
||||||
mWakelockAnomalyDetector.mBatteryUtils = mBatteryUtils;
|
mWakelockAnomalyDetector.mBatteryUtils = mBatteryUtils;
|
||||||
doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector).getTotalDurationMs(
|
doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector).getTotalDurationMs(
|
||||||
eq(mAnomalyTimer), anyLong());
|
eq(mAnomalyTimer), anyLong());
|
||||||
@@ -137,4 +143,9 @@ public class WakeLockAnomalyDetectorTest {
|
|||||||
|
|
||||||
assertThat(mAnomalies).containsExactly(anomaly);
|
assertThat(mAnomalies).containsExactly(anomaly);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testContainsThresholdFromPolicy() {
|
||||||
|
assertThat(mWakelockAnomalyDetector.mWakeLockThresholdMs).isEqualTo(WAKELOCK_THRESHOLD_MS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -37,6 +37,7 @@ import com.android.settings.core.PreferenceController;
|
|||||||
import com.android.settings.dashboard.SummaryLoader;
|
import com.android.settings.dashboard.SummaryLoader;
|
||||||
import com.android.settings.testutils.FakeFeatureFactory;
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
import com.android.settings.testutils.XmlTestUtils;
|
import com.android.settings.testutils.XmlTestUtils;
|
||||||
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
import com.android.settings.testutils.shadow.ShadowSecureSettings;
|
import com.android.settings.testutils.shadow.ShadowSecureSettings;
|
||||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user