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