import android.provider.Settings;
import android.support.annotation.VisibleForTesting;
import android.util.Log;
+import android.util.Pair;
+import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.os.BatteryStatsHelper;
import com.android.internal.util.ArrayUtils;
import com.android.settings.R;
import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
import com.android.settingslib.utils.ThreadUtils;
@Override
public boolean onStartJob(JobParameters params) {
ThreadUtils.postOnBackgroundThread(() -> {
+ final Context context = AnomalyDetectionJobService.this;
final BatteryDatabaseManager batteryDatabaseManager =
BatteryDatabaseManager.getInstance(this);
final BatteryTipPolicy policy = new BatteryTipPolicy(this);
final PowerWhitelistBackend powerWhitelistBackend = PowerWhitelistBackend.getInstance();
final PowerUsageFeatureProvider powerUsageFeatureProvider = FeatureFactory
.getFactory(this).getPowerUsageFeatureProvider(this);
+ final MetricsFeatureProvider metricsFeatureProvider = FeatureFactory
+ .getFactory(this).getMetricsFeatureProvider();
for (JobWorkItem item = params.dequeueWork(); item != null;
item = params.dequeueWork()) {
- saveAnomalyToDatabase(batteryStatsHelper, userManager, batteryDatabaseManager,
- batteryUtils, policy, powerWhitelistBackend, contentResolver,
- powerUsageFeatureProvider,
+ saveAnomalyToDatabase(context, batteryStatsHelper, userManager,
+ batteryDatabaseManager, batteryUtils, policy, powerWhitelistBackend,
+ contentResolver, powerUsageFeatureProvider, metricsFeatureProvider,
item.getIntent().getExtras());
}
jobFinished(params, false /* wantsReschedule */);
}
@VisibleForTesting
- void saveAnomalyToDatabase(BatteryStatsHelper batteryStatsHelper, UserManager userManager,
+ void saveAnomalyToDatabase(Context context, BatteryStatsHelper batteryStatsHelper,
+ UserManager userManager,
BatteryDatabaseManager databaseManager, BatteryUtils batteryUtils,
BatteryTipPolicy policy, PowerWhitelistBackend powerWhitelistBackend,
ContentResolver contentResolver, PowerUsageFeatureProvider powerUsageFeatureProvider,
- Bundle bundle) {
+ MetricsFeatureProvider metricsFeatureProvider, Bundle bundle) {
// The Example of intentDimsValue is: 35:{1:{1:{1:10013|}|}|}
final StatsDimensionsValue intentDimsValue =
bundle.getParcelable(StatsManager.EXTRA_STATS_DIMENSIONS_VALUE);
AnomalyDatabaseHelper.State.NEW,
timeMs);
}
+ metricsFeatureProvider.action(context,
+ MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
+ packageName,
+ Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT,
+ anomalyInfo.anomalyType));
}
}
} catch (NullPointerException | IndexOutOfBoundsException e) {
import android.os.Process;
import android.os.StatsDimensionsValue;
import android.os.UserManager;
+import android.util.Pair;
+import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.os.BatteryStatsHelper;
import com.android.settings.R;
import com.android.settings.fuelgauge.BatteryUtils;
"anomaly_type=6,auto_restriction=true";
private static final String SUBSCRIBER_COOKIES_NOT_AUTO_RESTRICTION =
"anomaly_type=6,auto_restriction=false";
+ private static final int ANOMALY_TYPE = 6;
@Mock
private BatteryStatsHelper mBatteryStatsHelper;
@Mock
doReturn(SYSTEM_PACKAGE).when(mBatteryUtils).getPackageName(anyInt());
doReturn(true).when(mPowerWhitelistBackend).isSysWhitelisted(SYSTEM_PACKAGE);
- mAnomalyDetectionJobService.saveAnomalyToDatabase(mBatteryStatsHelper, mUserManager,
- mBatteryDatabaseManager, mBatteryUtils, mPolicy, mPowerWhitelistBackend,
- mContext.getContentResolver(), mFeatureFactory.powerUsageFeatureProvider, mBundle);
+ mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mBatteryStatsHelper,
+ mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
+ mPowerWhitelistBackend, mContext.getContentResolver(),
+ mFeatureFactory.powerUsageFeatureProvider,
+ mFeatureFactory.metricsFeatureProvider, mBundle);
verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(),
anyInt(), anyLong());
doReturn(Process.SYSTEM_UID).when(
mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
- mAnomalyDetectionJobService.saveAnomalyToDatabase(mBatteryStatsHelper, mUserManager,
- mBatteryDatabaseManager, mBatteryUtils, mPolicy, mPowerWhitelistBackend,
- mContext.getContentResolver(), mFeatureFactory.powerUsageFeatureProvider, mBundle);
+ mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mBatteryStatsHelper,
+ mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
+ mPowerWhitelistBackend, mContext.getContentResolver(),
+ mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
+ mBundle);
verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(),
anyInt(), anyLong());
doReturn(Process.FIRST_APPLICATION_UID).when(
mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
- mAnomalyDetectionJobService.saveAnomalyToDatabase(mBatteryStatsHelper, mUserManager,
- mBatteryDatabaseManager, mBatteryUtils, mPolicy, mPowerWhitelistBackend,
- mContext.getContentResolver(), mFeatureFactory.powerUsageFeatureProvider, mBundle);
+ mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mBatteryStatsHelper,
+ mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
+ mPowerWhitelistBackend, mContext.getContentResolver(),
+ mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
+ mBundle);
verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), eq(6),
eq(AnomalyDatabaseHelper.State.AUTO_HANDLED), anyLong());
+ verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
+ MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
+ SYSTEM_PACKAGE,
+ Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, ANOMALY_TYPE));
}
doReturn(Process.FIRST_APPLICATION_UID).when(
mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
- mAnomalyDetectionJobService.saveAnomalyToDatabase(mBatteryStatsHelper, mUserManager,
- mBatteryDatabaseManager, mBatteryUtils, mPolicy, mPowerWhitelistBackend,
- mContext.getContentResolver(), mFeatureFactory.powerUsageFeatureProvider, mBundle);
+ mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mBatteryStatsHelper,
+ mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
+ mPowerWhitelistBackend, mContext.getContentResolver(),
+ mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
+ mBundle);
verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), eq(6),
eq(AnomalyDatabaseHelper.State.NEW), anyLong());
+ verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
+ MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
+ SYSTEM_PACKAGE,
+ Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, ANOMALY_TYPE));
}
}