1e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar/*
2e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar * Copyright 2018 The Android Open Source Project
3e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar *
4e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar * Licensed under the Apache License, Version 2.0 (the "License");
5e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar * you may not use this file except in compliance with the License.
6e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar * You may obtain a copy of the License at
7e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar *
8e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar *      http://www.apache.org/licenses/LICENSE-2.0
9e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar *
10e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar * Unless required by applicable law or agreed to in writing, software
11e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar * distributed under the License is distributed on an "AS IS" BASIS,
12e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar * See the License for the specific language governing permissions and
14e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar * limitations under the License.
15e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar */
16e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar
17e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumarpackage androidx.work.worker;
18e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar
19e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumarimport static androidx.work.Worker.Result.SUCCESS;
20e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar
21e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumarimport android.support.annotation.NonNull;
22e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar
23e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumarimport androidx.work.Data;
24e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumarimport androidx.work.Worker;
25e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumarimport androidx.work.impl.Scheduler;
26e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumarimport androidx.work.impl.WorkManagerImpl;
27e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumarimport androidx.work.impl.model.WorkSpec;
28e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar
29e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumarimport java.util.List;
30e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar
31e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumarpublic class CheckLimitsWorker extends Worker {
32e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar    /* The limit to enforce */
33e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar    public static final String KEY_LIMIT_TO_ENFORCE = "limit";
34e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar
35e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar    /* The output key which tells us if we exceeded the scheduler limits. */
36e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar    public static final String KEY_EXCEEDS_SCHEDULER_LIMIT = "exceed_scheduler_limit";
37e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar
38e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar    @NonNull
39e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar    @Override
40e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar    public Result doWork() {
41e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar        Data input = getInputData();
42e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar        int limitToEnforce = input.getInt(KEY_LIMIT_TO_ENFORCE, Scheduler.MAX_SCHEDULER_LIMIT);
43e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar        WorkManagerImpl workManager = WorkManagerImpl.getInstance();
44e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar        List<WorkSpec> eligibleWorkSpecs = workManager.getWorkDatabase()
45e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar                .workSpecDao()
46e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar                .getEligibleWorkForScheduling(limitToEnforce);
47e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar        int size = eligibleWorkSpecs != null ? eligibleWorkSpecs.size() : 0;
48e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar        boolean exceedsLimits = size > limitToEnforce;
49e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar        Data output = new Data.Builder()
50e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar                .putBoolean(KEY_EXCEEDS_SCHEDULER_LIMIT, exceedsLimits)
51e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar                .build();
52e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar
53e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar        setOutputData(output);
54e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar        return SUCCESS;
55e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar    }
56e326592ec414dfe4c002e2840d9fc4aef0ee8747Rahul Ravikumar}
57