/* * 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.annotation.NonNull; import android.annotation.Nullable; import android.net.Uri; import android.os.OutcomeReceiver; import com.android.internal.util.Preconditions; import java.util.Objects; import java.util.concurrent.Executor; /** * This class represents a field in the {@code OutcomeReceiver}, which is an input to the {@link * AdSelectionManager#selectAds} in the {@link AdSelectionManager}. This field is populated in the * case of a successful {@link AdSelectionManager#selectAds} call. * *

Empty outcome may be returned from {@link * AdSelectionManager#selectAds(AdSelectionFromOutcomesConfig, Executor, OutcomeReceiver)}. Use * {@link AdSelectionOutcome#hasOutcome()} to check if an instance has a valid outcome. When {@link * AdSelectionOutcome#hasOutcome()} returns {@code false}, results from {@link AdSelectionOutcome * #getAdSelectionId()} and {@link AdSelectionOutcome#getRenderUri()} are invalid and shouldn't be * used. */ public class AdSelectionOutcome { /** Represents an AdSelectionOutcome with empty results. */ @NonNull public static final AdSelectionOutcome NO_OUTCOME = new AdSelectionOutcome(); /** @hide */ public static final String UNSET_AD_SELECTION_ID_MESSAGE = "Non-zero ad selection ID must be set"; /** @hide */ public static final int UNSET_AD_SELECTION_ID = 0; private final long mAdSelectionId; @NonNull private final Uri mRenderUri; private AdSelectionOutcome() { mAdSelectionId = UNSET_AD_SELECTION_ID; mRenderUri = Uri.EMPTY; } private AdSelectionOutcome(long adSelectionId, @NonNull Uri renderUri) { Objects.requireNonNull(renderUri); mAdSelectionId = adSelectionId; mRenderUri = renderUri; } /** Returns the renderUri that the AdSelection returns. */ @NonNull public Uri getRenderUri() { return mRenderUri; } /** Returns the adSelectionId that identifies the AdSelection. */ @NonNull public long getAdSelectionId() { return mAdSelectionId; } /** * Returns whether the outcome contains results or empty. Empty outcomes' {@code render uris} * shouldn't be used. */ public boolean hasOutcome() { return !this.equals(NO_OUTCOME); } @Override public boolean equals(Object o) { if (o instanceof AdSelectionOutcome) { AdSelectionOutcome adSelectionOutcome = (AdSelectionOutcome) o; return mAdSelectionId == adSelectionOutcome.mAdSelectionId && Objects.equals(mRenderUri, adSelectionOutcome.mRenderUri); } return false; } @Override public int hashCode() { return Objects.hash(mAdSelectionId, mRenderUri); } /** * Builder for {@link AdSelectionOutcome} objects. */ public static final class Builder { private long mAdSelectionId = UNSET_AD_SELECTION_ID; @Nullable private Uri mRenderUri; public Builder() {} /** Sets the mAdSelectionId. */ @NonNull public AdSelectionOutcome.Builder setAdSelectionId(long adSelectionId) { this.mAdSelectionId = adSelectionId; return this; } /** Sets the RenderUri. */ @NonNull public AdSelectionOutcome.Builder setRenderUri(@NonNull Uri renderUri) { Objects.requireNonNull(renderUri); mRenderUri = renderUri; return this; } /** * Builds a {@link AdSelectionOutcome} instance. * * @throws IllegalArgumentException if the adSelectionIid is not set * @throws NullPointerException if the RenderUri is null */ @NonNull public AdSelectionOutcome build() { Objects.requireNonNull(mRenderUri); Preconditions.checkArgument( mAdSelectionId != UNSET_AD_SELECTION_ID, UNSET_AD_SELECTION_ID_MESSAGE); return new AdSelectionOutcome(mAdSelectionId, mRenderUri); } } }