| /* |
| * Copyright (C) 2017 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.voicemail.impl; |
| |
| import android.app.job.JobInfo; |
| import android.app.job.JobInfo.TriggerContentUri; |
| import android.app.job.JobParameters; |
| import android.app.job.JobScheduler; |
| import android.app.job.JobService; |
| import android.app.job.JobWorkItem; |
| import android.content.ComponentName; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.provider.Settings; |
| import android.provider.Settings.Global; |
| import android.support.annotation.VisibleForTesting; |
| import android.telecom.PhoneAccountHandle; |
| import com.android.dialer.constants.ScheduledJobIds; |
| |
| /** |
| * JobService triggered when the setup wizard is completed, and rerun all {@link ActivationTask} |
| * scheduled during the setup. |
| */ |
| public class DeviceProvisionedJobService extends JobService { |
| |
| @VisibleForTesting static final String EXTRA_PHONE_ACCOUNT_HANDLE = "EXTRA_PHONE_ACCOUNT_HANDLE"; |
| |
| /** Queue the phone account to be reactivated after the setup wizard has completed. */ |
| public static void activateAfterProvisioned( |
| Context context, PhoneAccountHandle phoneAccountHandle) { |
| Intent intent = new Intent(); |
| intent.putExtra(EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle); |
| context |
| .getSystemService(JobScheduler.class) |
| .enqueue(createJobInfo(context), new JobWorkItem(intent)); |
| } |
| |
| @Override |
| public boolean onStartJob(JobParameters params) { |
| if (!isDeviceProvisioned()) { |
| VvmLog.i("DeviceProvisionedJobService.onStartJob", "device not provisioned, rescheduling"); |
| getSystemService(JobScheduler.class).schedule(createJobInfo(this)); |
| return false; // job not running in background |
| } |
| VvmLog.i("DeviceProvisionedJobService.onStartJob", "device provisioned"); |
| for (JobWorkItem item = params.dequeueWork(); item != null; item = params.dequeueWork()) { |
| PhoneAccountHandle phoneAccountHandle = |
| item.getIntent().getParcelableExtra(EXTRA_PHONE_ACCOUNT_HANDLE); |
| VvmLog.i( |
| "DeviceProvisionedJobService.onStartJob", |
| "restarting activation for " + phoneAccountHandle); |
| ActivationTask.start(this, phoneAccountHandle, null); |
| } |
| return false; // job not running in background |
| } |
| |
| @Override |
| public boolean onStopJob(JobParameters params) { |
| return true; // reschedule job |
| } |
| |
| private boolean isDeviceProvisioned() { |
| return Settings.Global.getInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0) == 1; |
| } |
| |
| private static JobInfo createJobInfo(Context context) { |
| return new JobInfo.Builder( |
| ScheduledJobIds.VVM_DEVICE_PROVISIONED_JOB, |
| new ComponentName(context, DeviceProvisionedJobService.class)) |
| .addTriggerContentUri(new TriggerContentUri(Global.getUriFor(Global.DEVICE_PROVISIONED), 0)) |
| // VVM activation must be run as soon as possible to avoid voicemail loss |
| .setTriggerContentMaxDelay(0) |
| .build(); |
| } |
| } |