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

Commit b98039e2 authored by Lei Yu's avatar Lei Yu Committed by Android (Google) Code Review
Browse files

Merge "Fix a bug in AnomalyDetectionJobService" into pi-dev

parents be5fa599 a00e3936
Loading
Loading
Loading
Loading
+7 −7
Original line number Original line Diff line number Diff line
@@ -71,7 +71,8 @@ public class AnomalyDetectionJobService extends JobService {


    private final Object mLock = new Object();
    private final Object mLock = new Object();
    @GuardedBy("mLock")
    @GuardedBy("mLock")
    private boolean mIsJobCanceled = false;
    @VisibleForTesting
    boolean mIsJobCanceled = false;


    public static void scheduleAnomalyDetection(Context context, Intent intent) {
    public static void scheduleAnomalyDetection(Context context, Intent intent) {
        final JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
        final JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
@@ -89,6 +90,9 @@ public class AnomalyDetectionJobService extends JobService {


    @Override
    @Override
    public boolean onStartJob(JobParameters params) {
    public boolean onStartJob(JobParameters params) {
        synchronized (mLock) {
            mIsJobCanceled = false;
        }
        ThreadUtils.postOnBackgroundThread(() -> {
        ThreadUtils.postOnBackgroundThread(() -> {
            final Context context = AnomalyDetectionJobService.this;
            final Context context = AnomalyDetectionJobService.this;
            final BatteryDatabaseManager batteryDatabaseManager =
            final BatteryDatabaseManager batteryDatabaseManager =
@@ -96,18 +100,15 @@ public class AnomalyDetectionJobService extends JobService {
            final BatteryTipPolicy policy = new BatteryTipPolicy(this);
            final BatteryTipPolicy policy = new BatteryTipPolicy(this);
            final BatteryUtils batteryUtils = BatteryUtils.getInstance(this);
            final BatteryUtils batteryUtils = BatteryUtils.getInstance(this);
            final ContentResolver contentResolver = getContentResolver();
            final ContentResolver contentResolver = getContentResolver();
            final BatteryStatsHelper batteryStatsHelper = new BatteryStatsHelper(this,
                    true /* collectBatteryBroadcast */);
            final UserManager userManager = getSystemService(UserManager.class);
            final UserManager userManager = getSystemService(UserManager.class);
            final PowerWhitelistBackend powerWhitelistBackend = PowerWhitelistBackend.getInstance();
            final PowerWhitelistBackend powerWhitelistBackend = PowerWhitelistBackend.getInstance();
            final PowerUsageFeatureProvider powerUsageFeatureProvider = FeatureFactory
            final PowerUsageFeatureProvider powerUsageFeatureProvider = FeatureFactory
                    .getFactory(this).getPowerUsageFeatureProvider(this);
                    .getFactory(this).getPowerUsageFeatureProvider(this);
            final MetricsFeatureProvider metricsFeatureProvider = FeatureFactory
            final MetricsFeatureProvider metricsFeatureProvider = FeatureFactory
                    .getFactory(this).getMetricsFeatureProvider();
                    .getFactory(this).getMetricsFeatureProvider();
            batteryUtils.initBatteryStatsHelper(batteryStatsHelper, null /* bundle */, userManager);


            for (JobWorkItem item = dequeueWork(params); item != null; item = dequeueWork(params)) {
            for (JobWorkItem item = dequeueWork(params); item != null; item = dequeueWork(params)) {
                saveAnomalyToDatabase(context, batteryStatsHelper, userManager,
                saveAnomalyToDatabase(context, userManager,
                        batteryDatabaseManager, batteryUtils, policy, powerWhitelistBackend,
                        batteryDatabaseManager, batteryUtils, policy, powerWhitelistBackend,
                        contentResolver, powerUsageFeatureProvider, metricsFeatureProvider,
                        contentResolver, powerUsageFeatureProvider, metricsFeatureProvider,
                        item.getIntent().getExtras());
                        item.getIntent().getExtras());
@@ -128,8 +129,7 @@ public class AnomalyDetectionJobService extends JobService {
    }
    }


    @VisibleForTesting
    @VisibleForTesting
    void saveAnomalyToDatabase(Context context, BatteryStatsHelper batteryStatsHelper,
    void saveAnomalyToDatabase(Context context, UserManager userManager,
            UserManager userManager,
            BatteryDatabaseManager databaseManager, BatteryUtils batteryUtils,
            BatteryDatabaseManager databaseManager, BatteryUtils batteryUtils,
            BatteryTipPolicy policy, PowerWhitelistBackend powerWhitelistBackend,
            BatteryTipPolicy policy, PowerWhitelistBackend powerWhitelistBackend,
            ContentResolver contentResolver, PowerUsageFeatureProvider powerUsageFeatureProvider,
            ContentResolver contentResolver, PowerUsageFeatureProvider powerUsageFeatureProvider,
+16 −12
Original line number Original line Diff line number Diff line
@@ -46,8 +46,6 @@ import android.app.job.JobWorkItem;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Process;
import android.os.Process;
import android.os.StatsDimensionsValue;
import android.os.StatsDimensionsValue;
import android.os.UserManager;
import android.os.UserManager;
@@ -57,11 +55,11 @@ import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.os.BatteryStatsHelper;
import com.android.internal.os.BatteryStatsHelper;
import com.android.settings.R;
import com.android.settings.R;
import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowConnectivityManager;
import com.android.settings.testutils.shadow.ShadowConnectivityManager;
import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
import com.android.settings.testutils.shadow.ShadowPowerWhitelistBackend;


import org.junit.Before;
import org.junit.Before;
import org.junit.Test;
import org.junit.Test;
@@ -80,7 +78,7 @@ import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeUnit;


@RunWith(SettingsRobolectricTestRunner.class)
@RunWith(SettingsRobolectricTestRunner.class)
@Config(shadows = ShadowConnectivityManager.class)
@Config(shadows = {ShadowConnectivityManager.class, ShadowPowerWhitelistBackend.class})
public class AnomalyDetectionJobServiceTest {
public class AnomalyDetectionJobServiceTest {
    private static final int UID = 12345;
    private static final int UID = 12345;
    private static final String SYSTEM_PACKAGE = "com.android.system";
    private static final String SYSTEM_PACKAGE = "com.android.system";
@@ -91,8 +89,6 @@ public class AnomalyDetectionJobServiceTest {
    private static final int ANOMALY_TYPE = 6;
    private static final int ANOMALY_TYPE = 6;
    private static final long VERSION_CODE = 15;
    private static final long VERSION_CODE = 15;
    @Mock
    @Mock
    private BatteryStatsHelper mBatteryStatsHelper;
    @Mock
    private UserManager mUserManager;
    private UserManager mUserManager;
    @Mock
    @Mock
    private BatteryDatabaseManager mBatteryDatabaseManager;
    private BatteryDatabaseManager mBatteryDatabaseManager;
@@ -150,7 +146,7 @@ public class AnomalyDetectionJobServiceTest {
        doReturn(UID).when(mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
        doReturn(UID).when(mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
        doReturn(true).when(mPowerWhitelistBackend).isWhitelisted(any(String[].class));
        doReturn(true).when(mPowerWhitelistBackend).isWhitelisted(any(String[].class));


        mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mBatteryStatsHelper,
        mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext,
                mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
                mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
                mPowerWhitelistBackend, mContext.getContentResolver(),
                mPowerWhitelistBackend, mContext.getContentResolver(),
                mFeatureFactory.powerUsageFeatureProvider,
                mFeatureFactory.powerUsageFeatureProvider,
@@ -171,7 +167,7 @@ public class AnomalyDetectionJobServiceTest {
                mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
                mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
        doReturn(true).when(mBatteryUtils).shouldHideAnomaly(any(), anyInt());
        doReturn(true).when(mBatteryUtils).shouldHideAnomaly(any(), anyInt());


        mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mBatteryStatsHelper,
        mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext,
                mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
                mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
                mPowerWhitelistBackend, mContext.getContentResolver(),
                mPowerWhitelistBackend, mContext.getContentResolver(),
                mFeatureFactory.powerUsageFeatureProvider,
                mFeatureFactory.powerUsageFeatureProvider,
@@ -191,7 +187,7 @@ public class AnomalyDetectionJobServiceTest {
        doReturn(Process.SYSTEM_UID).when(
        doReturn(Process.SYSTEM_UID).when(
                mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
                mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());


        mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mBatteryStatsHelper,
        mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext,
                mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
                mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
                mPowerWhitelistBackend, mContext.getContentResolver(),
                mPowerWhitelistBackend, mContext.getContentResolver(),
                mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
                mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
@@ -206,7 +202,7 @@ public class AnomalyDetectionJobServiceTest {
        doReturn(AnomalyDetectionJobService.UID_NULL).when(
        doReturn(AnomalyDetectionJobService.UID_NULL).when(
                mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
                mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());


        mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mBatteryStatsHelper,
        mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext,
                mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
                mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
                mPowerWhitelistBackend, mContext.getContentResolver(),
                mPowerWhitelistBackend, mContext.getContentResolver(),
                mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
                mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
@@ -226,7 +222,7 @@ public class AnomalyDetectionJobServiceTest {
        doReturn(Process.FIRST_APPLICATION_UID).when(
        doReturn(Process.FIRST_APPLICATION_UID).when(
                mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
                mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());


        mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mBatteryStatsHelper,
        mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext,
                mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
                mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
                mPowerWhitelistBackend, mContext.getContentResolver(),
                mPowerWhitelistBackend, mContext.getContentResolver(),
                mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
                mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
@@ -251,7 +247,7 @@ public class AnomalyDetectionJobServiceTest {
        doReturn(Process.FIRST_APPLICATION_UID).when(
        doReturn(Process.FIRST_APPLICATION_UID).when(
                mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
                mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());


        mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mBatteryStatsHelper,
        mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext,
                mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
                mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,
                mPowerWhitelistBackend, mContext.getContentResolver(),
                mPowerWhitelistBackend, mContext.getContentResolver(),
                mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
                mFeatureFactory.powerUsageFeatureProvider, mFeatureFactory.metricsFeatureProvider,
@@ -316,4 +312,12 @@ public class AnomalyDetectionJobServiceTest {
        // Should not crash even job is stopped
        // Should not crash even job is stopped
        mAnomalyDetectionJobService.completeWork(mJobParameters, mJobWorkItem);
        mAnomalyDetectionJobService.completeWork(mJobParameters, mJobWorkItem);
    }
    }

    @Test
    public void restartWorkAfterBeenStopped_jobStarted() {
        mAnomalyDetectionJobService.onStopJob(mJobParameters);
        mAnomalyDetectionJobService.onStartJob(mJobParameters);

        assertThat(mAnomalyDetectionJobService.mIsJobCanceled).isFalse();
    }
}
}
+28 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.testutils.shadow;

import com.android.settingslib.fuelgauge.PowerWhitelistBackend;

import org.robolectric.annotation.Implements;

@Implements(PowerWhitelistBackend.class)
public class ShadowPowerWhitelistBackend {
    public void __constructor__() {
        // Do nothing
    }
}