Merge changes Ib497aca6,Ic6def54a into pi-dev
* changes: Make anomaly jobs persistent. Update job ids in Settings
This commit is contained in:
committed by
Android (Google) Code Review
commit
5e8a0e2436
@@ -18,9 +18,6 @@
|
|||||||
-->
|
-->
|
||||||
<resources>
|
<resources>
|
||||||
<item type="id" name="preference_highlighted" />
|
<item type="id" name="preference_highlighted" />
|
||||||
<item type="id" name="job_anomaly_clean_up" />
|
|
||||||
<item type="id" name="job_anomaly_config_update"/>
|
|
||||||
<item type="id" name="job_anomaly_detection" />
|
|
||||||
|
|
||||||
<item type="id" name="lock_none" />
|
<item type="id" name="lock_none" />
|
||||||
<item type="id" name="lock_pin" />
|
<item type="id" name="lock_pin" />
|
||||||
|
22
res/values/integers.xml
Normal file
22
res/values/integers.xml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
<resources>
|
||||||
|
<!-- Reserve all the job ids in settings -->
|
||||||
|
<integer name="job_anomaly_clean_up">100</integer>
|
||||||
|
<integer name="job_anomaly_config_update">101</integer>
|
||||||
|
<integer name="job_anomaly_detection">102</integer>
|
||||||
|
</resources>
|
@@ -42,12 +42,17 @@ public class AnomalyCleanupJobService extends JobService {
|
|||||||
|
|
||||||
final ComponentName component = new ComponentName(context, AnomalyCleanupJobService.class);
|
final ComponentName component = new ComponentName(context, AnomalyCleanupJobService.class);
|
||||||
final JobInfo.Builder jobBuilder =
|
final JobInfo.Builder jobBuilder =
|
||||||
new JobInfo.Builder(R.id.job_anomaly_clean_up, component)
|
new JobInfo.Builder(R.integer.job_anomaly_clean_up, component)
|
||||||
.setPeriodic(CLEAN_UP_FREQUENCY_MS)
|
.setPeriodic(CLEAN_UP_FREQUENCY_MS)
|
||||||
.setRequiresDeviceIdle(true)
|
.setRequiresDeviceIdle(true)
|
||||||
.setRequiresCharging(true);
|
.setRequiresCharging(true)
|
||||||
|
.setPersisted(true);
|
||||||
|
final JobInfo pending = jobScheduler.getPendingJob(R.integer.job_anomaly_clean_up);
|
||||||
|
|
||||||
if (jobScheduler.schedule(jobBuilder.build()) != JobScheduler.RESULT_SUCCESS) {
|
// Don't schedule it if it already exists, to make sure it runs periodically even after
|
||||||
|
// reboot
|
||||||
|
if (pending == null && jobScheduler.schedule(jobBuilder.build())
|
||||||
|
!= JobScheduler.RESULT_SUCCESS) {
|
||||||
Log.i(TAG, "Anomaly clean up job service schedule failed.");
|
Log.i(TAG, "Anomaly clean up job service schedule failed.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -52,12 +52,17 @@ public class AnomalyConfigJobService extends JobService {
|
|||||||
|
|
||||||
final ComponentName component = new ComponentName(context, AnomalyConfigJobService.class);
|
final ComponentName component = new ComponentName(context, AnomalyConfigJobService.class);
|
||||||
final JobInfo.Builder jobBuilder =
|
final JobInfo.Builder jobBuilder =
|
||||||
new JobInfo.Builder(R.id.job_anomaly_config_update, component)
|
new JobInfo.Builder(R.integer.job_anomaly_config_update, component)
|
||||||
.setPeriodic(CONFIG_UPDATE_FREQUENCY_MS)
|
.setPeriodic(CONFIG_UPDATE_FREQUENCY_MS)
|
||||||
.setRequiresDeviceIdle(true)
|
.setRequiresDeviceIdle(true)
|
||||||
.setRequiresCharging(true);
|
.setRequiresCharging(true)
|
||||||
|
.setPersisted(true);
|
||||||
|
final JobInfo pending = jobScheduler.getPendingJob(R.integer.job_anomaly_config_update);
|
||||||
|
|
||||||
if (jobScheduler.schedule(jobBuilder.build()) != JobScheduler.RESULT_SUCCESS) {
|
// Don't schedule it if it already exists, to make sure it runs periodically even after
|
||||||
|
// reboot
|
||||||
|
if (pending == null && jobScheduler.schedule(jobBuilder.build())
|
||||||
|
!= JobScheduler.RESULT_SUCCESS) {
|
||||||
Log.i(TAG, "Anomaly config update job service schedule failed.");
|
Log.i(TAG, "Anomaly config update job service schedule failed.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -70,7 +70,7 @@ public class AnomalyDetectionJobService extends JobService {
|
|||||||
final ComponentName component = new ComponentName(context,
|
final ComponentName component = new ComponentName(context,
|
||||||
AnomalyDetectionJobService.class);
|
AnomalyDetectionJobService.class);
|
||||||
final JobInfo.Builder jobBuilder =
|
final JobInfo.Builder jobBuilder =
|
||||||
new JobInfo.Builder(R.id.job_anomaly_detection, component)
|
new JobInfo.Builder(R.integer.job_anomaly_detection, component)
|
||||||
.setOverrideDeadline(MAX_DELAY_MS);
|
.setOverrideDeadline(MAX_DELAY_MS);
|
||||||
|
|
||||||
if (jobScheduler.enqueue(jobBuilder.build(), new JobWorkItem(intent))
|
if (jobScheduler.enqueue(jobBuilder.build(), new JobWorkItem(intent))
|
||||||
|
@@ -18,10 +18,16 @@ package com.android.settings.fuelgauge.batterytip;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.mockito.Matchers.any;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
import static org.robolectric.RuntimeEnvironment.application;
|
import static org.robolectric.RuntimeEnvironment.application;
|
||||||
|
|
||||||
import android.app.job.JobInfo;
|
import android.app.job.JobInfo;
|
||||||
import android.app.job.JobScheduler;
|
import android.app.job.JobScheduler;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
@@ -30,6 +36,7 @@ import org.junit.Before;
|
|||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
|
import org.robolectric.RuntimeEnvironment;
|
||||||
import org.robolectric.Shadows;
|
import org.robolectric.Shadows;
|
||||||
import org.robolectric.shadows.ShadowJobScheduler;
|
import org.robolectric.shadows.ShadowJobScheduler;
|
||||||
|
|
||||||
@@ -38,23 +45,39 @@ import java.util.concurrent.TimeUnit;
|
|||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
public class AnomalyCleanupJobServiceTest {
|
public class AnomalyCleanupJobServiceTest {
|
||||||
|
private Context mContext;
|
||||||
|
private JobScheduler mJobScheduler;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
|
|
||||||
|
mContext = spy(RuntimeEnvironment.application);
|
||||||
|
mJobScheduler = spy(mContext.getSystemService(JobScheduler.class));
|
||||||
|
when(mContext.getSystemService(JobScheduler.class)).thenReturn(mJobScheduler);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testScheduleCleanUp() {
|
public void testScheduleCleanUp() {
|
||||||
AnomalyCleanupJobService.scheduleCleanUp(application);
|
AnomalyCleanupJobService.scheduleCleanUp(mContext);
|
||||||
|
|
||||||
ShadowJobScheduler shadowJobScheduler =
|
ShadowJobScheduler shadowJobScheduler =
|
||||||
Shadows.shadowOf(application.getSystemService(JobScheduler.class));
|
Shadows.shadowOf(mContext.getSystemService(JobScheduler.class));
|
||||||
List<JobInfo> pendingJobs = shadowJobScheduler.getAllPendingJobs();
|
List<JobInfo> pendingJobs = shadowJobScheduler.getAllPendingJobs();
|
||||||
assertEquals(1, pendingJobs.size());
|
assertEquals(1, pendingJobs.size());
|
||||||
JobInfo pendingJob = pendingJobs.get(0);
|
JobInfo pendingJob = pendingJobs.get(0);
|
||||||
assertThat(pendingJob.getId()).isEqualTo(R.id.job_anomaly_clean_up);
|
assertThat(pendingJob.getId()).isEqualTo(R.integer.job_anomaly_clean_up);
|
||||||
assertThat(pendingJob.getIntervalMillis()).isEqualTo(TimeUnit.DAYS.toMillis(1));
|
assertThat(pendingJob.getIntervalMillis()).isEqualTo(TimeUnit.DAYS.toMillis(1));
|
||||||
assertThat(pendingJob.isRequireDeviceIdle()).isTrue();
|
assertThat(pendingJob.isRequireDeviceIdle()).isTrue();
|
||||||
assertThat(pendingJob.isRequireCharging()).isTrue();
|
assertThat(pendingJob.isRequireCharging()).isTrue();
|
||||||
|
assertThat(pendingJob.isPersisted()).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testScheduleCleanUp_invokeTwice_onlyScheduleOnce() {
|
||||||
|
AnomalyCleanupJobService.scheduleCleanUp(mContext);
|
||||||
|
AnomalyCleanupJobService.scheduleCleanUp(mContext);
|
||||||
|
|
||||||
|
verify(mJobScheduler, times(1)).schedule(any());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -25,7 +25,9 @@ import static org.mockito.Matchers.anyString;
|
|||||||
import static org.mockito.Matchers.eq;
|
import static org.mockito.Matchers.eq;
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
import static org.robolectric.RuntimeEnvironment.application;
|
import static org.robolectric.RuntimeEnvironment.application;
|
||||||
|
|
||||||
import android.app.StatsManager;
|
import android.app.StatsManager;
|
||||||
@@ -43,6 +45,7 @@ import org.junit.Test;
|
|||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
|
import org.robolectric.RuntimeEnvironment;
|
||||||
import org.robolectric.Shadows;
|
import org.robolectric.Shadows;
|
||||||
import org.robolectric.shadows.ShadowJobScheduler;
|
import org.robolectric.shadows.ShadowJobScheduler;
|
||||||
|
|
||||||
@@ -57,12 +60,18 @@ public class AnomalyConfigJobServiceTest {
|
|||||||
@Mock
|
@Mock
|
||||||
private StatsManager mStatsManager;
|
private StatsManager mStatsManager;
|
||||||
|
|
||||||
|
private Context mContext;
|
||||||
|
private JobScheduler mJobScheduler;
|
||||||
private AnomalyConfigJobService mJobService;
|
private AnomalyConfigJobService mJobService;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
|
|
||||||
|
mContext = spy(RuntimeEnvironment.application);
|
||||||
|
mJobScheduler = spy(mContext.getSystemService(JobScheduler.class));
|
||||||
|
when(mContext.getSystemService(JobScheduler.class)).thenReturn(mJobScheduler);
|
||||||
|
|
||||||
mJobService = spy(new AnomalyConfigJobService());
|
mJobService = spy(new AnomalyConfigJobService());
|
||||||
doReturn(application.getSharedPreferences(AnomalyConfigJobService.PREF_DB,
|
doReturn(application.getSharedPreferences(AnomalyConfigJobService.PREF_DB,
|
||||||
Context.MODE_PRIVATE)).when(mJobService).getSharedPreferences(anyString(),
|
Context.MODE_PRIVATE)).when(mJobService).getSharedPreferences(anyString(),
|
||||||
@@ -71,18 +80,27 @@ public class AnomalyConfigJobServiceTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testScheduleCleanUp() {
|
public void testScheduleConfigUpdate() {
|
||||||
AnomalyConfigJobService.scheduleConfigUpdate(application);
|
AnomalyConfigJobService.scheduleConfigUpdate(mContext);
|
||||||
|
|
||||||
ShadowJobScheduler shadowJobScheduler =
|
ShadowJobScheduler shadowJobScheduler =
|
||||||
Shadows.shadowOf(application.getSystemService(JobScheduler.class));
|
Shadows.shadowOf(mContext.getSystemService(JobScheduler.class));
|
||||||
List<JobInfo> pendingJobs = shadowJobScheduler.getAllPendingJobs();
|
List<JobInfo> pendingJobs = shadowJobScheduler.getAllPendingJobs();
|
||||||
assertEquals(1, pendingJobs.size());
|
assertEquals(1, pendingJobs.size());
|
||||||
JobInfo pendingJob = pendingJobs.get(0);
|
JobInfo pendingJob = pendingJobs.get(0);
|
||||||
assertThat(pendingJob.getId()).isEqualTo(R.id.job_anomaly_config_update);
|
assertThat(pendingJob.getId()).isEqualTo(R.integer.job_anomaly_config_update);
|
||||||
assertThat(pendingJob.getIntervalMillis()).isEqualTo(TimeUnit.DAYS.toMillis(1));
|
assertThat(pendingJob.getIntervalMillis()).isEqualTo(TimeUnit.DAYS.toMillis(1));
|
||||||
assertThat(pendingJob.isRequireDeviceIdle()).isTrue();
|
assertThat(pendingJob.isRequireDeviceIdle()).isTrue();
|
||||||
assertThat(pendingJob.isRequireCharging()).isTrue();
|
assertThat(pendingJob.isRequireCharging()).isTrue();
|
||||||
|
assertThat(pendingJob.isPersisted()).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testScheduleConfigUpdate_invokeTwice_onlyScheduleOnce() {
|
||||||
|
AnomalyConfigJobService.scheduleConfigUpdate(mContext);
|
||||||
|
AnomalyConfigJobService.scheduleConfigUpdate(mContext);
|
||||||
|
|
||||||
|
verify(mJobScheduler, times(1)).schedule(any());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@@ -113,7 +113,7 @@ public class AnomalyDetectionJobServiceTest {
|
|||||||
assertThat(pendingJobs).hasSize(1);
|
assertThat(pendingJobs).hasSize(1);
|
||||||
|
|
||||||
JobInfo pendingJob = pendingJobs.get(0);
|
JobInfo pendingJob = pendingJobs.get(0);
|
||||||
assertThat(pendingJob.getId()).isEqualTo(R.id.job_anomaly_detection);
|
assertThat(pendingJob.getId()).isEqualTo(R.integer.job_anomaly_detection);
|
||||||
assertThat(pendingJob.getMaxExecutionDelayMillis())
|
assertThat(pendingJob.getMaxExecutionDelayMillis())
|
||||||
.isEqualTo(TimeUnit.MINUTES.toMillis(30));
|
.isEqualTo(TimeUnit.MINUTES.toMillis(30));
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user