Skip to content

Commit 1c3944f

Browse files
feat: correct targetingData in OptableTargeting
1 parent d369331 commit 1c3944f

7 files changed

Lines changed: 278 additions & 52 deletions

File tree

android_sdk/src/main/java/co/optable/android_sdk/OptableSDK.kt

Lines changed: 12 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import co.optable.android_sdk.core.network.NetworkClient
99
import co.optable.android_sdk.core.network.NetworkResponse
1010
import co.optable.android_sdk.core.network.RequestInterceptor
1111
import co.optable.android_sdk.core.network.ResponseInterceptor
12-
import co.optable.android_sdk.core.network.edge.TargetingResponse
1312
import kotlinx.coroutines.GlobalScope
1413
import kotlinx.coroutines.MainScope
1514
import kotlinx.coroutines.launch
@@ -33,6 +32,7 @@ class OptableSDK(
3332
private val consentsManager = ConsentsManager(storage)
3433
private val adIdManager = GoogleAdIdManager(config)
3534
private val networkClient = createNetworkClient()
35+
private val useCases = UseCases()
3636

3737
/**
3838
* Calls the Optable Sandbox "identify" API, passing it the list of IDs,
@@ -142,18 +142,19 @@ class OptableSDK(
142142
GlobalScope.launch {
143143
val response = networkClient.targeting(ids)
144144

145-
MainScope().launch {
146-
val optableResult = when (response) {
147-
is NetworkResponse.Success -> {
148-
val targeting = createOptableTargeting(response.result)
149-
storage.setTargeting(targeting)
150-
OptableResult.Success(targeting)
151-
}
145+
val optableResult = when (response) {
146+
is NetworkResponse.Success -> {
147+
val targeting = useCases.parseTargetingResponse(response.result)
148+
storage.setTargeting(targeting)
149+
OptableResult.Success(targeting)
150+
}
152151

153-
is NetworkResponse.Error -> {
154-
OptableResult.Error(response.message)
155-
}
152+
is NetworkResponse.Error -> {
153+
OptableResult.Error(response.message)
156154
}
155+
}
156+
157+
MainScope().launch {
157158
listener.onComplete(optableResult)
158159
}
159160
}
@@ -216,32 +217,5 @@ class OptableSDK(
216217
return NetworkClient(config, requestInterceptor, responseInterceptor)
217218
}
218219

219-
private fun createOptableTargeting(response: TargetingResponse): OptableTargeting {
220-
val audiences = response.audience ?: return OptableTargeting(emptyMap(), response.ortb2.toString(), emptyMap())
221-
222-
val gamTargetingKeywords = mutableMapOf<String, List<String>>()
223-
val targetingData = mutableMapOf<String, String>()
224-
225-
for (audience in audiences) {
226-
val keyspace = audience.asJsonObject.get("keyspace").asString
227-
228-
if (keyspace == null || keyspace.isBlank()) continue
229-
230-
val ids = audience.asJsonObject.get("ids").asJsonArray
231-
val gamIds = mutableListOf<String>()
232-
for (id in ids) {
233-
gamIds.add(id.asJsonObject.get("id").asString)
234-
}
235-
236-
gamTargetingKeywords[keyspace] = gamIds
237-
targetingData[keyspace] = audience.toString()
238-
}
239-
240-
return OptableTargeting(
241-
gamTargetingKeywords,
242-
response.ortb2.toString(),
243-
targetingData,
244-
)
245-
}
246220
}
247221

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package co.optable.android_sdk
22

3+
import org.json.JSONObject
4+
5+
36
/**
47
* @param gamTargetingKeywords Targeting keywords for GAM.
58
* Should be applied to `AdManagerAdRequest.Builder.addCustomTargeting`.
69
* @param openRtbJson Partial OpenRTB JSON string. Should be merged with OpenRTB request.
710
* For Prebid SDK use `TargetingParams.setGlobalOrtbConfig`.
8-
* @param targetingData Complete audience JSON strings grouped by keyspace. Allows dynamically parsing custom fields.
11+
* @param targetingData Complete JSON response. Allows dynamically parsing custom fields.
912
*/
1013
data class OptableTargeting(
1114
val gamTargetingKeywords: Map<String, List<String>>,
1215
val openRtbJson: String?,
13-
val targetingData: Map<String, String>,
16+
val targetingData: JSONObject,
1417
)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package co.optable.android_sdk.core
2+
3+
import android.util.Log
4+
import co.optable.android_sdk.OptableTargeting
5+
import com.google.gson.JsonObject
6+
import org.json.JSONObject
7+
8+
class UseCases {
9+
10+
fun parseTargetingResponse(responseJson: JsonObject): OptableTargeting {
11+
val gamTargetingKeywords = parseTargetingKeywords(responseJson)
12+
val openRtbJson = parseOpenRtbJson(responseJson)
13+
val targetingData = parseTargetingData(responseJson)
14+
return OptableTargeting(gamTargetingKeywords, openRtbJson, targetingData)
15+
}
16+
17+
private fun parseTargetingData(responseJson: JsonObject): JSONObject {
18+
var targetingData = JSONObject()
19+
try {
20+
targetingData = JSONObject(responseJson.toString())
21+
} catch (e: Exception) {
22+
}
23+
return targetingData
24+
}
25+
26+
private fun parseOpenRtbJson(responseJson: JsonObject): String? {
27+
var openRtbJson: String? = null
28+
try {
29+
openRtbJson = responseJson.getAsJsonObject("ortb2").toString()
30+
} catch (e: Exception) {
31+
Log.d("OptableSDK", "Can't parse OpenRTB: ${e.message}")
32+
}
33+
return openRtbJson
34+
}
35+
36+
private fun parseTargetingKeywords(responseJson: JsonObject): MutableMap<String, List<String>> {
37+
val gamTargetingKeywords = mutableMapOf<String, List<String>>()
38+
try {
39+
val audienceJsonArray = responseJson.getAsJsonArray("audience")
40+
for (audience in audienceJsonArray) {
41+
val keyspace = audience.asJsonObject.get("keyspace").asString
42+
43+
if (keyspace == null || keyspace.isBlank()) continue
44+
45+
val ids = audience.asJsonObject.get("ids").asJsonArray
46+
val gamIds = mutableListOf<String>()
47+
for (id in ids) {
48+
gamIds.add(id.asJsonObject.get("id").asString)
49+
}
50+
51+
gamTargetingKeywords[keyspace] = gamIds
52+
}
53+
} catch (e: Exception) {
54+
Log.d("OptableSDK", "Can't parse GAM targeting keywords: ${e.message}")
55+
}
56+
return gamTargetingKeywords
57+
}
58+
59+
}

android_sdk/src/main/java/co/optable/android_sdk/core/network/NetworkClient.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package co.optable.android_sdk.core.network
33
import co.optable.android_sdk.OptableConfig
44
import co.optable.android_sdk.OptableIdentifiers
55
import co.optable.android_sdk.core.network.edge.EdgeService
6-
import co.optable.android_sdk.core.network.edge.TargetingResponse
6+
import com.google.gson.JsonObject
77
import kotlinx.coroutines.Dispatchers
88
import kotlinx.coroutines.withContext
99
import okhttp3.OkHttpClient
@@ -51,7 +51,7 @@ internal class NetworkClient(
5151
}
5252
}
5353

54-
suspend fun targeting(idList: OptableIdentifiers): NetworkResponse<TargetingResponse> {
54+
suspend fun targeting(idList: OptableIdentifiers): NetworkResponse<JsonObject> {
5555
return runSafe {
5656
val ids = idList.generateEIDs()
5757
edgeService.targeting(ids)

android_sdk/src/main/java/co/optable/android_sdk/core/network/edge/EdgeService.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
package co.optable.android_sdk.core.network.edge
66

7+
import com.google.gson.JsonObject
78
import retrofit2.Response
89
import retrofit2.http.Body
910
import retrofit2.http.GET
@@ -13,7 +14,7 @@ import retrofit2.http.Query
1314
interface EdgeService {
1415

1516
@GET("targeting")
16-
suspend fun targeting(@Query("id") idList: List<String>): Response<TargetingResponse>
17+
suspend fun targeting(@Query("id") idList: List<String>): Response<JsonObject>
1718

1819
@POST("identify")
1920
suspend fun identify(@Body idList: List<String>): Response<Unit>

android_sdk/src/main/java/co/optable/android_sdk/core/network/edge/TargetingResponse.kt

Lines changed: 0 additions & 9 deletions
This file was deleted.

0 commit comments

Comments
 (0)