From 00b8ae311d9a653d4c6402e6a3ad70a5082f1fda Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Tue, 1 May 2018 12:27:04 +0200 Subject: [PATCH] [#4006] anonymous uuid for mixpanel --- .../status/ethereum/module/StatusModule.java | 21 ++++++++++++++++++ .../ios/RCTStatus/RCTStatus.m | 9 ++++++++ src/status_im/native_module/core.cljs | 3 +++ src/status_im/native_module/impl/module.cljs | 14 ++++++++++-- src/status_im/native_module/module.cljs | 3 ++- src/status_im/ui/screens/db.cljs | 7 +++++- src/status_im/ui/screens/events.cljs | 22 ++++++++++++------- src/status_im/utils/handlers.cljs | 4 +--- 8 files changed, 68 insertions(+), 15 deletions(-) diff --git a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java index b717f4359a1..c8dc2e2d83b 100644 --- a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java +++ b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java @@ -1,6 +1,8 @@ package im.status.ethereum.module; import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; import android.net.Uri; import android.os.*; import android.view.WindowManager; @@ -728,4 +730,23 @@ public void appStateChange(final String type) { Log.d(TAG, "AppStateChange: " + type); Statusgo.AppStateChange(type); } + + private static String uniqueID = null; + private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID"; + + @ReactMethod + public void getDeviceUUID(final Callback callback) { + if (uniqueID == null) { + SharedPreferences sharedPrefs = this.getReactApplicationContext().getSharedPreferences( + PREF_UNIQUE_ID, Context.MODE_PRIVATE); + uniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null); + if (uniqueID == null) { + uniqueID = UUID.randomUUID().toString(); + SharedPreferences.Editor editor = sharedPrefs.edit(); + editor.putString(PREF_UNIQUE_ID, uniqueID); + editor.commit(); + } + } + callback.invoke(uniqueID); + } } diff --git a/modules/react-native-status/ios/RCTStatus/RCTStatus.m b/modules/react-native-status/ios/RCTStatus/RCTStatus.m index de97dbe899d..bc45e03a73e 100644 --- a/modules/react-native-status/ios/RCTStatus/RCTStatus.m +++ b/modules/react-native-status/ios/RCTStatus/RCTStatus.m @@ -426,6 +426,15 @@ + (BOOL)JSCEnabled AppStateChange((char *) [type UTF8String]); } +RCT_EXPORT_METHOD(getDeviceUUID:(RCTResponseSenderBlock)callback) { +#if DEBUG + NSLog(@"getDeviceUUID() method called"); +#endif + NSString* Identifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; + + callback(@[Identifier]); +} + + (void)signalEvent:(const char *) signal { if(!signal){ diff --git a/src/status_im/native_module/core.cljs b/src/status_im/native_module/core.cljs index 2a8356bbf8b..3c53fd28ffb 100644 --- a/src/status_im/native_module/core.cljs +++ b/src/status_im/native_module/core.cljs @@ -100,3 +100,6 @@ (defn app-state-change [state] (module-interface/-app-state-change rns-module state)) + +(defn get-device-UUID [callback] + (module-interface/-get-device-UUID rns-module callback)) diff --git a/src/status_im/native_module/impl/module.cljs b/src/status_im/native_module/impl/module.cljs index de1368e4dd9..4c5cf56578a 100644 --- a/src/status_im/native_module/impl/module.cljs +++ b/src/status_im/native_module/impl/module.cljs @@ -12,7 +12,8 @@ [status-im.utils.async :as async-util :refer [timeout]] [status-im.react-native.js-dependencies :as rn-dependencies] [status-im.native-module.module :as module] - [status-im.utils.config :as config])) + [status-im.utils.config :as config] + [clojure.string :as string])) ;; if StatusModule is not initialized better to store ;; calls and make them only when StatusModule is ready @@ -243,6 +244,13 @@ (defn app-state-change [state] (.appStateChange status state)) +(defn get-device-UUID [callback] + (call-module + #(.getDeviceUUID + status + (fn [UUID] + (callback (string/upper-case UUID)))))) + (defrecord ReactNativeStatus [] module/IReactNativeStatus ;; status-go calls @@ -293,4 +301,6 @@ (-connection-change [this data] (connection-change data)) (-app-state-change [this state] - (app-state-change state))) + (app-state-change state)) + (-get-device-UUID [this callback] + (get-device-UUID callback))) diff --git a/src/status_im/native_module/module.cljs b/src/status_im/native_module/module.cljs index 99fe4784239..0ccfd94e591 100644 --- a/src/status_im/native_module/module.cljs +++ b/src/status_im/native_module/module.cljs @@ -23,5 +23,6 @@ (-add-peer [this enode callback]) (-close-application [this]) (-connection-change [this data]) - (-app-state-change [this state])) + (-app-state-change [this state]) + (-get-device-UUID [this callback])) diff --git a/src/status_im/ui/screens/db.cljs b/src/status_im/ui/screens/db.cljs index 13c0c6ea348..1cdcbd2f3c0 100644 --- a/src/status_im/ui/screens/db.cljs +++ b/src/status_im/ui/screens/db.cljs @@ -132,6 +132,10 @@ (spec/def ::message-envelopes (spec/nilable map?)) +;;;;UUID + +(spec/def ::device-UUID (spec/nilable string?)) + (spec/def ::db (allowed-keys :opt [:contacts/contacts @@ -235,4 +239,5 @@ :wallet/wallet-selected-asset :prices/prices :prices/prices-loading? - :notifications/notifications])) + :notifications/notifications + ::device-UUID])) diff --git a/src/status_im/ui/screens/events.cljs b/src/status_im/ui/screens/events.cljs index 00ea8073d9b..226688c4a27 100644 --- a/src/status_im/ui/screens/events.cljs +++ b/src/status_im/ui/screens/events.cljs @@ -180,6 +180,11 @@ (i18n/label :testfairy-title) (i18n/label :testfairy-message))))) +(re-frame/reg-fx + ::init-device-UUID + (fn [] + (status/get-device-UUID #(re-frame/dispatch [:set :device-UUID %])))) + (re-frame/reg-fx ::get-fcm-token-fx (fn [_] @@ -224,14 +229,15 @@ {::got-encryption-key-fx opts})) (handlers/register-handler-fx - :initialize-app - (fn [_ [_ encryption-key]] - {::testfairy-alert nil - :dispatch-n [[:initialize-db encryption-key] - [:load-accounts] - [:initialize-views] - [:listen-to-network-status] - [:initialize-geth]]})) + :initialize-app + (fn [_ [_ encryption-key]] + {::init-device-UUID nil + ::testfairy-alert nil + :dispatch-n [[:initialize-db encryption-key] + [:load-accounts] + [:initialize-views] + [:listen-to-network-status] + [:initialize-geth]]})) (handlers/register-handler-fx :logout diff --git a/src/status_im/utils/handlers.cljs b/src/status_im/utils/handlers.cljs index 8b0748147bb..786a29e9efa 100644 --- a/src/status_im/utils/handlers.cljs +++ b/src/status_im/utils/handlers.cljs @@ -3,7 +3,6 @@ [clojure.string :as string] [re-frame.core :refer [reg-event-db reg-event-fx] :as re-frame] [re-frame.interceptor :refer [->interceptor get-coeffect get-effect]] - [status-im.utils.ethereum.core :as ethereum] [status-im.utils.instabug :as instabug] [status-im.utils.mixpanel :as mixpanel] [cljs.core.async :as async] @@ -92,7 +91,6 @@ (fn track-handler [context] (let [new-db (get-coeffect context :db) - current-account-id (get-in new-db [:account/account :address]) [event-name] (get-coeffect context :event)] (when (or (mixpanel/force-tracking? event-name) @@ -100,7 +98,7 @@ (let [event (get-coeffect context :event) offline? (or (= :offline (:network-status new-db)) (= :offline (:sync-state new-db))) - anon-id (ethereum/sha3 current-account-id)] + anon-id (:device-UUID new-db)] (doseq [{:keys [label properties]} (mixpanel/matching-events new-db event mixpanel/event-by-trigger)] (mixpanel/track anon-id label properties offline?))