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.service.stats; 18 19 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_NAME__FETCH_AND_JOIN_CUSTOM_AUDIENCE; 20 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_NAME__GET_AD_SELECTION_DATA; 21 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_NAME__GET_TOPICS; 22 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE; 23 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE; 24 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_NAME__PERSIST_AD_SELECTION_RESULT; 25 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION; 26 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_NAME__REPORT_INTERACTION; 27 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_NAME__SCHEDULE_CUSTOM_AUDIENCE_UPDATE; 28 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_NAME__UPDATE_SIGNALS; 29 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__FETCH_AND_JOIN_CUSTOM_AUDIENCE; 30 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__GET_AD_SELECTION_DATA; 31 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__JOIN_CUSTOM_AUDIENCE; 32 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__LEAVE_CUSTOM_AUDIENCE; 33 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__PAS; 34 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__PERSIST_AD_SELECTION_RESULT; 35 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__PPAPI_NAME_UNSPECIFIED; 36 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__REPORT_IMPRESSION; 37 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__REPORT_INTERACTION; 38 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__SCHEDULE_CUSTOM_AUDIENCE_UPDATE; 39 import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__TOPICS; 40 41 import android.annotation.IntDef; 42 import android.os.Binder; 43 44 import com.android.adservices.errorlogging.ErrorLogUtil; 45 46 import java.lang.annotation.Retention; 47 import java.lang.annotation.RetentionPolicy; 48 49 /** 50 * Utility class containing status enum types and functions used by various stats objects. 51 * 52 * <p>Those status codes are internal only. 53 * 54 * @hide 55 */ 56 public class AdsRelevanceStatusUtils { 57 /** The Ad Filtering is UNSET process. */ 58 public static final int FILTER_PROCESS_TYPE_UNSET = 0; 59 /** The Ad Filtering is used in Custom Audiences process. */ 60 public static final int FILTER_PROCESS_TYPE_CUSTOM_AUDIENCES = 1; 61 /** The Ad Filtering is used in Contextual Ads process. */ 62 public static final int FILTER_PROCESS_TYPE_CONTEXTUAL_ADS = 2; 63 64 /** The beacon comes from UNSET winner. */ 65 public static final int BEACON_SOURCE_UNSET = 0; 66 /** The beacon comes from PROTECTED_SIGNALS winner. */ 67 public static final int BEACON_SOURCE_PROTECTED_SIGNALS = 1; 68 /** The beacon comes from CUSTOM_AUDIENCE winner. */ 69 public static final int BEACON_SOURCE_CUSTOM_AUDIENCE = 2; 70 71 /** The status of Json processing is UNSET. */ 72 public static final int JSON_PROCESSING_STATUS_UNSET = 0; 73 /** The status of Json processing is SUCCESS. */ 74 public static final int JSON_PROCESSING_STATUS_SUCCESS = 1; 75 /** The status of Json processing is TOO_BIG. */ 76 public static final int JSON_PROCESSING_STATUS_TOO_BIG = 2; 77 /** The status of Json processing is SYNTACTIC_ERROR. */ 78 public static final int JSON_PROCESSING_STATUS_SYNTACTIC_ERROR = 3; 79 /** The status of Json processing is SEMANTIC_ERROR. */ 80 public static final int JSON_PROCESSING_STATUS_SEMANTIC_ERROR = 4; 81 /** The status of Json processing is OTHER_ERROR. */ 82 public static final int JSON_PROCESSING_STATUS_OTHER_ERROR = 5; 83 84 /** The status of encoding fetch is UNSET. */ 85 public static final int ENCODING_FETCH_STATUS_UNSET = 0; 86 /** The status of encoding fetch is SUCCESS. */ 87 public static final int ENCODING_FETCH_STATUS_SUCCESS = 1; 88 /** The status of encoding fetch is TOO_BIG. */ 89 public static final int ENCODING_FETCH_STATUS_TOO_BIG = 2; 90 /** The status of encoding fetch is TIMEOUT. */ 91 public static final int ENCODING_FETCH_STATUS_TIMEOUT = 3; 92 /** The status of encoding fetch is NETWORK_FAILURE. */ 93 public static final int ENCODING_FETCH_STATUS_NETWORK_FAILURE = 4; 94 /** The status of encoding fetch is OTHER_FAILURE. */ 95 public static final int ENCODING_FETCH_STATUS_OTHER_FAILURE = 5; 96 97 /** The status of JavaScript run is UNSET. */ 98 public static final int JS_RUN_STATUS_UNSET = 0; 99 /** The status of JavaScript run is SUCCESS. */ 100 public static final int JS_RUN_STATUS_SUCCESS = 1; 101 /** The status of JavaScript run is TIMEOUT. */ 102 public static final int JS_RUN_STATUS_TIMEOUT = 2; 103 /** The status of JavaScript run is JS_SYNTAX_ERROR. */ 104 public static final int JS_RUN_STATUS_JS_SYNTAX_ERROR = 3; 105 /** The status of JavaScript run is OUTPUT_SYNTAX_ERROR. */ 106 public static final int JS_RUN_STATUS_OUTPUT_SYNTAX_ERROR = 4; 107 /** The status of JavaScript run is OUTPUT_SEMANTIC_ERROR. */ 108 public static final int JS_RUN_STATUS_OUTPUT_SEMANTIC_ERROR = 5; 109 /** The status of JavaScript run is OUTPUT_NON_ZERO_RESULT. */ 110 public static final int JS_RUN_STATUS_OUTPUT_NON_ZERO_RESULT = 6; 111 /** The status of JavaScript run is DB_PERSIST_FAILURE. */ 112 public static final int JS_RUN_STATUS_DB_PERSIST_FAILURE = 7; 113 /** The status of JavaScript run is OTHER_FAILURE. */ 114 public static final int JS_RUN_STATUS_OTHER_FAILURE = 8; 115 116 /** The status of JavaScript run is JS_REFERENCE_ERROR. */ 117 public static final int JS_RUN_STATUS_JS_REFERENCE_ERROR = 9; 118 119 /** The auction winner type is UNSET. */ 120 public static final int WINNER_TYPE_UNSET = 0; 121 /** The auction winner type is NO_WINNER. */ 122 public static final int WINNER_TYPE_NO_WINNER = 1; 123 /** The auction winner type is CA_WINNER. */ 124 public static final int WINNER_TYPE_CA_WINNER = 2; 125 /** The auction winner type is PAS_WINNER. */ 126 public static final int WINNER_TYPE_PAS_WINNER = 3; 127 128 /** Leaving the following 6 size type. 129 * These not tied to specific numbers gives us flexibility to change them later. */ 130 public static final int SIZE_UNSET = 0; 131 public static final int SIZE_VERY_SMALL = 1; 132 public static final int SIZE_SMALL = 2; 133 public static final int SIZE_MEDIUM = 3; 134 public static final int SIZE_LARGE = 4; 135 public static final int SIZE_VERY_LARGE = 5; 136 137 /** The auction coordinator source is UNSET. */ 138 public static final int SERVER_AUCTION_COORDINATOR_SOURCE_UNSET = 0; 139 /** The auction coordinator source is DEFAULT. */ 140 public static final int SERVER_AUCTION_COORDINATOR_SOURCE_DEFAULT = 1; 141 /** The auction coordinator source is API. */ 142 public static final int SERVER_AUCTION_COORDINATOR_SOURCE_API = 2; 143 144 // We expect most JSONs to be small, at least initially, so we'll bucket more there. 145 public static final long[] JSON_SIZE_BUCKETS = {100, 300, 1000, 5000}; 146 147 // Buckets for JS download latency in ms 148 public static final long[] JS_DOWNLOAD_LATENCY_BUCKETS = {50, 200, 1000, 2000}; 149 150 // Buckets for JS execution latency in ms 151 public static final long[] JS_EXECUTION_LATENCY_BUCKETS = {50, 200, 1000, 2000}; 152 153 /** The key fetch status is UNSET. */ 154 public static final int BACKGROUND_KEY_FETCH_STATUS_UNSET = 0; 155 /** The key fetch status is NO_OP. */ 156 public static final int BACKGROUND_KEY_FETCH_STATUS_NO_OP = 1; 157 /** The key fetch status is REFRESH_KEYS_INITIATED. */ 158 public static final int BACKGROUND_KEY_FETCH_STATUS_REFRESH_KEYS_INITIATED = 2; 159 160 /** The server auction key fetch source is UNSET. */ 161 public static final int SERVER_AUCTION_KEY_FETCH_SOURCE_UNSET = 0; 162 /** The server auction key fetch source is via a background fetch. */ 163 public static final int SERVER_AUCTION_KEY_FETCH_SOURCE_BACKGROUND_FETCH = 1; 164 /** The server auction key fetch source is via an auction. */ 165 public static final int SERVER_AUCTION_KEY_FETCH_SOURCE_AUCTION = 2; 166 167 /** The server auction encryption key source is UNSET. */ 168 public static final int SERVER_AUCTION_ENCRYPTION_KEY_SOURCE_UNSET = 0; 169 /** The server auction encryption key source is the database. */ 170 public static final int SERVER_AUCTION_ENCRYPTION_KEY_SOURCE_DATABASE = 1; 171 /** The server auction encryption key source is the network. */ 172 public static final int SERVER_AUCTION_ENCRYPTION_KEY_SOURCE_NETWORK = 2; 173 174 /** Buckets for per buyer signal size in the update signals process. */ 175 public static final long[] PER_BUYER_SIGNAL_SIZE_BUCKETS = {10, 100, 500, 5000}; 176 177 /** The topics reschedule epoch job status is unset. */ 178 public static final int TOPICS_RESCHEDULE_EPOCH_JOB_STATUS_UNSET = 0; 179 /** The topics reschedule epoch job status is success. */ 180 public static final int TOPICS_RESCHEDULE_EPOCH_JOB_STATUS_RESCHEDULE_SUCCESS = 1; 181 /** The topics reschedule epoch job status is skipped because of empty job scheduler. */ 182 public static final int 183 TOPICS_RESCHEDULE_EPOCH_JOB_STATUS_SKIP_RESCHEDULE_EMPTY_JOB_SCHEDULER = 2; 184 /** The topics reschedule epoch job status is skipped because of empty pending job. */ 185 public static final int 186 TOPICS_RESCHEDULE_EPOCH_JOB_STATUS_SKIP_RESCHEDULE_EMPTY_PENDING_JOB = 3; 187 188 /** The topics epoch job battery constraint is unknown setting. */ 189 public static final int TOPICS_EPOCH_JOB_BATTERY_CONSTRAINT_UNKNOWN_SETTING = 0; 190 /** The topics epoch job battery constraint is requires charging. */ 191 public static final int TOPICS_EPOCH_JOB_BATTERY_CONSTRAINT_REQUIRES_CHARGING = 1; 192 /** The topics epoch job battery constraint is battery not low. */ 193 public static final int TOPICS_EPOCH_JOB_BATTERY_CONSTRAINT_REQUIRES_BATTERY_NOT_LOW = 2; 194 195 /** Schedule ca update failure during http call. */ 196 public static final int SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_ACTION_HTTP_CALL = 0; 197 198 /** Schedule ca update failure during join custom audience. */ 199 public static final int SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_ACTION_JOIN_CA = 1; 200 201 /** Schedule ca update failure during leaving custom audience. */ 202 public static final int SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_ACTION_LEAVE_CA = 2; 203 204 /** Schedule ca update failure during scheduling ca update for second hop. */ 205 public static final int SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_ACTION_SCHEDULE_CA_UPDATE = 3; 206 207 /** Unknown failure during schedule custom audience update by the background job. */ 208 public static final int SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_UNKNOWN = 0; 209 210 /** Http error during schedule custom audience update by the background job. */ 211 public static final int SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_HTTP_UNKNOWN_ERROR = 1; 212 213 /** 214 * Http server error during schedule custom audience update by the background job. Error code 215 * indicating that the user has sent too many requests in a given amount of time and the service 216 * received an HTTP 429 status code 217 */ 218 public static final int SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_HTTP_TOO_MANY_REQUESTS = 2; 219 220 /** 221 * Http server error during schedule custom audience update by the background job. Error code 222 * indicating that the service received an HTTP 3xx status code 223 */ 224 public static final int SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_HTTP_REDIRECTION = 3; 225 226 /** 227 * Http server error during schedule custom audience update by the background job. Error code 228 * indicating that the service received an HTTP 4xx status code 229 */ 230 public static final int SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_HTTP_CLIENT_ERROR = 4; 231 232 /** 233 * Http server error during schedule custom audience update by the background job. Error code 234 * indicating that the service received an HTTP 5xx. 235 */ 236 public static final int SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_HTTP_SERVER_ERROR = 5; 237 238 /** Json error during schedule custom audience update by the background job. */ 239 public static final int SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_JSON_ERROR = 6; 240 241 /** Internal error during schedule custom audience update by the background job. */ 242 public static final int SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_INTERNAL_ERROR = 7; 243 244 /** 245 * Used for logging IO Exception thrown by the AdServicesHttpsClient. This exception is thrown 246 * by IOException. 247 */ 248 public static final int SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_HTTP_IO_EXCEPTION = 8; 249 250 /** 251 * Used for logging HttpContentSizeException thrown by the AdServicesHttpsClient. This exception 252 * is thrown when the http response is exceeds the maximum permitted value. 253 */ 254 public static final int SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_HTTP_CONTENT_SIZE_ERROR = 9; 255 256 /** Unknown status for existing update in the database. */ 257 public static final int SCHEDULE_CA_UPDATE_EXISTING_UPDATE_STATUS_UNKNOWN = 0; 258 259 /** Schedule custom audience request overwriting an already existing update in the database. */ 260 public static final int 261 SCHEDULE_CA_UPDATE_EXISTING_UPDATE_STATUS_DID_OVERWRITE_EXISTING_UPDATE = 1; 262 263 /** No existing update in the database present in the database. */ 264 public static final int SCHEDULE_CA_UPDATE_EXISTING_UPDATE_STATUS_NO_EXISTING_UPDATE = 2; 265 266 /** 267 * Schedule custom audience request rejected because of an already existing update in the 268 * database. 269 */ 270 public static final int SCHEDULE_CA_UPDATE_EXISTING_UPDATE_STATUS_REJECTED_BY_EXISTING_UPDATE = 271 3; 272 273 /** The PAS encoding source type is unset. */ 274 public static final int PAS_ENCODING_SOURCE_TYPE_UNSET = 0; 275 276 /** The PAS raw signals are encoded in {@code PeriodicEncodingJobService}. */ 277 public static final int PAS_ENCODING_SOURCE_TYPE_ENCODING_JOB_SERVICE = 1; 278 279 /** The PAS raw signals are encoded in {@code PeriodicSignalsServiceImpl}. */ 280 public static final int PAS_ENCODING_SOURCE_TYPE_SERVICE_IMPL = 2; 281 282 /** Buckets for signal size in the encoding JS execution process. */ 283 public static final long[] ENCODING_JS_EXECUTION_SIGNAL_SIZE_BUCKETS = {10, 100, 500, 5000}; 284 285 /* Constants for status in the ReportingWithDestinationPerformed stats. */ 286 public static final int REPORTING_CALL_STATUS_UNSET = 0; 287 public static final int REPORTING_CALL_STATUS_SUCCESSFUL = 1; 288 public static final int REPORTING_CALL_STATUS_FAILURE_HTTP_TOO_MANY_REQUESTS = 2; 289 public static final int REPORTING_CALL_STATUS_FAILURE_HTTP_REDIRECTION = 3; 290 public static final int REPORTING_CALL_STATUS_FAILURE_HTTP_CLIENT_ERROR = 4; 291 public static final int REPORTING_CALL_STATUS_FAILURE_HTTP_SERVER_ERROR = 5; 292 public static final int REPORTING_CALL_STATUS_FAILURE_HTTP_IO_EXCEPTION = 6; 293 public static final int REPORTING_CALL_STATUS_FAILURE_HTTP_NETWORK_NOT_AVAILABLE = 7; 294 public static final int REPORTING_CALL_STATUS_FAILURE_UNKNOWN = 8; 295 296 /* Constants for destination in the ReportingWithDestinationPerformed stats. */ 297 public static final int REPORTING_CALL_DESTINATION_UNSET = 0; 298 public static final int REPORTING_CALL_DESTINATION_SELLER = 1; 299 public static final int REPORTING_CALL_DESTINATION_BUYER = 2; 300 public static final int REPORTING_CALL_DESTINATION_COMPONENT_SELLER = 3; 301 302 /* Constants for type of reporting api in the ReportingWithDestinationPerformed stats. */ 303 public static final int REPORTING_API_UNSET = 0; 304 public static final int REPORTING_API_REPORT_IMPRESSION = 1; 305 public static final int REPORTING_API_REPORT_EVENT = 2; 306 307 /** The kind of winner did the beacon come from. */ 308 @IntDef( 309 prefix = {"BEACON_SOURCE_"}, 310 value = { 311 BEACON_SOURCE_UNSET, 312 BEACON_SOURCE_PROTECTED_SIGNALS, 313 BEACON_SOURCE_CUSTOM_AUDIENCE 314 }) 315 @Retention(RetentionPolicy.SOURCE) 316 public @interface BeaconSource {} 317 318 /** The status of JSON processing. */ 319 @IntDef( 320 prefix = {"JSON_PROCESSING_STATUS_"}, 321 value = { 322 JSON_PROCESSING_STATUS_UNSET, 323 JSON_PROCESSING_STATUS_SUCCESS, 324 JSON_PROCESSING_STATUS_TOO_BIG, 325 JSON_PROCESSING_STATUS_SYNTACTIC_ERROR, 326 JSON_PROCESSING_STATUS_SEMANTIC_ERROR, 327 JSON_PROCESSING_STATUS_OTHER_ERROR 328 }) 329 @Retention(RetentionPolicy.SOURCE) 330 public @interface JsonProcessingStatus {} 331 332 /** The status of encoding fetch. */ 333 @IntDef( 334 prefix = {"ENCODING_FETCH_STATUS_"}, 335 value = { 336 ENCODING_FETCH_STATUS_UNSET, 337 ENCODING_FETCH_STATUS_SUCCESS, 338 ENCODING_FETCH_STATUS_TOO_BIG, 339 ENCODING_FETCH_STATUS_TIMEOUT, 340 ENCODING_FETCH_STATUS_NETWORK_FAILURE, 341 ENCODING_FETCH_STATUS_OTHER_FAILURE 342 }) 343 @Retention(RetentionPolicy.SOURCE) 344 public @interface EncodingFetchStatus {} 345 346 /** The status of JavaScript Run. */ 347 @IntDef( 348 prefix = {"JS_RUN_STATUS_"}, 349 value = { 350 JS_RUN_STATUS_UNSET, 351 JS_RUN_STATUS_SUCCESS, 352 JS_RUN_STATUS_TIMEOUT, 353 JS_RUN_STATUS_JS_SYNTAX_ERROR, 354 JS_RUN_STATUS_OUTPUT_SYNTAX_ERROR, 355 JS_RUN_STATUS_OUTPUT_SEMANTIC_ERROR, 356 JS_RUN_STATUS_OUTPUT_NON_ZERO_RESULT, 357 JS_RUN_STATUS_DB_PERSIST_FAILURE, 358 JS_RUN_STATUS_OTHER_FAILURE, 359 JS_RUN_STATUS_JS_REFERENCE_ERROR 360 }) 361 @Retention(RetentionPolicy.SOURCE) 362 public @interface JsRunStatus {} 363 364 /** The type of auction winner. */ 365 @IntDef( 366 prefix = {"WINNER_TYPE_"}, 367 value = { 368 WINNER_TYPE_UNSET, 369 WINNER_TYPE_NO_WINNER, 370 WINNER_TYPE_CA_WINNER, 371 WINNER_TYPE_PAS_WINNER 372 }) 373 @Retention(RetentionPolicy.SOURCE) 374 public @interface WinnerType {} 375 376 /** The size type of JSON or JavaScript. */ 377 @IntDef( 378 prefix = {"SIZE_"}, 379 value = { 380 SIZE_UNSET, 381 SIZE_VERY_SMALL, 382 SIZE_SMALL, 383 SIZE_MEDIUM, 384 SIZE_LARGE, 385 SIZE_VERY_LARGE 386 }) 387 @Retention(RetentionPolicy.SOURCE) 388 public @interface Size {} 389 390 /** Filter processing type */ 391 @IntDef( 392 prefix = {"FILTER_PROCESS_TYPE_"}, 393 value = { 394 FILTER_PROCESS_TYPE_UNSET, 395 FILTER_PROCESS_TYPE_CUSTOM_AUDIENCES, 396 FILTER_PROCESS_TYPE_CONTEXTUAL_ADS 397 }) 398 @Retention(RetentionPolicy.SOURCE) 399 public @interface FilterProcessType {} 400 401 /** The type of server auction coordinator source. */ 402 @IntDef( 403 prefix = {"SERVER_AUCTION_COORDINATOR_SOURCE_"}, 404 value = { 405 SERVER_AUCTION_COORDINATOR_SOURCE_UNSET, 406 SERVER_AUCTION_COORDINATOR_SOURCE_DEFAULT, 407 SERVER_AUCTION_COORDINATOR_SOURCE_API 408 }) 409 @Retention(RetentionPolicy.SOURCE) 410 public @interface ServerAuctionCoordinatorSource {} 411 412 @IntDef( 413 prefix = {"SCHEDULE_CUSTOM_AUDIENCE_UPDATE_EXISTING_UPDATE_STATUS_"}, 414 value = { 415 SCHEDULE_CA_UPDATE_EXISTING_UPDATE_STATUS_UNKNOWN, 416 SCHEDULE_CA_UPDATE_EXISTING_UPDATE_STATUS_DID_OVERWRITE_EXISTING_UPDATE, 417 SCHEDULE_CA_UPDATE_EXISTING_UPDATE_STATUS_NO_EXISTING_UPDATE, 418 SCHEDULE_CA_UPDATE_EXISTING_UPDATE_STATUS_REJECTED_BY_EXISTING_UPDATE 419 }) 420 @Retention(RetentionPolicy.SOURCE) 421 public @interface ScheduleCustomAudienceUpdateExistingUpdateStatus {} 422 423 @IntDef( 424 prefix = {"SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_ACTION"}, 425 value = { 426 SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_ACTION_HTTP_CALL, 427 SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_ACTION_JOIN_CA, 428 SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_ACTION_LEAVE_CA, 429 SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_ACTION_SCHEDULE_CA_UPDATE 430 }) 431 @Retention(RetentionPolicy.SOURCE) 432 public @interface ScheduleCustomAudienceUpdatePerformedFailureAction {} 433 434 @IntDef( 435 prefix = {"SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE"}, 436 value = { 437 SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_UNKNOWN, 438 SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_HTTP_UNKNOWN_ERROR, 439 SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_HTTP_TOO_MANY_REQUESTS, 440 SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_HTTP_REDIRECTION, 441 SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_HTTP_CLIENT_ERROR, 442 SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_HTTP_SERVER_ERROR, 443 SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_JSON_ERROR, 444 SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_INTERNAL_ERROR, 445 SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_HTTP_IO_EXCEPTION, 446 SCHEDULE_CA_UPDATE_PERFORMED_FAILURE_TYPE_HTTP_CONTENT_SIZE_ERROR 447 }) 448 @Retention(RetentionPolicy.SOURCE) 449 public @interface ScheduleCustomAudienceUpdatePerformedFailureType {} 450 451 @IntDef( 452 prefix = {"PAS_ENCODING_SOURCE_TYPE_"}, 453 value = { 454 PAS_ENCODING_SOURCE_TYPE_UNSET, 455 PAS_ENCODING_SOURCE_TYPE_ENCODING_JOB_SERVICE, 456 PAS_ENCODING_SOURCE_TYPE_SERVICE_IMPL 457 }) 458 @Retention(RetentionPolicy.SOURCE) 459 public @interface PasEncodingSourceType {} 460 461 /** Returns the size bucket for a raw value. */ 462 @Size computeSize(long rawSize, long[] buckets)463 public static int computeSize(long rawSize, long[] buckets) { 464 if (rawSize < buckets[0]) { 465 return SIZE_VERY_SMALL; 466 } else if (rawSize < buckets[1]) { 467 return SIZE_SMALL; 468 } else if (rawSize < buckets[2]) { 469 return SIZE_MEDIUM; 470 } else if (rawSize < buckets[3]) { 471 return SIZE_LARGE; 472 } 473 return SIZE_VERY_LARGE; 474 } 475 476 /** The status of the background key fetch. */ 477 @IntDef( 478 prefix = {"BACKGROUND_KEY_FETCH_STATUS_"}, 479 value = { 480 BACKGROUND_KEY_FETCH_STATUS_UNSET, 481 BACKGROUND_KEY_FETCH_STATUS_NO_OP, 482 BACKGROUND_KEY_FETCH_STATUS_REFRESH_KEYS_INITIATED, 483 }) 484 @Retention(RetentionPolicy.SOURCE) 485 public @interface BackgroundKeyFetchStatus {} 486 487 /** The source of the server auction key fetch. */ 488 @IntDef( 489 prefix = {"SERVER_AUCTION_KEY_FETCH_SOURCE_"}, 490 value = { 491 SERVER_AUCTION_KEY_FETCH_SOURCE_UNSET, 492 SERVER_AUCTION_KEY_FETCH_SOURCE_BACKGROUND_FETCH, 493 SERVER_AUCTION_KEY_FETCH_SOURCE_AUCTION 494 }) 495 @Retention(RetentionPolicy.SOURCE) 496 public @interface ServerAuctionKeyFetchSource {} 497 498 /** The source of the server auction encryption key. */ 499 @IntDef( 500 prefix = {"SERVER_AUCTION_ENCRYPTION_KEY_SOURCE_"}, 501 value = { 502 SERVER_AUCTION_ENCRYPTION_KEY_SOURCE_UNSET, 503 SERVER_AUCTION_ENCRYPTION_KEY_SOURCE_DATABASE, 504 SERVER_AUCTION_ENCRYPTION_KEY_SOURCE_NETWORK 505 }) 506 @Retention(RetentionPolicy.SOURCE) 507 public @interface ServerAuctionEncryptionKeySource {} 508 509 /** The status when forcing reschedule Topics API EpochJob. */ 510 @IntDef( 511 prefix = {"TOPICS_RESCHEDULE_EPOCH_JOB_STATUS_"}, 512 value = { 513 TOPICS_RESCHEDULE_EPOCH_JOB_STATUS_UNSET, 514 TOPICS_RESCHEDULE_EPOCH_JOB_STATUS_RESCHEDULE_SUCCESS, 515 TOPICS_RESCHEDULE_EPOCH_JOB_STATUS_SKIP_RESCHEDULE_EMPTY_JOB_SCHEDULER, 516 TOPICS_RESCHEDULE_EPOCH_JOB_STATUS_SKIP_RESCHEDULE_EMPTY_PENDING_JOB 517 }) 518 @Retention(RetentionPolicy.SOURCE) 519 public @interface TopicsRescheduleEpochJobStatus {} 520 521 /** The Epoch job setting of the Topics API EpochJob. */ 522 @IntDef( 523 prefix = {"TOPICS_EPOCH_JOB_BATTERY_CONSTRAINT_"}, 524 value = { 525 TOPICS_EPOCH_JOB_BATTERY_CONSTRAINT_UNKNOWN_SETTING, 526 TOPICS_EPOCH_JOB_BATTERY_CONSTRAINT_REQUIRES_CHARGING, 527 TOPICS_EPOCH_JOB_BATTERY_CONSTRAINT_REQUIRES_BATTERY_NOT_LOW 528 }) 529 @Retention(RetentionPolicy.SOURCE) 530 public @interface TopicsEpochJobBatteryConstraint {} 531 532 /** 533 * Reporting call status. This represents the status of report impression and report event call. 534 */ 535 @IntDef( 536 prefix = {"REPORTING_CALL_STATUS_"}, 537 value = { 538 REPORTING_CALL_STATUS_UNSET, 539 REPORTING_CALL_STATUS_SUCCESSFUL, 540 REPORTING_CALL_STATUS_FAILURE_HTTP_TOO_MANY_REQUESTS, 541 REPORTING_CALL_STATUS_FAILURE_HTTP_REDIRECTION, 542 REPORTING_CALL_STATUS_FAILURE_HTTP_CLIENT_ERROR, 543 REPORTING_CALL_STATUS_FAILURE_HTTP_SERVER_ERROR, 544 REPORTING_CALL_STATUS_FAILURE_HTTP_IO_EXCEPTION, 545 REPORTING_CALL_STATUS_FAILURE_HTTP_NETWORK_NOT_AVAILABLE, 546 REPORTING_CALL_STATUS_FAILURE_UNKNOWN 547 }) 548 @Retention(RetentionPolicy.SOURCE) 549 public @interface ReportingCallStatsStatus {} 550 551 /** Enum to determine the destination in the reporting event / reporting impression call. */ 552 @IntDef( 553 prefix = {"REPORTING_CALL_DESTINATION_"}, 554 value = { 555 REPORTING_CALL_DESTINATION_UNSET, 556 REPORTING_CALL_DESTINATION_SELLER, 557 REPORTING_CALL_DESTINATION_BUYER, 558 REPORTING_CALL_DESTINATION_COMPONENT_SELLER 559 }) 560 public @interface ReportingCallStatsDestination {} 561 562 /** Enum to determine the type of reporting api in telemetry. */ 563 @IntDef( 564 prefix = {"REPORTING_CALL_DESTINATION_"}, 565 value = { 566 REPORTING_API_UNSET, 567 REPORTING_API_REPORT_IMPRESSION, 568 REPORTING_API_REPORT_EVENT, 569 }) 570 public @interface ReportingApiType {} 571 572 /** 573 * Returns the Cel PP API name ID from AdServices API name ID. 574 */ getCelPpApiNameId(int apiNameLoggingId)575 public static int getCelPpApiNameId(int apiNameLoggingId) { 576 int celPpApiNameId = AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__PPAPI_NAME_UNSPECIFIED; 577 switch (apiNameLoggingId) { 578 case AD_SERVICES_API_CALLED__API_NAME__GET_TOPICS: 579 celPpApiNameId = AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__TOPICS; 580 break; 581 case AD_SERVICES_API_CALLED__API_NAME__GET_AD_SELECTION_DATA: 582 celPpApiNameId = AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__GET_AD_SELECTION_DATA; 583 break; 584 case AD_SERVICES_API_CALLED__API_NAME__PERSIST_AD_SELECTION_RESULT: 585 celPpApiNameId = 586 AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__PERSIST_AD_SELECTION_RESULT; 587 break; 588 case AD_SERVICES_API_CALLED__API_NAME__UPDATE_SIGNALS: 589 celPpApiNameId = AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__PAS; 590 break; 591 case AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE: 592 celPpApiNameId = AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__JOIN_CUSTOM_AUDIENCE; 593 break; 594 case AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE: 595 celPpApiNameId = AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__LEAVE_CUSTOM_AUDIENCE; 596 break; 597 case AD_SERVICES_API_CALLED__API_NAME__FETCH_AND_JOIN_CUSTOM_AUDIENCE: 598 celPpApiNameId = 599 AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__FETCH_AND_JOIN_CUSTOM_AUDIENCE; 600 break; 601 case AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION: 602 celPpApiNameId = AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__REPORT_IMPRESSION; 603 break; 604 case AD_SERVICES_API_CALLED__API_NAME__REPORT_INTERACTION: 605 celPpApiNameId = AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__REPORT_INTERACTION; 606 break; 607 case AD_SERVICES_API_CALLED__API_NAME__SCHEDULE_CUSTOM_AUDIENCE_UPDATE: 608 celPpApiNameId = 609 AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__SCHEDULE_CUSTOM_AUDIENCE_UPDATE; 610 } 611 return celPpApiNameId; 612 } 613 614 /** 615 * Clean the caller's identity and log CEL. 616 * TODO(b/376542959): this is a temporary solution for CEL logs inside the Binder thread. 617 */ logCelInsideBinderThread(int errorCode, int ppapiName)618 public static void logCelInsideBinderThread(int errorCode, int ppapiName) { 619 long token = Binder.clearCallingIdentity(); 620 try { 621 ErrorLogUtil.e(errorCode, ppapiName); 622 } finally { 623 Binder.restoreCallingIdentity(token); 624 } 625 } 626 627 /** 628 * Clean the caller's identity and log CEL. 629 * TODO(b/376542959): this is a temporary solution for CEL logs inside the Binder thread. 630 */ logCelInsideBinderThread(Throwable tr, int errorCode, int ppapiName)631 public static void logCelInsideBinderThread(Throwable tr, int errorCode, int ppapiName) { 632 long token = Binder.clearCallingIdentity(); 633 try { 634 ErrorLogUtil.e(tr, errorCode, ppapiName); 635 } finally { 636 Binder.restoreCallingIdentity(token); 637 } 638 } 639 640 // Takes an AdServicesApiName, and attempts to log the CEL error. checkAndLogCelByApiNameLoggingId(Throwable throwable, int celErrorCode, int apiNameLoggingId)641 public static void checkAndLogCelByApiNameLoggingId(Throwable throwable, int celErrorCode, 642 int apiNameLoggingId) { 643 checkPpapiNameAndLogCel(throwable, celErrorCode, getCelPpApiNameId(apiNameLoggingId)); 644 } 645 646 /** 647 * Logs a CEL error when the API name is not 648 * AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__PPAPI_NAME_UNSPECIFIED 649 */ checkPpapiNameAndLogCel(Throwable throwable, int celErrorCode, int celApiNameId)650 public static void checkPpapiNameAndLogCel(Throwable throwable, int celErrorCode, 651 int celApiNameId) { 652 if (celApiNameId != AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__PPAPI_NAME_UNSPECIFIED) { 653 if (throwable != null) { 654 ErrorLogUtil.e(throwable, celErrorCode, celApiNameId); 655 } else { 656 ErrorLogUtil.e(celErrorCode, celApiNameId); 657 } 658 } 659 } 660 }