• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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.measurement.registration;
18 
19 import android.adservices.measurement.RegistrationRequest;
20 import android.adservices.measurement.WebSourceParams;
21 import android.adservices.measurement.WebSourceRegistrationRequest;
22 import android.adservices.measurement.WebTriggerParams;
23 import android.adservices.measurement.WebTriggerRegistrationRequest;
24 import android.annotation.NonNull;
25 import android.annotation.Nullable;
26 import android.content.ContentProviderClient;
27 import android.content.ContentResolver;
28 import android.net.Uri;
29 import android.os.RemoteException;
30 
31 import com.android.adservices.LogUtil;
32 import com.android.adservices.data.measurement.DatastoreException;
33 import com.android.adservices.data.measurement.DatastoreManager;
34 import com.android.adservices.data.measurement.IMeasurementDao;
35 import com.android.adservices.service.measurement.Source;
36 
37 import java.util.Objects;
38 import java.util.UUID;
39 
40 /** Class containing static functions for enqueueing AsyncRegistrations */
41 public class EnqueueAsyncRegistration {
42     /**
43      * Inserts an App Source or Trigger Registration request into the Async Registration Queue
44      * table.
45      *
46      * @param registrationRequest a {@link RegistrationRequest} to be queued.
47      */
appSourceOrTriggerRegistrationRequest( RegistrationRequest registrationRequest, boolean adIdPermission, Uri registrant, long requestTime, @Nullable Source.SourceType sourceType, @NonNull DatastoreManager datastoreManager, @NonNull ContentResolver contentResolver)48     public static boolean appSourceOrTriggerRegistrationRequest(
49             RegistrationRequest registrationRequest,
50             boolean adIdPermission,
51             Uri registrant,
52             long requestTime,
53             @Nullable Source.SourceType sourceType,
54             @NonNull DatastoreManager datastoreManager,
55             @NonNull ContentResolver contentResolver) {
56         Objects.requireNonNull(contentResolver);
57         Objects.requireNonNull(datastoreManager);
58         return datastoreManager.runInTransaction(
59                 (dao) ->
60                         insertAsyncRegistration(
61                                 UUID.randomUUID().toString(),
62                                 registrationRequest.getRegistrationUri(),
63                                 /* mWebDestination */ null,
64                                 /* mOsDestination */ null,
65                                 registrant,
66                                 /* verifiedDestination */ null,
67                                 registrant,
68                                 registrationRequest.getRegistrationType()
69                                                 == RegistrationRequest.REGISTER_SOURCE
70                                         ? AsyncRegistration.RegistrationType.APP_SOURCE
71                                         : AsyncRegistration.RegistrationType.APP_TRIGGER,
72                                 sourceType,
73                                 requestTime,
74                                 false,
75                                 adIdPermission,
76                                 registrationRequest.getAdIdValue(),
77                                 UUID.randomUUID().toString(),
78                                 dao,
79                                 contentResolver));
80     }
81 
82     /**
83      * Inserts a Web Source Registration request into the Async Registration Queue table.
84      *
85      * @param webSourceRegistrationRequest a {@link WebSourceRegistrationRequest} to be queued.
86      */
webSourceRegistrationRequest( WebSourceRegistrationRequest webSourceRegistrationRequest, boolean adIdPermission, Uri registrant, long requestTime, @Nullable Source.SourceType sourceType, @NonNull DatastoreManager datastoreManager, @NonNull ContentResolver contentResolver)87     public static boolean webSourceRegistrationRequest(
88             WebSourceRegistrationRequest webSourceRegistrationRequest,
89             boolean adIdPermission,
90             Uri registrant,
91             long requestTime,
92             @Nullable Source.SourceType sourceType,
93             @NonNull DatastoreManager datastoreManager,
94             @NonNull ContentResolver contentResolver) {
95         Objects.requireNonNull(contentResolver);
96         Objects.requireNonNull(datastoreManager);
97         String registrationId = UUID.randomUUID().toString();
98         return datastoreManager.runInTransaction(
99                 (dao) -> {
100                     for (WebSourceParams webSourceParams :
101                             webSourceRegistrationRequest.getSourceParams()) {
102                         insertAsyncRegistration(
103                                 UUID.randomUUID().toString(),
104                                 webSourceParams.getRegistrationUri(),
105                                 webSourceRegistrationRequest.getWebDestination(),
106                                 webSourceRegistrationRequest.getAppDestination(),
107                                 registrant,
108                                 webSourceRegistrationRequest.getVerifiedDestination(),
109                                 webSourceRegistrationRequest.getTopOriginUri(),
110                                 AsyncRegistration.RegistrationType.WEB_SOURCE,
111                                 sourceType,
112                                 requestTime,
113                                 webSourceParams.isDebugKeyAllowed(),
114                                 adIdPermission,
115                                 /* adIdValue */ null, // null for web
116                                 registrationId,
117                                 dao,
118                                 contentResolver);
119                     }
120                 });
121     }
122 
123     /**
124      * Inserts a Web Trigger Registration request into the Async Registration Queue table.
125      *
126      * @param webTriggerRegistrationRequest a {@link WebTriggerRegistrationRequest} to be queued.
127      */
128     public static boolean webTriggerRegistrationRequest(
129             WebTriggerRegistrationRequest webTriggerRegistrationRequest,
130             boolean adIdPermission,
131             Uri registrant,
132             long requestTime,
133             @NonNull DatastoreManager datastoreManager,
134             @NonNull ContentResolver contentResolver) {
135         Objects.requireNonNull(contentResolver);
136         Objects.requireNonNull(datastoreManager);
137         String registrationId = UUID.randomUUID().toString();
138         return datastoreManager.runInTransaction(
139                 (dao) -> {
140                     for (WebTriggerParams webTriggerParams :
141                             webTriggerRegistrationRequest.getTriggerParams()) {
142                         insertAsyncRegistration(
143                                 UUID.randomUUID().toString(),
144                                 webTriggerParams.getRegistrationUri(),
145                                 /* mWebDestination */ null,
146                                 /* mOsDestination */ null,
147                                 registrant,
148                                 /* mVerifiedDestination */ null,
149                                 webTriggerRegistrationRequest.getDestination(),
150                                 AsyncRegistration.RegistrationType.WEB_TRIGGER,
151                                 /* mSourceType */ null,
152                                 requestTime,
153                                 webTriggerParams.isDebugKeyAllowed(),
154                                 adIdPermission,
155                                 /* adIdValue */ null, // null for web
156                                 registrationId,
157                                 dao,
158                                 contentResolver);
159                     }
160                 });
161     }
162 
163     private static void insertAsyncRegistration(
164             String id,
165             Uri registrationUri,
166             Uri webDestination,
167             Uri osDestination,
168             Uri registrant,
169             Uri verifiedDestination,
170             Uri topOrigin,
171             AsyncRegistration.RegistrationType registrationType,
172             Source.SourceType sourceType,
173             long mRequestTime,
174             boolean debugKeyAllowed,
175             boolean adIdPermission,
176             String platformAdIdValue,
177             String registrationId,
178             IMeasurementDao dao,
179             ContentResolver contentResolver)
180             throws DatastoreException {
181         AsyncRegistration asyncRegistration =
182                 new AsyncRegistration.Builder()
183                         .setId(id)
184                         .setRegistrationUri(registrationUri)
185                         .setWebDestination(webDestination)
186                         .setOsDestination(osDestination)
187                         .setRegistrant(registrant)
188                         .setVerifiedDestination(verifiedDestination)
189                         .setTopOrigin(topOrigin)
190                         .setType(registrationType)
191                         .setSourceType(sourceType)
192                         .setRequestTime(mRequestTime)
193                         .setRetryCount(0)
194                         .setDebugKeyAllowed(debugKeyAllowed)
195                         .setAdIdPermission(adIdPermission)
196                         .setPlatformAdId(platformAdIdValue)
197                         .setRegistrationId(registrationId)
198                         .build();
199 
200         dao.insertAsyncRegistration(asyncRegistration);
201         notifyContentProvider(contentResolver);
202     }
203 
204     private static void notifyContentProvider(ContentResolver contentResolver) {
205         try (ContentProviderClient contentProviderClient =
206                 contentResolver.acquireContentProviderClient(
207                         AsyncRegistrationContentProvider.TRIGGER_URI)) {
208             if (contentProviderClient != null) {
209                 contentProviderClient.insert(AsyncRegistrationContentProvider.TRIGGER_URI, null);
210             }
211         } catch (RemoteException e) {
212             LogUtil.e(e, "AsyncRegistration Content Provider invocation failed.");
213         }
214     }
215 }
216