• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }