• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 android.adservices.debuggablects;
18 
19 
20 import android.adservices.common.AdData;
21 import android.adservices.common.AdFilters;
22 import android.adservices.common.AdSelectionSignals;
23 import android.adservices.common.AdTechIdentifier;
24 import android.adservices.customaudience.CustomAudience;
25 import android.adservices.customaudience.TrustedBiddingData;
26 import android.net.Uri;
27 
28 import androidx.annotation.NonNull;
29 
30 import com.google.common.collect.ImmutableList;
31 import com.google.common.collect.ImmutableSet;
32 
33 import org.json.JSONArray;
34 import org.json.JSONException;
35 import org.json.JSONObject;
36 
37 import java.time.Instant;
38 
39 final class CustomAudienceShellCommandHelper {
40     private static final String NAME = "name";
41     private static final String BUYER = "buyer";
42     static final String ACTIVATION_TIME = "activation_time";
43     private static final String EXPIRATION_TIME = "expiration_time";
44     private static final String BIDDING_LOGIC_URI = "bidding_logic_uri";
45     private static final String USER_BIDDING_SIGNALS = "user_bidding_signals";
46     private static final String TRUSTED_BIDDING_DATA = "trusted_bidding_data";
47     static final String DAILY_UPDATE = "daily_update";
48     private static final String DAILY_UPDATE_URI = "uri";
49     private static final String ADS = "ads";
50     private static final String ADS_URI = "uri";
51     private static final String ADS_KEYS = "keys";
52     private static final String ADS_AD_COUNTER_KEYS = "ad_counter_keys";
53     private static final String ADS_AD_FILTERS = "ad_filters";
54     private static final String AD_AD_RENDER_URI = "render_uri";
55     private static final String AD_METADATA = "metadata";
56     private static final String AD_AD_RENDER_ID = "ad_render_id";
57     static final String ELIGIBLE_UPDATE_TIME = "eligible_update_time";
58     static final String NUM_VALIDATION_FAILURES = "num_validation_failures";
59     static final String NUM_TIMEOUT_FAILURES = "num_timeout_failures";
60 
fromJson(@onNull JSONObject jsonObject)61     static CustomAudience fromJson(@NonNull JSONObject jsonObject) throws JSONException {
62         return new CustomAudience.Builder()
63                 .setName(jsonObject.getString(NAME))
64                 .setBuyer(AdTechIdentifier.fromString(jsonObject.getString(BUYER)))
65                 .setExpirationTime(Instant.parse(jsonObject.getString(EXPIRATION_TIME)))
66                 .setBiddingLogicUri(Uri.parse(jsonObject.getString(BIDDING_LOGIC_URI)))
67                 .setTrustedBiddingData(
68                         getTrustedBiddingDataFromJson(
69                                 jsonObject.getJSONObject(TRUSTED_BIDDING_DATA)))
70                 .setUserBiddingSignals(
71                         AdSelectionSignals.fromString(jsonObject.getString(USER_BIDDING_SIGNALS)))
72                 .setAds(getAdsFromJsonArray(jsonObject.getJSONArray(ADS)))
73                 .setDailyUpdateUri(
74                         jsonObject.isNull(DAILY_UPDATE)
75                                 ? Uri.EMPTY
76                                 : Uri.parse(
77                                         jsonObject
78                                                 .getJSONObject(DAILY_UPDATE)
79                                                 .getString(DAILY_UPDATE_URI)))
80                 .build();
81     }
82 
83 
getTrustedBiddingDataFromJson(JSONObject jsonObject)84     private static TrustedBiddingData getTrustedBiddingDataFromJson(JSONObject jsonObject)
85             throws JSONException {
86         return new TrustedBiddingData.Builder()
87                 .setTrustedBiddingUri(Uri.parse(jsonObject.getString(ADS_URI)))
88                 .setTrustedBiddingKeys(getStringsFromJsonArray(jsonObject.getJSONArray(ADS_KEYS)))
89                 .build();
90     }
91 
getStringsFromJsonArray(JSONArray jsonArray)92     private static ImmutableList<String> getStringsFromJsonArray(JSONArray jsonArray)
93             throws JSONException {
94         ImmutableList.Builder<String> builder = ImmutableList.builder();
95         for (int i = 0; i < jsonArray.length(); i++) {
96             builder.add(jsonArray.getString(i));
97         }
98         return builder.build();
99     }
100 
getAdsFromJsonArray(JSONArray jsonArray)101     private static ImmutableList<AdData> getAdsFromJsonArray(JSONArray jsonArray)
102             throws JSONException {
103         ImmutableList.Builder<AdData> builder = ImmutableList.builder();
104         for (int i = 0; i < jsonArray.length(); i++) {
105             builder.add(getAdFromJson(jsonArray.getJSONObject(i)));
106         }
107         return builder.build();
108     }
109 
getAdFromJson(JSONObject jsonObject)110     private static AdData getAdFromJson(JSONObject jsonObject) throws JSONException {
111         AdData.Builder builder =
112                 new AdData.Builder()
113                         .setRenderUri(Uri.parse(jsonObject.getString(AD_AD_RENDER_URI)))
114                         .setMetadata(jsonObject.getString(AD_METADATA));
115         if (jsonObject.has(AD_AD_RENDER_ID)) {
116             builder.setAdRenderId(jsonObject.getString(AD_AD_RENDER_ID));
117         }
118         if (jsonObject.has(ADS_AD_COUNTER_KEYS)) {
119             builder.setAdCounterKeys(
120                     getIntegersFromJsonArray(jsonObject.getJSONArray(ADS_AD_COUNTER_KEYS)));
121         }
122         if (jsonObject.has(ADS_AD_FILTERS)) {
123             builder.setAdFilters(
124                     AdFilters.fromJson(new JSONObject(jsonObject.getString(ADS_AD_FILTERS))));
125         }
126         return builder.build();
127     }
128 
getIntegersFromJsonArray(JSONArray jsonArray)129     private static ImmutableSet<Integer> getIntegersFromJsonArray(JSONArray jsonArray)
130             throws JSONException {
131         ImmutableSet.Builder<Integer> builder = ImmutableSet.builder();
132         for (int i = 0; i < jsonArray.length(); i++) {
133             builder.add(jsonArray.getInt(i));
134         }
135         return builder.build();
136     }
137 }
138