From 9e30b90a177edaee3d49db0f86c2a3f8eddf574e Mon Sep 17 00:00:00 2001 From: Ben Wheeler Date: Mon, 13 Apr 2020 22:07:24 -0400 Subject: [PATCH 1/4] ios and android log event action as event type --- .../src/main/java/org/scratchjr/android/ScratchJrActivity.java | 3 +-- ios/ScratchJr/src/ViewController.m | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) 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 afc7232d..709a5827 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 @@ -502,10 +502,9 @@ public void run() { */ public void logAnalyticsEvent(String category, String action, String label) { Bundle params = new Bundle(); - params.putString(FirebaseAnalytics.Param.ITEM_ID, action); params.putString(FirebaseAnalytics.Param.ITEM_CATEGORY, category); params.putString(FirebaseAnalytics.Param.ITEM_NAME, label); - _FirebaseAnalytics.logEvent(FirebaseAnalytics.Event.VIEW_ITEM, params); + _FirebaseAnalytics.logEvent(action, params); } /** diff --git a/ios/ScratchJr/src/ViewController.m b/ios/ScratchJr/src/ViewController.m index 064f2260..0827e9ff 100644 --- a/ios/ScratchJr/src/ViewController.m +++ b/ios/ScratchJr/src/ViewController.m @@ -321,9 +321,8 @@ - (NSString *) hideSplash :(NSString *)body { } -(NSString*) analyticsEvent:(NSString*) category :(NSString*) action :(NSString*) label { - [FIRAnalytics logEventWithName:kFIREventViewItem + [FIRAnalytics logEventWithName:action parameters:@{ - kFIRParameterItemID:action, kFIRParameterItemName:label, kFIRParameterItemCategory:category }]; From caa7aed2915595b9f87789258a172c095026d33c Mon Sep 17 00:00:00 2001 From: Ben Wheeler Date: Mon, 13 Apr 2020 22:09:20 -0400 Subject: [PATCH 2/4] log more events to analytics --- src/editor/ScratchJr.js | 1 + src/editor/engine/Sprite.js | 3 +++ src/editor/ui/Record.js | 4 ++++ src/editor/ui/Thumbs.js | 3 +++ src/editor/ui/UI.js | 1 + src/painteditor/Paint.js | 9 +++++++-- 6 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/editor/ScratchJr.js b/src/editor/ScratchJr.js index f1b35ccc..1d8fc388 100644 --- a/src/editor/ScratchJr.js +++ b/src/editor/ScratchJr.js @@ -536,6 +536,7 @@ export default class ScratchJr { inFullscreen = false; UI.quitFullScreen(); onBackButtonCallback.pop(); + iOS.analyticsEvent('editor', 'full_screen_exited'); document.body.style.background = 'white'; } diff --git a/src/editor/engine/Sprite.js b/src/editor/engine/Sprite.js index fafb578a..c0949d37 100755 --- a/src/editor/engine/Sprite.js +++ b/src/editor/engine/Sprite.js @@ -716,6 +716,7 @@ export default class Sprite { var sprites = JSON.parse(page.sprites); sprites.push(this.id); page.sprites = JSON.stringify(sprites); + iOS.analyticsEvent('editor', 'text_sprite_create'); if ((this.str == '') && !whenDone) { this.setTextBox(); this.activateInput(); @@ -805,6 +806,7 @@ export default class Sprite { document.body.scrollLeft = 0; var form = document.forms.activetextbox; var changed = (this.oldvalue != form.typing.value); + iOS.analyticsEvent('editor', 'text_sprite_close'); if (this.noChars(form.typing.value)) { this.deleteText(this.oldvalue != ''); } else { @@ -889,6 +891,7 @@ export default class Sprite { var ti = document.forms.activetextbox.typing; gn('textbox').style.visibility = 'visible'; var me = this; + iOS.analyticsEvent('editor', 'text_sprite_open'); ti.onblur = function () { me.unfocusText(); }; diff --git a/src/editor/ui/Record.js b/src/editor/ui/Record.js index c02cd5b0..47bb8e6b 100644 --- a/src/editor/ui/Record.js +++ b/src/editor/ui/Record.js @@ -60,6 +60,7 @@ export default class Record { // Dialog box hide/show static appear () { + iOS.analyticsEvent('editor', 'record_dialog_open'); gn('backdrop').setAttribute('class', 'modal-backdrop fade in'); setProps(gn('backdrop').style, { display: 'block' @@ -71,6 +72,7 @@ export default class Record { } static disappear () { + iOS.analyticsEvent('editor', 'record_dialog_close'); setTimeout(function () { gn('backdrop').setAttribute('class', 'modal-backdrop fade'); setProps(gn('backdrop').style, { @@ -152,6 +154,7 @@ export default class Record { } static startRecording (filename) { + iOS.analyticsEvent('editor', 'start_recording'); if (parseInt(filename) < 0) { // Error in getting record filename - go back to editor recordedSound = undefined; @@ -250,6 +253,7 @@ export default class Record { // Stop the volume monitor and recording static stopRecording (fcn) { + iOS.analyticsEvent('editor', 'stop_recording'); if (timeLimit != null) { clearTimeout(timeLimit); timeLimit = null; diff --git a/src/editor/ui/Thumbs.js b/src/editor/ui/Thumbs.js index c7fba28e..8f07bc92 100644 --- a/src/editor/ui/Thumbs.js +++ b/src/editor/ui/Thumbs.js @@ -8,6 +8,7 @@ import Page from '../engine/Page'; import ScriptsPane from './ScriptsPane'; import Undo from './Undo'; import UI from './UI'; +import iOS from '../../iPad/iOS'; import Events from '../../utils/Events'; import ScratchAudio from '../../utils/ScratchAudio'; import {frame, gn, localx, newHTML, scaleMultiplier, getIdFor, @@ -82,6 +83,7 @@ export default class Thumbs { var tb = Thumbs.getType(Thumbs.t, 'pagethumb'); if (ScratchJr.shaking && (e.target.className == 'deletethumb')) { ScratchJr.clearSelection(); + iOS.analyticsEvent('editor', 'delete_scene'); ScratchJr.stage.deletePage(tb.owner); return; } @@ -376,6 +378,7 @@ export default class Thumbs { sc.owner.deactivate(); } ScratchJr.unfocus(e); + iOS.analyticsEvent('editor', 'add_scene'); new Page(getIdFor('page')); } diff --git a/src/editor/ui/UI.js b/src/editor/ui/UI.js index 42f6a827..23f681bc 100644 --- a/src/editor/ui/UI.js +++ b/src/editor/ui/UI.js @@ -761,6 +761,7 @@ export default class UI { static toggleGrid (b) { Grid.hide(b); + iOS.analyticsEvent('editor', Grid.hidden ? 'hide_grid' : 'show_grid'); gn('grid').className = Grid.hidden ? 'gridToggle off' : 'gridToggle on'; } diff --git a/src/painteditor/Paint.js b/src/painteditor/Paint.js index 7140b99b..1329bc7f 100644 --- a/src/painteditor/Paint.js +++ b/src/painteditor/Paint.js @@ -164,8 +164,12 @@ export default class Paint { let action = ''; let label = ''; // Analytics: - // md3: name of the asset, an md5 hash for user generated, filename for library items - // sname: is not set for a new character (ignored for backgrounds) + // * md3: name of the asset, an md5 hash for user generated, filename for library items + // * sname: is not set for a new character (ignored for backgrounds) + // log two events: + // * paint editor is opened + // * type of edit (edit_background, edit_character, new_character) + iOS.analyticsEvent('paint_editor', 'paint_editor_open'); if (bkg) { action = 'edit_background'; label = (md5 in MediaLib.keys) ? md5 : 'user_background'; @@ -352,6 +356,7 @@ export default class Paint { } static close () { + iOS.analyticsEvent('paint_editor', 'paint_editor_close'); saving = true; paintFrame.className = 'paintframe disappear'; frame.style.display = 'block'; From 2762cdf27153602fcd70078dfe86aaf2d7c9e514 Mon Sep 17 00:00:00 2001 From: Ben Wheeler Date: Mon, 20 Apr 2020 13:40:45 -0400 Subject: [PATCH 3/4] refactor toggleGrid to be clearer, only send analytics in response to user action --- src/editor/ui/UI.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/editor/ui/UI.js b/src/editor/ui/UI.js index 23f681bc..8bd8f1e3 100644 --- a/src/editor/ui/UI.js +++ b/src/editor/ui/UI.js @@ -729,7 +729,7 @@ export default class UI { UI.creatTopBarClicky(div, 'go', 'go on', UI.toggleRun); UI.creatTopBarClicky(div, 'resetall', 'resetall', UI.resetAllSprites); UI.creatTopBarClicky(div, 'full', 'fullscreen', ScratchJr.fullScreen); - UI.toggleGrid(true); + UI.setShowGrid(false); } static resetAllSprites (e) { @@ -756,12 +756,12 @@ export default class UI { static switchGrid () { ScratchAudio.sndFX('tap.wav'); - UI.toggleGrid(!Grid.hidden); + UI.setShowGrid(Grid.hidden); + iOS.analyticsEvent('editor', Grid.hidden ? 'hide_grid' : 'show_grid'); } - static toggleGrid (b) { - Grid.hide(b); - iOS.analyticsEvent('editor', Grid.hidden ? 'hide_grid' : 'show_grid'); + static setShowGrid (b) { + Grid.hide(!b); gn('grid').className = Grid.hidden ? 'gridToggle off' : 'gridToggle on'; } From abd8a1bb86afab1f6b8415a21da8eb7891c80791 Mon Sep 17 00:00:00 2001 From: Ben Wheeler Date: Mon, 20 Apr 2020 15:18:14 -0400 Subject: [PATCH 4/4] added project_editor_open and _close analytics events --- src/editor/ScratchJr.js | 1 + src/entry/editor.js | 1 + 2 files changed, 2 insertions(+) diff --git a/src/editor/ScratchJr.js b/src/editor/ScratchJr.js index 1d8fc388..52c2cf8f 100644 --- a/src/editor/ScratchJr.js +++ b/src/editor/ScratchJr.js @@ -381,6 +381,7 @@ export default class ScratchJr { ScratchJr.stopStripsFromTop(e); ScratchJr.unfocus(e); ScratchJr.saveProject(e, ScratchJr.flippage); + iOS.analyticsEvent('editor', 'project_editor_close'); } static flippage () { diff --git a/src/entry/editor.js b/src/entry/editor.js index 2b3be6e6..74d69253 100644 --- a/src/entry/editor.js +++ b/src/entry/editor.js @@ -5,6 +5,7 @@ import Record from '../editor/ui/Record'; export function editorMain () { iOS.getsettings(doNext); + iOS.analyticsEvent('editor', 'project_editor_open'); function doNext (str) { var list = str.split(','); iOS.path = list[1] == '0' ? list[0] + '/' : undefined;