Loading src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java +17 −5 Original line number Diff line number Diff line Loading @@ -38,13 +38,16 @@ import android.os.UserManager; 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; Loading Loading @@ -78,6 +81,7 @@ public class AnomalyDetectionJobService extends JobService { @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); Loading @@ -89,12 +93,14 @@ public class AnomalyDetectionJobService extends JobService { 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 */); Loading @@ -109,11 +115,12 @@ public class AnomalyDetectionJobService extends JobService { } @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); Loading Loading @@ -158,6 +165,11 @@ public class AnomalyDetectionJobService extends JobService { 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) { Loading tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java +31 −12 Original line number Diff line number Diff line Loading @@ -38,7 +38,9 @@ import android.os.Bundle; 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; Loading Loading @@ -67,6 +69,7 @@ public class AnomalyDetectionJobServiceTest { "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 Loading Loading @@ -119,9 +122,11 @@ public class AnomalyDetectionJobServiceTest { 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()); Loading @@ -132,9 +137,11 @@ public class AnomalyDetectionJobServiceTest { 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()); Loading @@ -149,12 +156,18 @@ public class AnomalyDetectionJobServiceTest { 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)); } Loading @@ -167,11 +180,17 @@ public class AnomalyDetectionJobServiceTest { 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)); } } Loading
src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java +17 −5 Original line number Diff line number Diff line Loading @@ -38,13 +38,16 @@ import android.os.UserManager; 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; Loading Loading @@ -78,6 +81,7 @@ public class AnomalyDetectionJobService extends JobService { @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); Loading @@ -89,12 +93,14 @@ public class AnomalyDetectionJobService extends JobService { 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 */); Loading @@ -109,11 +115,12 @@ public class AnomalyDetectionJobService extends JobService { } @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); Loading Loading @@ -158,6 +165,11 @@ public class AnomalyDetectionJobService extends JobService { 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) { Loading
tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java +31 −12 Original line number Diff line number Diff line Loading @@ -38,7 +38,9 @@ import android.os.Bundle; 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; Loading Loading @@ -67,6 +69,7 @@ public class AnomalyDetectionJobServiceTest { "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 Loading Loading @@ -119,9 +122,11 @@ public class AnomalyDetectionJobServiceTest { 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()); Loading @@ -132,9 +137,11 @@ public class AnomalyDetectionJobServiceTest { 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()); Loading @@ -149,12 +156,18 @@ public class AnomalyDetectionJobServiceTest { 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)); } Loading @@ -167,11 +180,17 @@ public class AnomalyDetectionJobServiceTest { 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)); } }