WorkRequest.java revision 960d12bd2332b73d49adbd6fdcbb767abf3f461c
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 56fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria protected WorkRequest(@NonNull UUID id, @NonNull WorkSpec workSpec, @NonNull Set<String> tags) { 57fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria mId = id; 587031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar mWorkSpec = workSpec; 597031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar mTags = tags; 606d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria } 616d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria 626d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria /** 637031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * Gets the unique identifier associated with this unit of work. 646d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria * 657031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @return The identifier for this unit of work 666d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria */ 67fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria public UUID getId() { 68fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria return mId; 69fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria } 70fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria 71fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria /** 72fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria * Gets the string for the unique identifier associated with this unit of work. 73fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria * 74fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria * @return The string identifier for this unit of work 75fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria * @hide 76fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria */ 77fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) 78fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria public String getStringId() { 79fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria return mId.toString(); 806d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria } 816d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria 827031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar /** 837031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * Gets the {@link WorkSpec} associated with this unit of work. 847031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * 857031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @return The {@link WorkSpec} for this unit of work 867031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @hide 877031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar */ 887031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) 897031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar public WorkSpec getWorkSpec() { 907031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar return mWorkSpec; 917031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar } 9231099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria 937031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar /** 947031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * Gets the tags associated with this unit of work. 957031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * 967031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @return The tags for this unit of work 977031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @hide 987031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar */ 997031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) 1007031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar public Set<String> getTags() { 1017031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar return mTags; 10231099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria } 10331099f8c34e2e4ba4760ca643c7f6cdb51791c4eSumir Kataria 1046d0c2e72666e6e6c463ce283f6f546ef26159f1cSumir Kataria /** 1057031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * A builder for {@link WorkRequest}. 1067031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * 1077031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @param <B> The concrete implementation of of this Builder 1087031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @param <W> The type of work object built by this Builder 109c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria */ 1107031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar public abstract static class Builder<B extends Builder, W extends WorkRequest> { 1117031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar 112fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria boolean mBackoffCriteriaSet = false; 113fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria UUID mId; 114fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria WorkSpec mWorkSpec; 115fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria Set<String> mTags = new HashSet<>(); 116c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 11786894df5599526eb983c484ce185ad27ee8e0398Sumir Kataria public Builder(@NonNull Class<? extends Worker> workerClass) { 118fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria mId = UUID.randomUUID(); 119fa284c943bd003ff03f1934370d70bd4a5e034c3Sumir Kataria mWorkSpec = new WorkSpec(mId.toString(), workerClass.getName()); 1207031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar } 1217031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar 1227031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar /** 1237031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * Change backoff policy and delay for the work. The default is 1247031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * {@link BackoffPolicy#EXPONENTIAL} and 1257031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * {@value WorkRequest#DEFAULT_BACKOFF_DELAY_MILLIS}. The maximum backoff delay 1267031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * duration is {@value WorkRequest#MAX_BACKOFF_MILLIS}. 1277031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * 1287031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @param backoffPolicy The {@link BackoffPolicy} to use for work 1297031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @param backoffDelay Time to wait before restarting {@link Worker} in {@code timeUnit} 1307031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * units 1317031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @param timeUnit The {@link TimeUnit} for {@code backoffDelay} 1327031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @return The current {@link Builder} 1337031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar */ 13462a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria public B setBackoffCriteria( 1357031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar @NonNull BackoffPolicy backoffPolicy, 1367031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar long backoffDelay, 1377031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar @NonNull TimeUnit timeUnit) { 1387031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar mBackoffCriteriaSet = true; 1397031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar mWorkSpec.backoffPolicy = backoffPolicy; 1407031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar mWorkSpec.setBackoffDelayDuration(timeUnit.toMillis(backoffDelay)); 1417031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar return getThis(); 1427031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar } 1437031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar 1447031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar /** 1457031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * Add constraints to the {@link OneTimeWorkRequest}. 1467031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * 1477031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @param constraints The constraints for the work 1487031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @return The current {@link Builder} 1497031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar */ 15062a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria public B setConstraints(@NonNull Constraints constraints) { 1517031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar mWorkSpec.constraints = constraints; 1527031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar return getThis(); 153367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar } 154367c6495989abb32b5c0fa99be983c93c4bb5c09Xyan Bhatnagar 1558b3284fa4a62568df91f706b0b2334284794008fSumir Kataria /** 1567031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * Add input {@link Data} to the work. 1578b3284fa4a62568df91f706b0b2334284794008fSumir Kataria * 1587031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @param inputData key/value pairs that will be provided to the {@link Worker} class 1598b3284fa4a62568df91f706b0b2334284794008fSumir Kataria * @return The current {@link Builder} 1608b3284fa4a62568df91f706b0b2334284794008fSumir Kataria */ 16162a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria public B setInputData(@NonNull Data inputData) { 1627031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar mWorkSpec.input = inputData; 1637031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar return getThis(); 1643d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria } 1653d5949e3e18fe4a190a83079bef180fae6dcb318Sumir Kataria 1668b3284fa4a62568df91f706b0b2334284794008fSumir Kataria /** 1677031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * Add an optional tag for the work. This is particularly useful for modules or 1687031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * libraries who want to query for or cancel all of their own work. 1698b3284fa4a62568df91f706b0b2334284794008fSumir Kataria * 1707031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @param tag A tag for identifying the work in queries. 1718b3284fa4a62568df91f706b0b2334284794008fSumir Kataria * @return The current {@link Builder} 1728b3284fa4a62568df91f706b0b2334284794008fSumir Kataria */ 1737031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar public B addTag(@NonNull String tag) { 1747031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar mTags.add(tag); 1757031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar return getThis(); 17613915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria } 17713915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria 1787031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar /** 1797031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * Specifies that the results of this work should be kept for at least the specified amount 1807031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * of time. After this time has elapsed, the results may be pruned at the discretion of 1817031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * WorkManager when there are no pending dependent jobs. 1827031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * 1837031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * When the results of a work are pruned, it becomes impossible to query for its 1847031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * {@link WorkStatus}. 1857031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * 1867031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * Specifying a long duration here may adversely affect performance in terms of app storage 1877031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * and database query time. 1887031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * 1897031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @param duration The minimum duration of time (in {@code timeUnit} units) to keep the 1907031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * results of this work 1917031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @param timeUnit The unit of time for {@code duration} 1927031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @return The current {@link Builder} 1937031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar */ 1947031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar public B keepResultsForAtLeast(long duration, @NonNull TimeUnit timeUnit) { 1957031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar mWorkSpec.minimumRetentionDuration = timeUnit.toMillis(duration); 1967031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar return getThis(); 1977031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar } 19813915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria 1997031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar /** 20011c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria * Specifies that the results of this work should be kept for at least the specified amount 20111c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria * of time. After this time has elapsed, the results may be pruned at the discretion of 20211c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria * WorkManager when there are no pending dependent jobs. 20311c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria * 20411c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria * When the results of a work are pruned, it becomes impossible to query for its 20511c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria * {@link WorkStatus}. 20611c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria * 20711c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria * Specifying a long duration here may adversely affect performance in terms of app storage 20811c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria * and database query time. 20911c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria * 21011c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria * @param duration The minimum duration of time to keep the results of this work 21111c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria * @return The current {@link Builder} 21211c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria */ 21311c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria @RequiresApi(26) 21411c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria public B keepResultsForAtLeast(@NonNull Duration duration) { 21511c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria mWorkSpec.minimumRetentionDuration = duration.toMillis(); 21611c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria return getThis(); 21711c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria } 21811c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria 21911c59a053ff3ea65f6e27d77ca54f35b7ea9f4fdSumir Kataria /** 2207031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * Builds this work object. 2217031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * 2227031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @return The concrete implementation of the work associated with this builder 2237031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar */ 2247031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar public abstract W build(); 2257031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar 22662a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria abstract B getThis(); 2277031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar 2287031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar /** 2297031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * Set the initial state for this work. Used in testing only. 2307031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * 2317031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @param state The {@link State} to set 2327031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @return The current {@link Builder} 2337031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @hide 2347031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar */ 2357031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) 2367031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar @VisibleForTesting 23762a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria public B setInitialState(@NonNull State state) { 2387031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar mWorkSpec.state = state; 2397031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar return getThis(); 24013915a0763bdd2601eeb95046138ebbcabf4fb04Sumir Kataria } 2415ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria 2427031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar /** 2437031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * Set the initial run attempt count for this work. Used in testing only. 2447031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * 2457031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @param runAttemptCount The initial run attempt count 2467031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @return The current {@link Builder} 2477031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @hide 2487031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar */ 2497031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) 2507031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar @VisibleForTesting 25162a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria public B setInitialRunAttemptCount(int runAttemptCount) { 2527031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar mWorkSpec.runAttemptCount = runAttemptCount; 2537031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar return getThis(); 2547031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar } 2557031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar 2567031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar /** 2577031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * Set the period start time for this work. Used in testing only. 2587031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * 2597031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @param periodStartTime the period start time in {@code timeUnit} units 2607031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @param timeUnit The {@link TimeUnit} for {@code periodStartTime} 2617031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @return The current {@link Builder} 2627031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @hide 2637031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar */ 2647031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) 2657031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar @VisibleForTesting 26662a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria public B setPeriodStartTime(long periodStartTime, @NonNull TimeUnit timeUnit) { 2677031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar mWorkSpec.periodStartTime = timeUnit.toMillis(periodStartTime); 2687031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar return getThis(); 2697031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar } 2707031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar 2717031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar /** 2727031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * Set when the scheduler actually schedules the worker. 2737031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * 2747031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @param scheduleRequestedAt The time at which the scheduler scheduled a worker. 2757031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @param timeUnit The {@link TimeUnit} for {@code scheduleRequestedAt} 2767031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @return The current {@link Builder} 2777031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar * @hide 2787031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar */ 2797031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) 2807031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar @VisibleForTesting 28162a7e773945d980084dfc5d00c724de2e27dc22dSumir Kataria public B setScheduleRequestedAt( 2827031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar long scheduleRequestedAt, 2837031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar @NonNull TimeUnit timeUnit) { 2847031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar mWorkSpec.scheduleRequestedAt = timeUnit.toMillis(scheduleRequestedAt); 2857031a0fbe12b8159ab2dc6d9c50be5b3f38477faRahul Ravikumar return getThis(); 2865ab54f5659eccf75e3b7deee75012e83380da48cSumir Kataria } 287c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 288c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria} 289