From 21d29b51e5af57e5bd5060fff75b3a4993d5cebf Mon Sep 17 00:00:00 2001 From: Carl Vuorinen Date: Tue, 30 Apr 2019 09:03:35 +0300 Subject: [PATCH] Refactor NotificationsManager --- .../data/implementation/ApiClientImpl.kt | 6 +-- .../habitica/helpers/NotificationsManager.kt | 50 ++++++++----------- .../android/habitica/models/Notification.kt | 2 +- .../PopupNotificationsManagerTest.java | 26 +++++----- 4 files changed, 37 insertions(+), 47 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt index 9bf300a5c..9c834d639 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt @@ -337,7 +337,7 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; override fun validateSubscription(request: SubscriptionValidationRequest): Flowable { return apiService.validateSubscription(request).map { habitResponse -> if (habitResponse.notifications != null) { - notificationsManager.showNotificationDialog(habitResponse.notifications) + notificationsManager.setNotifications(habitResponse.notifications) } habitResponse.getData() } @@ -346,7 +346,7 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; override fun validateNoRenewSubscription(request: PurchaseValidationRequest): Flowable { return apiService.validateNoRenewSubscription(request).map { habitResponse -> if (habitResponse.notifications != null) { - notificationsManager.showNotificationDialog(habitResponse.notifications) + notificationsManager.setNotifications(habitResponse.notifications) } habitResponse.getData() } @@ -571,7 +571,7 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; override fun validatePurchase(request: PurchaseValidationRequest): Flowable { return apiService.validatePurchase(request).map { habitResponse -> if (habitResponse.notifications != null) { - notificationsManager.showNotificationDialog(habitResponse.notifications) + notificationsManager.setNotifications(habitResponse.notifications) } habitResponse.getData() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationsManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationsManager.kt index 090d9661e..376f739b5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationsManager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/NotificationsManager.kt @@ -12,7 +12,6 @@ import com.habitrpg.android.habitica.events.ShowSnackbarEvent import com.habitrpg.android.habitica.models.Notification import com.habitrpg.android.habitica.models.notifications.LoginIncentiveData import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar -import com.playseeds.android.sdk.inappmessaging.Log import io.reactivex.functions.Consumer import org.greenrobot.eventbus.EventBus @@ -26,7 +25,7 @@ import java.util.HashMap class NotificationsManager (private val context: Context) { // @TODO: A queue for displaying alert dialogues - private var seenNotifications: MutableMap? = null + private val seenNotifications: MutableMap private var apiClient: ApiClient? = null private val notifications: BehaviorSubject> @@ -38,9 +37,8 @@ class NotificationsManager (private val context: Context) { fun setNotifications(current: List) { this.notifications.onNext(current) -current.map { Log.d("NotificationsManager.setNotifications." + it.type) } - this.showNotificationDialog(current) + this.handlePopupNotifications(current) } fun getNotifications(): Flowable> { @@ -51,7 +49,24 @@ current.map { Log.d("NotificationsManager.setNotifications." + it.type) } this.apiClient = apiClient } - fun displayNotification(notification: Notification): Boolean? { + fun handlePopupNotifications(notifications: List): Boolean? { + notifications + .filter { !this.seenNotifications.containsKey(it.id) } + .map { + val notificationDisplayed = when (it.type) { + Notification.Type.LOGIN_INCENTIVE.type -> displayLoginIncentiveNotification(it) + else -> false + } + + if (notificationDisplayed == true) { + this.seenNotifications[it.id] = true + } + } + + return true + } + + fun displayLoginIncentiveNotification(notification: Notification): Boolean? { val notificationData = notification.data as LoginIncentiveData? val nextUnlockText = context.getString(R.string.nextPrizeUnlocks, notificationData!!.nextRewardAt) if (notificationData.rewardKey != null) { @@ -73,29 +88,4 @@ current.map { Log.d("NotificationsManager.setNotifications." + it.type) } } return true } - - fun showNotificationDialog(notifications: List?): Boolean? { - if (notifications == null || notifications.size == 0) { - return false - } - - if (this.seenNotifications == null) { - this.seenNotifications = HashMap() - } - - for (notification in notifications) { - if (this.seenNotifications!![notification.id] != null) { - continue - } - - if (notification.type != "LOGIN_INCENTIVE") { - continue - } - - this.displayNotification(notification) - this.seenNotifications!![notification.id] = true - } - - return true - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/Notification.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/Notification.kt index afd6a0a25..cf4cff7c6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/Notification.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/Notification.kt @@ -27,4 +27,4 @@ class Notification { else -> null } } -} \ No newline at end of file +} diff --git a/Habitica/src/test/java/com/habitrpg/android/habitica/helpers/PopupNotificationsManagerTest.java b/Habitica/src/test/java/com/habitrpg/android/habitica/helpers/PopupNotificationsManagerTest.java index 7cf13b0cd..261c890fe 100644 --- a/Habitica/src/test/java/com/habitrpg/android/habitica/helpers/PopupNotificationsManagerTest.java +++ b/Habitica/src/test/java/com/habitrpg/android/habitica/helpers/PopupNotificationsManagerTest.java @@ -50,7 +50,7 @@ public class PopupNotificationsManagerTest { @Test public void itDoesNothingWhenNotificationsListIsEmpty() { List notifications = new ArrayList<>(); - notificationsManager.showNotificationDialog(notifications); + notificationsManager.handlePopupNotifications(notifications); AlertDialog alert = ShadowAlertDialog.getLatestAlertDialog(); @@ -68,12 +68,12 @@ public class PopupNotificationsManagerTest { notifications.add(notification); final NotificationsManager testClass = Mockito.mock(NotificationsManager.class); - Mockito.when(testClass.displayNotification(notification)).thenReturn(true); - Mockito.when(testClass.showNotificationDialog(notifications)).thenCallRealMethod(); + Mockito.when(testClass.displayLoginIncentiveNotification(notification)).thenReturn(true); + Mockito.when(testClass.handlePopupNotifications(notifications)).thenCallRealMethod(); - testClass.showNotificationDialog(notifications); + testClass.handlePopupNotifications(notifications); - verify(testClass, times(0)).displayNotification(notification); + verify(testClass, times(0)).displayLoginIncentiveNotification(notification); } @Test @@ -92,12 +92,12 @@ public class PopupNotificationsManagerTest { notifications.add(notification); final NotificationsManager testClass = Mockito.mock(NotificationsManager.class); - Mockito.when(testClass.displayNotification(notification)).thenReturn(true); - Mockito.when(testClass.showNotificationDialog(notifications)).thenCallRealMethod(); + Mockito.when(testClass.displayLoginIncentiveNotification(notification)).thenReturn(true); + Mockito.when(testClass.handlePopupNotifications(notifications)).thenCallRealMethod(); - testClass.showNotificationDialog(notifications); + testClass.handlePopupNotifications(notifications); - verify(testClass, times(1)).displayNotification(notification); + verify(testClass, times(1)).displayLoginIncentiveNotification(notification); } @Test @@ -117,11 +117,11 @@ public class PopupNotificationsManagerTest { notifications.add(notification); final NotificationsManager testClass = Mockito.mock(NotificationsManager.class); - Mockito.when(testClass.displayNotification(notification)).thenReturn(true); - Mockito.when(testClass.showNotificationDialog(notifications)).thenCallRealMethod(); + Mockito.when(testClass.displayLoginIncentiveNotification(notification)).thenReturn(true); + Mockito.when(testClass.handlePopupNotifications(notifications)).thenCallRealMethod(); - testClass.showNotificationDialog(notifications); + testClass.handlePopupNotifications(notifications); - verify(testClass, times(1)).displayNotification(notification); + verify(testClass, times(1)).displayLoginIncentiveNotification(notification); } }