IdleMaint: run more frequently during 3AM to 4AM

This patch introduces two flows where:
1) add a deadline, 2 days, to avoid missing idlemaint job
2) run the job more frequently between 3AM and 4AM

Bug: 128594671
Change-Id: Id6596be44ff96d39f77fb21dca52c35952f2cf7e
Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
This commit is contained in:
Jaegeuk Kim
2019-04-25 05:00:36 -07:00
parent 8d098c28c6
commit e00ed0695b

View File

@@ -27,6 +27,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.os.RemoteException;
import android.util.Slog;
import java.util.concurrent.TimeUnit;
public class MountServiceIdler extends JobService {
private static final String TAG = "MountServiceIdler";
@@ -48,7 +49,7 @@ public class MountServiceIdler extends JobService {
mStarted = false;
}
}
// ... and try again tomorrow
// ... and try again right away or tomorrow
scheduleIdlePass(MountServiceIdler.this);
}
};
@@ -98,24 +99,36 @@ public class MountServiceIdler extends JobService {
public static void scheduleIdlePass(Context context) {
JobScheduler tm = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
Calendar calendar = tomorrowMidnight();
final long timeToMidnight = calendar.getTimeInMillis() - System.currentTimeMillis();
final long today3AM = MidnightInTime(0, 0).getTimeInMillis();
final long today4AM = MidnightInTime(0, 1).getTimeInMillis();
long nextScheduleTime, maxScheduleTime;
if (System.currentTimeMillis() > today3AM && System.currentTimeMillis() < today4AM) {
nextScheduleTime = TimeUnit.SECONDS.toMillis(10);
maxScheduleTime = today4AM - System.currentTimeMillis();
} else {
final long tomorrow3AM = MidnightInTime(1, 0).getTimeInMillis();
final long twodays3AM = MidnightInTime(2, 0).getTimeInMillis();
nextScheduleTime = tomorrow3AM - System.currentTimeMillis(); // 3AM tomorrow
maxScheduleTime = twodays3AM - System.currentTimeMillis(); // 3AM in two days
}
JobInfo.Builder builder = new JobInfo.Builder(MOUNT_JOB_ID, sIdleService);
builder.setRequiresDeviceIdle(true);
builder.setRequiresCharging(true);
builder.setMinimumLatency(timeToMidnight);
builder.setMinimumLatency(nextScheduleTime);
builder.setOverrideDeadline(maxScheduleTime);
tm.schedule(builder.build());
}
private static Calendar tomorrowMidnight() {
private static Calendar MidnightInTime(int nDays, int nHours) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 3);
calendar.set(Calendar.HOUR_OF_DAY, 3 + nHours);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
calendar.add(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.DAY_OF_MONTH, nDays);
return calendar;
}
}