WorkRequest.java revision 62a7e773945d980084dfc5d00c724de2e27dc22d
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;
197031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumarimport android.support.annotation.RestrictTo;
207031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumarimport android.support.annotation.VisibleForTesting;
217031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
227031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumarimport androidx.work.impl.model.WorkSpec;
23035f7b94b88f82d259c68938b9f07e5aeddfe057Rahul Ravikumar
247031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumarimport java.util.HashSet;
257031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumarimport java.util.Set;
267031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumarimport java.util.UUID;
27f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Katariaimport java.util.concurrent.TimeUnit;
286d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria
29c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria/**
307031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * The base interface for work requests.
31c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria */
32c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria
337031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumarpublic abstract class WorkRequest {
341cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria
351cd0e4eb391fb7e7d5ac60433f705496a9390384Sumir Kataria    /**
367031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * {@see https://android.googlesource.com/platform/frameworks/base/+/oreo-release/core/java/android/app/job/JobInfo.java#77}
377031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     */
387031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    public static final long DEFAULT_BACKOFF_DELAY_MILLIS = 30000L;
397031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
407031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    /**
417031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * {@see https://android.googlesource.com/platform/frameworks/base/+/oreo-release/core/java/android/app/job/JobInfo.java#82}
427031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     */
437031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    public static final long MAX_BACKOFF_MILLIS = 5 * 60 * 60 * 1000; // 5 hours.
447031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
457031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    /**
467031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * {@see https://android.googlesource.com/platform/frameworks/base/+/oreo-release/core/java/android/app/job/JobInfo.java#119}
476d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria     */
487031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    public static final long MIN_BACKOFF_MILLIS = 10 * 1000; // 10 seconds.
497031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
50fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    private @NonNull UUID mId;
51fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    private @NonNull WorkSpec mWorkSpec;
52fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    private @NonNull Set<String> mTags;
537031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
54fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    protected WorkRequest(@NonNull UUID id, @NonNull WorkSpec workSpec, @NonNull Set<String> tags) {
55fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria        mId = id;
567031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        mWorkSpec = workSpec;
577031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        mTags = tags;
586d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria    }
596d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria
606d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria    /**
617031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * Gets the unique identifier associated with this unit of work.
626d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria     *
637031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * @return The identifier for this unit of work
646d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria     */
65fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    public UUID getId() {
66fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria        return mId;
67fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    }
68fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria
69fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    /**
70fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria     * Gets the string for the unique identifier associated with this unit of work.
71fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria     *
72fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria     * @return The string identifier for this unit of work
73fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria     * @hide
74fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria     */
75fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
76fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria    public String getStringId() {
77fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria        return mId.toString();
786d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria    }
796d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria
807031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    /**
817031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * Gets the {@link WorkSpec} associated with this unit of work.
827031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     *
837031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * @return The {@link WorkSpec} for this unit of work
847031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * @hide
857031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     */
867031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
877031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    public WorkSpec getWorkSpec() {
887031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        return mWorkSpec;
897031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    }
9031099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria
917031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    /**
927031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * Gets the tags associated with this unit of work.
937031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     *
947031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * @return The tags for this unit of work
957031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * @hide
967031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     */
977031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
987031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    public Set<String> getTags() {
997031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        return mTags;
10031099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    }
10131099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria
1026d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria    /**
1037031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * A builder for {@link WorkRequest}.
1047031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     *
1057031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * @param <B> The concrete implementation of of this Builder
1067031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar     * @param <W> The type of work object built by this Builder
107c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria     */
1087031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar    public abstract static class Builder<B extends Builder, W extends WorkRequest> {
1097031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
110fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria        boolean mBackoffCriteriaSet = false;
111fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria        UUID mId;
112fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria        WorkSpec mWorkSpec;
113fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria        Set<String> mTags = new HashSet<>();
114c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria
11586894df5599526eb983c484ce185ad27ee8e0398Sumir Kataria        public Builder(@NonNull Class<? extends Worker> workerClass) {
116fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria            mId = UUID.randomUUID();
117fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria            mWorkSpec = new WorkSpec(mId.toString(), workerClass.getName());
1187031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        }
1197031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
1207031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        /**
1217031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Change backoff policy and delay for the work.  The default is
1227031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * {@link BackoffPolicy#EXPONENTIAL} and
1237031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * {@value WorkRequest#DEFAULT_BACKOFF_DELAY_MILLIS}.  The maximum backoff delay
1247031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * duration is {@value WorkRequest#MAX_BACKOFF_MILLIS}.
1257031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
1267031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param backoffPolicy The {@link BackoffPolicy} to use for work
1277031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param backoffDelay Time to wait before restarting {@link Worker} in {@code timeUnit}
1287031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *                     units
1297031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param timeUnit The {@link TimeUnit} for {@code backoffDelay}
1307031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @return The current {@link Builder}
1317031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         */
13262a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria        public B setBackoffCriteria(
1337031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar                @NonNull BackoffPolicy backoffPolicy,
1347031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar                long backoffDelay,
1357031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar                @NonNull TimeUnit timeUnit) {
1367031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mBackoffCriteriaSet = true;
1377031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.backoffPolicy = backoffPolicy;
1387031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.setBackoffDelayDuration(timeUnit.toMillis(backoffDelay));
1397031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
1407031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        }
1417031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
1427031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        /**
1437031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Add constraints to the {@link OneTimeWorkRequest}.
1447031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
1457031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param constraints The constraints for the work
1467031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @return The current {@link Builder}
1477031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         */
14862a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria        public B setConstraints(@NonNull Constraints constraints) {
1497031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.constraints = constraints;
1507031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
151367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar        }
152367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar
1538b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        /**
1547031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Add input {@link Data} to the work.
1558b3284fa4a62568df91f706b0b2334284794008fSumir Kataria         *
1567031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param inputData key/value pairs that will be provided to the {@link Worker} class
1578b3284fa4a62568df91f706b0b2334284794008fSumir Kataria         * @return The current {@link Builder}
1588b3284fa4a62568df91f706b0b2334284794008fSumir Kataria         */
15962a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria        public B setInputData(@NonNull Data inputData) {
1607031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.input = inputData;
1617031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
1623d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria        }
1633d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria
1648b3284fa4a62568df91f706b0b2334284794008fSumir Kataria        /**
1657031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Add an optional tag for the work.  This is particularly useful for modules or
1667031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * libraries who want to query for or cancel all of their own work.
1678b3284fa4a62568df91f706b0b2334284794008fSumir Kataria         *
1687031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param tag A tag for identifying the work in queries.
1698b3284fa4a62568df91f706b0b2334284794008fSumir Kataria         * @return The current {@link Builder}
1708b3284fa4a62568df91f706b0b2334284794008fSumir Kataria         */
1717031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        public B addTag(@NonNull String tag) {
1727031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mTags.add(tag);
1737031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
17413915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria        }
17513915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria
1767031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        /**
1777031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Specifies that the results of this work should be kept for at least the specified amount
1787031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * of time.  After this time has elapsed, the results may be pruned at the discretion of
1797031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * WorkManager when there are no pending dependent jobs.
1807031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
1817031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * When the results of a work are pruned, it becomes impossible to query for its
1827031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * {@link WorkStatus}.
1837031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
1847031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Specifying a long duration here may adversely affect performance in terms of app storage
1857031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * and database query time.
1867031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
1877031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param duration The minimum duration of time (in {@code timeUnit} units) to keep the
1887031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *                 results of this work
1897031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param timeUnit The unit of time for {@code duration}
1907031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @return The current {@link Builder}
1917031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         */
1927031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        public B keepResultsForAtLeast(long duration, @NonNull TimeUnit timeUnit) {
1937031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.minimumRetentionDuration = timeUnit.toMillis(duration);
1947031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
1957031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        }
19613915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria
1977031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        /**
1987031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Builds this work object.
1997031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
2007031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @return The concrete implementation of the work associated with this builder
2017031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         */
2027031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        public abstract W build();
2037031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
20462a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria        abstract B getThis();
2057031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
2067031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        /**
2077031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Set the initial state for this work.  Used in testing only.
2087031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
2097031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param state The {@link State} to set
2107031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @return The current {@link Builder}
2117031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @hide
2127031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         */
2137031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
2147031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        @VisibleForTesting
21562a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria        public B setInitialState(@NonNull State state) {
2167031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.state = state;
2177031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
21813915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria        }
2195ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria
2207031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        /**
2217031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Set the initial run attempt count for this work.  Used in testing only.
2227031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
2237031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param runAttemptCount The initial run attempt count
2247031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @return The current {@link Builder}
2257031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @hide
2267031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         */
2277031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
2287031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        @VisibleForTesting
22962a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria        public B setInitialRunAttemptCount(int runAttemptCount) {
2307031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.runAttemptCount = runAttemptCount;
2317031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
2327031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        }
2337031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
2347031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        /**
2357031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Set the period start time for this work. Used in testing only.
2367031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
2377031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param periodStartTime the period start time in {@code timeUnit} units
2387031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param timeUnit The {@link TimeUnit} for {@code periodStartTime}
2397031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @return The current {@link Builder}
2407031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @hide
2417031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         */
2427031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
2437031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        @VisibleForTesting
24462a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria        public B setPeriodStartTime(long periodStartTime, @NonNull TimeUnit timeUnit) {
2457031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.periodStartTime = timeUnit.toMillis(periodStartTime);
2467031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
2477031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        }
2487031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar
2497031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        /**
2507031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * Set when the scheduler actually schedules the worker.
2517031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         *
2527031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param scheduleRequestedAt The time at which the scheduler scheduled a worker.
2537031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @param timeUnit            The {@link TimeUnit} for {@code scheduleRequestedAt}
2547031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @return The current {@link Builder}
2557031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         * @hide
2567031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar         */
2577031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
2587031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar        @VisibleForTesting
25962a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria        public B setScheduleRequestedAt(
2607031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar                long scheduleRequestedAt,
2617031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar                @NonNull TimeUnit timeUnit) {
2627031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            mWorkSpec.scheduleRequestedAt = timeUnit.toMillis(scheduleRequestedAt);
2637031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar            return getThis();
2645ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        }
265c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria    }
266c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria}
267