Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Include action file arguments in CustomTemplateInAppData::getFileArgs… #634

Merged
merged 2 commits into from
Jul 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -483,15 +483,15 @@ void prepareForDisplay(
storeRegistry.getInAppAssetsStore());

if (inAppType.equals(CTInAppType.CTInAppTypeCustomCodeTemplate)) {
final List<Pair<String, CtCacheType>> fileUrlMetas = customTemplateData.getFileArgsUrls(templatesManager);
final List<String> fileUrls = customTemplateData.getFileArgsUrls(templatesManager);

int index = 0;
while (index < fileUrlMetas.size()) {
Pair<String, CtCacheType> urlMeta = fileUrlMetas.get(index);
byte[] bytes = fileResourceProvider.fetchFile(urlMeta.getFirst());
while (index < fileUrls.size()) {
String url = fileUrls.get(index);
byte[] bytes = fileResourceProvider.fetchFile(url);

if (bytes != null && bytes.length > 0) {
FileResourcesRepoImpl.saveUrlExpiryToStore(urlMeta,storePair);
FileResourcesRepoImpl.saveUrlExpiryToStore(new Pair<>(url, CtCacheType.FILES), storePair);
} else {
// download fail
this.error = "Error processing the custom code in-app template: file download failed.";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import com.clevertap.android.sdk.Constants
import com.clevertap.android.sdk.copyFrom
import com.clevertap.android.sdk.inapp.CTInAppType
import com.clevertap.android.sdk.inapp.customtemplates.TemplateArgumentType.FILE
import com.clevertap.android.sdk.inapp.data.CtCacheType
import com.clevertap.android.sdk.inapp.customtemplates.TemplateArgumentType.ACTION
import com.clevertap.android.sdk.utils.getStringOrNull
import com.clevertap.android.sdk.utils.readJson
import com.clevertap.android.sdk.utils.writeJson
Expand Down Expand Up @@ -48,15 +48,36 @@ internal class CustomTemplateInAppData private constructor(parcel: Parcel?) : Pa
}
}

fun getFileArgsUrls(templatesManager: TemplatesManager): List<Pair<String, CtCacheType>> {
return templateName?.let { name ->
templatesManager.getTemplate(name)?.args
?.filter { arg -> arg.type == FILE && args?.has(arg.name) ?: false }
?.mapNotNull { arg -> args?.getString(arg.name) }
?.map { url ->
Pair(url, CtCacheType.FILES)
fun getFileArgsUrls(templatesManager: TemplatesManager): List<String> {
val urls = mutableListOf<String>()
getFileArgsUrls(templatesManager, urls)
return urls
}

fun getFileArgsUrls(templatesManager: TemplatesManager, filesList: MutableList<String>) {
val templateName = templateName ?: return
val customTemplate = templatesManager.getTemplate(templateName) ?: return
val inAppArguments = args ?: return

for (arg in customTemplate.args) {
when (arg.type) {
FILE -> {
inAppArguments.getStringOrNull(arg.name)?.let { fileUrl ->
filesList.add(fileUrl)
}
}

ACTION -> {
inAppArguments.optJSONObject(arg.name)?.let { actionJson ->
createFromJson(actionJson)?.getFileArgsUrls(
templatesManager, filesList
)
}
}
} ?: emptyList()

else -> continue
}
}
}

override fun writeToParcel(dest: Parcel, flags: Int) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,18 @@ package com.clevertap.android.sdk.inapp.data
import android.content.res.Configuration
import com.clevertap.android.sdk.Constants
import com.clevertap.android.sdk.inapp.CTInAppNotificationMedia
import com.clevertap.android.sdk.inapp.customtemplates.CustomTemplateInAppData
import com.clevertap.android.sdk.inapp.customtemplates.CustomTemplateInAppData.CREATOR.createFromJson
import com.clevertap.android.sdk.inapp.customtemplates.TemplateArgument
import com.clevertap.android.sdk.inapp.customtemplates.TemplateArgumentType
import com.clevertap.android.sdk.inapp.customtemplates.TemplatesManager
import com.clevertap.android.sdk.inapp.evaluation.LimitAdapter
import com.clevertap.android.sdk.iterator
import com.clevertap.android.sdk.orEmptyArray
import com.clevertap.android.sdk.safeGetJSONArray
import com.clevertap.android.sdk.safeGetJSONArrayOrNullIfEmpty
import com.clevertap.android.sdk.toList
import com.clevertap.android.sdk.utils.getStringOrNull
import org.json.JSONArray
import org.json.JSONObject

Expand Down Expand Up @@ -42,7 +46,7 @@ internal class InAppResponseAdapter(
val clientSideInApps: Pair<Boolean, JSONArray?> = responseJson.safeGetJSONArray(Constants.INAPP_NOTIFS_KEY_CS)
val serverSideInApps: Pair<Boolean, JSONArray?> = responseJson.safeGetJSONArray(Constants.INAPP_NOTIFS_KEY_SS)
val appLaunchServerSideInApps: Pair<Boolean, JSONArray?> = responseJson.safeGetJSONArrayOrNullIfEmpty(Constants.INAPP_NOTIFS_APP_LAUNCHED_KEY)

val preloadImages: List<String>
val preloadGifs: List<String>
val preloadFiles: List<String>
Expand Down Expand Up @@ -114,14 +118,12 @@ internal class InAppResponseAdapter(

private fun fetchFilesUrlsForTemplates(filesList: MutableList<String>, templatesManager: TemplatesManager) {
if (clientSideInApps.first) {
for (i in 0 until clientSideInApps.second!!.length()) {
val customTemplateInAppData = createFromJson(clientSideInApps.second!!.getJSONObject(i))
if (customTemplateInAppData != null) {
val fileArgs = customTemplateInAppData.getFileArgsUrls(
templatesManager
)
filesList.addAll(fileArgs.map { it.first })
}
val inAppsList = clientSideInApps.second ?: return
for (i in 0 until inAppsList.length()) {
createFromJson(inAppsList.optJSONObject(i))?.getFileArgsUrls(
templatesManager,
filesList
)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import kotlin.test.assertEquals

class CustomTemplateInAppDataTest {


private lateinit var templatesManager: TemplatesManager
private val keyTemplateName = "templateName"
private val keyVars = "vars"
Expand Down Expand Up @@ -162,6 +161,56 @@ class CustomTemplateInAppDataTest {
assertEquals(listOf(Pair("file_url_1",CtCacheType.FILES)), result)
}

@Test
fun `getFileArgsUrls retrieves file args in both the template and its actions`() {
val url1 = "url1"
val url2 = "url2"
val mainTemplateName = "templateWithAction"
val actionTemplateName = "actionTemplate"
val inAppDataJson = JSONObject(
"""
{
"templateName": "$mainTemplateName",
"templateId": "templateWithActionId",
"templateDescription": "Description",
"type": "$CUSTOM_CODE",
"vars": {
"file": "$url1",
"action": {
"templateName": "$actionTemplateName",
"templateId": "actionTemplateId",
"templateDescription": "Description",
"type": "$CUSTOM_CODE",
"vars": {
"file": "$url2"
}
}
}
}
""".trimIndent()
)

val mainTemplate = template {
name(mainTemplateName)
presenter(presenter)
fileArgument("file")
actionArgument("action")
}
val actionTemplate = function(false) {
name(actionTemplateName)
presenter {}
fileArgument("file")
}

every { templatesManager.getTemplate(mainTemplateName) } returns mainTemplate
every { templatesManager.getTemplate(actionTemplateName) } returns actionTemplate

val customInAppData = CustomTemplateInAppData.createFromJson(inAppDataJson)
val fileUrls = customInAppData!!.getFileArgsUrls(templatesManager)

assertEquals(listOf(url1, url2), fileUrls)
}

private val inAppDataJson = JSONObject(
"""
{
Expand Down