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; 18 19 import android.annotation.IntDef; 20 import android.net.Uri; 21 22 import com.android.adservices.service.measurement.util.Validation; 23 24 import java.lang.annotation.Retention; 25 import java.lang.annotation.RetentionPolicy; 26 import java.util.Objects; 27 28 /** 29 * It is used to insert and retrieve an entry in the database that counts towards attribution rate 30 * limits. It is typically built from an {@link EventReport} or {@link Source}-{@link Trigger} 31 * combination. 32 */ 33 public class Attribution { 34 private final String mId; 35 // Defaults to Scope.EVENT 36 @Scope private int mScope; 37 private final String mSourceSite; 38 private final String mSourceOrigin; 39 private final String mDestinationSite; 40 private final String mDestinationOrigin; 41 private final String mEnrollmentId; 42 // TODO: b/276638412 rename to source time 43 private final long mTriggerTime; 44 private final String mRegistrant; 45 private final String mSourceId; 46 private final String mTriggerId; 47 private final Uri mRegistrationOrigin; 48 private final String mReportId; 49 Attribution(Builder builder)50 private Attribution(Builder builder) { 51 this.mId = builder.mId; 52 this.mScope = builder.mScope; 53 this.mSourceSite = builder.mSourceSite; 54 this.mSourceOrigin = builder.mSourceOrigin; 55 this.mDestinationSite = builder.mDestinationSite; 56 this.mDestinationOrigin = builder.mDestinationOrigin; 57 this.mEnrollmentId = builder.mEnrollmentId; 58 this.mTriggerTime = builder.mTriggerTime; 59 this.mRegistrant = builder.mRegistrant; 60 this.mSourceId = builder.mSourceId; 61 this.mTriggerId = builder.mTriggerId; 62 this.mRegistrationOrigin = builder.mRegistrationOrigin; 63 this.mReportId = builder.mReportId; 64 } 65 66 @IntDef(value = {Scope.EVENT, Scope.AGGREGATE}) 67 @Retention(RetentionPolicy.SOURCE) 68 public @interface Scope { 69 int EVENT = 0; 70 int AGGREGATE = 1; 71 } 72 73 @Override equals(Object obj)74 public boolean equals(Object obj) { 75 if (!(obj instanceof Attribution)) { 76 return false; 77 } 78 Attribution attr = (Attribution) obj; 79 return mScope == attr.mScope 80 && mTriggerTime == attr.mTriggerTime 81 && Objects.equals(mSourceSite, attr.mSourceSite) 82 && Objects.equals(mSourceOrigin, attr.mSourceOrigin) 83 && Objects.equals(mDestinationSite, attr.mDestinationSite) 84 && Objects.equals(mDestinationOrigin, attr.mDestinationOrigin) 85 && Objects.equals(mEnrollmentId, attr.mEnrollmentId) 86 && Objects.equals(mRegistrant, attr.mRegistrant) 87 && Objects.equals(mSourceId, attr.mSourceId) 88 && Objects.equals(mTriggerId, attr.mTriggerId) 89 && Objects.equals(mRegistrationOrigin, attr.mRegistrationOrigin) 90 && Objects.equals(mReportId, attr.mReportId); 91 } 92 93 @Override hashCode()94 public int hashCode() { 95 return Objects.hash( 96 mScope, 97 mSourceSite, 98 mSourceOrigin, 99 mDestinationSite, 100 mDestinationOrigin, 101 mEnrollmentId, 102 mTriggerTime, 103 mRegistrant, 104 mSourceId, 105 mTriggerId, 106 mRegistrationOrigin, 107 mReportId); 108 } 109 110 /** @return unique identifier for {@link Attribution} */ getId()111 public String getId() { 112 return mId; 113 } 114 115 /** Current scope of the {@link Attribution}. */ 116 @Scope getScope()117 public int getScope() { 118 return mScope; 119 } 120 121 /** @return top private domain of {@link Source} publisher */ getSourceSite()122 public String getSourceSite() { 123 return mSourceSite; 124 } 125 126 /** @return complete {@link Source} publisher */ getSourceOrigin()127 public String getSourceOrigin() { 128 return mSourceOrigin; 129 } 130 131 /** @return top private domain of {@link Trigger} destination */ getDestinationSite()132 public String getDestinationSite() { 133 return mDestinationSite; 134 } 135 136 /** @return complete {@link Trigger} destination */ getDestinationOrigin()137 public String getDestinationOrigin() { 138 return mDestinationOrigin; 139 } 140 141 /** @return {@link Source} or {@link Trigger} enrollment ID */ getEnrollmentId()142 public String getEnrollmentId() { 143 return mEnrollmentId; 144 } 145 146 /** @return {@link Trigger} event time */ getTriggerTime()147 public long getTriggerTime() { 148 return mTriggerTime; 149 } 150 151 /** @return {@link Trigger} registrant */ getRegistrant()152 public String getRegistrant() { 153 return mRegistrant; 154 } 155 156 /** @return {@link Source} ID */ getSourceId()157 public String getSourceId() { 158 return mSourceId; 159 } 160 161 /** @return {@link Trigger} ID */ getTriggerId()162 public String getTriggerId() { 163 return mTriggerId; 164 } 165 166 /** 167 * @return aggregate/event report ID for scoped attributions 168 */ getReportId()169 public String getReportId() { 170 return mReportId; 171 } 172 173 /** 174 * @return {@link Trigger} registration origin 175 */ getRegistrationOrigin()176 public Uri getRegistrationOrigin() { 177 return mRegistrationOrigin; 178 } 179 180 /** Builder for AttributionRateLimit */ 181 public static final class Builder { 182 private String mId; 183 @Scope private int mScope; 184 private String mSourceSite; 185 private String mSourceOrigin; 186 private String mDestinationSite; 187 private String mDestinationOrigin; 188 private String mEnrollmentId; 189 private long mTriggerTime; 190 private String mRegistrant; 191 private String mSourceId; 192 private String mTriggerId; 193 private Uri mRegistrationOrigin; 194 private String mReportId; 195 196 /** See {@link Attribution#getId()}. */ setId(String id)197 public Builder setId(String id) { 198 mId = id; 199 return this; 200 } 201 202 /** See {@link Attribution#getScope()}. */ setScope(@cope int scope)203 public Builder setScope(@Scope int scope) { 204 mScope = scope; 205 return this; 206 } 207 208 /** See {@link Attribution#getSourceSite()}. */ setSourceSite(String sourceSite)209 public Builder setSourceSite(String sourceSite) { 210 mSourceSite = sourceSite; 211 return this; 212 } 213 214 /** See {@link Attribution#getSourceOrigin()}. */ setSourceOrigin(String sourceOrigin)215 public Builder setSourceOrigin(String sourceOrigin) { 216 mSourceOrigin = sourceOrigin; 217 return this; 218 } 219 220 /** See {@link Attribution#getDestinationSite()}. */ setDestinationSite(String destinationSite)221 public Builder setDestinationSite(String destinationSite) { 222 mDestinationSite = destinationSite; 223 return this; 224 } 225 226 /** See {@link Attribution#getDestinationOrigin()}. */ setDestinationOrigin(String destinationOrigin)227 public Builder setDestinationOrigin(String destinationOrigin) { 228 mDestinationOrigin = destinationOrigin; 229 return this; 230 } 231 232 /** See {@link Attribution#getEnrollmentId()}. */ setEnrollmentId(String enrollmentId)233 public Builder setEnrollmentId(String enrollmentId) { 234 mEnrollmentId = enrollmentId; 235 return this; 236 } 237 238 /** See {@link Attribution#getTriggerTime()}. */ setTriggerTime(long triggerTime)239 public Builder setTriggerTime(long triggerTime) { 240 mTriggerTime = triggerTime; 241 return this; 242 } 243 244 /** See {@link Attribution#getRegistrant()}. */ setRegistrant(String registrant)245 public Builder setRegistrant(String registrant) { 246 mRegistrant = registrant; 247 return this; 248 } 249 250 /** See {@link Attribution#getSourceId()}. */ setSourceId(String sourceId)251 public Builder setSourceId(String sourceId) { 252 mSourceId = sourceId; 253 return this; 254 } 255 256 /** See {@link Attribution#getTriggerId()}. */ setTriggerId(String triggerId)257 public Builder setTriggerId(String triggerId) { 258 mTriggerId = triggerId; 259 return this; 260 } 261 262 /** See {@link Attribution#getRegistrationOrigin()} ()}. */ setRegistrationOrigin(Uri registrationOrigin)263 public Builder setRegistrationOrigin(Uri registrationOrigin) { 264 mRegistrationOrigin = registrationOrigin; 265 return this; 266 } 267 268 /** See {@link Attribution#getReportId()}. */ setReportId(String reportId)269 public Builder setReportId(String reportId) { 270 mReportId = reportId; 271 return this; 272 } 273 274 /** Validate and build the {@link Attribution}. */ build()275 public Attribution build() { 276 Validation.validateNonNull( 277 mSourceSite, 278 mSourceOrigin, 279 mDestinationSite, 280 mDestinationOrigin, 281 mEnrollmentId, 282 mRegistrant); 283 return new Attribution(this); 284 } 285 } 286 } 287