/* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.adservices.adselection; import android.adservices.common.AdSelectionSignals; import android.adservices.common.AdTechIdentifier; import android.annotation.NonNull; import android.annotation.Nullable; import android.net.Uri; import android.os.Build; import android.os.Parcel; import android.os.Parcelable; import java.util.List; import java.util.Objects; /** * Contains the configuration of the ad selection process that select a winner from a given list of * ad selection ids. * *

Instances of this class are created by SDKs to be provided as arguments to the {@link * AdSelectionManager#selectAds} methods in {@link AdSelectionManager}. */ public final class AdSelectionFromOutcomesConfig implements Parcelable { @NonNull private final AdTechIdentifier mSeller; @NonNull private final List mAdSelectionIds; @NonNull private final AdSelectionSignals mSelectionSignals; @NonNull private final Uri mSelectionLogicUri; @NonNull public static final Creator CREATOR = new Creator() { @Override public AdSelectionFromOutcomesConfig createFromParcel(@NonNull Parcel in) { return new AdSelectionFromOutcomesConfig(in); } @Override public AdSelectionFromOutcomesConfig[] newArray(int size) { return new AdSelectionFromOutcomesConfig[size]; } }; private AdSelectionFromOutcomesConfig( @NonNull AdTechIdentifier seller, @NonNull List adSelectionIds, @NonNull AdSelectionSignals selectionSignals, @NonNull Uri selectionLogicUri) { Objects.requireNonNull(seller); Objects.requireNonNull(adSelectionIds); Objects.requireNonNull(selectionSignals); Objects.requireNonNull(selectionLogicUri); this.mSeller = seller; this.mAdSelectionIds = adSelectionIds; this.mSelectionSignals = selectionSignals; this.mSelectionLogicUri = selectionLogicUri; } private AdSelectionFromOutcomesConfig(@NonNull Parcel in) { Objects.requireNonNull(in); this.mSeller = AdTechIdentifier.CREATOR.createFromParcel(in); this.mAdSelectionIds = Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU ? in.readArrayList(Long.class.getClassLoader()) : in.readArrayList(Long.class.getClassLoader(), Long.class); this.mSelectionSignals = AdSelectionSignals.CREATOR.createFromParcel(in); this.mSelectionLogicUri = Uri.CREATOR.createFromParcel(in); } /** @return a AdTechIdentifier of the seller, for example "www.example-ssp.com" */ @NonNull public AdTechIdentifier getSeller() { return mSeller; } /** * @return a list of ad selection ids passed by the SSP to participate in the ad selection from * outcomes process */ @NonNull public List getAdSelectionIds() { return mAdSelectionIds; } /** * @return JSON in an {@link AdSelectionSignals} object, fetched from the {@link * AdSelectionFromOutcomesConfig} and consumed by the JS logic fetched from the DSP {@code * SelectionLogicUri}. */ @NonNull public AdSelectionSignals getSelectionSignals() { return mSelectionSignals; } /** * @return the URI used to retrieve the JS code containing the seller/SSP {@code selectOutcome} * function used during the ad selection */ @NonNull public Uri getSelectionLogicUri() { return mSelectionLogicUri; } @Override public void writeToParcel(@NonNull Parcel dest, int flags) { Objects.requireNonNull(dest); mSeller.writeToParcel(dest, flags); dest.writeList(mAdSelectionIds); mSelectionSignals.writeToParcel(dest, flags); mSelectionLogicUri.writeToParcel(dest, flags); } @Override public int describeContents() { return 0; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof AdSelectionFromOutcomesConfig)) return false; AdSelectionFromOutcomesConfig that = (AdSelectionFromOutcomesConfig) o; return Objects.equals(this.mSeller, that.mSeller) && Objects.equals(this.mAdSelectionIds, that.mAdSelectionIds) && Objects.equals(this.mSelectionSignals, that.mSelectionSignals) && Objects.equals(this.mSelectionLogicUri, that.mSelectionLogicUri); } @Override public int hashCode() { return Objects.hash(mSeller, mAdSelectionIds, mSelectionSignals, mSelectionLogicUri); } /** * Builder for {@link AdSelectionFromOutcomesConfig} objects. All fields require non-null values * to build. */ public static final class Builder { @Nullable private AdTechIdentifier mSeller; @Nullable private List mAdSelectionIds; @Nullable private AdSelectionSignals mSelectionSignals; @Nullable private Uri mSelectionLogicUri; public Builder() {} /** Sets the seller {@link AdTechIdentifier}. */ @NonNull public AdSelectionFromOutcomesConfig.Builder setSeller(@NonNull AdTechIdentifier seller) { Objects.requireNonNull(seller); this.mSeller = seller; return this; } /** Sets the list of {@code AdSelectionIds} to participate in the selection process. */ @NonNull public AdSelectionFromOutcomesConfig.Builder setAdSelectionIds( @NonNull List adSelectionIds) { Objects.requireNonNull(adSelectionIds); this.mAdSelectionIds = adSelectionIds; return this; } /** * Sets the {@code SelectionSignals} to be consumed by the JS script downloaded from {@code * SelectionLogicUri} */ @NonNull public AdSelectionFromOutcomesConfig.Builder setSelectionSignals( @NonNull AdSelectionSignals selectionSignals) { Objects.requireNonNull(selectionSignals); this.mSelectionSignals = selectionSignals; return this; } /** * Sets the {@code SelectionLogicUri}. Selection URI could be either of the two schemas: * *

* * {@code AdSelectionIds} and {@code SelectionSignals}. */ @NonNull public AdSelectionFromOutcomesConfig.Builder setSelectionLogicUri( @NonNull Uri selectionLogicUri) { Objects.requireNonNull(selectionLogicUri); this.mSelectionLogicUri = selectionLogicUri; return this; } /** Builds a {@link AdSelectionFromOutcomesConfig} instance. */ @NonNull public AdSelectionFromOutcomesConfig build() { Objects.requireNonNull(mSeller); Objects.requireNonNull(mAdSelectionIds); Objects.requireNonNull(mSelectionSignals); Objects.requireNonNull(mSelectionLogicUri); return new AdSelectionFromOutcomesConfig( mSeller, mAdSelectionIds, mSelectionSignals, mSelectionLogicUri); } } }