diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-11-04 00:41:00 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-11-04 00:41:00 +0000 |
commit | 725bf3e2372b8ab29e521e864d28770fdf2c0443 (patch) | |
tree | d094f43841ac9dc9c54fd96ffd940b6f71f8ba39 /adservices/service-core/java/com/android/adservices/service/measurement/DeleteUninstalledJobService.java | |
parent | 190c25efdbd5a5bdbb41a2818cf39a05d0ea9be0 (diff) | |
parent | 7b99dc653ed133fef81d0423fee87d45299097e2 (diff) | |
download | AdServices-725bf3e2372b8ab29e521e864d28770fdf2c0443.tar.gz |
Snap for 9254005 from 7b99dc653ed133fef81d0423fee87d45299097e2 to mainline-ipsec-releaseaml_ips_331910010aml_ips_331312000aml_ips_331310000android13-mainline-ipsec-release
Change-Id: Id77860bb313cd5104abdea4a778d197a1db28861
Diffstat (limited to 'adservices/service-core/java/com/android/adservices/service/measurement/DeleteUninstalledJobService.java')
-rw-r--r-- | adservices/service-core/java/com/android/adservices/service/measurement/DeleteUninstalledJobService.java | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/adservices/service-core/java/com/android/adservices/service/measurement/DeleteUninstalledJobService.java b/adservices/service-core/java/com/android/adservices/service/measurement/DeleteUninstalledJobService.java new file mode 100644 index 0000000000..175d9de1f2 --- /dev/null +++ b/adservices/service-core/java/com/android/adservices/service/measurement/DeleteUninstalledJobService.java @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2022 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.adservices.service.measurement; + +import static com.android.adservices.service.AdServicesConfig.MEASUREMENT_DELETE_UNINSTALLED_JOB_ID; + +import android.app.job.JobInfo; +import android.app.job.JobParameters; +import android.app.job.JobScheduler; +import android.app.job.JobService; +import android.content.ComponentName; +import android.content.Context; + +import com.android.adservices.LogUtil; +import com.android.adservices.concurrency.AdServicesExecutors; +import com.android.adservices.service.AdServicesConfig; +import com.android.adservices.service.FlagsFactory; +import com.android.internal.annotations.VisibleForTesting; + +import java.util.concurrent.Executor; + +/** + * Service for deleting data for uninstalled packages that the package change receiver has missed. + */ +public final class DeleteUninstalledJobService extends JobService { + private static final Executor sBackgroundExecutor = AdServicesExecutors.getBackgroundExecutor(); + + @Override + public void onCreate() { + super.onCreate(); + } + + @Override + public boolean onStartJob(JobParameters params) { + if (FlagsFactory.getFlags().getMeasurementJobDeleteUninstalledKillSwitch()) { + LogUtil.e("DeleteUninstalledJobService is disabled"); + return skipAndCancelBackgroundJob(params); + } + + LogUtil.d("DeleteUninstalledJobService.onStartJob"); + sBackgroundExecutor.execute( + () -> { + MeasurementImpl.getInstance(this).deleteAllUninstalledMeasurementData(); + jobFinished(params, /* wantsReschedule */ false); + }); + return true; + } + + @Override + public boolean onStopJob(JobParameters params) { + LogUtil.d("DeleteUninstalledJobService.onStopJob"); + return false; + } + + /** Schedule the job. */ + @VisibleForTesting + static void schedule(Context context, JobScheduler jobScheduler) { + final JobInfo job = + new JobInfo.Builder( + MEASUREMENT_DELETE_UNINSTALLED_JOB_ID, + new ComponentName(context, DeleteUninstalledJobService.class)) + .setRequiresDeviceIdle(true) + .setPeriodic(AdServicesConfig.getMeasurementDeleteExpiredJobPeriodMs()) + .setPersisted(true) + .build(); + jobScheduler.schedule(job); + } + + /** + * Schedule Delete Uninstalled Job Service if it is not already scheduled. + * + * @param context the context + * @param forceSchedule flag to indicate whether to force rescheduling the job. + */ + public static void scheduleIfNeeded(Context context, boolean forceSchedule) { + if (FlagsFactory.getFlags().getMeasurementJobDeleteUninstalledKillSwitch()) { + LogUtil.e("DeleteUninstalledJobService is disabled, skip scheduling"); + return; + } + + final JobScheduler jobScheduler = context.getSystemService(JobScheduler.class); + if (jobScheduler == null) { + LogUtil.e("JobScheduler not found"); + return; + } + + final JobInfo job = jobScheduler.getPendingJob(MEASUREMENT_DELETE_UNINSTALLED_JOB_ID); + // Schedule if it hasn't been scheduled already or force rescheduling. + if (job == null || forceSchedule) { + schedule(context, jobScheduler); + LogUtil.d("Scheduled DeleteUninstalledJobService"); + } else { + LogUtil.d("DeleteUninstalledJobService already scheduled, skipping reschedule"); + } + } + + private boolean skipAndCancelBackgroundJob(final JobParameters params) { + final JobScheduler jobScheduler = this.getSystemService(JobScheduler.class); + if (jobScheduler != null) { + jobScheduler.cancel(MEASUREMENT_DELETE_UNINSTALLED_JOB_ID); + } + // Tell the JobScheduler that the job has completed and does not need to be rescheduled. + jobFinished(params, /* wantsReschedule */ false); + + // Returning false meas that this job has completed its work. + return false; + } +} |