From f2e3e0f8d8b497ea40a740e2f6876aa23a473e0f Mon Sep 17 00:00:00 2001 From: Arif Burak Demiray Date: Wed, 2 Oct 2024 13:11:55 +0300 Subject: [PATCH 1/4] fix: response --- .../java/ly/count/android/sdk/ModuleContent.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sdk/src/main/java/ly/count/android/sdk/ModuleContent.java b/sdk/src/main/java/ly/count/android/sdk/ModuleContent.java index ef27b9cf5..2ab2a0129 100644 --- a/sdk/src/main/java/ly/count/android/sdk/ModuleContent.java +++ b/sdk/src/main/java/ly/count/android/sdk/ModuleContent.java @@ -139,12 +139,12 @@ Map parseContent(@NonNull JSONObject respons JSONObject contentObj = contents.optJSONObject(0); assert contentObj != null; - String content = contentObj.optString("pathToHtml"); - JSONObject coordinates = contentObj.optJSONObject("placementCoordinates"); + String content = contentObj.optString("html"); + JSONObject coordinates = contentObj.optJSONObject("geo"); assert coordinates != null; - placementCoordinates.put(Configuration.ORIENTATION_PORTRAIT, extractOrientationPlacements(coordinates, displayMetrics.density, "portrait", content)); - placementCoordinates.put(Configuration.ORIENTATION_LANDSCAPE, extractOrientationPlacements(coordinates, displayMetrics.density, "landscape", content)); + placementCoordinates.put(Configuration.ORIENTATION_PORTRAIT, extractOrientationPlacements(coordinates, displayMetrics.density, "p", content)); + placementCoordinates.put(Configuration.ORIENTATION_LANDSCAPE, extractOrientationPlacements(coordinates, displayMetrics.density, "l", content)); return placementCoordinates; } @@ -155,8 +155,8 @@ private TransparentActivityConfig extractOrientationPlacements(@NonNull JSONObje assert orientationPlacements != null; int x = orientationPlacements.optInt("x"); int y = orientationPlacements.optInt("y"); - int w = orientationPlacements.optInt("width"); - int h = orientationPlacements.optInt("height"); + int w = orientationPlacements.optInt("w"); + int h = orientationPlacements.optInt("h"); L.d("[ModuleContent] extractOrientationPlacements, orientation: [" + orientation + "], x: [" + x + "], y: [" + y + "], w: [" + w + "], h: [" + h + "]"); TransparentActivityConfig config = new TransparentActivityConfig((int) Math.ceil(x * density), (int) Math.ceil(y * density), (int) Math.ceil(w * density), (int) Math.ceil(h * density)); From f9d973484cfc54f5f20ceb776b11f7e73174f250 Mon Sep 17 00:00:00 2001 From: Arif Burak Demiray Date: Wed, 2 Oct 2024 15:44:02 +0300 Subject: [PATCH 2/4] feat: made it worj --- .../main/java/ly/count/android/sdk/ModuleContent.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/sdk/src/main/java/ly/count/android/sdk/ModuleContent.java b/sdk/src/main/java/ly/count/android/sdk/ModuleContent.java index 2ab2a0129..ffbf7c673 100644 --- a/sdk/src/main/java/ly/count/android/sdk/ModuleContent.java +++ b/sdk/src/main/java/ly/count/android/sdk/ModuleContent.java @@ -125,18 +125,19 @@ private String prepareContentFetchRequest(@NonNull DisplayMetrics displayMetrics } boolean validateResponse(@NonNull JSONObject response) { - boolean success = response.optString("result", "error").equals("success"); - JSONArray content = response.optJSONArray("content"); - return success && content != null && content.length() > 0; + return response.has("geo"); + //boolean success = response.optString("result", "error").equals("success"); + //JSONArray content = response.optJSONArray("content"); + //return success && content != null && content.length() > 0; } @NonNull Map parseContent(@NonNull JSONObject response, @NonNull DisplayMetrics displayMetrics) { Map placementCoordinates = new ConcurrentHashMap<>(); JSONArray contents = response.optJSONArray("content"); - assert contents != null; + //assert contents != null; TODO enable later - JSONObject contentObj = contents.optJSONObject(0); + JSONObject contentObj = response; //contents.optJSONObject(0); TODO this will be changed assert contentObj != null; String content = contentObj.optString("html"); From 3ebfaaa972bacbf981c260561a2374111dcb0b6e Mon Sep 17 00:00:00 2001 From: Arif Burak Demiray Date: Wed, 2 Oct 2024 15:46:44 +0300 Subject: [PATCH 3/4] feat: reorder changelog --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61c181dac..6abe57833 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,9 @@ * Disabled caching for webviews. * Expanded the flag (enablePreviousNameRecording) to add current view name as segmentation to custom events. (Experimental!) -* Mitigated an issue where content fetching was enabled after initialization of the SDK. - * Fixed an issue where the validation of the parameters during content retrieval was improper. * Mitigated an issue that density calculation was missing while resizing content. +* Mitigated an issue where content fetching was enabled after initialization of the SDK. ## 24.7.3 * Automatic view pause/resumes are changed with stop/start for better data consistency. From b30a450355e6aa5816fc5efac811d2fd552222fe Mon Sep 17 00:00:00 2001 From: turtledreams <62231246+turtledreams@users.noreply.github.com> Date: Sat, 5 Oct 2024 01:11:31 +0900 Subject: [PATCH 4/4] release updates --- .../ly/count/android/sdk/ConnectionQueue.java | 2 +- .../android/sdk/CountlyWebViewClient.java | 19 +++++-- .../android/sdk/TransparentActivity.java | 49 ++++++++++--------- 3 files changed, 41 insertions(+), 29 deletions(-) diff --git a/sdk/src/main/java/ly/count/android/sdk/ConnectionQueue.java b/sdk/src/main/java/ly/count/android/sdk/ConnectionQueue.java index f27f49830..3511df032 100644 --- a/sdk/src/main/java/ly/count/android/sdk/ConnectionQueue.java +++ b/sdk/src/main/java/ly/count/android/sdk/ConnectionQueue.java @@ -841,7 +841,7 @@ public String prepareFetchContents(int portraitWidth, int portraitHeight, int la L.e("Error while preparing fetch contents request"); } - return prepareCommonRequestData() + "&method=queue" + "&category=" + Arrays.asList(categories) + "&res=" + UtilsNetworking.urlEncodeString(json.toString()); + return prepareCommonRequestData() + "&method=queue" + "&category=" + Arrays.asList(categories) + "&resolution=" + UtilsNetworking.urlEncodeString(json.toString()); } @Override diff --git a/sdk/src/main/java/ly/count/android/sdk/CountlyWebViewClient.java b/sdk/src/main/java/ly/count/android/sdk/CountlyWebViewClient.java index c5e629e7c..0f0f1655f 100644 --- a/sdk/src/main/java/ly/count/android/sdk/CountlyWebViewClient.java +++ b/sdk/src/main/java/ly/count/android/sdk/CountlyWebViewClient.java @@ -1,5 +1,6 @@ package ly.count.android.sdk; +import android.util.Log; import android.webkit.WebResourceRequest; import android.webkit.WebResourceResponse; import android.webkit.WebView; @@ -29,13 +30,23 @@ public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request } @Override - public WebResourceResponse shouldInterceptRequest(WebView view, String url) { - return null; - } + public WebResourceResponse shouldInterceptRequest(WebView view, String url) { return null ; } @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { - return null; + String url = request.getUrl().toString(); + Log.d(Countly.TAG, "[WebClient] Intercepted request URL: [" + url + "]"); + + // Call listeners for specific actions + for (WebViewUrlListener listener : listeners) { + boolean handled = listener.onUrl(url, view); + if (handled) { + Log.d(Countly.TAG, "Request handled by listener: " + url); + break; + } + } + + return super.shouldInterceptRequest(view, request); } public void registerWebViewUrlListeners(List listener) { diff --git a/sdk/src/main/java/ly/count/android/sdk/TransparentActivity.java b/sdk/src/main/java/ly/count/android/sdk/TransparentActivity.java index 24e737e07..9889bda2d 100644 --- a/sdk/src/main/java/ly/count/android/sdk/TransparentActivity.java +++ b/sdk/src/main/java/ly/count/android/sdk/TransparentActivity.java @@ -181,39 +181,40 @@ private boolean contentUrlAction(String url, TransparentActivityConfig config, W Map query = splitQuery(url); Log.v(Countly.TAG, "[TransparentActivity] contentUrlAction, query: [" + query + "]"); - Object clyEvent = query.get("cly_x_action_event"); + Object clyEvent = query.get("?cly_x_action_event"); if (clyEvent == null || !clyEvent.equals("1")) { - Log.w(Countly.TAG, "[TransparentActivity] contentUrlAction, this is not a countly action event url"); - return false; - } - Object clyAction = query.get("action"); - if (!(clyAction instanceof String)) { - Log.w(Countly.TAG, "[TransparentActivity] contentUrlAction, action is not a string"); + Log.w(Countly.TAG, "[TransparentActivity] contentUrlAction, event:[" + clyEvent + "] this is not a countly action event url"); return false; } - String action = (String) clyAction; + Object clyAction = query.get("action"); boolean result = false; - - switch (action) { - case "event": - eventAction(query); - break; - case "link": - result = linkAction(query, view); - break; - case "resize_me": - resizeMeAction(query); - break; - default: - break; + if (clyAction instanceof String) { + Log.d(Countly.TAG, "[TransparentActivity] contentUrlAction, action string:[" + clyAction + "]"); + String action = (String) clyAction; + + switch (action) { + case "event": + eventAction(query); + break; + case "link": + linkAction(query, view); + break; + case "resize_me": + resizeMeAction(query); + break; + default: + break; + } } if (query.containsKey("close") && Objects.equals(query.get("close"), "1")) { - finish(); - config.globalContentCallback.onContentCallback(ContentStatus.CLOSED, query); + if (config.globalContentCallback != null) { // TODO: verify this later + config.globalContentCallback.onContentCallback(ContentStatus.CLOSED, query); + } ModuleContent.waitForDelay = 2; // this is indicating that we will wait 1 min after closing the content and before fetching the next one + finish(); return true; } @@ -315,7 +316,7 @@ private void eventAction(Map query) { private Map splitQuery(String url) { Map query_pairs = new ConcurrentHashMap<>(); - String[] pairs = url.split("https://countly_action_event?"); + String[] pairs = url.split("https://countly_action_event/?"); if (pairs.length != 2) { return query_pairs; }