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.data.customaudience; 18 19 import android.adservices.common.AdSelectionSignals; 20 import android.adservices.customaudience.PartialCustomAudience; 21 22 import androidx.annotation.NonNull; 23 import androidx.annotation.Nullable; 24 import androidx.room.ColumnInfo; 25 import androidx.room.Entity; 26 import androidx.room.ForeignKey; 27 import androidx.room.Index; 28 29 import com.google.auto.value.AutoValue; 30 31 import java.time.Instant; 32 33 @AutoValue 34 @AutoValue.CopyAnnotations 35 @Entity( 36 tableName = DBPartialCustomAudience.TABLE_NAME, 37 foreignKeys = 38 @ForeignKey( 39 entity = DBScheduledCustomAudienceUpdate.class, 40 parentColumns = {"update_id"}, 41 childColumns = {"update_id"}, 42 onDelete = ForeignKey.CASCADE), 43 indices = { 44 @Index( 45 value = {"update_id", "name"}, 46 unique = true) 47 }, 48 primaryKeys = {"update_id", "name"}) 49 public abstract class DBPartialCustomAudience { 50 public static final String TABLE_NAME = "partial_custom_audience"; 51 52 /** Unique id associated with a delayed update */ 53 @AutoValue.CopyAnnotations 54 @ColumnInfo(name = "update_id") 55 @NonNull getUpdateId()56 public abstract Long getUpdateId(); 57 58 /** Gets Custom Audience name */ 59 @AutoValue.CopyAnnotations 60 @ColumnInfo(name = "name") 61 @NonNull getName()62 public abstract String getName(); 63 64 /** Gets Custom Audience activation time */ 65 @AutoValue.CopyAnnotations 66 @ColumnInfo(name = "activation_time") 67 @Nullable getActivationTime()68 public abstract Instant getActivationTime(); 69 70 /** Gets Custom Audience expiration time */ 71 @AutoValue.CopyAnnotations 72 @ColumnInfo(name = "expiration_time") 73 @Nullable getExpirationTime()74 public abstract Instant getExpirationTime(); 75 76 /** Gets Custom Audience's bidding signals */ 77 @AutoValue.CopyAnnotations 78 @ColumnInfo(name = "bidding_signals") 79 @Nullable getUserBiddingSignals()80 public abstract AdSelectionSignals getUserBiddingSignals(); 81 82 /** Provides a {@link DBCustomAudience.Builder} */ 83 @NonNull builder()84 public static DBPartialCustomAudience.Builder builder() { 85 return new AutoValue_DBPartialCustomAudience.Builder() 86 .setActivationTime(null) 87 .setExpirationTime(null) 88 .setUserBiddingSignals(null); 89 } 90 91 /** Utility to convert a {@link DBPartialCustomAudience} into a {@link PartialCustomAudience} */ 92 @NonNull getPartialCustomAudience( DBPartialCustomAudience dbPartialCustomAudience)93 public static PartialCustomAudience getPartialCustomAudience( 94 DBPartialCustomAudience dbPartialCustomAudience) { 95 return new PartialCustomAudience.Builder(dbPartialCustomAudience.getName()) 96 .setActivationTime(dbPartialCustomAudience.getActivationTime()) 97 .setExpirationTime(dbPartialCustomAudience.getExpirationTime()) 98 .setUserBiddingSignals(dbPartialCustomAudience.getUserBiddingSignals()) 99 .build(); 100 } 101 102 /** Creates an instance of {@link DBPartialCustomAudience} */ 103 @NonNull create( @onNull Long updateId, @NonNull String name, @Nullable Instant activationTime, @Nullable Instant expirationTime, @Nullable AdSelectionSignals userBiddingSignals)104 public static DBPartialCustomAudience create( 105 @NonNull Long updateId, 106 @NonNull String name, 107 @Nullable Instant activationTime, 108 @Nullable Instant expirationTime, 109 @Nullable AdSelectionSignals userBiddingSignals) { 110 return builder() 111 .setUpdateId(updateId) 112 .setName(name) 113 .setActivationTime(activationTime) 114 .setExpirationTime(expirationTime) 115 .setUserBiddingSignals(userBiddingSignals) 116 .build(); 117 } 118 119 /** 120 * Creates an instance of {@link DBPartialCustomAudience} from a {@link PartialCustomAudience} 121 */ 122 @NonNull fromPartialCustomAudience( Long updateId, @NonNull PartialCustomAudience partialCa)123 public static DBPartialCustomAudience fromPartialCustomAudience( 124 Long updateId, @NonNull PartialCustomAudience partialCa) { 125 return DBPartialCustomAudience.builder() 126 .setUpdateId(updateId) 127 .setName(partialCa.getName()) 128 .setActivationTime(partialCa.getActivationTime()) 129 .setExpirationTime(partialCa.getExpirationTime()) 130 .setUserBiddingSignals(partialCa.getUserBiddingSignals()) 131 .build(); 132 } 133 134 /** Builder for convenient creation of an object of type {@link DBPartialCustomAudience} */ 135 @AutoValue.Builder 136 public abstract static class Builder { 137 /** see {@link #getUpdateId()} */ 138 @NonNull setUpdateId(@onNull Long updateId)139 public abstract Builder setUpdateId(@NonNull Long updateId); 140 141 /** see {@link #getName()} */ 142 @NonNull setName(@onNull String name)143 public abstract Builder setName(@NonNull String name); 144 145 /** see {@link #getActivationTime()} */ 146 @NonNull setActivationTime(@ullable Instant activationTime)147 public abstract Builder setActivationTime(@Nullable Instant activationTime); 148 149 /** see {@link #getExpirationTime()} */ 150 @NonNull setExpirationTime(@ullable Instant expirationTime)151 public abstract Builder setExpirationTime(@Nullable Instant expirationTime); 152 153 /** see {@link #getUserBiddingSignals()} */ 154 @NonNull setUserBiddingSignals( @ullable AdSelectionSignals userBiddingSignals)155 public abstract Builder setUserBiddingSignals( 156 @Nullable AdSelectionSignals userBiddingSignals); 157 158 /** Builds a {@link DBCustomAudience.Builder} */ 159 @NonNull build()160 public abstract DBPartialCustomAudience build(); 161 } 162 } 163