From 9ebad1471ab9bcbe91a9b7b6061ace08fd6b8c6b Mon Sep 17 00:00:00 2001 From: Jeasmine Nahui Date: Sat, 11 Sep 2021 15:49:35 -0300 Subject: [PATCH 1/3] Add onNewToken with Bundle HMS method support * Add onNewToken method support to HmsMessageServiceOneSignal, HmsMessageServiceAppLevel and OneSignalHmsEventBridge --- Examples/OneSignalDemo/app/build.gradle | 2 +- .../notification/HmsMessageServiceAppLevel.java | 10 +++++++--- .../com/onesignal/HmsMessageServiceOneSignal.java | 9 +++++++-- .../java/com/onesignal/OneSignalHmsEventBridge.java | 11 +++++++++-- .../main/java/com/onesignal/PushRegistratorHMS.java | 6 +++--- .../java/com/onesignal/ShadowPushRegistratorHMS.java | 2 +- 6 files changed, 28 insertions(+), 12 deletions(-) diff --git a/Examples/OneSignalDemo/app/build.gradle b/Examples/OneSignalDemo/app/build.gradle index b3abc769d4..b92b7b2e14 100644 --- a/Examples/OneSignalDemo/app/build.gradle +++ b/Examples/OneSignalDemo/app/build.gradle @@ -75,7 +75,7 @@ dependencies { // Test local OneSignal SDK gmsImplementation(project(':onesignal')) - huaweiImplementation 'com.huawei.hms:push:5.0.0.300' + huaweiImplementation 'com.huawei.hms:push:5.3.0.304' huaweiImplementation 'com.huawei.hms:location:4.0.0.300' // Omit Google / Firebase libraries for Huawei builds. huaweiImplementation(project(':onesignal')) { diff --git a/Examples/OneSignalDemo/app/src/huawei/java/com/onesignal/sdktest/notification/HmsMessageServiceAppLevel.java b/Examples/OneSignalDemo/app/src/huawei/java/com/onesignal/sdktest/notification/HmsMessageServiceAppLevel.java index aa66e3a690..6750d05115 100644 --- a/Examples/OneSignalDemo/app/src/huawei/java/com/onesignal/sdktest/notification/HmsMessageServiceAppLevel.java +++ b/Examples/OneSignalDemo/app/src/huawei/java/com/onesignal/sdktest/notification/HmsMessageServiceAppLevel.java @@ -1,5 +1,7 @@ package com.onesignal.sdktest.notification; +import android.os.Bundle; + import com.huawei.hms.push.HmsMessageService; import com.huawei.hms.push.RemoteMessage; import com.onesignal.OneSignal; @@ -7,19 +9,21 @@ public class HmsMessageServiceAppLevel extends HmsMessageService { + /** * When an app calls the getToken method to apply for a token from the server, * if the server does not return the token during current method calling, the server can return the token through this method later. * This method callback must be completed in 10 seconds. Otherwise, you need to start a new Job for callback processing. * * @param token token + * @param bundle bundle */ @Override - public void onNewToken(String token) { - OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "HMS onNewToken refresh token:" + token); + public void onNewToken(String token, Bundle bundle) { + OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "HMS onNewToken refresh token:" + token + " bundle: " + bundle); // Forward event on to OneSignal SDK - OneSignalHmsEventBridge.onNewToken(this, token); + OneSignalHmsEventBridge.onNewToken(this, token, bundle); } /** diff --git a/OneSignalSDK/onesignal/src/main/java/com/onesignal/HmsMessageServiceOneSignal.java b/OneSignalSDK/onesignal/src/main/java/com/onesignal/HmsMessageServiceOneSignal.java index 6a409f446d..afdc0ebfbd 100644 --- a/OneSignalSDK/onesignal/src/main/java/com/onesignal/HmsMessageServiceOneSignal.java +++ b/OneSignalSDK/onesignal/src/main/java/com/onesignal/HmsMessageServiceOneSignal.java @@ -1,5 +1,7 @@ package com.onesignal; +import android.os.Bundle; + import com.huawei.hms.push.HmsMessageService; import com.huawei.hms.push.RemoteMessage; @@ -20,15 +22,18 @@ */ public class HmsMessageServiceOneSignal extends HmsMessageService { + /** * When an app calls the getToken method to apply for a token from the server, * if the server does not return the token during current method calling, the server can return the token through this method later. * This method callback must be completed in 10 seconds. Otherwise, you need to start a new Job for callback processing. + * * @param token token + * @param bundle bundle */ @Override - public void onNewToken(String token) { - OneSignalHmsEventBridge.onNewToken(this, token); + public void onNewToken(String token, Bundle bundle) { + OneSignalHmsEventBridge.onNewToken(this, token, bundle); } /** diff --git a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java index bc620eeb0d..46ce819299 100644 --- a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java +++ b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java @@ -1,8 +1,10 @@ package com.onesignal; import android.content.Context; +import android.os.Bundle; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.huawei.hms.push.RemoteMessage; @@ -16,11 +18,16 @@ */ public class OneSignalHmsEventBridge { - public static void onNewToken(@NonNull Context context, @NonNull String token) { - OneSignal.Log(OneSignal.LOG_LEVEL.INFO, "HmsMessageServiceOneSignal.onNewToken - HMS token: " + token); + public static void onNewToken(@NonNull Context context, @NonNull String token, @Nullable Bundle bundle) { + OneSignal.Log(OneSignal.LOG_LEVEL.INFO, "HmsMessageServiceOneSignal.onNewToken - HMS token: " + token + " Bundle: " + bundle); PushRegistratorHMS.fireCallback(token); } + @Deprecated + public static void onNewToken(@NonNull Context context, @NonNull String token) { + onNewToken(context, token, null); + } + public static void onMessageReceived(@NonNull Context context, @NonNull RemoteMessage message) { NotificationPayloadProcessorHMS.processDataMessageReceived(context, message.getData()); } diff --git a/OneSignalSDK/onesignal/src/main/java/com/onesignal/PushRegistratorHMS.java b/OneSignalSDK/onesignal/src/main/java/com/onesignal/PushRegistratorHMS.java index 6e6ea38f6a..843a2381b2 100644 --- a/OneSignalSDK/onesignal/src/main/java/com/onesignal/PushRegistratorHMS.java +++ b/OneSignalSDK/onesignal/src/main/java/com/onesignal/PushRegistratorHMS.java @@ -68,9 +68,9 @@ private synchronized void getHMSTokenTask(@NonNull Context context, @NonNull Reg if (!TextUtils.isEmpty(pushToken)) { OneSignal.Log(LOG_LEVEL.INFO, "Device registered for HMS, push token = " + pushToken); callback.complete(pushToken, UserState.PUSH_STATUS_SUBSCRIBED); - } - else + } else { waitForOnNewPushTokenEvent(callback); + } } private static void doTimeOutWait() { @@ -82,7 +82,7 @@ private static void doTimeOutWait() { // If EMUI 9.x or older getToken will always return null. // We must wait for HmsMessageService.onNewToken to fire instead. - void waitForOnNewPushTokenEvent(@NonNull RegisteredHandler callback) { + private void waitForOnNewPushTokenEvent(@NonNull RegisteredHandler callback) { doTimeOutWait(); if (!callbackSuccessful) { OneSignal.Log(OneSignal.LOG_LEVEL.ERROR, "HmsMessageServiceOneSignal.onNewToken timed out."); diff --git a/OneSignalSDK/unittest/src/test/java/com/onesignal/ShadowPushRegistratorHMS.java b/OneSignalSDK/unittest/src/test/java/com/onesignal/ShadowPushRegistratorHMS.java index f78d13f826..52e1d35a61 100644 --- a/OneSignalSDK/unittest/src/test/java/com/onesignal/ShadowPushRegistratorHMS.java +++ b/OneSignalSDK/unittest/src/test/java/com/onesignal/ShadowPushRegistratorHMS.java @@ -23,7 +23,7 @@ public static void doTimeOutWait() { if (backgroundSuccessful) { // prepare required since doTimeOutWait will be run from a new background thread. Looper.prepare(); - new HmsMessageServiceOneSignal().onNewToken(ShadowHmsInstanceId.DEFAULT_MOCK_HMS_TOKEN_VALUE); + new HmsMessageServiceOneSignal().onNewToken(ShadowHmsInstanceId.DEFAULT_MOCK_HMS_TOKEN_VALUE, null); } } } From fd2fd4cbc3ce661724ba7dc17627bf6ceea4d948 Mon Sep 17 00:00:00 2001 From: Jeasmine Nahui Date: Mon, 1 Nov 2021 20:57:31 -0300 Subject: [PATCH 2/3] Add Deprecation comment * Add OneSignalHmsEventBridge onNewToken comment --- .../sdktest/notification/HmsMessageServiceAppLevel.java | 1 - .../main/java/com/onesignal/OneSignalHmsEventBridge.java | 7 +++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Examples/OneSignalDemo/app/src/huawei/java/com/onesignal/sdktest/notification/HmsMessageServiceAppLevel.java b/Examples/OneSignalDemo/app/src/huawei/java/com/onesignal/sdktest/notification/HmsMessageServiceAppLevel.java index 6750d05115..eab20d1837 100644 --- a/Examples/OneSignalDemo/app/src/huawei/java/com/onesignal/sdktest/notification/HmsMessageServiceAppLevel.java +++ b/Examples/OneSignalDemo/app/src/huawei/java/com/onesignal/sdktest/notification/HmsMessageServiceAppLevel.java @@ -9,7 +9,6 @@ public class HmsMessageServiceAppLevel extends HmsMessageService { - /** * When an app calls the getToken method to apply for a token from the server, * if the server does not return the token during current method calling, the server can return the token through this method later. diff --git a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java index 46ce819299..da8017f46e 100644 --- a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java +++ b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java @@ -18,11 +18,18 @@ */ public class OneSignalHmsEventBridge { + /** + * Method used by last HMS push version 5.3.0.304 and upper + */ public static void onNewToken(@NonNull Context context, @NonNull String token, @Nullable Bundle bundle) { OneSignal.Log(OneSignal.LOG_LEVEL.INFO, "HmsMessageServiceOneSignal.onNewToken - HMS token: " + token + " Bundle: " + bundle); PushRegistratorHMS.fireCallback(token); } + /** + * This method is being deprecated + * @see OneSignalHmsEventBridge#onNewToken(Context, String, Bundle) + */ @Deprecated public static void onNewToken(@NonNull Context context, @NonNull String token) { onNewToken(context, token, null); From c72be26e6132d3b9fb8dae131e4a6f6b283e7524 Mon Sep 17 00:00:00 2001 From: Jeasmine Nahui Date: Tue, 2 Nov 2021 12:42:54 -0300 Subject: [PATCH 3/3] Add backguards compatibility * Keep old onNewToken without bundle param --- .../notification/HmsMessageServiceAppLevel.java | 11 ++++++++++- .../com/onesignal/HmsMessageServiceOneSignal.java | 11 ++++++++++- .../java/com/onesignal/OneSignalHmsEventBridge.java | 12 ++++++++++-- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/Examples/OneSignalDemo/app/src/huawei/java/com/onesignal/sdktest/notification/HmsMessageServiceAppLevel.java b/Examples/OneSignalDemo/app/src/huawei/java/com/onesignal/sdktest/notification/HmsMessageServiceAppLevel.java index eab20d1837..21d20f86f6 100644 --- a/Examples/OneSignalDemo/app/src/huawei/java/com/onesignal/sdktest/notification/HmsMessageServiceAppLevel.java +++ b/Examples/OneSignalDemo/app/src/huawei/java/com/onesignal/sdktest/notification/HmsMessageServiceAppLevel.java @@ -19,12 +19,21 @@ public class HmsMessageServiceAppLevel extends HmsMessageService { */ @Override public void onNewToken(String token, Bundle bundle) { - OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "HMS onNewToken refresh token:" + token + " bundle: " + bundle); + OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "HmsMessageServiceAppLevel onNewToken refresh token:" + token + " bundle: " + bundle); // Forward event on to OneSignal SDK OneSignalHmsEventBridge.onNewToken(this, token, bundle); } + @Deprecated + @Override + public void onNewToken(String token) { + OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "HmsMessageServiceAppLevel onNewToken refresh token:" + token); + + // Forward event on to OneSignal SDK + OneSignalHmsEventBridge.onNewToken(this, token); + } + /** * This method is called in the following cases: * 1. "Data messages" - App process is alive when received. diff --git a/OneSignalSDK/onesignal/src/main/java/com/onesignal/HmsMessageServiceOneSignal.java b/OneSignalSDK/onesignal/src/main/java/com/onesignal/HmsMessageServiceOneSignal.java index afdc0ebfbd..adac9a0d8c 100644 --- a/OneSignalSDK/onesignal/src/main/java/com/onesignal/HmsMessageServiceOneSignal.java +++ b/OneSignalSDK/onesignal/src/main/java/com/onesignal/HmsMessageServiceOneSignal.java @@ -22,7 +22,6 @@ */ public class HmsMessageServiceOneSignal extends HmsMessageService { - /** * When an app calls the getToken method to apply for a token from the server, * if the server does not return the token during current method calling, the server can return the token through this method later. @@ -33,9 +32,19 @@ public class HmsMessageServiceOneSignal extends HmsMessageService { */ @Override public void onNewToken(String token, Bundle bundle) { + OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "HmsMessageServiceOneSignal onNewToken refresh token:" + token); + OneSignalHmsEventBridge.onNewToken(this, token, bundle); } + @Deprecated + @Override + public void onNewToken(String token) { + OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "HmsMessageServiceOneSignal onNewToken refresh token:" + token); + + OneSignalHmsEventBridge.onNewToken(this, token); + } + /** * This method is called in the following cases: * 1. "Data messages" - App process is alive when received. diff --git a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java index da8017f46e..b8f629d65a 100644 --- a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java +++ b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java @@ -8,6 +8,8 @@ import com.huawei.hms.push.RemoteMessage; +import java.util.concurrent.atomic.AtomicBoolean; + /** * If you have your own {@link com.huawei.hms.push.HmsMessageService} defined in your app please also * call {@link OneSignalHmsEventBridge#onNewToken} and {@link OneSignalHmsEventBridge#onMessageReceived} @@ -18,12 +20,18 @@ */ public class OneSignalHmsEventBridge { + private static final AtomicBoolean firstToken = new AtomicBoolean(true); + /** * Method used by last HMS push version 5.3.0.304 and upper */ public static void onNewToken(@NonNull Context context, @NonNull String token, @Nullable Bundle bundle) { - OneSignal.Log(OneSignal.LOG_LEVEL.INFO, "HmsMessageServiceOneSignal.onNewToken - HMS token: " + token + " Bundle: " + bundle); - PushRegistratorHMS.fireCallback(token); + if (firstToken.compareAndSet(true, false)) { + OneSignal.Log(OneSignal.LOG_LEVEL.INFO, "OneSignalHmsEventBridge onNewToken - HMS token: " + token + " Bundle: " + bundle); + PushRegistratorHMS.fireCallback(token); + } else { + OneSignal.Log(OneSignal.LOG_LEVEL.INFO, "OneSignalHmsEventBridge ignoring onNewToken - HMS token: " + token + " Bundle: " + bundle); + } } /**