Add action active check for anomaly action.

This cl adds the action active check for the following actions:
1. ForceStopAction: check whether app is stopped
2. BackgroundActivityAction: check whether background activity
is turned on

If related action is not active, we won't report anomaly
to users. Future cl will add active check for bluetooth anomaly.

Bug: 62452014
Test: RunSettingsRoboTests

Change-Id: Ib490227f4570accf8ca4840a99bf85a022c42a5b
This commit is contained in:
jackqdyulei
2017-06-08 17:43:29 -07:00
parent 1dc3f38506
commit 9453e89aca
9 changed files with 112 additions and 10 deletions

View File

@@ -24,11 +24,18 @@ import com.android.settings.fuelgauge.anomaly.Anomaly;
public interface AnomalyAction {
/**
* handle the action when user clicks positive button
* @param Anomaly about the app that we need to handle
* @param anomaly about the app that we need to handle
* @param metricsKey key for the page that invokes the action
*
* @see com.android.internal.logging.nano.MetricsProto
*/
void handlePositiveAction(Anomaly Anomaly, int metricsKey);
void handlePositiveAction(Anomaly anomaly, int metricsKey);
/**
* Check whether the action is active for {@code anomaly}
* @param anomaly about the app that we need to handle
* @return {@code true} if action is active, otherwise return {@code false}
*/
boolean isActionActive(Anomaly anomaly);
int getActionType();
}

View File

@@ -45,6 +45,14 @@ public class BackgroundCheckAction implements AnomalyAction {
AppOpsManager.MODE_IGNORED);
}
@Override
public boolean isActionActive(Anomaly anomaly) {
final int mode = mAppOpsManager
.checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, anomaly.uid,
anomaly.packageName);
return mode != AppOpsManager.MODE_IGNORED && mode != AppOpsManager.MODE_ERRORED;
}
@Override
public int getActionType() {
return Anomaly.AnomalyActionType.BACKGROUND_CHECK;

View File

@@ -18,6 +18,9 @@ package com.android.settings.fuelgauge.anomaly.action;
import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.util.Log;
import android.util.Pair;
import com.android.internal.logging.nano.MetricsProto;
@@ -25,20 +28,25 @@ import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.fuelgauge.anomaly.Anomaly;
import com.android.settings.overlay.FeatureFactory;
import java.util.List;
/**
* Force stop action for anomaly app, which means to stop the app which causes anomaly
*/
public class ForceStopAction implements AnomalyAction {
private static final String TAG = "ForceStopAction";
private Context mContext;
private MetricsFeatureProvider mMetricsFeatureProvider;
private ActivityManager mActivityManager;
private PackageManager mPackageManager;
public ForceStopAction(Context context) {
mContext = context;
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
mActivityManager = (ActivityManager) context.getSystemService(
Context.ACTIVITY_SERVICE);
mPackageManager = context.getPackageManager();
}
@Override
@@ -52,6 +60,18 @@ public class ForceStopAction implements AnomalyAction {
mActivityManager.forceStopPackage(packageName);
}
@Override
public boolean isActionActive(Anomaly anomaly) {
try {
ApplicationInfo info = mPackageManager.getApplicationInfo(anomaly.packageName,
PackageManager.GET_META_DATA);
return (info.flags & ApplicationInfo.FLAG_STOPPED) == 0;
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "Cannot find info for app: " + anomaly.packageName);
}
return false;
}
@Override
public int getActionType() {
return Anomaly.AnomalyActionType.FORCE_STOP;

View File

@@ -17,14 +17,11 @@
package com.android.settings.fuelgauge.anomaly.checker;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.BatteryStats;
import android.os.SystemClock;
import android.support.annotation.VisibleForTesting;
import android.text.format.DateUtils;
import android.util.ArrayMap;
import android.util.Log;
import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatteryStatsHelper;
@@ -32,6 +29,8 @@ 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 com.android.settings.fuelgauge.anomaly.AnomalyUtils;
import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
import java.util.ArrayList;
import java.util.List;
@@ -47,6 +46,8 @@ public class WakeLockAnomalyDetector implements AnomalyDetector {
BatteryUtils mBatteryUtils;
@VisibleForTesting
long mWakeLockThresholdMs;
@VisibleForTesting
AnomalyAction mAnomalyAction;
public WakeLockAnomalyDetector(Context context) {
this(context, new AnomalyDetectionPolicy(context));
@@ -57,6 +58,8 @@ public class WakeLockAnomalyDetector implements AnomalyDetector {
mContext = context;
mPackageManager = context.getPackageManager();
mBatteryUtils = BatteryUtils.getInstance(context);
mAnomalyAction = AnomalyUtils.getInstance(context).getAnomalyAction(
Anomaly.AnomalyType.WAKE_LOCK);
mWakeLockThresholdMs = policy.wakeLockThreshold;
}
@@ -111,7 +114,10 @@ public class WakeLockAnomalyDetector implements AnomalyDetector {
.setDisplayName(displayName)
.setPackageName(packageName)
.build();
anomalies.add(anomaly);
if (mAnomalyAction.isActionActive(anomaly)) {
anomalies.add(anomaly);
}
}
}

View File

@@ -17,9 +17,7 @@
package com.android.settings.fuelgauge.anomaly.checker;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.BatteryStats;
import android.os.SystemClock;
import android.support.annotation.VisibleForTesting;
import android.text.format.DateUtils;
import android.util.ArrayMap;
@@ -30,6 +28,8 @@ 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 com.android.settings.fuelgauge.anomaly.AnomalyUtils;
import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
import java.util.ArrayList;
import java.util.List;
@@ -41,6 +41,8 @@ public class WakeupAlarmAnomalyDetector implements AnomalyDetector {
private static final String TAG = "WakeupAlarmAnomalyDetector";
@VisibleForTesting
BatteryUtils mBatteryUtils;
@VisibleForTesting
AnomalyAction mAnomalyAction;
private long mWakeupAlarmThreshold;
private Context mContext;
@@ -52,6 +54,8 @@ public class WakeupAlarmAnomalyDetector implements AnomalyDetector {
WakeupAlarmAnomalyDetector(Context context, AnomalyDetectionPolicy policy) {
mContext = context;
mBatteryUtils = BatteryUtils.getInstance(context);
mAnomalyAction = AnomalyUtils.getInstance(context).getAnomalyAction(
Anomaly.AnomalyType.WAKEUP_ALARM);
mWakeupAlarmThreshold = policy.wakeupAlarmThreshold;
}
@@ -91,7 +95,10 @@ public class WakeupAlarmAnomalyDetector implements AnomalyDetector {
.setDisplayName(displayName)
.setPackageName(packageName)
.build();
anomalies.add(anomaly);
if (mAnomalyAction.isActionActive(anomaly)) {
anomalies.add(anomaly);
}
}
}
}