WorkRequest.java revision c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735e
1c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria/* 2c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * Copyright (C) 2017 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 */ 16c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 17c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Katariapackage android.arch.background.workmanager; 18c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 19c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Katariaimport android.support.annotation.NonNull; 20c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 21c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Katariaimport java.util.ArrayList; 22c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Katariaimport java.util.List; 23c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Katariaimport java.util.UUID; 24c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 25c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria/** 26c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * A class to create a logical chain of work, which may contain several dependent steps. 27c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria */ 28c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 29c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Katariapublic class Work { 30c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 31c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria private WorkSpec mWorkSpec; 32c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria private List<WorkItem> mWorkItems; 33c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 34c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria private Work(WorkSpec workSpec, List<WorkItem> workItems) { 35c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria mWorkSpec = workSpec; 36c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria mWorkItems = workItems; 37c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 38c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 39c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria /** 40c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * @return The id for this set of work. 41c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria */ 42c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria public String getId() { 43c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria return mWorkSpec.mId; 44c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 45c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 46c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria /** 47c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * @return A list of ids for each stage of execution. 48c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria */ 49c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria public List<String> getWorkItemIds() { 50c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria List<String> ids = new ArrayList<>(mWorkItems.size()); 51c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria for (WorkItem workItem : mWorkItems) { 52c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria ids.add(workItem.mId); 53c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 54c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria return ids; 55c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 56c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 57c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria WorkSpec getWorkSpec() { 58c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria return mWorkSpec; 59c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 60c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 61c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria List<WorkItem> getWorkItems() { 62c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria return mWorkItems; 63c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 64c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 65c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria List<Dependency> generateDependencies() { 66c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria List<Dependency> dependencies = new ArrayList<>(); 67c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria for (int i = 1; i < mWorkItems.size(); i++) { 68c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria Dependency dependency = new Dependency(); 69c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria dependency.mWorkItemId = mWorkItems.get(i).mId; 70c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria dependency.mPrerequisiteId = mWorkItems.get(i - 1).mId; 71c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria dependencies.add(dependency); 72c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 73c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria return dependencies; 74c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 75c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria /** 76c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * Builder for {@link Work} class. 77c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria */ 78c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria public static class Builder { 79c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria private WorkSpec mWorkSpec = new WorkSpec(UUID.randomUUID().toString()); 80c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria private List<WorkItem> mWorkItems = new ArrayList<>(1); 81c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 82c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria public Builder(Class<? extends Worker> workerClass) { 83c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria addNewWorkItem(workerClass); 84c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 85c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 86c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria private WorkItem getCurrentWorkItem() { 87c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria return mWorkItems.get(mWorkItems.size() - 1); 88c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 89c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 90c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria /** 91c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * Add constraints to the current {@link Worker}. 92c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * 93c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * @param constraints the constraints to attach to the work item 94c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * @return current builder 95c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria */ 96c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria public Builder withConstraints(@NonNull Constraints constraints) { 97c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria getCurrentWorkItem().mConstraints = constraints; 98c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria return this; 99c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 100c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 101c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria /** 102c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * Chain this {@link Work} to another {@link Worker} Class. 103c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * 104c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * @param workerClass the next {@link Worker} class to chain this Work to 105c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * @return current {@link Builder} 106c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria */ 107c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria public Builder then(Class<? extends Worker> workerClass) { 108c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria addNewWorkItem(workerClass); 109c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria return this; 110c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 111c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 112c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria /** 113c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * Change backoff policy and delay for the current {@link WorkItem}. 114c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * Default is {@value WorkItem#BACKOFF_POLICY_EXPONENTIAL} and 30 seconds. 115c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * 116c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * @param backoffPolicy Backoff Policy to use for current {@link WorkItem} 117c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * @param backoffDelayDuration Time to wait before restarting {@link Worker} 118c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * (in milliseconds) 119c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * @return current builder 120c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria */ 121c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria public Builder withBackoffCriteria(@WorkItem.BackoffPolicy int backoffPolicy, 122c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria long backoffDelayDuration) { 123c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria // TODO(xbhatnag): Enforce restrictions on backoff delay. 30 seconds? 124c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria getCurrentWorkItem().mBackoffPolicy = backoffPolicy; 125c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria getCurrentWorkItem().mBackoffDelayDuration = backoffDelayDuration; 126c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria return this; 127c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 128c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 129c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria /** 130c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * Generates the {@link Work} from this builder 131c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * 132c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria * @return new {@link Work} 133c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria */ 134c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria public Work build() { 135c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria return new Work(mWorkSpec, mWorkItems); 136c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 137c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria 138c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria private void addNewWorkItem(Class<? extends Worker> workerClass) { 139c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria WorkItem workItem = new WorkItem(UUID.randomUUID().toString(), mWorkSpec.mId); 140c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria workItem.mWorkerClassName = workerClass.getName(); 141c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria mWorkItems.add(workItem); 142c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 143c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria } 144c8aed5157c86b7f6a7c609d4d1aeb6f3b12e735eSumir Kataria} 145