From c301a1090ed747c26955309ca5fcaa683e84286c Mon Sep 17 00:00:00 2001 From: Ben Wheeler Date: Thu, 13 Aug 2020 18:24:25 -0400 Subject: [PATCH 1/3] add generic setAnalyticsPref functions for iOS and Android --- .../android/JavaScriptDirectInterface.java | 7 +++++++ .../scratchjr/android/ScratchJrActivity.java | 19 +++++++++++++++++++ ios/ScratchJr/src/ScratchJr.h | 1 + ios/ScratchJr/src/ViewController.m | 10 ++++++++++ src/tablet/Android.js | 4 ++++ src/tablet/OS.js | 4 ++++ src/tablet/iOS.js | 4 ++++ 7 files changed, 49 insertions(+) diff --git a/android/ScratchJr/app/src/main/java/org/scratchjr/android/JavaScriptDirectInterface.java b/android/ScratchJr/app/src/main/java/org/scratchjr/android/JavaScriptDirectInterface.java index 856eaefa..603b5c17 100644 --- a/android/ScratchJr/app/src/main/java/org/scratchjr/android/JavaScriptDirectInterface.java +++ b/android/ScratchJr/app/src/main/java/org/scratchjr/android/JavaScriptDirectInterface.java @@ -629,4 +629,11 @@ public void setAnalyticsPlacePref(String place) { _activity.setAnalyticsPlacePref(place); } } + + @JavascriptInterface + public void setAnalyticsPref(String prefObjStr) { + if (prefObjStr != null) { + _activity.setAnalyticsPref(prefObjStr); + } + } } diff --git a/android/ScratchJr/app/src/main/java/org/scratchjr/android/ScratchJrActivity.java b/android/ScratchJr/app/src/main/java/org/scratchjr/android/ScratchJrActivity.java index a58b89f2..23c67958 100644 --- a/android/ScratchJr/app/src/main/java/org/scratchjr/android/ScratchJrActivity.java +++ b/android/ScratchJr/app/src/main/java/org/scratchjr/android/ScratchJrActivity.java @@ -41,6 +41,9 @@ import java.io.IOException; import java.io.InputStream; +import org.json.JSONObject; +import org.json.JSONArray; +import org.json.JSONException; /** * Main activity for Scratch Jr., consisting of a full-screen landscape WebView. * @@ -520,6 +523,22 @@ public void setAnalyticsPlacePref(String place) { _FirebaseAnalytics.setUserProperty("place_preference", place); } + /** + * Record a user property + * @param prefObjStr like "{\"school\": \"Central High\"}" + */ + public void setAnalyticsPref(String prefObjStr) { + try { + JSONObject jsonObject = new JSONObject(prefObjStr); + JSONArray jsonArray = jsonObject.names(); + String key = jsonArray.getString(0); + String value = jsonObject.getString(key); + _FirebaseAnalytics.setUserProperty(key, value); + } catch (JSONException e) { + // don't log anything to Firebase + } + } + public void translateAndScaleRectToContainerCoords(RectF rect, float devicePixelRatio) { float wx = _webView.getX(); float wy = _webView.getY(); diff --git a/ios/ScratchJr/src/ScratchJr.h b/ios/ScratchJr/src/ScratchJr.h index 873bf715..4201b3cb 100644 --- a/ios/ScratchJr/src/ScratchJr.h +++ b/ios/ScratchJr/src/ScratchJr.h @@ -128,6 +128,7 @@ - (NSString *) deviceName; - (NSString *) analyticsEvent:(NSString *)category :(NSString *)action :(NSString *)label; - (void) setAnalyticsPlacePref:(NSString *)place; +- (void) setAnalyticsPref:(NSString *)prefObjStr; @end @interface ViewController : UIViewController diff --git a/ios/ScratchJr/src/ViewController.m b/ios/ScratchJr/src/ViewController.m index 5571b85d..58d0d6d4 100644 --- a/ios/ScratchJr/src/ViewController.m +++ b/ios/ScratchJr/src/ViewController.m @@ -333,6 +333,16 @@ -(void) setAnalyticsPlacePref:(NSString*)place { [FIRAnalytics setUserPropertyString:place forName:@"place_preference"]; } +// @param prefObjStr like "{\"place_preference\": \"School\"}" +-(void) setAnalyticsPref:(NSString*)prefObjStr { + NSData* data = [prefObjStr dataUsingEncoding:NSUTF8StringEncoding]; + NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:data options:0 error: nil]; + NSString *key = [[dict allKeys] firstObject]; + NSString *value = [dict objectForKey: key]; + [FIRAnalytics setUserPropertyString:value forName:key]; +} + + // iPad name (used for information in the name/sharing dialog to help people using Airdrop) - (NSString*) deviceName { return [[UIDevice currentDevice] name]; diff --git a/src/tablet/Android.js b/src/tablet/Android.js index 90d0feeb..7ceebf5a 100644 --- a/src/tablet/Android.js +++ b/src/tablet/Android.js @@ -261,6 +261,10 @@ export default class Android { AndroidInterface.setAnalyticsPlacePref(preferredPlace); } + static setAnalyticsPref (jsonStr) { + AndroidInterface.setAnalyticsPref(jsonStr); + } + // // Web Wiew delegate call backs // // static pageError (desc) { diff --git a/src/tablet/OS.js b/src/tablet/OS.js index 794b7ef4..2124a6bd 100644 --- a/src/tablet/OS.js +++ b/src/tablet/OS.js @@ -253,6 +253,10 @@ export default class OS { tabletInterface.setAnalyticsPlacePref(preferredPlace); } + static setAnalyticsPref (key, value) { + tabletInterface.setAnalyticsPref(JSON.stringify({[key]: value})); + } + // Web Wiew delegate call backs static pageError (desc) { diff --git a/src/tablet/iOS.js b/src/tablet/iOS.js index 747751ed..e5db9550 100644 --- a/src/tablet/iOS.js +++ b/src/tablet/iOS.js @@ -268,6 +268,10 @@ export default class iOS { window.tablet.setAnalyticsPlacePref(preferredPlace); } + static setAnalyticsPref (jsonStr) { + window.tablet.setAnalyticsPref(jsonStr); + } + // // Web Wiew delegate call backs // // static pageError (desc) { From dcd4222b4ce0fbb0575a417fa697e845a43da097 Mon Sep 17 00:00:00 2001 From: Ben Wheeler Date: Fri, 14 Aug 2020 12:14:20 -0400 Subject: [PATCH 2/3] Move json stringify and parsing into interface --- .../android/JavaScriptDirectInterface.java | 14 +++++++++++++- .../scratchjr/android/ScratchJrActivity.java | 18 ++++-------------- src/tablet/Android.js | 4 ++-- src/tablet/OS.js | 2 +- src/tablet/iOS.js | 4 ++-- 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/android/ScratchJr/app/src/main/java/org/scratchjr/android/JavaScriptDirectInterface.java b/android/ScratchJr/app/src/main/java/org/scratchjr/android/JavaScriptDirectInterface.java index 603b5c17..1f7541e2 100644 --- a/android/ScratchJr/app/src/main/java/org/scratchjr/android/JavaScriptDirectInterface.java +++ b/android/ScratchJr/app/src/main/java/org/scratchjr/android/JavaScriptDirectInterface.java @@ -630,10 +630,22 @@ public void setAnalyticsPlacePref(String place) { } } + /** + * Record a user property + * @param prefObjStr single key-value JSON string, like "{\"school\": \"Central High\"}" + */ @JavascriptInterface public void setAnalyticsPref(String prefObjStr) { if (prefObjStr != null) { - _activity.setAnalyticsPref(prefObjStr); + try { + JSONObject jsonObject = new JSONObject(prefObjStr); + JSONArray jsonArray = jsonObject.names(); + String key = jsonArray.getString(0); + String value = jsonObject.getString(key); + } catch (JSONException e) { + Log.e(LOG_TAG, "JSON error: " + e.getMessage(), e); + } + _activity.setAnalyticsPref(key, value); } } } diff --git a/android/ScratchJr/app/src/main/java/org/scratchjr/android/ScratchJrActivity.java b/android/ScratchJr/app/src/main/java/org/scratchjr/android/ScratchJrActivity.java index 23c67958..e511efc9 100644 --- a/android/ScratchJr/app/src/main/java/org/scratchjr/android/ScratchJrActivity.java +++ b/android/ScratchJr/app/src/main/java/org/scratchjr/android/ScratchJrActivity.java @@ -41,9 +41,6 @@ import java.io.IOException; import java.io.InputStream; -import org.json.JSONObject; -import org.json.JSONArray; -import org.json.JSONException; /** * Main activity for Scratch Jr., consisting of a full-screen landscape WebView. * @@ -525,18 +522,11 @@ public void setAnalyticsPlacePref(String place) { /** * Record a user property - * @param prefObjStr like "{\"school\": \"Central High\"}" + * @param key like "school" + * @param value like "Central High" */ - public void setAnalyticsPref(String prefObjStr) { - try { - JSONObject jsonObject = new JSONObject(prefObjStr); - JSONArray jsonArray = jsonObject.names(); - String key = jsonArray.getString(0); - String value = jsonObject.getString(key); - _FirebaseAnalytics.setUserProperty(key, value); - } catch (JSONException e) { - // don't log anything to Firebase - } + public void setAnalyticsPref(String key, String value) { + _FirebaseAnalytics.setUserProperty(key, value); } public void translateAndScaleRectToContainerCoords(RectF rect, float devicePixelRatio) { diff --git a/src/tablet/Android.js b/src/tablet/Android.js index 7ceebf5a..e4e5804b 100644 --- a/src/tablet/Android.js +++ b/src/tablet/Android.js @@ -261,8 +261,8 @@ export default class Android { AndroidInterface.setAnalyticsPlacePref(preferredPlace); } - static setAnalyticsPref (jsonStr) { - AndroidInterface.setAnalyticsPref(jsonStr); + static setAnalyticsPref (obj) { + AndroidInterface.setAnalyticsPref(JSON.stringify(obj)); } // // Web Wiew delegate call backs diff --git a/src/tablet/OS.js b/src/tablet/OS.js index 2124a6bd..d3d86236 100644 --- a/src/tablet/OS.js +++ b/src/tablet/OS.js @@ -254,7 +254,7 @@ export default class OS { } static setAnalyticsPref (key, value) { - tabletInterface.setAnalyticsPref(JSON.stringify({[key]: value})); + tabletInterface.setAnalyticsPref({[key]: value}); } // Web Wiew delegate call backs diff --git a/src/tablet/iOS.js b/src/tablet/iOS.js index e5db9550..7b7e7b50 100644 --- a/src/tablet/iOS.js +++ b/src/tablet/iOS.js @@ -268,8 +268,8 @@ export default class iOS { window.tablet.setAnalyticsPlacePref(preferredPlace); } - static setAnalyticsPref (jsonStr) { - window.tablet.setAnalyticsPref(jsonStr); + static setAnalyticsPref (obj) { + window.tablet.setAnalyticsPref(JSON.stringify(obj)); } // // Web Wiew delegate call backs From 685389bfbdfe3057ea0dbf181cbea0de9b99b139 Mon Sep 17 00:00:00 2001 From: Ben Wheeler Date: Fri, 14 Aug 2020 13:50:36 -0400 Subject: [PATCH 3/3] only call setAnalyticsPref with a valid key, value pair --- .../java/org/scratchjr/android/JavaScriptDirectInterface.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/ScratchJr/app/src/main/java/org/scratchjr/android/JavaScriptDirectInterface.java b/android/ScratchJr/app/src/main/java/org/scratchjr/android/JavaScriptDirectInterface.java index 1f7541e2..f61f1f66 100644 --- a/android/ScratchJr/app/src/main/java/org/scratchjr/android/JavaScriptDirectInterface.java +++ b/android/ScratchJr/app/src/main/java/org/scratchjr/android/JavaScriptDirectInterface.java @@ -642,10 +642,11 @@ public void setAnalyticsPref(String prefObjStr) { JSONArray jsonArray = jsonObject.names(); String key = jsonArray.getString(0); String value = jsonObject.getString(key); + _activity.setAnalyticsPref(key, value); } catch (JSONException e) { Log.e(LOG_TAG, "JSON error: " + e.getMessage(), e); + return; } - _activity.setAnalyticsPref(key, value); } } }