113b0241248716b126a538457828a964e86109d58Matthew Williams/*
213b0241248716b126a538457828a964e86109d58Matthew Williams * Copyright 2013 Google Inc.
313b0241248716b126a538457828a964e86109d58Matthew Williams *
413b0241248716b126a538457828a964e86109d58Matthew Williams * Licensed under the Apache License, Version 2.0 (the "License");
513b0241248716b126a538457828a964e86109d58Matthew Williams * you may not use this file except in compliance with the License.
613b0241248716b126a538457828a964e86109d58Matthew Williams * You may obtain a copy of the License at
713b0241248716b126a538457828a964e86109d58Matthew Williams *
813b0241248716b126a538457828a964e86109d58Matthew Williams *      http://www.apache.org/licenses/LICENSE-2.0
913b0241248716b126a538457828a964e86109d58Matthew Williams *
1013b0241248716b126a538457828a964e86109d58Matthew Williams * Unless required by applicable law or agreed to in writing, software
1113b0241248716b126a538457828a964e86109d58Matthew Williams * distributed under the License is distributed on an "AS IS" BASIS,
1213b0241248716b126a538457828a964e86109d58Matthew Williams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1313b0241248716b126a538457828a964e86109d58Matthew Williams * See the License for the specific language governing permissions and
1413b0241248716b126a538457828a964e86109d58Matthew Williams * limitations under the License.
1513b0241248716b126a538457828a964e86109d58Matthew Williams */
1613b0241248716b126a538457828a964e86109d58Matthew Williams
1713b0241248716b126a538457828a964e86109d58Matthew Williamspackage com.android.demo.jobSchedulerApp.service;
1813b0241248716b126a538457828a964e86109d58Matthew Williams
197060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tateimport android.app.job.JobInfo;
207060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tateimport android.app.job.JobScheduler;
217060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tateimport android.app.job.JobParameters;
227060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tateimport android.app.job.JobService;
23ee410da42b6b8352213f03f7725fd041f703b035Matthew Williamsimport android.content.ComponentName;
2413b0241248716b126a538457828a964e86109d58Matthew Williamsimport android.content.Context;
2513b0241248716b126a538457828a964e86109d58Matthew Williamsimport android.content.Intent;
26ee410da42b6b8352213f03f7725fd041f703b035Matthew Williamsimport android.os.AsyncTask;
2713b0241248716b126a538457828a964e86109d58Matthew Williamsimport android.os.Message;
2813b0241248716b126a538457828a964e86109d58Matthew Williamsimport android.os.Messenger;
2913b0241248716b126a538457828a964e86109d58Matthew Williamsimport android.os.RemoteException;
3013b0241248716b126a538457828a964e86109d58Matthew Williamsimport android.util.Log;
31ee410da42b6b8352213f03f7725fd041f703b035Matthew Williamsimport android.util.SparseArray;
3203a4da6e8e92b19c1345016c06694cb3aabbfc27Matthew Williamsimport android.widget.Toast;
3313b0241248716b126a538457828a964e86109d58Matthew Williams
3413b0241248716b126a538457828a964e86109d58Matthew Williamsimport com.android.demo.jobSchedulerApp.MainActivity;
3513b0241248716b126a538457828a964e86109d58Matthew Williams
36ee410da42b6b8352213f03f7725fd041f703b035Matthew Williamsimport java.util.HashMap;
3713b0241248716b126a538457828a964e86109d58Matthew Williamsimport java.util.LinkedList;
38ee410da42b6b8352213f03f7725fd041f703b035Matthew Williamsimport java.util.Random;
3913b0241248716b126a538457828a964e86109d58Matthew Williams
4013b0241248716b126a538457828a964e86109d58Matthew Williams
4113b0241248716b126a538457828a964e86109d58Matthew Williams/**
4213b0241248716b126a538457828a964e86109d58Matthew Williams * Service to handle sync requests.
4313b0241248716b126a538457828a964e86109d58Matthew Williams * <p>
4413b0241248716b126a538457828a964e86109d58Matthew Williams * This service is invoked in response to Intents with action android.content.SyncAdapter, and
4513b0241248716b126a538457828a964e86109d58Matthew Williams * returns a Binder connection to SyncAdapter.
4613b0241248716b126a538457828a964e86109d58Matthew Williams * <p>
4713b0241248716b126a538457828a964e86109d58Matthew Williams * For performance, only one sync adapter will be initialized within this application's context.
4813b0241248716b126a538457828a964e86109d58Matthew Williams * <p>
4913b0241248716b126a538457828a964e86109d58Matthew Williams * Note: The SyncService itself is not notified when a new sync occurs. It's role is to manage the
5013b0241248716b126a538457828a964e86109d58Matthew Williams * lifecycle of our and provide a handle to said SyncAdapter to the OS on
5113b0241248716b126a538457828a964e86109d58Matthew Williams * request.
5213b0241248716b126a538457828a964e86109d58Matthew Williams */
537060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tatepublic class TestJobService extends JobService {
5413b0241248716b126a538457828a964e86109d58Matthew Williams    private static final String TAG = "SyncService";
5513b0241248716b126a538457828a964e86109d58Matthew Williams
5613b0241248716b126a538457828a964e86109d58Matthew Williams    @Override
5713b0241248716b126a538457828a964e86109d58Matthew Williams    public void onCreate() {
5813b0241248716b126a538457828a964e86109d58Matthew Williams        super.onCreate();
5913b0241248716b126a538457828a964e86109d58Matthew Williams        Log.i(TAG, "Service created");
6013b0241248716b126a538457828a964e86109d58Matthew Williams    }
6113b0241248716b126a538457828a964e86109d58Matthew Williams
6213b0241248716b126a538457828a964e86109d58Matthew Williams    @Override
6313b0241248716b126a538457828a964e86109d58Matthew Williams    public void onDestroy() {
6413b0241248716b126a538457828a964e86109d58Matthew Williams        super.onDestroy();
6513b0241248716b126a538457828a964e86109d58Matthew Williams        Log.i(TAG, "Service destroyed");
6613b0241248716b126a538457828a964e86109d58Matthew Williams    }
6713b0241248716b126a538457828a964e86109d58Matthew Williams
6813b0241248716b126a538457828a964e86109d58Matthew Williams    @Override
6913b0241248716b126a538457828a964e86109d58Matthew Williams    public int onStartCommand(Intent intent, int flags, int startId) {
7013b0241248716b126a538457828a964e86109d58Matthew Williams        Messenger callback = intent.getParcelableExtra("messenger");
7113b0241248716b126a538457828a964e86109d58Matthew Williams        Message m = Message.obtain();
7213b0241248716b126a538457828a964e86109d58Matthew Williams        m.what = MainActivity.MSG_SERVICE_OBJ;
7313b0241248716b126a538457828a964e86109d58Matthew Williams        m.obj = this;
7413b0241248716b126a538457828a964e86109d58Matthew Williams        try {
7513b0241248716b126a538457828a964e86109d58Matthew Williams            callback.send(m);
7613b0241248716b126a538457828a964e86109d58Matthew Williams        } catch (RemoteException e) {
7713b0241248716b126a538457828a964e86109d58Matthew Williams            Log.e(TAG, "Error passing service object back to activity.");
7813b0241248716b126a538457828a964e86109d58Matthew Williams        }
7913b0241248716b126a538457828a964e86109d58Matthew Williams        return START_NOT_STICKY;
8013b0241248716b126a538457828a964e86109d58Matthew Williams    }
8113b0241248716b126a538457828a964e86109d58Matthew Williams
8213b0241248716b126a538457828a964e86109d58Matthew Williams    @Override
837060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tate    public boolean onStartJob(JobParameters params) {
84ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams        Log.i(TAG, "on start job: " + params.getJobId());
85ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams        currentId++;
86ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams        jobParamsMap.put(currentId, params);
87ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams        final int currId = this.currentId;
8813b0241248716b126a538457828a964e86109d58Matthew Williams        if (mActivity != null) {
897060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tate            mActivity.onReceivedStartJob(params);
9013b0241248716b126a538457828a964e86109d58Matthew Williams        }
91ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams
9203a4da6e8e92b19c1345016c06694cb3aabbfc27Matthew Williams        Toast.makeText(
9303a4da6e8e92b19c1345016c06694cb3aabbfc27Matthew Williams                this, "On start job: '" + params.getJobId() + "' deadline exceeded: " +
9403a4da6e8e92b19c1345016c06694cb3aabbfc27Matthew Williams                        params.isOverrideDeadlineExpired(),
9503a4da6e8e92b19c1345016c06694cb3aabbfc27Matthew Williams                Toast.LENGTH_LONG).show();
9603a4da6e8e92b19c1345016c06694cb3aabbfc27Matthew Williams
9713b0241248716b126a538457828a964e86109d58Matthew Williams        return true;
9813b0241248716b126a538457828a964e86109d58Matthew Williams    }
9913b0241248716b126a538457828a964e86109d58Matthew Williams
100ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams
10113b0241248716b126a538457828a964e86109d58Matthew Williams    @Override
1027060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tate    public boolean onStopJob(JobParameters params) {
1037060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tate        Log.i(TAG, "on stop job: " + params.getJobId());
104ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams        int ind = jobParamsMap.indexOfValue(params);
105ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams        jobParamsMap.remove(ind);
106ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams        mActivity.onReceivedStopJob();
10703a4da6e8e92b19c1345016c06694cb3aabbfc27Matthew Williams        return false; // no reschedule
10813b0241248716b126a538457828a964e86109d58Matthew Williams    }
10913b0241248716b126a538457828a964e86109d58Matthew Williams
110ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams    static int currentId = 0;
11113b0241248716b126a538457828a964e86109d58Matthew Williams    MainActivity mActivity;
112ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams    private final SparseArray<JobParameters> jobParamsMap = new SparseArray<JobParameters>();
113ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams
11413b0241248716b126a538457828a964e86109d58Matthew Williams
11513b0241248716b126a538457828a964e86109d58Matthew Williams    public void setUiCallback(MainActivity activity) {
11613b0241248716b126a538457828a964e86109d58Matthew Williams        mActivity = activity;
11713b0241248716b126a538457828a964e86109d58Matthew Williams    }
11813b0241248716b126a538457828a964e86109d58Matthew Williams
11913b0241248716b126a538457828a964e86109d58Matthew Williams    /** Send job to the JobScheduler. */
120ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams    public void scheduleJob(JobInfo job) {
121ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams        Log.d(TAG, "Scheduling job " + job);
1227060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tate        JobScheduler tm =
1237060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tate                (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
124ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams        tm.schedule(job);
12513b0241248716b126a538457828a964e86109d58Matthew Williams    }
12613b0241248716b126a538457828a964e86109d58Matthew Williams
1277060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tate    public boolean callJobFinished() {
128ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams        if (jobParamsMap.size() == 0) {
129ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams            return false;
130ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams        }
131ee410da42b6b8352213f03f7725fd041f703b035Matthew Williams        JobParameters params = jobParamsMap.valueAt(0);
13213b0241248716b126a538457828a964e86109d58Matthew Williams        if (params == null) {
13313b0241248716b126a538457828a964e86109d58Matthew Williams            return false;
13413b0241248716b126a538457828a964e86109d58Matthew Williams        } else {
1357060b04f6d92351b67222e636ab378a0273bf3e7Christopher Tate            jobFinished(params, false);
13603a4da6e8e92b19c1345016c06694cb3aabbfc27Matthew Williams            jobParamsMap.removeAt(0);
13713b0241248716b126a538457828a964e86109d58Matthew Williams            return true;
13813b0241248716b126a538457828a964e86109d58Matthew Williams        }
13913b0241248716b126a538457828a964e86109d58Matthew Williams    }
14013b0241248716b126a538457828a964e86109d58Matthew Williams
14113b0241248716b126a538457828a964e86109d58Matthew Williams}
142