From 605133c393b0b66991f143d1340add8c2df154ee Mon Sep 17 00:00:00 2001 From: Jeasmine Nahui Date: Thu, 10 Feb 2022 00:42:54 -0300 Subject: [PATCH 1/3] Fix default values when no TTL and sentTime is available * HMS notification TTL and sentTime is coming with no value * Notification is not being displayed due to missing data * Add default values --- .../java/com/onesignal/OneSignalHmsEventBridge.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java index 5639912664..e5233ba021 100644 --- a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java +++ b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalHmsEventBridge.java @@ -53,8 +53,14 @@ public static void onMessageReceived(@NonNull Context context, @NonNull RemoteMe String data = message.getData(); try { JSONObject messageDataJSON = new JSONObject(message.getData()); - messageDataJSON.put(HMS_TTL_KEY, message.getTtl()); - messageDataJSON.put(HMS_SENT_TIME_KEY, message.getSentTime()); + if (message.getTtl() == 0) + messageDataJSON.put(HMS_TTL_KEY, OSNotificationRestoreWorkManager.DEFAULT_TTL_IF_NOT_IN_PAYLOAD); + else + messageDataJSON.put(HMS_TTL_KEY, message.getTtl()); + if (message.getSentTime() == 0) + messageDataJSON.put(HMS_SENT_TIME_KEY, OneSignal.getTime().getCurrentTimeMillis()); + else + messageDataJSON.put(HMS_SENT_TIME_KEY, message.getSentTime()); data = messageDataJSON.toString(); } catch (JSONException e) { OneSignal.Log(OneSignal.LOG_LEVEL.ERROR, "OneSignalHmsEventBridge error when trying to create RemoteMessage data JSON"); From 828e2760e790b4f7c96f4e8648b1966abec31a51 Mon Sep 17 00:00:00 2001 From: Jeasmine Nahui Date: Thu, 10 Feb 2022 17:35:55 -0300 Subject: [PATCH 2/3] Remove getCurrentThreadTimeMillis method * getCurrentThreadTimeMillis retrieves SystemClock.currentThreadTimeMillis() * CurrentThreadTimeMillis is a value that can vary between threads, is not safe to rely on it --- .../src/main/java/com/onesignal/OSTime.java | 2 -- .../src/main/java/com/onesignal/OSTimeImpl.java | 5 ----- .../test/java/com/onesignal/MockOSTimeImpl.java | 16 ---------------- ...ataMessageReceivedIntegrationTestsRunner.java | 2 +- 4 files changed, 1 insertion(+), 24 deletions(-) diff --git a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OSTime.java b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OSTime.java index e6e0704324..0424063dbc 100644 --- a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OSTime.java +++ b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OSTime.java @@ -4,6 +4,4 @@ public interface OSTime { long getCurrentTimeMillis(); long getElapsedRealtime(); - - long getCurrentThreadTimeMillis(); } diff --git a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OSTimeImpl.java b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OSTimeImpl.java index a594f80782..3214f231a4 100644 --- a/OneSignalSDK/onesignal/src/main/java/com/onesignal/OSTimeImpl.java +++ b/OneSignalSDK/onesignal/src/main/java/com/onesignal/OSTimeImpl.java @@ -12,9 +12,4 @@ public long getCurrentTimeMillis() { public long getElapsedRealtime() { return SystemClock.elapsedRealtime(); } - - @Override - public long getCurrentThreadTimeMillis() { - return SystemClock.currentThreadTimeMillis(); - } } diff --git a/OneSignalSDK/unittest/src/test/java/com/onesignal/MockOSTimeImpl.java b/OneSignalSDK/unittest/src/test/java/com/onesignal/MockOSTimeImpl.java index adaf8ad051..555b822bcd 100644 --- a/OneSignalSDK/unittest/src/test/java/com/onesignal/MockOSTimeImpl.java +++ b/OneSignalSDK/unittest/src/test/java/com/onesignal/MockOSTimeImpl.java @@ -4,12 +4,10 @@ public class MockOSTimeImpl extends OSTimeImpl { private Long mockedTime = null; private Long mockedElapsedTime = null; - private Long mockedCurrentThreadTimeMillis = null; public void reset() { mockedTime = null; mockedElapsedTime = null; - mockedCurrentThreadTimeMillis = null; } @Override @@ -22,11 +20,6 @@ public long getElapsedRealtime() { return mockedElapsedTime != null ? mockedElapsedTime : super.getElapsedRealtime(); } - @Override - public long getCurrentThreadTimeMillis() { - return mockedCurrentThreadTimeMillis != null ? mockedCurrentThreadTimeMillis : super.getCurrentThreadTimeMillis(); - } - public void setMockedTime(Long mockedTime) { this.mockedTime = mockedTime; } @@ -35,20 +28,11 @@ public void setMockedElapsedTime(Long mockedForegroundTime) { this.mockedElapsedTime = mockedForegroundTime; } - public void setMockedCurrentThreadTimeMillis(Long mockedCurrentThreadTimeMillis) { - this.mockedCurrentThreadTimeMillis = mockedCurrentThreadTimeMillis; - } - public void advanceSystemTimeBy(long sec) { long ms = sec * 1_000L; setMockedTime(getCurrentTimeMillis() + ms); } - public void advanceThreadTimeBy(long sec) { - long ms = sec * 1_000L; - setMockedCurrentThreadTimeMillis(getCurrentThreadTimeMillis() + ms); - } - public void advanceSystemAndElapsedTimeBy(long sec) { long ms = sec * 1_000L; setMockedElapsedTime(getCurrentTimeMillis() + ms); diff --git a/OneSignalSDK/unittest/src/test/java/com/test/onesignal/HMSDataMessageReceivedIntegrationTestsRunner.java b/OneSignalSDK/unittest/src/test/java/com/test/onesignal/HMSDataMessageReceivedIntegrationTestsRunner.java index d8c65c7214..cc323e3ff7 100644 --- a/OneSignalSDK/unittest/src/test/java/com/test/onesignal/HMSDataMessageReceivedIntegrationTestsRunner.java +++ b/OneSignalSDK/unittest/src/test/java/com/test/onesignal/HMSDataMessageReceivedIntegrationTestsRunner.java @@ -126,7 +126,7 @@ public void ttl_shouldNotDisplayNotification() throws Exception { long sentTime = 1_635_971_895_940L; int ttl = 60; - time.setMockedCurrentThreadTimeMillis(sentTime * 1_000); + time.setMockedTime(sentTime * 1_000); ShadowHmsRemoteMessage.data = helperBasicOSPayload(); ShadowHmsRemoteMessage.ttl = ttl; From 7315a7f4109ea7e1fd09bc026d590333c52e4f51 Mon Sep 17 00:00:00 2001 From: Jeasmine Nahui Date: Thu, 10 Feb 2022 18:06:24 -0300 Subject: [PATCH 3/3] Add ttl_shouldDisplayNotificationWithNoTTLandSentTime test * Test HMS notification with no TTL and sentTime --- .../OneSignalPackagePrivateHelper.java | 3 ++ ...ShadowHmsNotificationPayloadProcessor.java | 30 +++++++++++++++++++ ...MessageReceivedIntegrationTestsRunner.java | 28 +++++++++++++++++ .../java/com/test/onesignal/TestHelpers.java | 2 ++ 4 files changed, 63 insertions(+) create mode 100644 OneSignalSDK/unittest/src/test/java/com/onesignal/ShadowHmsNotificationPayloadProcessor.java diff --git a/OneSignalSDK/unittest/src/test/java/com/onesignal/OneSignalPackagePrivateHelper.java b/OneSignalSDK/unittest/src/test/java/com/onesignal/OneSignalPackagePrivateHelper.java index e33024f063..938111110a 100644 --- a/OneSignalSDK/unittest/src/test/java/com/onesignal/OneSignalPackagePrivateHelper.java +++ b/OneSignalSDK/unittest/src/test/java/com/onesignal/OneSignalPackagePrivateHelper.java @@ -225,6 +225,9 @@ public static class InAppMessageTable extends OneSignalDbContract.InAppMessageTa } public static class OSNotificationRestoreWorkManager extends com.onesignal.OSNotificationRestoreWorkManager { + public static int getDEFAULT_TTL_IF_NOT_IN_PAYLOAD() { + return DEFAULT_TTL_IF_NOT_IN_PAYLOAD; + } } public static class OSNotificationGenerationJob extends com.onesignal.OSNotificationGenerationJob { diff --git a/OneSignalSDK/unittest/src/test/java/com/onesignal/ShadowHmsNotificationPayloadProcessor.java b/OneSignalSDK/unittest/src/test/java/com/onesignal/ShadowHmsNotificationPayloadProcessor.java new file mode 100644 index 0000000000..2c11e524fa --- /dev/null +++ b/OneSignalSDK/unittest/src/test/java/com/onesignal/ShadowHmsNotificationPayloadProcessor.java @@ -0,0 +1,30 @@ +package com.onesignal; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; + +@Implements(NotificationPayloadProcessorHMS.class) +public class ShadowHmsNotificationPayloadProcessor { + + private static @Nullable + String messageData; + + public static void resetStatics() { + messageData = null; + } + + @Implementation + public static void processDataMessageReceived(@NonNull final Context context, @Nullable String data) { + messageData = data; + } + + @Nullable + public static String getMessageData() { + return messageData; + } +} diff --git a/OneSignalSDK/unittest/src/test/java/com/test/onesignal/HMSDataMessageReceivedIntegrationTestsRunner.java b/OneSignalSDK/unittest/src/test/java/com/test/onesignal/HMSDataMessageReceivedIntegrationTestsRunner.java index cc323e3ff7..9d4aa1a8bc 100644 --- a/OneSignalSDK/unittest/src/test/java/com/test/onesignal/HMSDataMessageReceivedIntegrationTestsRunner.java +++ b/OneSignalSDK/unittest/src/test/java/com/test/onesignal/HMSDataMessageReceivedIntegrationTestsRunner.java @@ -3,12 +3,16 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.os.Bundle; +import android.util.Log; import com.huawei.hms.push.RemoteMessage; import com.onesignal.MockOSTimeImpl; +import com.onesignal.OneSignal; +import com.onesignal.OneSignalPackagePrivateHelper; import com.onesignal.OneSignalPackagePrivateHelper.NotificationPayloadProcessorHMS; import com.onesignal.ShadowBadgeCountUpdater; import com.onesignal.ShadowGenerateNotification; +import com.onesignal.ShadowHmsNotificationPayloadProcessor; import com.onesignal.ShadowHmsRemoteMessage; import com.onesignal.ShadowNotificationManagerCompat; import com.onesignal.ShadowOSUtils; @@ -33,6 +37,8 @@ import java.util.UUID; +import static com.onesignal.OneSignalHmsEventBridge.HMS_SENT_TIME_KEY; +import static com.onesignal.OneSignalHmsEventBridge.HMS_TTL_KEY; import static com.onesignal.OneSignalPackagePrivateHelper.HMSEventBridge_onMessageReceive; import static com.onesignal.OneSignalPackagePrivateHelper.HMSProcessor_processDataMessageReceived; import static com.onesignal.OneSignalPackagePrivateHelper.OSNotificationFormatHelper.PAYLOAD_OS_NOTIFICATION_ID; @@ -138,6 +144,28 @@ public void ttl_shouldNotDisplayNotification() throws Exception { assertEquals(0, ShadowBadgeCountUpdater.lastCount); } + @Test + @Config(shadows = { ShadowGenerateNotification.class, ShadowHmsRemoteMessage.class, ShadowBadgeCountUpdater.class, ShadowHmsNotificationPayloadProcessor.class }) + public void ttl_shouldDisplayNotificationWithNoTTLandSentTime() throws Exception { + blankActivityController.pause(); + + long sentTime = 1_635_971_895_940L; + + time.setMockedTime(sentTime * 1_000); + long setSentTime = time.getCurrentTimeMillis(); + + ShadowHmsRemoteMessage.data = helperBasicOSPayload(); + + HMSEventBridge_onMessageReceive(blankActivity, new RemoteMessage(new Bundle())); + threadAndTaskWait(); + + String messageData = ShadowHmsNotificationPayloadProcessor.getMessageData(); + JSONObject jsonObject = new JSONObject(messageData); + + assertEquals(OneSignalPackagePrivateHelper.OSNotificationRestoreWorkManager.getDEFAULT_TTL_IF_NOT_IN_PAYLOAD(), jsonObject.getInt(HMS_TTL_KEY)); + assertEquals(setSentTime, jsonObject.getLong(HMS_SENT_TIME_KEY)); + } + // NOTE: More tests can be added but they would be duplicated with GenerateNotificationRunner // In 4.0.0 or later these should be written in a reusable way between HMS, FCM, and ADM } diff --git a/OneSignalSDK/unittest/src/test/java/com/test/onesignal/TestHelpers.java b/OneSignalSDK/unittest/src/test/java/com/test/onesignal/TestHelpers.java index 78643be1c5..ab563a3b02 100644 --- a/OneSignalSDK/unittest/src/test/java/com/test/onesignal/TestHelpers.java +++ b/OneSignalSDK/unittest/src/test/java/com/test/onesignal/TestHelpers.java @@ -35,6 +35,7 @@ import com.onesignal.ShadowGoogleApiClientCompatProxy; import com.onesignal.ShadowHMSFusedLocationProviderClient; import com.onesignal.ShadowHmsInstanceId; +import com.onesignal.ShadowHmsNotificationPayloadProcessor; import com.onesignal.ShadowNotificationManagerCompat; import com.onesignal.ShadowNotificationReceivedEvent; import com.onesignal.ShadowOSUtils; @@ -130,6 +131,7 @@ static void beforeTestInitAndCleanup() throws Exception { ShadowNotificationReceivedEvent.resetStatics(); ShadowOneSignalNotificationManager.resetStatics(); ShadowBadgeCountUpdater.resetStatics(); + ShadowHmsNotificationPayloadProcessor.resetStatics(); ShadowFocusHandler.Companion.resetStatics(); lastException = null;