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