diff --git a/CHANGELOG.md b/CHANGELOG.md index b529dfeb6..c84da36df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,10 @@ * Disabled caching for webviews. * Expanded the flag (enablePreviousNameRecording) to add current view name as segmentation to custom events. (Experimental!) -* Mitigated an issue where a session could have started while the app was in the background when the device ID was changed (non-merge). -* 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 where a session could have started while the app was in the background when the device ID was changed (non-merge). * 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. 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/ModuleContent.java b/sdk/src/main/java/ly/count/android/sdk/ModuleContent.java index ef27b9cf5..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,26 +125,27 @@ 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("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 +156,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)); 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; }