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