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..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 @@ -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; @@ -13,10 +15,20 @@ public class HmsMessageServiceAppLevel extends HmsMessageService { * 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, 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, "HMS onNewToken refresh token:" + token); + OneSignal.onesignalLog(OneSignal.LOG_LEVEL.DEBUG, "HmsMessageServiceAppLevel onNewToken refresh token:" + token); // Forward event on to OneSignal SDK OneSignalHmsEventBridge.onNewToken(this, token); diff --git a/OneSignalSDK/onesignal/src/main/java/com/onesignal/HmsMessageServiceOneSignal.java b/OneSignalSDK/onesignal/src/main/java/com/onesignal/HmsMessageServiceOneSignal.java index 6a409f446d..adac9a0d8c 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; @@ -24,10 +26,22 @@ 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, 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); } diff --git a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java index bc620eeb0d..b8f629d65a 100644 --- a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java +++ b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java @@ -1,11 +1,15 @@ 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; +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} @@ -16,9 +20,27 @@ */ 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) { + 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); + } + } + + /** + * This method is being deprecated + * @see OneSignalHmsEventBridge#onNewToken(Context, String, Bundle) + */ + @Deprecated public static void onNewToken(@NonNull Context context, @NonNull String token) { - OneSignal.Log(OneSignal.LOG_LEVEL.INFO, "HmsMessageServiceOneSignal.onNewToken - HMS token: " + token); - PushRegistratorHMS.fireCallback(token); + onNewToken(context, token, null); } public static void onMessageReceived(@NonNull Context context, @NonNull RemoteMessage message) { 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); } } }