SystemAlarmService.java revision ea55183d5b0bb706e6e962605cd820e5b3a02c28
1a92623408ef72ecfb70083938eb5896199589c79Jan Clarin/*
2a92623408ef72ecfb70083938eb5896199589c79Jan Clarin * Copyright 2017 The Android Open Source Project
3a92623408ef72ecfb70083938eb5896199589c79Jan Clarin *
4a92623408ef72ecfb70083938eb5896199589c79Jan Clarin * Licensed under the Apache License, Version 2.0 (the "License");
5a92623408ef72ecfb70083938eb5896199589c79Jan Clarin * you may not use this file except in compliance with the License.
6a92623408ef72ecfb70083938eb5896199589c79Jan Clarin * You may obtain a copy of the License at
7a92623408ef72ecfb70083938eb5896199589c79Jan Clarin *
8a92623408ef72ecfb70083938eb5896199589c79Jan Clarin *      http://www.apache.org/licenses/LICENSE-2.0
9a92623408ef72ecfb70083938eb5896199589c79Jan Clarin *
10a92623408ef72ecfb70083938eb5896199589c79Jan Clarin * Unless required by applicable law or agreed to in writing, software
11a92623408ef72ecfb70083938eb5896199589c79Jan Clarin * distributed under the License is distributed on an "AS IS" BASIS,
12a92623408ef72ecfb70083938eb5896199589c79Jan Clarin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a92623408ef72ecfb70083938eb5896199589c79Jan Clarin * See the License for the specific language governing permissions and
14a92623408ef72ecfb70083938eb5896199589c79Jan Clarin * limitations under the License.
15a92623408ef72ecfb70083938eb5896199589c79Jan Clarin */
16a92623408ef72ecfb70083938eb5896199589c79Jan Clarin
171ecbe025abd63da00f6868d6459afb823241a412Jan Clarinpackage android.arch.background.workmanager.background.systemalarm;
18a92623408ef72ecfb70083938eb5896199589c79Jan Clarin
19a92623408ef72ecfb70083938eb5896199589c79Jan Clarinimport android.arch.background.workmanager.ExecutionListener;
20a92623408ef72ecfb70083938eb5896199589c79Jan Clarinimport android.arch.background.workmanager.WorkDatabase;
21a92623408ef72ecfb70083938eb5896199589c79Jan Clarinimport android.arch.background.workmanager.WorkManager;
22bb667b8826f311cfc49a1deff0c7670f8dc9cdfdJan Clarinimport android.arch.background.workmanager.background.BackgroundProcessor;
23ea55183d5b0bb706e6e962605cd820e5b3a02c28Xyan Bhatnagarimport android.arch.lifecycle.LifecycleService;
24a92623408ef72ecfb70083938eb5896199589c79Jan Clarinimport android.content.Context;
25a92623408ef72ecfb70083938eb5896199589c79Jan Clarinimport android.content.Intent;
26a92623408ef72ecfb70083938eb5896199589c79Jan Clarinimport android.os.IBinder;
2709835397594c33239e4eefe16cb4dee544047af3Xyan Bhatnagarimport android.support.annotation.NonNull;
28a92623408ef72ecfb70083938eb5896199589c79Jan Clarinimport android.support.annotation.Nullable;
29a92623408ef72ecfb70083938eb5896199589c79Jan Clarinimport android.support.annotation.RestrictTo;
30a92623408ef72ecfb70083938eb5896199589c79Jan Clarinimport android.util.Log;
31a92623408ef72ecfb70083938eb5896199589c79Jan Clarin
32a92623408ef72ecfb70083938eb5896199589c79Jan Clarin/**
33a92623408ef72ecfb70083938eb5896199589c79Jan Clarin * Service invoked by {@link android.app.AlarmManager} to run work tasks.
34a92623408ef72ecfb70083938eb5896199589c79Jan Clarin *
35a92623408ef72ecfb70083938eb5896199589c79Jan Clarin * @hide
36a92623408ef72ecfb70083938eb5896199589c79Jan Clarin */
37a92623408ef72ecfb70083938eb5896199589c79Jan Clarin@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
38ea55183d5b0bb706e6e962605cd820e5b3a02c28Xyan Bhatnagarpublic class SystemAlarmService extends LifecycleService implements ExecutionListener {
3996c5bc560ddbdc1fb871d2c7450f86df34dbcbf6Jan Clarin    public static final String EXTRA_WORK_ID = "EXTRA_WORK_ID";
40a92623408ef72ecfb70083938eb5896199589c79Jan Clarin    private static final String TAG = "SystemAlarmService";
41bb667b8826f311cfc49a1deff0c7670f8dc9cdfdJan Clarin    private BackgroundProcessor mProcessor;
42a92623408ef72ecfb70083938eb5896199589c79Jan Clarin
43a92623408ef72ecfb70083938eb5896199589c79Jan Clarin    @Override
44a92623408ef72ecfb70083938eb5896199589c79Jan Clarin    public void onCreate() {
45a92623408ef72ecfb70083938eb5896199589c79Jan Clarin        super.onCreate();
46a92623408ef72ecfb70083938eb5896199589c79Jan Clarin        Context context = getApplicationContext();
47f53efa6d7ade99f4acc5db025e38a7bedabc0ddbSumir Kataria        WorkManager workManager = WorkManager.getInstance();
48a92623408ef72ecfb70083938eb5896199589c79Jan Clarin        WorkDatabase database = workManager.getWorkDatabase();
49bb667b8826f311cfc49a1deff0c7670f8dc9cdfdJan Clarin        mProcessor = new BackgroundProcessor(context, database, workManager.getScheduler(), this);
50ea55183d5b0bb706e6e962605cd820e5b3a02c28Xyan Bhatnagar        ProxyController.startProxyControllers(context, database, this);
51a92623408ef72ecfb70083938eb5896199589c79Jan Clarin    }
52a92623408ef72ecfb70083938eb5896199589c79Jan Clarin
53a92623408ef72ecfb70083938eb5896199589c79Jan Clarin    @Override
54a92623408ef72ecfb70083938eb5896199589c79Jan Clarin    public int onStartCommand(Intent intent, int flags, int startId) {
5596c5bc560ddbdc1fb871d2c7450f86df34dbcbf6Jan Clarin        // TODO(janclarin): Keep wakelock.
56ea55183d5b0bb706e6e962605cd820e5b3a02c28Xyan Bhatnagar        super.onStartCommand(intent, flags, startId);
5796c5bc560ddbdc1fb871d2c7450f86df34dbcbf6Jan Clarin        String workSpecId = intent.getStringExtra(EXTRA_WORK_ID);
5896c5bc560ddbdc1fb871d2c7450f86df34dbcbf6Jan Clarin        mProcessor.process(workSpecId, 0L);
5996c5bc560ddbdc1fb871d2c7450f86df34dbcbf6Jan Clarin        return START_NOT_STICKY;
60a92623408ef72ecfb70083938eb5896199589c79Jan Clarin    }
61a92623408ef72ecfb70083938eb5896199589c79Jan Clarin
62a92623408ef72ecfb70083938eb5896199589c79Jan Clarin    @Override
6309835397594c33239e4eefe16cb4dee544047af3Xyan Bhatnagar    public void onExecuted(@NonNull String workSpecId, boolean needsReschedule) {
64a92623408ef72ecfb70083938eb5896199589c79Jan Clarin        Log.d(TAG, workSpecId + " executed on AlarmManager");
6596c5bc560ddbdc1fb871d2c7450f86df34dbcbf6Jan Clarin        // TODO(janclarin): Handle rescheduling if needed or if periodic.
660f5ebc4740ab2db64fc2b278d6d60624b69ffeb0Xyan Bhatnagar        // TODO(xbhatnag): Query WorkSpecs and disable proxies as needed.
6796c5bc560ddbdc1fb871d2c7450f86df34dbcbf6Jan Clarin
6896c5bc560ddbdc1fb871d2c7450f86df34dbcbf6Jan Clarin        if (!mProcessor.hasWork()) {
6996c5bc560ddbdc1fb871d2c7450f86df34dbcbf6Jan Clarin            // TODO(janclarin): Release wakelock.
7096c5bc560ddbdc1fb871d2c7450f86df34dbcbf6Jan Clarin            Log.d(TAG, "Stopping self");
7196c5bc560ddbdc1fb871d2c7450f86df34dbcbf6Jan Clarin            stopSelf();
7296c5bc560ddbdc1fb871d2c7450f86df34dbcbf6Jan Clarin        }
73a92623408ef72ecfb70083938eb5896199589c79Jan Clarin    }
74a92623408ef72ecfb70083938eb5896199589c79Jan Clarin
75a92623408ef72ecfb70083938eb5896199589c79Jan Clarin    @Nullable
76a92623408ef72ecfb70083938eb5896199589c79Jan Clarin    @Override
77a92623408ef72ecfb70083938eb5896199589c79Jan Clarin    public IBinder onBind(Intent intent) {
78ea55183d5b0bb706e6e962605cd820e5b3a02c28Xyan Bhatnagar        super.onBind(intent);
79a92623408ef72ecfb70083938eb5896199589c79Jan Clarin        return null;
80a92623408ef72ecfb70083938eb5896199589c79Jan Clarin    }
81a92623408ef72ecfb70083938eb5896199589c79Jan Clarin
82a92623408ef72ecfb70083938eb5896199589c79Jan Clarin    @Override
83a92623408ef72ecfb70083938eb5896199589c79Jan Clarin    public void onDestroy() {
84a92623408ef72ecfb70083938eb5896199589c79Jan Clarin        Log.d(TAG, "Destroyed");
8596c5bc560ddbdc1fb871d2c7450f86df34dbcbf6Jan Clarin        super.onDestroy();
86a92623408ef72ecfb70083938eb5896199589c79Jan Clarin    }
87a92623408ef72ecfb70083938eb5896199589c79Jan Clarin}
88