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