1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.jobscheduler.cts.jobtestapp;
18 
19 import android.app.job.JobInfo;
20 import android.app.job.JobScheduler;
21 import android.content.BroadcastReceiver;
22 import android.content.ComponentName;
23 import android.content.Context;
24 import android.content.Intent;
25 import android.os.Bundle;
26 import android.util.Log;
27 
28 /**
29  * Schedules jobs for this package but does not, by itself, occupy a foreground uid state
30  * while doing so.
31  */
32 public class TestJobSchedulerReceiver extends BroadcastReceiver {
33     private static final String TAG = TestJobSchedulerReceiver.class.getSimpleName();
34     private static final String PACKAGE_NAME = "android.jobscheduler.cts.jobtestapp";
35 
36     public static final String ACTION_JOB_SCHEDULE_RESULT =
37             PACKAGE_NAME + ".action.SCHEDULE_RESULT";
38     public static final String EXTRA_SCHEDULE_RESULT = PACKAGE_NAME + ".extra.SCHEDULE_RESULT";
39 
40     public static final String EXTRA_JOB_ID_KEY = PACKAGE_NAME + ".extra.JOB_ID";
41     public static final String EXTRA_ALLOW_IN_IDLE = PACKAGE_NAME + ".extra.ALLOW_IN_IDLE";
42     public static final String EXTRA_REQUIRED_NETWORK_TYPE =
43             PACKAGE_NAME + ".extra.REQUIRED_NETWORK_TYPE";
44     public static final String EXTRA_AS_EXPEDITED = PACKAGE_NAME + ".extra.AS_EXPEDITED";
45     public static final String EXTRA_REQUEST_JOB_UID_STATE =
46             PACKAGE_NAME + ".extra.REQUEST_JOB_UID_STATE";
47     public static final String ACTION_SCHEDULE_JOB = PACKAGE_NAME + ".action.SCHEDULE_JOB";
48     public static final String ACTION_CANCEL_JOBS = PACKAGE_NAME + ".action.CANCEL_JOBS";
49     public static final int JOB_INITIAL_BACKOFF = 10_000;
50 
51     @Override
onReceive(Context context, Intent intent)52     public void onReceive(Context context, Intent intent) {
53         final ComponentName jobServiceComponent = new ComponentName(context, TestJobService.class);
54         final JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
55         switch (intent.getAction()) {
56             case ACTION_CANCEL_JOBS:
57                 jobScheduler.cancelAll();
58                 Log.d(TAG, "Cancelled all jobs for " + context.getPackageName());
59                 break;
60             case ACTION_SCHEDULE_JOB:
61                 final int jobId = intent.getIntExtra(EXTRA_JOB_ID_KEY, hashCode());
62                 final boolean allowInIdle = intent.getBooleanExtra(EXTRA_ALLOW_IN_IDLE, false);
63                 final int networkType =
64                         intent.getIntExtra(EXTRA_REQUIRED_NETWORK_TYPE, JobInfo.NETWORK_TYPE_NONE);
65                 final boolean expedited = intent.getBooleanExtra(EXTRA_AS_EXPEDITED, false);
66                 final boolean requestJobUidState = intent.getBooleanExtra(
67                         EXTRA_REQUEST_JOB_UID_STATE, false);
68                 final Bundle extras = new Bundle();
69                 extras.putBoolean(EXTRA_REQUEST_JOB_UID_STATE, requestJobUidState);
70                 JobInfo.Builder jobBuilder = new JobInfo.Builder(jobId, jobServiceComponent)
71                         .setBackoffCriteria(JOB_INITIAL_BACKOFF, JobInfo.BACKOFF_POLICY_LINEAR)
72                         .setTransientExtras(extras)
73                         .setImportantWhileForeground(allowInIdle)
74                         .setExpedited(expedited)
75                         .setRequiredNetworkType(networkType);
76                 final int result = jobScheduler.schedule(jobBuilder.build());
77                 if (result != JobScheduler.RESULT_SUCCESS) {
78                     Log.e(TAG, "Could not schedule job " + jobId);
79                 } else {
80                     Log.d(TAG, "Successfully scheduled job with id " + jobId);
81                 }
82 
83                 final Intent scheduleJobResultIntent = new Intent(ACTION_JOB_SCHEDULE_RESULT);
84                 scheduleJobResultIntent.putExtra(EXTRA_SCHEDULE_RESULT, result);
85                 context.sendBroadcast(scheduleJobResultIntent);
86                 break;
87             default:
88                 Log.e(TAG, "Unknown action " + intent.getAction());
89         }
90     }
91 }