JobInfo.java revision e96c3b7eff5290f2a6c5e572babbfa8a3897be96
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2014 The Android Open Source Project 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License. 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpackage android.app.job; 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.annotation.NonNull; 2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.annotation.Nullable; 2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.content.ComponentName; 2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.net.Uri; 2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.os.Parcel; 2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.os.Parcelable; 2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.os.PersistableBundle; 2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.util.Log; 277562408b2261d38415453378b6188f74fda99d88Mathias Agopian 287562408b2261d38415453378b6188f74fda99d88Mathias Agopianimport java.util.ArrayList; 2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/** 3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Container of data passed to the {@link android.app.job.JobScheduler} fully encapsulating the 3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * parameters required to schedule work against the calling application. These are constructed 333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * using the {@link JobInfo.Builder}. 343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * You must specify at least one sort of constraint on the JobInfo object that you are creating. 357562408b2261d38415453378b6188f74fda99d88Mathias Agopian * The goal here is to provide the scheduler with high-level semantics about the work you want to 3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * accomplish. Doing otherwise with throw an exception in your app. 372db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber */ 382db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huberpublic class JobInfo implements Parcelable { 392db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber private static String TAG = "JobInfo"; 4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** Default. */ 4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static final int NETWORK_TYPE_NONE = 0; 4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** This job requires network connectivity. */ 4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static final int NETWORK_TYPE_ANY = 1; 4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** This job requires network connectivity that is unmetered. */ 4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static final int NETWORK_TYPE_UNMETERED = 2; 4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Amount of backoff a job has initially by default, in milliseconds. 4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static final long DEFAULT_INITIAL_BACKOFF_MILLIS = 30000L; // 30 seconds. 5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Maximum backoff we allow for a job, in milliseconds. 5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static final long MAX_BACKOFF_DELAY_MILLIS = 5 * 60 * 60 * 1000; // 5 hours. 5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 571af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams /** 58a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent * Linearly back-off a failed job. See 598c563ed9ca8a863a66965330b5d14bb4b4ab59d4Eric Laurent * {@link android.app.job.JobInfo.Builder#setBackoffCriteria(long, int)} 6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * retry_time(current_time, num_failures) = 6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * current_time + initial_backoff_millis * num_failures, num_failures >= 1 6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static final int BACKOFF_POLICY_LINEAR = 0; 6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Exponentially back-off a failed job. See 6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * {@link android.app.job.JobInfo.Builder#setBackoffCriteria(long, int)} 6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * retry_time(current_time, num_failures) = 7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * current_time + initial_backoff_millis * 2 ^ (num_failures - 1), num_failures >= 1 7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static final int BACKOFF_POLICY_EXPONENTIAL = 1; 7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /* Minimum interval for a periodic job, in milliseconds. */ 7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static final long MIN_PERIOD_MILLIS = 60 * 60 * 1000L; // 60 minutes 7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /* Minimum flex for a periodic job, in milliseconds. */ 7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static final long MIN_FLEX_MILLIS = 5 * 60 * 1000L; // 5 minutes 7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Default type of backoff. 8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @hide 8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static final int DEFAULT_BACKOFF_POLICY = BACKOFF_POLICY_EXPONENTIAL; 8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final int jobId; 8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final PersistableBundle extras; 8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final ComponentName service; 8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final boolean requireCharging; 8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final boolean requireDeviceIdle; 9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final TriggerContentUri[] triggerContentUris; 9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final boolean hasEarlyConstraint; 9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final boolean hasLateConstraint; 9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final int networkType; 9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final long minLatencyMillis; 9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final long maxExecutionDelayMillis; 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final boolean isPeriodic; 9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final boolean isPersisted; 9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final long intervalMillis; 9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final long flexMillis; 10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final long initialBackoffMillis; 10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final int backoffPolicy; 10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final int priority; 10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unique job id associated with this class. This is assigned to your job by the scheduler. 10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public int getId() { 10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return jobId; 10983ff1438d2d1d5dbf39ca5e6f2e4fa1799e7ba80Marco Nelissen } 11083ff1438d2d1d5dbf39ca5e6f2e4fa1799e7ba80Marco Nelissen 11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Bundle of extras which are returned to your application at execution time. 11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public PersistableBundle getExtras() { 11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return extras; 11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Name of the service endpoint that will be called back into by the JobScheduler. 12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public ComponentName getService() { 12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return service; 12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** @hide */ 12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public int getPriority() { 12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return priority; 12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Whether this job needs the device to be plugged in. 13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 1332db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber public boolean isRequireCharging() { 1342db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber return requireCharging; 13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Whether this job needs the device to be in an Idle maintenance window. 13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public boolean isRequireDeviceIdle() { 1412db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber return requireDeviceIdle; 142a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent } 14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Which content: URIs must change for the job to be scheduled. Returns null 14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * if there are none required. 14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project @Nullable 14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public TriggerContentUri[] getTriggerContentUris() { 15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return triggerContentUris; 15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * One of {@link android.app.job.JobInfo#NETWORK_TYPE_ANY}, 155a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent * {@link android.app.job.JobInfo#NETWORK_TYPE_NONE}, or 15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * {@link android.app.job.JobInfo#NETWORK_TYPE_UNMETERED}. 15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public int getNetworkType() { 15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return networkType; 16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 1611d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania 1621d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania /** 1631d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania * Set for a job that does not recur periodically, to specify a delay after which the job 1644023493a827bc9751d8e40795516d0d536a53348Nicolas Catania * will be eligible for execution. This value is not set if the job recurs periodically. 1654023493a827bc9751d8e40795516d0d536a53348Nicolas Catania */ 1664023493a827bc9751d8e40795516d0d536a53348Nicolas Catania public long getMinLatencyMillis() { 1674023493a827bc9751d8e40795516d0d536a53348Nicolas Catania return minLatencyMillis; 1681d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania } 1691d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania 1701d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania /** 1711d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania * See {@link Builder#setOverrideDeadline(long)}. This value is not set if the job recurs 1721d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania * periodically. 1731d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania */ 1741d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania public long getMaxExecutionDelayMillis() { 175a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return maxExecutionDelayMillis; 176a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 177a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania 1788e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania /** 1798e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania * Track whether this job will repeat with a given period. 180a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania */ 181a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania public boolean isPeriodic() { 182a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania return isPeriodic; 183a7e0e8b4c429fc68eb1bd5b5a30f5b91352288f9Nicolas Catania } 1841d187f1a86855f5f0694d7ec30efc9833bf7c589Nicolas Catania 1858e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania /** 1868e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania * @return Whether or not this job should be persisted across device reboots. 1878e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania */ 1888e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania public boolean isPersisted() { 1898e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania return isPersisted; 1908e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania } 1918e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania 1928e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania /** 1938e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania * Set to the interval between occurrences of this job. This value is <b>not</b> set if the 1948e1b6cce24574b9ecd5b0300155776bd0b4ef756Nicolas Catania * job does not recur periodically. 19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public long getIntervalMillis() { 19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return intervalMillis >= MIN_PERIOD_MILLIS ? intervalMillis : MIN_PERIOD_MILLIS; 19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2005daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber /** 2015daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber * Flex time for this job. Only valid if this is a periodic job. 20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public long getFlexMillis() { 2041173118eace0e9e347cb007f0da817cee87579edGlenn Kasten long interval = getIntervalMillis(); 2051173118eace0e9e347cb007f0da817cee87579edGlenn Kasten long percentClamp = 5 * interval / 100; 2061173118eace0e9e347cb007f0da817cee87579edGlenn Kasten long clampedFlex = Math.max(flexMillis, Math.max(percentClamp, MIN_FLEX_MILLIS)); 2071173118eace0e9e347cb007f0da817cee87579edGlenn Kasten return clampedFlex <= interval ? clampedFlex : interval; 2081173118eace0e9e347cb007f0da817cee87579edGlenn Kasten } 2091173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 2101173118eace0e9e347cb007f0da817cee87579edGlenn Kasten /** 2111173118eace0e9e347cb007f0da817cee87579edGlenn Kasten * The amount of time the JobScheduler will wait before rescheduling a failed job. This value 2121173118eace0e9e347cb007f0da817cee87579edGlenn Kasten * will be increased depending on the backoff policy specified at job creation time. Defaults 2131173118eace0e9e347cb007f0da817cee87579edGlenn Kasten * to 5 seconds. 21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public long getInitialBackoffMillis() { 21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return initialBackoffMillis; 21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * One of either {@link android.app.job.JobInfo#BACKOFF_POLICY_EXPONENTIAL}, or 22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * {@link android.app.job.JobInfo#BACKOFF_POLICY_LINEAR}, depending on which criteria you set 22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * when creating this job. 22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public int getBackoffPolicy() { 22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return backoffPolicy; 22665e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project } 22765e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project 22865e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project /** 22965e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project * User can specify an early constraint of 0L, which is valid, so we keep track of whether the 23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * function was called at all. 23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @hide 23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public boolean hasEarlyConstraint() { 2341af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams return hasEarlyConstraint; 2351af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams } 2361af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams 2371af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams /** 2381af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams * User can specify a late constraint of 0L, which is valid, so we keep track of whether the 23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * function was called at all. 24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @hide 2411af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams */ 2421af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams public boolean hasLateConstraint() { 2431af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams return hasLateConstraint; 2441af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams } 24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private JobInfo(Parcel in) { 24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project jobId = in.readInt(); 24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project extras = in.readPersistableBundle(); 24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project service = in.readParcelable(null); 25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project requireCharging = in.readInt() == 1; 2511af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams requireDeviceIdle = in.readInt() == 1; 25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project triggerContentUris = in.createTypedArray(TriggerContentUri.CREATOR); 25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project networkType = in.readInt(); 25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project minLatencyMillis = in.readLong(); 25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project maxExecutionDelayMillis = in.readLong(); 25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project isPeriodic = in.readInt() == 1; 25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project isPersisted = in.readInt() == 1; 25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project intervalMillis = in.readLong(); 25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project flexMillis = in.readLong(); 26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project initialBackoffMillis = in.readLong(); 26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project backoffPolicy = in.readInt(); 26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project hasEarlyConstraint = in.readInt() == 1; 26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project hasLateConstraint = in.readInt() == 1; 26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project priority = in.readInt(); 26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private JobInfo(JobInfo.Builder b) { 26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project jobId = b.mJobId; 26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project extras = b.mExtras; 27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project service = b.mJobService; 27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project requireCharging = b.mRequiresCharging; 2722beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent requireDeviceIdle = b.mRequiresDeviceIdle; 27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project triggerContentUris = b.mTriggerContentUris != null 27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ? b.mTriggerContentUris.toArray(new TriggerContentUri[b.mTriggerContentUris.size()]) 27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project : null; 27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project networkType = b.mNetworkType; 27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project minLatencyMillis = b.mMinLatencyMillis; 27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project maxExecutionDelayMillis = b.mMaxExecutionDelayMillis; 27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project isPeriodic = b.mIsPeriodic; 28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project isPersisted = b.mIsPersisted; 28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project intervalMillis = b.mIntervalMillis; 28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project flexMillis = b.mFlexMillis; 28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project initialBackoffMillis = b.mInitialBackoffMillis; 28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project backoffPolicy = b.mBackoffPolicy; 28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project hasEarlyConstraint = b.mHasEarlyConstraint; 28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project hasLateConstraint = b.mHasLateConstraint; 28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project priority = b.mPriority; 28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project @Override 29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public int describeContents() { 29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return 0; 29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project @Override 29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeInt(jobId); 29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writePersistableBundle(extras); 29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeParcelable(service, flags); 30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeInt(requireCharging ? 1 : 0); 30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeInt(requireDeviceIdle ? 1 : 0); 30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeTypedArray(triggerContentUris, flags); 30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeInt(networkType); 30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeLong(minLatencyMillis); 30589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeLong(maxExecutionDelayMillis); 30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeInt(isPeriodic ? 1 : 0); 30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeInt(isPersisted ? 1 : 0); 30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeLong(intervalMillis); 30989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeLong(flexMillis); 31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeLong(initialBackoffMillis); 311698f476590bc9e38d4d1d4155da9efdbedd357c4Marco Nelissen out.writeInt(backoffPolicy); 31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeInt(hasEarlyConstraint ? 1 : 0); 31389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeInt(hasLateConstraint ? 1 : 0); 31489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeInt(priority); 31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static final Creator<JobInfo> CREATOR = new Creator<JobInfo>() { 31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project @Override 31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public JobInfo createFromParcel(Parcel in) { 32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return new JobInfo(in); 32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project @Override 32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public JobInfo[] newArray(int size) { 32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return new JobInfo[size]; 32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 32789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project }; 32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 32989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project @Override 33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public String toString() { 33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return "(job:" + jobId + "/" + service.flattenToShortString() + ")"; 33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 33389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Information about a content URI modification that a job would like to 33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * trigger on. 33789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static final class TriggerContentUri implements Parcelable { 33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final Uri mUri; 34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private final int mFlags; 34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 34389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Flag for trigger: also trigger if any descendants of the given URI change. 34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Corresponds to the <var>notifyForDescendants</var> of 34589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * {@link android.content.ContentResolver#registerContentObserver}. 34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 34789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static final int FLAG_NOTIFY_FOR_DESCENDANTS = 1<<0; 34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 35089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Create a new trigger description. 35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @param uri The URI to observe. Must be non-null. 35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @param flags Optional flags for the observer, either 0 or 35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * {@link #FLAG_NOTIFY_FOR_DESCENDANTS}. 35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public TriggerContentUri(@NonNull Uri uri, int flags) { 35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mUri = uri; 35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mFlags = flags; 35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Return the Uri this trigger was created for. 36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 36389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public Uri getUri() { 36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mUri; 36589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Return the flags supplied for the trigger. 36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public int getFlags() { 37189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mFlags; 37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private TriggerContentUri(Parcel in) { 37589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mUri = Uri.CREATOR.createFromParcel(in); 37689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mFlags = in.readInt(); 37789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 37989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project @Override 38089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public int describeContents() { 38189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return 0; 38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project @Override 38589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 38689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mUri.writeToParcel(out, flags); 38789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project out.writeInt(mFlags); 38889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 39089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static final Creator<TriggerContentUri> CREATOR = new Creator<TriggerContentUri>() { 39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project @Override 39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public TriggerContentUri createFromParcel(Parcel in) { 39389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return new TriggerContentUri(in); 39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 39589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project @Override 39789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public TriggerContentUri[] newArray(int size) { 39889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return new TriggerContentUri[size]; 39989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 40089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project }; 40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 40389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** Builder class for constructing {@link JobInfo} objects. */ 40489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public static final class Builder { 40589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private int mJobId; 40689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private PersistableBundle mExtras = PersistableBundle.EMPTY; 40789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private ComponentName mJobService; 40889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private int mPriority; 40989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Requirements. 41089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private boolean mRequiresCharging; 41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private boolean mRequiresDeviceIdle; 41289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private int mNetworkType; 41389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private ArrayList<TriggerContentUri> mTriggerContentUris; 41489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private boolean mIsPersisted; 41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // One-off parameters. 41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private long mMinLatencyMillis; 41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private long mMaxExecutionDelayMillis; 41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Periodic parameters. 41989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private boolean mIsPeriodic; 42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private boolean mHasEarlyConstraint; 42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private boolean mHasLateConstraint; 42289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private long mIntervalMillis; 42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private long mFlexMillis; 42489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Back-off parameters. 42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private long mInitialBackoffMillis = DEFAULT_INITIAL_BACKOFF_MILLIS; 42689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private int mBackoffPolicy = DEFAULT_BACKOFF_POLICY; 4275cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber /** Easy way to track whether the client has tried to set a back-off policy. */ 42889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project private boolean mBackoffPolicySet = false; 4295cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber 4305cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber /** 4315cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber * @param jobId Application-provided id for this job. Subsequent calls to cancel, or 4325cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber * jobs created with the same jobId, will update the pre-existing job with 43389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * the same id. 43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @param jobService The endpoint that you implement that will receive the callback from the 43589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * JobScheduler. 43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 43789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public Builder(int jobId, ComponentName jobService) { 43889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mJobService = jobService; 43989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mJobId = jobId; 44089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 44189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 44289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 44389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @hide 44489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 44589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public Builder setPriority(int priority) { 44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mPriority = priority; 44789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return this; 44889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 44989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 450a1680bce73ea1b051cc92e0df651a53944b104eeJames Dong /** 451a1680bce73ea1b051cc92e0df651a53944b104eeJames Dong * Set optional extras. This is persisted, so we only allow primitive types. 452a1680bce73ea1b051cc92e0df651a53944b104eeJames Dong * @param extras Bundle containing extras you want the scheduler to hold on to for you. 45389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 45489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public Builder setExtras(PersistableBundle extras) { 45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mExtras = extras; 45689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return this; 45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 45889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 45989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 46089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Set some description of the kind of network type your job needs to have. 46189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Not calling this function means the network is not necessary, as the default is 46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * {@link #NETWORK_TYPE_NONE}. 46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Bear in mind that calling this function defines network as a strict requirement for your 46489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * job. If the network requested is not available your job will never run. See 46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * {@link #setOverrideDeadline(long)} to change this behaviour. 46689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 46789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public Builder setRequiredNetworkType(int networkType) { 46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mNetworkType = networkType; 46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return this; 47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 47189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 47289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 47389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Specify that to run this job, the device needs to be plugged in. This defaults to 47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * false. 47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @param requiresCharging Whether or not the device is plugged in. 47689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 47789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public Builder setRequiresCharging(boolean requiresCharging) { 47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mRequiresCharging = requiresCharging; 47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return this; 48089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 48189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 48289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Specify that to run, the job needs the device to be in idle mode. This defaults to 48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * false. 48589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * <p>Idle mode is a loose definition provided by the system, which means that the device 48689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * is not in use, and has not been in use for some time. As such, it is a good time to 48789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * perform resource heavy jobs. Bear in mind that battery usage will still be attributed 48889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * to your application, and surfaced to the user in battery stats.</p> 48989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @param requiresDeviceIdle Whether or not the device need be within an idle maintenance 49089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * window. 49189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public Builder setRequiresDeviceIdle(boolean requiresDeviceIdle) { 49389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mRequiresDeviceIdle = requiresDeviceIdle; 49489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return this; 49589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 49689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 49889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Add a new content: URI that will be monitored with a 49989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * {@link android.database.ContentObserver}, and will cause the job to execute if changed. 50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * If you have any trigger content URIs associated with a job, it will not execute until 50189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * there has been a change report for one or more of them. 50289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * <p>Note that trigger URIs can not be used in combination with 50389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * {@link #setPeriodic(long)} or {@link #setPersisted(boolean)}. To continually monitor 50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * for content changes, you need to schedule a new JobInfo observing the same URIs 50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * before you finish execution of the JobService handling the most recent changes.</p> 50689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @param uri The content: URI to monitor. 50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 508a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent public Builder addTriggerContentUri(@NonNull TriggerContentUri uri) { 509a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent if (mTriggerContentUris == null) { 510a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent mTriggerContentUris = new ArrayList<>(); 511a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent } 512a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent mTriggerContentUris.add(uri); 513a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent return this; 514a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent } 515a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent 516a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent /** 517a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent * Specify that this job should recur with the provided interval, not more than once per 518a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent * period. You have no control over when within this interval this job will be executed, 519a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent * only the guarantee that it will be executed at most once within this interval. 520a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent * Setting this function on the builder with {@link #setMinimumLatency(long)} or 521a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent * {@link #setOverrideDeadline(long)} will result in an error. 522a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent * @param intervalMillis Millisecond interval for which this job will repeat. 523a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent */ 524a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent public Builder setPeriodic(long intervalMillis) { 525a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent return setPeriodic(intervalMillis, intervalMillis); 526a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent } 527a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent 528a514bdb58b5de4986679f72b7204b4764f7a2778Eric Laurent /** 5292beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent * Specify that this job should recur with the provided interval and flex. The job can 5302beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent * execute at any time in a window of flex length at the end of the period. 5312beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent * @param intervalMillis Millisecond interval for which this job will repeat. A minimum 5322beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent * value of {@link #MIN_PERIOD_MILLIS} is enforced. 5332beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent * @param flexMillis Millisecond flex for this job. Flex is clamped to be at least 5342beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent * {@link #MIN_FLEX_MILLIS} or 5 percent of the period, whichever is 5352beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent * higher. 5362beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent */ 5372beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent public Builder setPeriodic(long intervalMillis, long flexMillis) { 5382beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent mIsPeriodic = true; 5392beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent mIntervalMillis = intervalMillis; 5402beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent mFlexMillis = flexMillis; 5412beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent mHasEarlyConstraint = mHasLateConstraint = true; 5422beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent return this; 5432beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent } 5442beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent 5452beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent /** 5462beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent * Specify that this job should be delayed by the provided amount of time. 5472beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent * Because it doesn't make sense setting this property on a periodic job, doing so will 5482beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent * throw an {@link java.lang.IllegalArgumentException} when 5492beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent * {@link android.app.job.JobInfo.Builder#build()} is called. 5502beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent * @param minLatencyMillis Milliseconds before which this job will not be considered for 5512beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent * execution. 5522beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent */ 5532beeb50b1bba9e92f6cacfeca37fe9fa9d36ead1Eric Laurent public Builder setMinimumLatency(long minLatencyMillis) { 55489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mMinLatencyMillis = minLatencyMillis; 55589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mHasEarlyConstraint = true; 55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return this; 55789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 5581af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams 55989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 56089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Set deadline which is the maximum scheduling latency. The job will be run by this 56189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * deadline even if other requirements are not met. Because it doesn't make sense setting 56289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * this property on a periodic job, doing so will throw an 563660951867e959ebe98612742ef1f72d33ea7e9a3Nicolas Catania * {@link java.lang.IllegalArgumentException} when 5641af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams * {@link android.app.job.JobInfo.Builder#build()} is called. 5655cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber */ 5665cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber public Builder setOverrideDeadline(long maxExecutionDelayMillis) { 5675cb07aa071b43a214e4c880b3b7852714e06451bAndreas Huber mMaxExecutionDelayMillis = maxExecutionDelayMillis; 5681af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams mHasLateConstraint = true; 5691af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams return this; 5701af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams } 571660951867e959ebe98612742ef1f72d33ea7e9a3Nicolas Catania 5721af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams /** 5733b26844e60f8487388e7e62709faf0dada86e7e1Eric Laurent * Set up the back-off/retry policy. 5743b26844e60f8487388e7e62709faf0dada86e7e1Eric Laurent * This defaults to some respectable values: {30 seconds, Exponential}. We cap back-off at 57589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 5hrs. 5761af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams * Note that trying to set a backoff criteria for a job with 57789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * {@link #setRequiresDeviceIdle(boolean)} will throw an exception when you call build(). 57889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * This is because back-off typically does not make sense for these types of jobs. See 57989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * {@link android.app.job.JobService#jobFinished(android.app.job.JobParameters, boolean)} 58089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * for more description of the return value for the case of a job executing while in idle 58189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * mode. 58289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @param initialBackoffMillis Millisecond time interval to wait initially when job has 58389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * failed. 58489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @param backoffPolicy is one of {@link #BACKOFF_POLICY_LINEAR} or 58589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * {@link #BACKOFF_POLICY_EXPONENTIAL} 58689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 58789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public Builder setBackoffCriteria(long initialBackoffMillis, int backoffPolicy) { 58889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mBackoffPolicySet = true; 58989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mInitialBackoffMillis = initialBackoffMillis; 59089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mBackoffPolicy = backoffPolicy; 59189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return this; 59289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 59389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 59489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 5951c1503cf47c0a37a30e7acac2c5d29140fc61a5fMarco Nelissen * Set whether or not to persist this job across device reboots. This will only have an 5961c1503cf47c0a37a30e7acac2c5d29140fc61a5fMarco Nelissen * effect if your application holds the permission 5971c1503cf47c0a37a30e7acac2c5d29140fc61a5fMarco Nelissen * {@link android.Manifest.permission#RECEIVE_BOOT_COMPLETED}. Otherwise an exception will 59889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * be thrown. 59989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @param isPersisted True to indicate that the job will be written to disk and loaded at 60089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * boot. 60189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 60289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public Builder setPersisted(boolean isPersisted) { 60365e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project mIsPersisted = isPersisted; 60465e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project return this; 60565e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project } 60689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 60789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /** 60889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * @return The job object to hand to the JobScheduler. This object is immutable. 60989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 61089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project public JobInfo build() { 61189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Allow jobs with no constraints - What am I, a database? 61289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!mHasEarlyConstraint && !mHasLateConstraint && !mRequiresCharging && 61389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project !mRequiresDeviceIdle && mNetworkType == NETWORK_TYPE_NONE && 61489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTriggerContentUris == null) { 61589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project throw new IllegalArgumentException("You're trying to build a job with no " + 61689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project "constraints, this is not allowed."); 61765e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project } 61865e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project mExtras = new PersistableBundle(mExtras); // Make our own copy. 61965e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project // Check that a deadline was not set on a periodic job. 620145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber if (mIsPeriodic && (mMaxExecutionDelayMillis != 0L)) { 621145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber throw new IllegalArgumentException("Can't call setOverrideDeadline() on a " + 622145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber "periodic job."); 62365e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project } 62489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mIsPeriodic && (mMinLatencyMillis != 0L)) { 62589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project throw new IllegalArgumentException("Can't call setMinimumLatency() on a " + 62689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project "periodic job"); 62789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 62889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mIsPeriodic && (mTriggerContentUris != null)) { 62989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project throw new IllegalArgumentException("Can't call addTriggerContentUri() on a " + 63089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project "periodic job"); 63189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 63289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mIsPersisted && (mTriggerContentUris != null)) { 63389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project throw new IllegalArgumentException("Can't call addTriggerContentUri() on a " + 63489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project "persisted job"); 63589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 63689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mBackoffPolicySet && mRequiresDeviceIdle) { 63789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project throw new IllegalArgumentException("An idle mode job will not respect any" + 63889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project " back-off policy, so calling setBackoffCriteria with" + 63989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project " setRequiresDeviceIdle is an error."); 64089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 64189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project JobInfo job = new JobInfo(this); 64289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (job.intervalMillis != job.getIntervalMillis()) { 64389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Log.w(TAG, "Specified interval is less than minimum interval. Clamped to " 64489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project + job.getIntervalMillis()); 64589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 64689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (job.flexMillis != job.getFlexMillis()) { 64789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Log.w(TAG, "Specified flex is less than minimum flex. Clamped to " 64889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project + job.getFlexMillis()); 64989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 6501af452f333664e8b0a61d96a9b3bb682d8b9a00fJason Sams return job; 65189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 65289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 65389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 65489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 65589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project