1687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar/*
2687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar * Copyright 2017 The Android Open Source Project
3687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar *
4687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar * Licensed under the Apache License, Version 2.0 (the "License");
5687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar * you may not use this file except in compliance with the License.
6687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar * You may obtain a copy of the License at
7687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar *
8687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar *      http://www.apache.org/licenses/LICENSE-2.0
9687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar *
10687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar * Unless required by applicable law or agreed to in writing, software
11687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar * distributed under the License is distributed on an "AS IS" BASIS,
12687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar * See the License for the specific language governing permissions and
14687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar * limitations under the License.
15687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar */
16687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar
17564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariapackage androidx.work.impl.utils.taskexecutor;
18687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar
19687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagarimport android.support.annotation.Nullable;
20687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagarimport android.support.annotation.RestrictTo;
21687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar
22687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar/**
23687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar * A static class that serves as a central point to execute common tasks in WorkManager.
24687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar * This is used for business logic internal to WorkManager and NOT for worker processing.
25687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar * Adapted from {@link android.arch.core.executor.ArchTaskExecutor}
26687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar * @hide
27687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar */
28687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar
29687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
30687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagarpublic class WorkManagerTaskExecutor implements TaskExecutor {
31687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar    private static WorkManagerTaskExecutor sInstance;
32687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar    private final TaskExecutor mDefaultTaskExecutor = new DefaultTaskExecutor();
33687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar    private TaskExecutor mTaskExecutor = mDefaultTaskExecutor;
34687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar
35687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar    /**
36687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar     * Returns an instance of the task executor.
37687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar     * @return The singleton WorkManagerTaskExecutor.
38687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar     */
39687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar    public static synchronized WorkManagerTaskExecutor getInstance() {
40687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar        if (sInstance == null) {
41687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar            sInstance = new WorkManagerTaskExecutor();
42687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar        }
43687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar        return sInstance;
44687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar    }
45687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar
46687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar    private WorkManagerTaskExecutor() {
47687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar    }
48687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar
49f8702c39a4cb2ca1fab53a8ab0addb2ab9361569Rahul Ravikumar    /**
50f8702c39a4cb2ca1fab53a8ab0addb2ab9361569Rahul Ravikumar     * Overrides the task executor used by {@link androidx.work.impl.WorkManagerImpl}.
51f8702c39a4cb2ca1fab53a8ab0addb2ab9361569Rahul Ravikumar     *
52f8702c39a4cb2ca1fab53a8ab0addb2ab9361569Rahul Ravikumar     * @param taskExecutor The instance of the {@link TaskExecutor}.
53f8702c39a4cb2ca1fab53a8ab0addb2ab9361569Rahul Ravikumar     */
54f8702c39a4cb2ca1fab53a8ab0addb2ab9361569Rahul Ravikumar    public void setTaskExecutor(@Nullable TaskExecutor taskExecutor) {
55687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar        mTaskExecutor = taskExecutor == null ? mDefaultTaskExecutor : taskExecutor;
56687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar    }
57687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar
58687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar    @Override
59687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar    public void postToMainThread(Runnable r) {
60687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar        mTaskExecutor.postToMainThread(r);
61687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar    }
62687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar
63687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar    @Override
64687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar    public void executeOnBackgroundThread(Runnable r) {
65687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar        mTaskExecutor.executeOnBackgroundThread(r);
66687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar    }
67687da3388ece2fefd80c710c382dff908b615a3fXyan Bhatnagar}
68