WorkRequest.java revision 5ab54f5659eccf75e3b7deee75012e83380da48c
13032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria/*
2564e43098c323d1a90be53c190b8fdbdde973505Sumir Kataria * Copyright 2018 The Android Open Source Project
33032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria *
43032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria * Licensed under the Apache License, Version 2.0 (the "License");
53032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria * you may not use this file except in compliance with the License.
63032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria * You may obtain a copy of the License at
73032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria *
83032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria *      http://www.apache.org/licenses/LICENSE-2.0
93032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria *
103032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria * Unless required by applicable law or agreed to in writing, software
113032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria * distributed under the License is distributed on an "AS IS" BASIS,
123032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria * See the License for the specific language governing permissions and
143032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria * limitations under the License.
153032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria */
16564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariapackage androidx.work;
173032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria
183032a52e9b0e87bcef422396d9080983df1e9eeaSumir Katariaimport android.support.annotation.NonNull;
1931099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Katariaimport android.support.annotation.RestrictTo;
203032a52e9b0e87bcef422396d9080983df1e9eeaSumir Katariaimport android.support.annotation.VisibleForTesting;
213032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria
2231099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Katariaimport androidx.work.impl.model.WorkSpec;
2331099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria
245ab54f5659eccf75e3b7deee75012e83380da48cSumir Katariaimport java.util.HashSet;
2531099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Katariaimport java.util.Set;
265ab54f5659eccf75e3b7deee75012e83380da48cSumir Katariaimport java.util.UUID;
27f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Katariaimport java.util.concurrent.TimeUnit;
28f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria
293032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria/**
303032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria * The base interface for units of work.
313032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria */
323032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria
3331099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Katariapublic abstract class BaseWork {
343032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria
3566fd2b18d367c602d84b3fa7220462b4228fae43Sumir Kataria    /**
364ee69ffea5f5636674c7aa8a19366dd950c9b770Sumir Kataria     * {@see https://android.googlesource.com/platform/frameworks/base/+/oreo-release/core/java/android/app/job/JobInfo.java#77}
374ee69ffea5f5636674c7aa8a19366dd950c9b770Sumir Kataria     */
3831099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    public static final long DEFAULT_BACKOFF_DELAY_MILLIS = 30000L;
393032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria
403032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria    /**
413032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria     * {@see https://android.googlesource.com/platform/frameworks/base/+/oreo-release/core/java/android/app/job/JobInfo.java#82}
423032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria     */
4331099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    public static final long MAX_BACKOFF_MILLIS = 5 * 60 * 60 * 1000; // 5 hours.
443032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria
453032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria    /**
463032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria     * {@see https://android.googlesource.com/platform/frameworks/base/+/oreo-release/core/java/android/app/job/JobInfo.java#119}
473032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria     */
4831099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    public static final long MIN_BACKOFF_MILLIS = 10 * 1000; // 10 seconds.
4931099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria
5031099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria
5131099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    private WorkSpec mWorkSpec;
5231099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    private Set<String> mTags;
5331099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria
5431099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    protected BaseWork(@NonNull WorkSpec workSpec, @NonNull Set<String> tags) {
5531099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria        mWorkSpec = workSpec;
5631099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria        mTags = tags;
5731099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    }
5831099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria
593032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria
603032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria    /**
613032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria     * Gets the unique identifier associated with this unit of work.
623032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria     *
633032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria     * @return The identifier for this unit of work
643032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria     */
6531099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    public String getId() {
66b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria        return mWorkSpec.id;
6731099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    }
6831099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria
6931099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    /**
7031099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria     * Gets the {@link WorkSpec} associated with this unit of work.
7131099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria     *
7231099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria     * @return The {@link WorkSpec} for this unit of work
7331099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria     * @hide
7431099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria     */
7531099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
7631099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    public WorkSpec getWorkSpec() {
7731099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria        return mWorkSpec;
7831099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    }
7931099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria
8031099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    /**
8131099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria     * Gets the tags associated with this unit of work.
8231099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria     *
8331099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria     * @return THe tags for this unit of work
8431099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria     * @hide
8531099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria     */
8631099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
8731099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    public Set<String> getTags() {
8831099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria        return mTags;
8931099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria    }
903032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria
913032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria    /**
923032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria     * A builder for {@link BaseWork}.
933032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria     *
945ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria     * @param <B> The concrete implementation of of this Builder
955ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria     * @param <W> The type of work object built by this Builder
963032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria     */
975ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria    public abstract static class Builder<B extends Builder, W extends BaseWork> {
985ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria
995ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        protected boolean mBackoffCriteriaSet = false;
1005ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        protected WorkSpec mWorkSpec;
1015ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        protected Set<String> mTags = new HashSet<>();
1025ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria
1035ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        public Builder(@NonNull Class<? extends Worker> workerClass) {
1045ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            mWorkSpec = new WorkSpec(UUID.randomUUID().toString(), workerClass.getName());
1055ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        }
1063032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria
1073032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria        /**
108f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria         * Change backoff policy and delay for the work.  The default is
109f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria         * {@link BackoffPolicy#EXPONENTIAL} and {@value BaseWork#DEFAULT_BACKOFF_DELAY_MILLIS}.
110f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria         * The maximum backoff delay duration is {@value BaseWork#MAX_BACKOFF_MILLIS}.
1113032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         *
112f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria         * @param backoffPolicy The {@link BackoffPolicy} to use for work
113f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria         * @param backoffDelay Time to wait before restarting {@link Worker} in {@code timeUnit}
114f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria         *                     units
115f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria         * @param timeUnit The {@link TimeUnit} for {@code backoffDelay}
1165ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria         * @return The current {@link Builder}
1173032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         */
1185ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        public B withBackoffCriteria(
119f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                @NonNull BackoffPolicy backoffPolicy,
120f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria                long backoffDelay,
1215ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria                @NonNull TimeUnit timeUnit) {
1225ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            mBackoffCriteriaSet = true;
1235ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            mWorkSpec.backoffPolicy = backoffPolicy;
1245ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            mWorkSpec.setBackoffDelayDuration(timeUnit.toMillis(backoffDelay));
1255ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            return getThis();
1265ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        }
1273032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria
1283032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria        /**
1293032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         * Add constraints to the {@link Work}.
1303032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         *
1313032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         * @param constraints The constraints for the work
1325ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria         * @return The current {@link Builder}
1333032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         */
1345ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        public B withConstraints(@NonNull Constraints constraints) {
1355ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            mWorkSpec.constraints = constraints;
1365ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            return getThis();
1375ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        }
1383032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria
1393032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria        /**
1403032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         * Add arguments to the work.
1413032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         *
1423032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         * @param arguments key/value pairs that will be provided to the {@link Worker} class
1435ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria         * @return The current {@link Builder}
1443032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         */
1455ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        public B withArguments(@NonNull Arguments arguments) {
1465ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            mWorkSpec.arguments = arguments;
1475ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            return getThis();
1485ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        }
1493032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria
1503032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria        /**
1513032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         * Add an optional tag for the work.  This is particularly useful for modules or
1523032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         * libraries who want to query for or cancel all of their own work.
1533032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         *
1543032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         * @param tag A tag for identifying the work in queries.
1555ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria         * @return The current {@link Builder}
1563032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         */
1575ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        public B addTag(@NonNull String tag) {
1585ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            mTags.add(tag);
1595ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            return getThis();
1605ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        }
1613032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria
1623032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria        /**
1633d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria         * Specifies that the results of this work should be kept for at least the specified amount
1643d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria         * of time.  After this time has elapsed, the results may be pruned at the discretion of
1653d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria         * WorkManager when there are no pending dependent jobs.
1663d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria         *
1673d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria         * When the results of a work are pruned, it becomes impossible to query for its
1683d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria         * {@link WorkStatus}.
1693d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria         *
1703d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria         * Specifying a long duration here may adversely affect performance in terms of app storage
1713d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria         * and database query time.
1723d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria         *
1733d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria         * @param duration The minimum duration of time (in {@code timeUnit} units) to keep the
1743d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria         *                 results of this work
1753d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria         * @param timeUnit The unit of time for {@code duration}
1763d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria         * @return The current {@link Builder}
1773d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria         */
1785ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        public B keepResultsForAtLeast(long duration, @NonNull TimeUnit timeUnit) {
1795ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            mWorkSpec.minimumRetentionDuration = timeUnit.toMillis(duration);
1805ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            return getThis();
1815ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        }
1823d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria
1833d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria        /**
1843032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         * Builds this work object.
1853032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         *
1863032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         * @return The concrete implementation of the work associated with this builder
1873032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria         */
1885ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        public abstract W build();
1895ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria
1905ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        protected abstract B getThis();
19113915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria
19213915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria        /**
1939cf4f3d3aa83bc64db574955805c67ac9ea84008Sumir Kataria         * Set the initial state for this work.  Used in testing only.
19413915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria         *
1959cf4f3d3aa83bc64db574955805c67ac9ea84008Sumir Kataria         * @param state The {@link State} to set
19613915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria         * @return The current {@link Builder}
19713915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria         */
19813915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria        @VisibleForTesting
1995ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        public B withInitialState(@NonNull State state) {
2005ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            mWorkSpec.state = state;
2015ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            return getThis();
2025ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        }
20313915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria
20413915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria        /**
20513915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria         * Set the initial run attempt count for this work.  Used in testing only.
20613915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria         *
20713915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria         * @param runAttemptCount The initial run attempt count
20813915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria         * @return The current {@link Builder}
20913915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria         */
21013915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria        @VisibleForTesting
2115ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        public B withInitialRunAttemptCount(int runAttemptCount) {
2125ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            mWorkSpec.runAttemptCount = runAttemptCount;
2135ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            return getThis();
2145ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        }
21513915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria
21613915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria        /**
21713915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria         * Set the period start time for this work. Used in testing only.
21813915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria         *
219f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria         * @param periodStartTime the period start time in {@code timeUnit} units
220f4ae2b7ec2f6d21ac6a7ee974fa363049ba6d12eSumir Kataria         * @param timeUnit The {@link TimeUnit} for {@code periodStartTime}
22113915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria         * @return The current {@link Builder}
22213915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria         */
22313915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria        @VisibleForTesting
2245ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        public B withPeriodStartTime(long periodStartTime, @NonNull TimeUnit timeUnit) {
2255ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            mWorkSpec.periodStartTime = timeUnit.toMillis(periodStartTime);
2265ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria            return getThis();
2275ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria        }
2283032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria    }
2293032a52e9b0e87bcef422396d9080983df1e9eeaSumir Kataria}
230