From a47575485a5c00f2e676af3c982e9eedf20011ce Mon Sep 17 00:00:00 2001 From: Brad Hesse Date: Thu, 21 Jun 2018 11:28:42 -0700 Subject: [PATCH 1/4] Fix React Native Null Activity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • In some cases, especially with projects using the react-native-navigation dependency, the initial Activity would be null, preventing the SDK from initializing. • Added a check that will launch a re-attempt timer if this occurs. • Updated build.gradle to use a newer version (26.0.2) --- android/build.gradle | 4 ++-- .../rnonesignalandroid/RNOneSignal.java | 20 ++++++++++++++++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 8a5f4560..cd50227f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -5,8 +5,8 @@ def safeExtGet(prop, fallback) { } android { - compileSdkVersion safeExtGet('compileSdkVersion', 23) - buildToolsVersion safeExtGet('buildToolsVersion', '23.0.1') + compileSdkVersion safeExtGet('compileSdkVersion', 26) + buildToolsVersion safeExtGet('buildToolsVersion', '26.0.2') defaultConfig { minSdkVersion safeExtGet('minSdkVersion', 16) diff --git a/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java b/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java index 2bf54e09..e444214e 100644 --- a/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java +++ b/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java @@ -75,7 +75,6 @@ private String appIdFromManifest(ReactApplicationContext context) { // However it seems it is also to soon to call getCurrentActivity() from the reactContext as well. // This will normally succeed when onHostResume fires instead. private void initOneSignal() { - // Uncomment to debug init issues. // OneSignal.setLogLevel(OneSignal.LOG_LEVEL.VERBOSE, OneSignal.LOG_LEVEL.ERROR); @@ -107,8 +106,23 @@ private JSONObject jsonFromErrorMessageString(String errorMessage) throws JSONEx @ReactMethod public void init(String appId) { Activity activity = getCurrentActivity(); - if (activity == null || oneSignalInitDone) { - Log.e("onesignal", "Unable to initialize the OneSignal SDK because activity is null " + (activity == null) + " or oneSignalInitDone" + oneSignalInitDone); + + if (activity == null) { + // in some cases, especially with react-native-navigation, it can take a while for the Activity to be created + // if null, we should re-attempt initialization after 50 milliseconds. + final String currentAppId = appId; + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + init(currentAppId); + } + }, 50); + return; + } + + if (oneSignalInitDone) { + Log.w("onesignal", "The OneSignal SDK has already been initialized"); return; } From cfc914d95d790bc5670e5c54d448f06150e1b7ec Mon Sep 17 00:00:00 2001 From: Brad Hesse Date: Thu, 21 Jun 2018 15:57:45 -0700 Subject: [PATCH 2/4] Get Activity from RN Context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Changes how the SDK gets a reference to the current activity during initialization --- .../main/java/com/geektime/rnonesignalandroid/RNOneSignal.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java b/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java index e444214e..6aad738b 100644 --- a/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java +++ b/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java @@ -105,7 +105,7 @@ private JSONObject jsonFromErrorMessageString(String errorMessage) throws JSONEx @ReactMethod public void init(String appId) { - Activity activity = getCurrentActivity(); + Activity activity = mReactApplicationContext.getCurrentActivity(); if (activity == null) { // in some cases, especially with react-native-navigation, it can take a while for the Activity to be created From a6552f034f8abe644c8db1cce3271f04785c1e7b Mon Sep 17 00:00:00 2001 From: Brad Hesse Date: Thu, 21 Jun 2018 17:16:24 -0700 Subject: [PATCH 3/4] Fallback to Context Initialization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Changed the SDK so that if, during initialization, the initial activity does not exist, the SDK will use the application context instead --- .../rnonesignalandroid/RNOneSignal.java | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java b/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java index 6aad738b..cccfba8c 100644 --- a/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java +++ b/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java @@ -106,37 +106,33 @@ private JSONObject jsonFromErrorMessageString(String errorMessage) throws JSONEx @ReactMethod public void init(String appId) { Activity activity = mReactApplicationContext.getCurrentActivity(); - - if (activity == null) { - // in some cases, especially with react-native-navigation, it can take a while for the Activity to be created - // if null, we should re-attempt initialization after 50 milliseconds. - final String currentAppId = appId; - Timer timer = new Timer(); - timer.schedule(new TimerTask() { - @Override - public void run() { - init(currentAppId); - } - }, 50); - return; - } if (oneSignalInitDone) { - Log.w("onesignal", "The OneSignal SDK has already been initialized"); + Log.w("onesignal", "Already initialized the OneSignal React-Native SDK"); return; } oneSignalInitDone = true; - OneSignal.sdkType = "react"; - OneSignal.init(activity, - null, - appId, - new NotificationOpenedHandler(mReactContext), - new NotificationReceivedHandler(mReactContext) - ); + if (activity == null) { + // in some cases, especially when react-native-navigation is installed, + // the activity can be null, so we can initialize with the context instead + OneSignal.init(mReactApplicationContext.getApplicationContext(), + null, + appId, + new NotificationOpenedHandler(mReactContext), + new NotificationReceivedHandler(mReactContext) + ); + } else { + OneSignal.init(activity, + null, + appId, + new NotificationOpenedHandler(mReactContext), + new NotificationReceivedHandler(mReactContext) + ); + } } @ReactMethod From decba5a07c5f8b1ba53b97784b0532493a748324 Mon Sep 17 00:00:00 2001 From: Brad Hesse Date: Thu, 21 Jun 2018 17:30:28 -0700 Subject: [PATCH 4/4] Cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Cleans up initialization of the SDK, since Activity is a subclass of Context, we can simplify the initialization method. --- .../rnonesignalandroid/RNOneSignal.java | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java b/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java index cccfba8c..af6bf377 100644 --- a/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java +++ b/android/src/main/java/com/geektime/rnonesignalandroid/RNOneSignal.java @@ -105,10 +105,10 @@ private JSONObject jsonFromErrorMessageString(String errorMessage) throws JSONEx @ReactMethod public void init(String appId) { - Activity activity = mReactApplicationContext.getCurrentActivity(); + Context context = mReactApplicationContext.getCurrentActivity(); if (oneSignalInitDone) { - Log.w("onesignal", "Already initialized the OneSignal React-Native SDK"); + Log.e("onesignal", "Already initialized the OneSignal React-Native SDK"); return; } @@ -116,23 +116,18 @@ public void init(String appId) { OneSignal.sdkType = "react"; - if (activity == null) { + if (context == null) { // in some cases, especially when react-native-navigation is installed, // the activity can be null, so we can initialize with the context instead - OneSignal.init(mReactApplicationContext.getApplicationContext(), - null, - appId, - new NotificationOpenedHandler(mReactContext), - new NotificationReceivedHandler(mReactContext) - ); - } else { - OneSignal.init(activity, - null, - appId, - new NotificationOpenedHandler(mReactContext), - new NotificationReceivedHandler(mReactContext) - ); + context = mReactApplicationContext.getApplicationContext(); } + + OneSignal.init(context, + null, + appId, + new NotificationOpenedHandler(mReactContext), + new NotificationReceivedHandler(mReactContext) + ); } @ReactMethod