1c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria/*
2564e43098c323d1a90be53c190b8fdbdde973505Sumir Kataria * Copyright 2018 The Android Open Source Project
3c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria *
4c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * Licensed under the Apache License, Version 2.0 (the "License");
5c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * you may not use this file except in compliance with the License.
6c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * You may obtain a copy of the License at
7c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria *
8c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria *      http://www.apache.org/licenses/LICENSE-2.0
9c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria *
10c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * Unless required by applicable law or agreed to in writing, software
11c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * distributed under the License is distributed on an "AS IS" BASIS,
12c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * See the License for the specific language governing permissions and
14c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * limitations under the License.
15c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria */
16564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariapackage androidx.work;
17c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria
181cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Katariaimport android.support.annotation.NonNull;
1911c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Katariaimport android.support.annotation.RequiresApi;
207031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumarimport android.support.annotation.RestrictTo;
217031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumarimport android.support.annotation.VisibleForTesting;
227031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
237031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumarimport androidx.work.impl.model.WorkSpec;
24035f7b94b88f82d259c68938b9f07e5aeddfe057Rahul Ravikumar
2511c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Katariaimport java.time.Duration;
267031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumarimport java.util.HashSet;
277031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumarimport java.util.Set;
287031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumarimport java.util.UUID;
29f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Katariaimport java.util.concurrent.TimeUnit;
306d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria
31c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria/**
327031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * The base interface for work requests.
33c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria */
34c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria
357031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumarpublic abstract class WorkRequest {
361cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria
371cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria    /**
38960d12bd2332b73d49adbd6fdcbb767abf3f461cSumir Kataria     * The default initial backoff time (in milliseconds) for work that has to be retried.
397031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     */
407031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    public static final long DEFAULT_BACKOFF_DELAY_MILLIS = 30000L;
417031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
427031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    /**
43960d12bd2332b73d49adbd6fdcbb767abf3f461cSumir Kataria     * The maximum backoff time (in milliseconds) for work that has to be retried.
447031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     */
457031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    public static final long MAX_BACKOFF_MILLIS = 5 * 60 * 60 * 1000; // 5 hours.
467031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
477031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    /**
48960d12bd2332b73d49adbd6fdcbb767abf3f461cSumir Kataria     * The minimum backoff time for work (in milliseconds) that has to be retried.
496d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria     */
507031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    public static final long MIN_BACKOFF_MILLIS = 10 * 1000; // 10 seconds.
517031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
52fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    private @NonNull UUID mId;
53fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    private @NonNull WorkSpec mWorkSpec;
54fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    private @NonNull Set<String> mTags;
557031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
5697c46766591189e7ce62706ce9614ebce99a222dSumir Kataria    /**
5797c46766591189e7ce62706ce9614ebce99a222dSumir Kataria     * @hide
5897c46766591189e7ce62706ce9614ebce99a222dSumir Kataria     */
5997c46766591189e7ce62706ce9614ebce99a222dSumir Kataria    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
60fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    protected WorkRequest(@NonNull UUID id, @NonNull WorkSpec workSpec, @NonNull Set<String> tags) {
61fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria        mId = id;
627031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        mWorkSpec = workSpec;
637031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        mTags = tags;
646d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria    }
656d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria
666d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria    /**
677031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * Gets the unique identifier associated with this unit of work.
686d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria     *
697031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * @return The identifier for this unit of work
706d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria     */
71fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    public UUID getId() {
72fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria        return mId;
73fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    }
74fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria
75fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    /**
76fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria     * Gets the string for the unique identifier associated with this unit of work.
77fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria     *
78fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria     * @return The string identifier for this unit of work
79fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria     * @hide
80fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria     */
81fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
82fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    public String getStringId() {
83fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria        return mId.toString();
846d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria    }
856d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria
867031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    /**
877031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * Gets the {@link WorkSpec} associated with this unit of work.
887031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     *
897031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * @return The {@link WorkSpec} for this unit of work
907031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * @hide
917031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     */
927031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
937031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    public WorkSpec getWorkSpec() {
947031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        return mWorkSpec;
957031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    }
9631099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria
977031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    /**
987031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * Gets the tags associated with this unit of work.
997031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     *
1007031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * @return The tags for this unit of work
1017031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * @hide
1027031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     */
1037031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
1047031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    public Set<String> getTags() {
1057031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        return mTags;
10631099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    }
10731099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria
1086d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria    /**
1097031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * A builder for {@link WorkRequest}.
1107031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     *
1117031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * @param <B> The concrete implementation of of this Builder
1127031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * @param <W> The type of work object built by this Builder
113c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria     */
1147031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    public abstract static class Builder<B extends Builder, W extends WorkRequest> {
1157031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
116fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria        boolean mBackoffCriteriaSet = false;
117fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria        UUID mId;
118fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria        WorkSpec mWorkSpec;
119fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria        Set<String> mTags = new HashSet<>();
120c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria
12186894df5599526eb983c484ce185ad27ee8e0398Sumir Kataria        public Builder(@NonNull Class<? extends Worker> workerClass) {
122fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria            mId = UUID.randomUUID();
123fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria            mWorkSpec = new WorkSpec(mId.toString(), workerClass.getName());
1248dfe54b350e7f8ec3f79c0952460f9f82622d801Sumir Kataria            addTag(workerClass.getName());
1257031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        }
1267031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
1277031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        /**
1287031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Change backoff policy and delay for the work.  The default is
1297031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * {@link BackoffPolicy#EXPONENTIAL} and
1307031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * {@value WorkRequest#DEFAULT_BACKOFF_DELAY_MILLIS}.  The maximum backoff delay
1317031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * duration is {@value WorkRequest#MAX_BACKOFF_MILLIS}.
1327031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
1337031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param backoffPolicy The {@link BackoffPolicy} to use for work
1347031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param backoffDelay Time to wait before restarting {@link Worker} in {@code timeUnit}
1357031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *                     units
1367031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param timeUnit The {@link TimeUnit} for {@code backoffDelay}
1377031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @return The current {@link Builder}
1387031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         */
13962a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria        public B setBackoffCriteria(
1407031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar                @NonNull BackoffPolicy backoffPolicy,
1417031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar                long backoffDelay,
1427031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar                @NonNull TimeUnit timeUnit) {
1437031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mBackoffCriteriaSet = true;
1447031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.backoffPolicy = backoffPolicy;
1457031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.setBackoffDelayDuration(timeUnit.toMillis(backoffDelay));
1467031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
1477031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        }
1487031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
1497031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        /**
1507031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Add constraints to the {@link OneTimeWorkRequest}.
1517031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
1527031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param constraints The constraints for the work
1537031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @return The current {@link Builder}
1547031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         */
15562a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria        public B setConstraints(@NonNull Constraints constraints) {
1567031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.constraints = constraints;
1577031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
158367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar        }
159367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar
1608b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        /**
1617031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Add input {@link Data} to the work.
1628b3284fa4a62568df91f706b0b2334284794008fSumir Kataria         *
1637031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param inputData key/value pairs that will be provided to the {@link Worker} class
1648b3284fa4a62568df91f706b0b2334284794008fSumir Kataria         * @return The current {@link Builder}
1658b3284fa4a62568df91f706b0b2334284794008fSumir Kataria         */
16662a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria        public B setInputData(@NonNull Data inputData) {
1677031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.input = inputData;
1687031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
1693d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria        }
1703d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria
1718b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        /**
1727031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Add an optional tag for the work.  This is particularly useful for modules or
1737031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * libraries who want to query for or cancel all of their own work.
1748b3284fa4a62568df91f706b0b2334284794008fSumir Kataria         *
1757031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param tag A tag for identifying the work in queries.
1768b3284fa4a62568df91f706b0b2334284794008fSumir Kataria         * @return The current {@link Builder}
1778b3284fa4a62568df91f706b0b2334284794008fSumir Kataria         */
1787031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        public B addTag(@NonNull String tag) {
1797031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mTags.add(tag);
1807031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
18113915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria        }
18213915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria
1837031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        /**
1847031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Specifies that the results of this work should be kept for at least the specified amount
1857031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * of time.  After this time has elapsed, the results may be pruned at the discretion of
1867031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * WorkManager when there are no pending dependent jobs.
1877031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
1887031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * When the results of a work are pruned, it becomes impossible to query for its
1897031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * {@link WorkStatus}.
1907031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
1917031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Specifying a long duration here may adversely affect performance in terms of app storage
1927031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * and database query time.
1937031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
1947031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param duration The minimum duration of time (in {@code timeUnit} units) to keep the
1957031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *                 results of this work
1967031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param timeUnit The unit of time for {@code duration}
1977031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @return The current {@link Builder}
1987031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         */
1997031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        public B keepResultsForAtLeast(long duration, @NonNull TimeUnit timeUnit) {
2007031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.minimumRetentionDuration = timeUnit.toMillis(duration);
2017031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
2027031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        }
20313915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria
2047031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        /**
20511c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria         * Specifies that the results of this work should be kept for at least the specified amount
20611c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria         * of time.  After this time has elapsed, the results may be pruned at the discretion of
20711c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria         * WorkManager when there are no pending dependent jobs.
20811c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria         *
20911c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria         * When the results of a work are pruned, it becomes impossible to query for its
21011c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria         * {@link WorkStatus}.
21111c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria         *
21211c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria         * Specifying a long duration here may adversely affect performance in terms of app storage
21311c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria         * and database query time.
21411c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria         *
21511c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria         * @param duration The minimum duration of time to keep the results of this work
21611c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria         * @return The current {@link Builder}
21711c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria         */
21811c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria        @RequiresApi(26)
21911c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria        public B keepResultsForAtLeast(@NonNull Duration duration) {
22011c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria            mWorkSpec.minimumRetentionDuration = duration.toMillis();
22111c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria            return getThis();
22211c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria        }
22311c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria
22411c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria        /**
2257031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Builds this work object.
2267031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
2277031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @return The concrete implementation of the work associated with this builder
2287031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         */
2297031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        public abstract W build();
2307031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
23162a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria        abstract B getThis();
2327031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
2337031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        /**
2347031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Set the initial state for this work.  Used in testing only.
2357031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
2367031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param state The {@link State} to set
2377031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @return The current {@link Builder}
2387031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @hide
2397031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         */
2407031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
2417031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        @VisibleForTesting
24262a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria        public B setInitialState(@NonNull State state) {
2437031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.state = state;
2447031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
24513915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria        }
2465ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria
2477031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        /**
2487031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Set the initial run attempt count for this work.  Used in testing only.
2497031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
2507031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param runAttemptCount The initial run attempt count
2517031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @return The current {@link Builder}
2527031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @hide
2537031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         */
2547031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
2557031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        @VisibleForTesting
25662a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria        public B setInitialRunAttemptCount(int runAttemptCount) {
2577031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.runAttemptCount = runAttemptCount;
2587031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
2597031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        }
2607031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
2617031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        /**
2627031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Set the period start time for this work. Used in testing only.
2637031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
2647031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param periodStartTime the period start time in {@code timeUnit} units
2657031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param timeUnit The {@link TimeUnit} for {@code periodStartTime}
2667031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @return The current {@link Builder}
2677031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @hide
2687031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         */
2697031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
2707031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        @VisibleForTesting
27162a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria        public B setPeriodStartTime(long periodStartTime, @NonNull TimeUnit timeUnit) {
2727031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.periodStartTime = timeUnit.toMillis(periodStartTime);
2737031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
2747031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        }
2757031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
2767031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        /**
2777031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Set when the scheduler actually schedules the worker.
2787031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
2797031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param scheduleRequestedAt The time at which the scheduler scheduled a worker.
2807031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param timeUnit            The {@link TimeUnit} for {@code scheduleRequestedAt}
2817031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @return The current {@link Builder}
2827031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @hide
2837031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         */
2847031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
2857031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        @VisibleForTesting
28662a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria        public B setScheduleRequestedAt(
2877031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar                long scheduleRequestedAt,
2887031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar                @NonNull TimeUnit timeUnit) {
2897031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.scheduleRequestedAt = timeUnit.toMillis(scheduleRequestedAt);
2907031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
2915ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        }
292c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria    }
293c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria}
294