1 /* 2 * Copyright (C) 2024 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 com.android.adservices.shared.spe; 18 19 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_BACKGROUND_JOBS_EXECUTION_REPORTED__EXECUTION_RESULT_CODE__SKIP_FOR_EXTSERVICES_JOB_ON_TPLUS; 20 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_BACKGROUND_JOBS_EXECUTION_REPORTED__EXECUTION_RESULT_CODE__SKIP_FOR_JOB_NOT_CONFIGURED; 21 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_BACKGROUND_JOBS_EXECUTION_REPORTED__EXECUTION_RESULT_CODE__SKIP_FOR_KILL_SWITCH_ON; 22 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_BACKGROUND_JOBS_EXECUTION_REPORTED__EXECUTION_RESULT_CODE__SKIP_FOR_USER_CONSENT_REVOKED; 23 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__ERROR_CODE__SPE_JOB_SCHEDULER_IS_UNAVAILABLE; 24 import static com.android.adservices.service.stats.AdServicesStatsLog.BACKGROUND_JOB_SCHEDULING_REPORTED__MODULE_NAME__UNKNOWN_MODULE_NAME; 25 import static com.android.adservices.service.stats.AdServicesStatsLog.BACKGROUND_JOB_SCHEDULING_REPORTED__RESULT_CODE__SCHEDULING_RESULT_CODE_FAILED; 26 import static com.android.adservices.service.stats.AdServicesStatsLog.BACKGROUND_JOB_SCHEDULING_REPORTED__RESULT_CODE__SCHEDULING_RESULT_CODE_SKIPPED; 27 import static com.android.adservices.service.stats.AdServicesStatsLog.BACKGROUND_JOB_SCHEDULING_REPORTED__RESULT_CODE__SCHEDULING_RESULT_CODE_SUCCESSFUL; 28 import static com.android.adservices.service.stats.AdServicesStatsLog.BACKGROUND_JOB_SCHEDULING_REPORTED__SCHEDULER_TYPE__SCHEDULER_TYPE_JOB_SCHEDULER; 29 import static com.android.adservices.service.stats.AdServicesStatsLog.BACKGROUND_JOB_SCHEDULING_REPORTED__SCHEDULER_TYPE__SCHEDULER_TYPE_SPE; 30 31 import android.annotation.IntDef; 32 import android.app.job.JobParameters; 33 34 import java.lang.annotation.Retention; 35 import java.lang.annotation.RetentionPolicy; 36 37 /** Class to store constants used by background jobs. */ 38 public final class JobServiceConstants { 39 /** 40 * Unavailable stop reason, used when {@link 41 * android.app.job.JobService#onStopJob(JobParameters)} is not invoked in an execution. 42 * 43 * <p>Use the value of {@link JobParameters#STOP_REASON_UNDEFINED} in case API version is lower 44 * than S. 45 */ 46 public static final int UNAVAILABLE_STOP_REASON = 0; 47 48 /** The shared preference file name for background jobs */ 49 public static final String SHARED_PREFS_BACKGROUND_JOBS = "PPAPI_Background_Jobs"; 50 51 /** The suffix to compose the key to store job start timestamp */ 52 public static final String SHARED_PREFS_START_TIMESTAMP_SUFFIX = "_job_start_timestamp"; 53 54 /** The suffix to compose the key to store job stop timestamp */ 55 public static final String SHARED_PREFS_STOP_TIMESTAMP_SUFFIX = "_job_stop_timestamp"; 56 57 /** The suffix to compose the key to store job execution period */ 58 public static final String SHARED_PREFS_EXEC_PERIOD_SUFFIX = "_job_execution_period"; 59 60 /** A utility string key that should NEVER be fetched */ 61 public static final String UNAVAILABLE_KEY = "unavailableKey"; 62 63 /** 64 * Value of the execution start timestamp when it's unavailable to achieve. For example, the 65 * shared preference key doesn't exist. 66 */ 67 public static final long UNAVAILABLE_JOB_EXECUTION_START_TIMESTAMP = -1L; 68 69 /** 70 * Value of the execution stop timestamp when it's unavailable to achieve. For example, the 71 * shared preference key doesn't exist. 72 */ 73 public static final long UNAVAILABLE_JOB_EXECUTION_STOP_TIMESTAMP = -1L; 74 75 /** 76 * Value of the execution period when it's unavailable to achieve, such as in the first 77 * execution. 78 */ 79 public static final long UNAVAILABLE_JOB_EXECUTION_PERIOD = -1L; 80 81 /** 82 * Value of the execution latency if it cannot be computed, such as an open-end execution caused 83 * by system or device issue. 84 */ 85 public static final long UNAVAILABLE_JOB_LATENCY = -1L; 86 87 /** The number of milliseconds per minute. */ 88 public static final int MILLISECONDS_PER_MINUTE = 60 * 1000; 89 90 /** Minimum allowed interval for periodic jobs, in minutes. */ 91 public static final long MIN_PERIODIC_INTERVAL_MINUTES = 15; 92 93 /** Minimum allowed flex interval for periodic jobs, in minutes. */ 94 public static final long MIN_FLEX_INTERVAL_MINUTES = 5; 95 96 /** 97 * Minimum allowed flex interval for periodic jobs, expressed as a percentage of the periodic 98 * interval. 99 */ 100 public static final double MIN_FLEX_INTERVAL_PERCENTAGE = 0.05; 101 102 /** Maximum possible percentage for percentage variables. */ 103 public static final int MAX_PERCENTAGE = 100; 104 105 /** A shorter version of error code for job scheduler is not available. */ 106 public static final int ERROR_CODE_JOB_SCHEDULER_IS_UNAVAILABLE = 107 AD_SERVICES_ERROR_REPORTED__ERROR_CODE__SPE_JOB_SCHEDULER_IS_UNAVAILABLE; 108 109 @IntDef( 110 value = { 111 JOB_ENABLED_STATUS_ENABLED, 112 JOB_ENABLED_STATUS_DISABLED_FOR_KILL_SWITCH_ON, 113 JOB_ENABLED_STATUS_DISABLED_FOR_USER_CONSENT_REVOKED, 114 JOB_ENABLED_STATUS_DISABLED_FOR_BACK_COMPAT_OTA, 115 }) 116 @Retention(RetentionPolicy.SOURCE) 117 public @interface JobEnablementStatus {} 118 119 /** The job is enabled. */ 120 public static final int JOB_ENABLED_STATUS_ENABLED = -1; 121 122 /** The job is disabled due to kill switch is ON. */ 123 public static final int JOB_ENABLED_STATUS_DISABLED_FOR_KILL_SWITCH_ON = 124 AD_SERVICES_BACKGROUND_JOBS_EXECUTION_REPORTED__EXECUTION_RESULT_CODE__SKIP_FOR_KILL_SWITCH_ON; 125 126 /** The job is disabled due to user consent is revoked. */ 127 public static final int JOB_ENABLED_STATUS_DISABLED_FOR_USER_CONSENT_REVOKED = 128 AD_SERVICES_BACKGROUND_JOBS_EXECUTION_REPORTED__EXECUTION_RESULT_CODE__SKIP_FOR_USER_CONSENT_REVOKED; 129 130 /** The job is disabled due to ExtServices' job running on AdServices */ 131 public static final int JOB_ENABLED_STATUS_DISABLED_FOR_BACK_COMPAT_OTA = 132 AD_SERVICES_BACKGROUND_JOBS_EXECUTION_REPORTED__EXECUTION_RESULT_CODE__SKIP_FOR_EXTSERVICES_JOB_ON_TPLUS; 133 134 /** The job is disabled due to misconfiguration in SPE framework. */ 135 public static final int SKIP_REASON_JOB_NOT_CONFIGURED = 136 AD_SERVICES_BACKGROUND_JOBS_EXECUTION_REPORTED__EXECUTION_RESULT_CODE__SKIP_FOR_JOB_NOT_CONFIGURED; 137 138 /** Shorter version for scheduler type - SPE. */ 139 public static final int SCHEDULER_TYPE_SPE = 140 BACKGROUND_JOB_SCHEDULING_REPORTED__SCHEDULER_TYPE__SCHEDULER_TYPE_SPE; 141 142 /** Shorter version for scheduler type - Job Scheduler. */ 143 public static final int SCHEDULER_TYPE_JOB_SCHEDULER = 144 BACKGROUND_JOB_SCHEDULING_REPORTED__SCHEDULER_TYPE__SCHEDULER_TYPE_JOB_SCHEDULER; 145 146 /** Shorter version for unknown module name. */ 147 public static final int EXECUTION_LOGGING_UNKNOWN_MODULE_NAME = 148 BACKGROUND_JOB_SCHEDULING_REPORTED__MODULE_NAME__UNKNOWN_MODULE_NAME; 149 150 /** Shorter version for unknown module name. */ 151 public static final int SCHEDULING_LOGGING_UNKNOWN_MODULE_NAME = 152 BACKGROUND_JOB_SCHEDULING_REPORTED__MODULE_NAME__UNKNOWN_MODULE_NAME; 153 154 @IntDef( 155 value = { 156 SCHEDULING_RESULT_CODE_SUCCESSFUL, 157 SCHEDULING_RESULT_CODE_FAILED, 158 SCHEDULING_RESULT_CODE_SKIPPED, 159 }) 160 @Retention(RetentionPolicy.SOURCE) 161 public @interface JobSchedulingResultCode {} 162 163 public static final int SCHEDULING_RESULT_CODE_SUCCESSFUL = 164 BACKGROUND_JOB_SCHEDULING_REPORTED__RESULT_CODE__SCHEDULING_RESULT_CODE_SUCCESSFUL; 165 166 public static final int SCHEDULING_RESULT_CODE_FAILED = 167 BACKGROUND_JOB_SCHEDULING_REPORTED__RESULT_CODE__SCHEDULING_RESULT_CODE_FAILED; 168 169 public static final int SCHEDULING_RESULT_CODE_SKIPPED = 170 BACKGROUND_JOB_SCHEDULING_REPORTED__RESULT_CODE__SCHEDULING_RESULT_CODE_SKIPPED; 171 172 /** The prefix of the error thrown from JobScheduler when an app schedules too many jobs. */ 173 public static final String ERROR_MESSAGE_TOO_MANY_JOBS_SCHEDULED = 174 "Apps may not schedule more than"; 175 } 176