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