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