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