/* * Copyright 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.demo.jobSchedulerApp; import android.app.Activity; import android.app.job.JobInfo; import android.app.job.JobParameters; import android.app.job.JobScheduler; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Messenger; import android.text.TextUtils; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import android.widget.RadioButton; import android.widget.TextView; import android.widget.Toast; import com.android.demo.jobSchedulerApp.service.TestJobService; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; public static final int MSG_UNCOLOUR_START = 0; public static final int MSG_UNCOLOUR_STOP = 1; public static final int MSG_SERVICE_OBJ = 2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Resources res = getResources(); defaultColor = getColor(R.color.none_received); startJobColor = getColor(R.color.start_received); stopJobColor = getColor(R.color.stop_received); // Set up UI. mShowStartView = findViewById(R.id.onstart_textview); mShowStopView = findViewById(R.id.onstop_textview); mParamsTextView = findViewById(R.id.task_params); mDelayEditText = findViewById(R.id.delay_time); mDeadlineEditText = findViewById(R.id.deadline_time); mWiFiConnectivityRadioButton = findViewById(R.id.checkbox_unmetered); mAnyConnectivityRadioButton = findViewById(R.id.checkbox_any); mCellConnectivityRadioButton = findViewById(R.id.checkbox_metered); mRequiresChargingCheckBox = findViewById(R.id.checkbox_charging); mRequiresIdleCheckbox = findViewById(R.id.checkbox_idle); mIsPersistedCheckbox = findViewById(R.id.checkbox_persisted); mServiceComponent = new ComponentName(this, TestJobService.class); // Start service and provide it a way to communicate with us. Intent startServiceIntent = new Intent(this, TestJobService.class); startServiceIntent.putExtra("messenger", new Messenger(mHandler)); startService(startServiceIntent); } // UI fields. int defaultColor; int startJobColor; int stopJobColor; TextView mShowStartView; TextView mShowStopView; TextView mParamsTextView; EditText mDelayEditText; EditText mDeadlineEditText; RadioButton mWiFiConnectivityRadioButton; RadioButton mAnyConnectivityRadioButton; RadioButton mCellConnectivityRadioButton; CheckBox mRequiresChargingCheckBox; CheckBox mRequiresIdleCheckbox; CheckBox mIsPersistedCheckbox; ComponentName mServiceComponent; /** Service object to interact scheduled jobs. */ TestJobService mTestService; private static int kJobId = 0; Handler mHandler = new Handler(/* default looper */) { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_UNCOLOUR_START: mShowStartView.setBackgroundColor(defaultColor); break; case MSG_UNCOLOUR_STOP: mShowStopView.setBackgroundColor(defaultColor); break; case MSG_SERVICE_OBJ: mTestService = (TestJobService) msg.obj; mTestService.setUiCallback(MainActivity.this); } } }; private boolean ensureTestService() { if (mTestService == null) { Toast.makeText(MainActivity.this, "Service null, never got callback?", Toast.LENGTH_SHORT).show(); return false; } return true; } /** * UI onclick listener to schedule a job. What this job is is defined in * TestJobService#scheduleJob() */ public void scheduleJob(View v) { if (!ensureTestService()) { return; } JobInfo.Builder builder = new JobInfo.Builder(kJobId++, mServiceComponent); String delay = mDelayEditText.getText().toString(); if (delay != null && !TextUtils.isEmpty(delay)) { builder.setMinimumLatency(Long.parseLong(delay) * 1000); } String deadline = mDeadlineEditText.getText().toString(); if (deadline != null && !TextUtils.isEmpty(deadline)) { builder.setOverrideDeadline(Long.parseLong(deadline) * 1000); } boolean requiresUnmetered = mWiFiConnectivityRadioButton.isChecked(); boolean requiresMetered = mCellConnectivityRadioButton.isChecked(); boolean requiresAnyConnectivity = mAnyConnectivityRadioButton.isChecked(); if (requiresUnmetered) { builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); } else if (requiresMetered) { builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_METERED); } else if (requiresAnyConnectivity) { builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); } builder.setRequiresDeviceIdle(mRequiresIdleCheckbox.isChecked()); builder.setRequiresCharging(mRequiresChargingCheckBox.isChecked()); builder.setPersisted(mIsPersistedCheckbox.isChecked()); mTestService.scheduleJob(builder.build()); } public void cancelAllJobs(View v) { JobScheduler tm = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); tm.cancelAll(); } /** * UI onclick listener to call jobFinished() in our service. */ public void finishJob(View v) { if (!ensureTestService()) { return; } mTestService.callJobFinished(); mParamsTextView.setText(""); } public void onReceivedStartJob(JobParameters params) { mShowStartView.setBackgroundColor(startJobColor); Message m = Message.obtain(mHandler, MSG_UNCOLOUR_START); mHandler.sendMessageDelayed(m, 1000L); // uncolour in 1 second. mParamsTextView.setText("Executing: " + params.getJobId() + " " + params.getExtras()); } public void onReceivedStopJob() { mShowStopView.setBackgroundColor(stopJobColor); Message m = Message.obtain(mHandler, MSG_UNCOLOUR_STOP); mHandler.sendMessageDelayed(m, 2000L); // uncolour in 1 second. mParamsTextView.setText(""); } }