From b125801b576b78baa03fb65c185e886dd1a6a978 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Wed, 12 Jul 2023 15:02:49 -0700 Subject: [PATCH] [SettingsProvider] use JobScheduler.forNamespace to avoid conflicting jobs Job IDs needs to be unique per UID, but SettingsProvider shares the system UID so there's high chance of job-id collision. Use JobScheduler.forNamespace to avoid it. BUG: 289319662 Test: manual by changing job criteria and observe the job is executed Change-Id: I577732e4f0d5bc13287790a17b59f1a42083feae --- .../src/com/android/providers/settings/SettingsProvider.java | 4 +++- .../settings/WriteFallbackSettingsFilesJobService.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 1784e48401519..16c5c36b73f19 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -246,6 +246,7 @@ public class SettingsProvider extends ContentProvider { public static final String RESULT_ROWS_DELETED = "result_rows_deleted"; public static final String RESULT_SETTINGS_LIST = "result_settings_list"; + public static final String SETTINGS_PROVIDER_JOBS_NS = "SettingsProviderJobsNamespace"; // Used for scheduling jobs to make a copy for the settings files public static final int WRITE_FALLBACK_SETTINGS_FILES_JOB_ID = 1; public static final long ONE_DAY_INTERVAL_MILLIS = 24 * 60 * 60 * 1000L; @@ -2762,12 +2763,13 @@ public class SettingsProvider extends ContentProvider { */ public void scheduleWriteFallbackFilesJob() { final Context context = getContext(); - final JobScheduler jobScheduler = + JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); if (jobScheduler == null) { // Might happen: SettingsProvider is created before JobSchedulerService in system server return; } + jobScheduler = jobScheduler.forNamespace(SETTINGS_PROVIDER_JOBS_NS); // Check if the job is already scheduled. If so, skip scheduling another one if (jobScheduler.getPendingJob(WRITE_FALLBACK_SETTINGS_FILES_JOB_ID) != null) { return; diff --git a/packages/SettingsProvider/src/com/android/providers/settings/WriteFallbackSettingsFilesJobService.java b/packages/SettingsProvider/src/com/android/providers/settings/WriteFallbackSettingsFilesJobService.java index 66aa7baa3b51b..91e8bf83b4fa0 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/WriteFallbackSettingsFilesJobService.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/WriteFallbackSettingsFilesJobService.java @@ -16,6 +16,7 @@ package com.android.providers.settings; +import static com.android.providers.settings.SettingsProvider.SETTINGS_PROVIDER_JOBS_NS; import static com.android.providers.settings.SettingsProvider.TABLE_CONFIG; import static com.android.providers.settings.SettingsProvider.TABLE_GLOBAL; import static com.android.providers.settings.SettingsProvider.TABLE_SECURE; @@ -35,7 +36,8 @@ import java.util.List; public class WriteFallbackSettingsFilesJobService extends JobService { @Override public boolean onStartJob(final JobParameters params) { - if (params.getJobId() != WRITE_FALLBACK_SETTINGS_FILES_JOB_ID) { + if (!SETTINGS_PROVIDER_JOBS_NS.equals(params.getJobNamespace()) + || params.getJobId() != WRITE_FALLBACK_SETTINGS_FILES_JOB_ID) { return false; } final List settingsFiles = new ArrayList<>();