From 1636c05945f146d20996d10139938ab46974d36d Mon Sep 17 00:00:00 2001 From: Jay Kim Date: Tue, 27 Sep 2022 17:26:17 -0700 Subject: [PATCH 1/4] create config option for in-app in memory storage --- .../com/iterable/iterableapi/IterableConfig.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java index b1398a6c7..d9b95f608 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java @@ -71,6 +71,12 @@ public class IterableConfig { */ final String[] allowedProtocols; + /** + * + * + */ + final boolean useInMemoryStorageForInApps; + private IterableConfig(Builder builder) { pushIntegrationName = builder.pushIntegrationName; urlHandler = builder.urlHandler; @@ -83,6 +89,7 @@ private IterableConfig(Builder builder) { authHandler = builder.authHandler; expiringAuthTokenRefreshPeriod = builder.expiringAuthTokenRefreshPeriod; allowedProtocols = builder.allowedProtocols; + useInMemoryStorageForInApps = builder.useInMemoryStorageForInApps; } public static class Builder { @@ -97,6 +104,8 @@ public static class Builder { private IterableAuthHandler authHandler; private long expiringAuthTokenRefreshPeriod = 60000L; private String[] allowedProtocols = new String[0]; + private boolean useInMemoryStorageForInApps = false; + public Builder() {} /** @@ -217,6 +226,12 @@ public Builder setAllowedProtocols(@NonNull String[] allowedProtocols) { return this; } + @NonNull + public Builder setUseInMemoryStorageForInApps(boolean useInMemoryStorageForInApps) { + this.useInMemoryStorageForInApps = useInMemoryStorageForInApps; + return this; + } + @NonNull public IterableConfig build() { return new IterableConfig(this); From 842b03d4d2ab67f53babe362cfbb97388f5b6cad Mon Sep 17 00:00:00 2001 From: Jay Kim Date: Tue, 27 Sep 2022 17:29:01 -0700 Subject: [PATCH 2/4] config option text --- .../main/java/com/iterable/iterableapi/IterableConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java index d9b95f608..c1aa0a1b3 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java @@ -72,8 +72,8 @@ public class IterableConfig { final String[] allowedProtocols; /** - * - * + * This controls whether the in-app content should be saved to disk, or only kept in memory. + * By default, the SDK will save in-apps to disk. */ final boolean useInMemoryStorageForInApps; From fdf5a84e13a5ec66ddbcd5d2be89a01e734dff34 Mon Sep 17 00:00:00 2001 From: Jay Kim Date: Wed, 28 Sep 2022 12:01:40 -0700 Subject: [PATCH 3/4] add in app in memory config switch --- .../java/com/iterable/iterableapi/IterableApi.java | 7 +++++-- .../com/iterable/iterableapi/IterableConfig.java | 5 +++++ .../iterable/iterableapi/IterableInAppManager.java | 12 ++++++++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java index 2cfc7c030..9eb534025 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java @@ -494,8 +494,11 @@ public static void initialize(@NonNull Context context, @NonNull String apiKey, IterableActivityMonitor.getInstance().addCallback(sharedInstance.activityMonitorListener); if (sharedInstance.inAppManager == null) { - sharedInstance.inAppManager = new IterableInAppManager(sharedInstance, sharedInstance.config.inAppHandler, - sharedInstance.config.inAppDisplayInterval); + sharedInstance.inAppManager = new IterableInAppManager( + sharedInstance, + sharedInstance.config.inAppHandler, + sharedInstance.config.inAppDisplayInterval, + sharedInstance.config.useInMemoryStorageForInApps); } loadLastSavedConfiguration(context); diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java index c1aa0a1b3..78eaaf5c9 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java @@ -226,6 +226,11 @@ public Builder setAllowedProtocols(@NonNull String[] allowedProtocols) { return this; } + /** + * Set whether the SDK should store in-apps only in memory, or in file storage + * @param useInMemoryStorageForInApps `true` will have in-apps be only in memory + */ + @NonNull public Builder setUseInMemoryStorageForInApps(boolean useInMemoryStorageForInApps) { this.useInMemoryStorageForInApps = useInMemoryStorageForInApps; diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableInAppManager.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableInAppManager.java index 2996e9273..9c7e6168f 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableInAppManager.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableInAppManager.java @@ -50,11 +50,11 @@ public interface Listener { private long lastInAppShown = 0; private boolean autoDisplayPaused = false; - IterableInAppManager(IterableApi iterableApi, IterableInAppHandler handler, double inAppDisplayInterval) { + IterableInAppManager(IterableApi iterableApi, IterableInAppHandler handler, double inAppDisplayInterval, boolean useInMemoryStorageForInApps) { this(iterableApi, handler, inAppDisplayInterval, - new IterableInAppFileStorage(iterableApi.getMainActivityContext()), + IterableInAppManager.getInAppStorageModel(iterableApi, useInMemoryStorageForInApps), IterableActivityMonitor.getInstance(), new IterableInAppDisplayer(IterableActivityMonitor.getInstance())); } @@ -435,6 +435,14 @@ private void handleIterableCustomAction(String actionName, IterableInAppMessage } } + private static IterableInAppStorage getInAppStorageModel(IterableApi iterableApi, boolean useInMemoryForInAppStorage) { + if (useInMemoryForInAppStorage) { + return new IterableInAppMemoryStorage(); + } else { + return new IterableInAppFileStorage(iterableApi.getMainActivityContext()); + } + } + @Override public void onSwitchToForeground() { if (IterableUtil.currentTimeMillis() - lastSyncTime > MOVE_TO_FOREGROUND_SYNC_INTERVAL_MS) { From 122badb386adae055c14375849f0d7a6b53051f6 Mon Sep 17 00:00:00 2001 From: Jay Kim Date: Wed, 28 Sep 2022 13:54:14 -0700 Subject: [PATCH 4/4] add in in-app blob delete when on in memory --- .../iterable/iterableapi/IterableInAppManager.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableInAppManager.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableInAppManager.java index 9c7e6168f..8fc294497 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableInAppManager.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableInAppManager.java @@ -17,6 +17,7 @@ import org.json.JSONException; import org.json.JSONObject; +import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -437,12 +438,24 @@ private void handleIterableCustomAction(String actionName, IterableInAppMessage private static IterableInAppStorage getInAppStorageModel(IterableApi iterableApi, boolean useInMemoryForInAppStorage) { if (useInMemoryForInAppStorage) { + checkAndDeleteUnusedInAppFileStorage(iterableApi.getMainActivityContext()); + return new IterableInAppMemoryStorage(); } else { return new IterableInAppFileStorage(iterableApi.getMainActivityContext()); } } + private static void checkAndDeleteUnusedInAppFileStorage(Context context) { + File sdkFilesDirectory = IterableUtil.getSDKFilesDirectory(context); + File inAppContentFolder = IterableUtil.getDirectory(sdkFilesDirectory, "IterableInAppFileStorage"); + File inAppBlob = new File(inAppContentFolder, "itbl_inapp.json"); + + if (inAppBlob.exists()) { + inAppBlob.delete(); + } + } + @Override public void onSwitchToForeground() { if (IterableUtil.currentTimeMillis() - lastSyncTime > MOVE_TO_FOREGROUND_SYNC_INTERVAL_MS) {