Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9453e89a authored by jackqdyulei's avatar jackqdyulei
Browse files

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
parent 1dc3f385
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -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();
}
+8 −0
Original line number Diff line number Diff line
@@ -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;
+20 −0
Original line number Diff line number Diff line
@@ -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;
+10 −4
Original line number Diff line number Diff line
@@ -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,8 +114,11 @@ public class WakeLockAnomalyDetector implements AnomalyDetector {
                        .setDisplayName(displayName)
                        .setPackageName(packageName)
                        .build();

                if (mAnomalyAction.isActionActive(anomaly)) {
                    anomalies.add(anomaly);
                }
            }

        }
        return anomalies;
+10 −3
Original line number Diff line number Diff line
@@ -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,10 +95,13 @@ public class WakeupAlarmAnomalyDetector implements AnomalyDetector {
                            .setDisplayName(displayName)
                            .setPackageName(packageName)
                            .build();

                    if (mAnomalyAction.isActionActive(anomaly)) {
                        anomalies.add(anomaly);
                    }
                }
            }
        }

        return anomalies;
    }
Loading