From 01ea0f6841d8193fb267055689360e86ee01bb87 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Wed, 7 Aug 2019 14:59:00 +0200 Subject: [PATCH] Show new stuff status in menu and notifications --- Habitica/res/layout/drawer_main_item.xml | 8 ++++++ .../android/habitica/models/Notification.kt | 13 ++++++++++ .../ui/activities/NotificationsActivity.kt | 6 ++++- .../ui/adapter/NavigationDrawerAdapter.kt | 2 ++ .../ui/fragments/NavigationDrawerFragment.kt | 9 +++---- .../habitica/ui/fragments/NewsFragment.kt | 10 ++++++-- .../habitica/ui/menu/HabiticaDrawerItem.kt | 1 + .../ui/viewmodels/NotificationsViewModel.kt | 25 +++++++++++++++---- 8 files changed, 61 insertions(+), 13 deletions(-) diff --git a/Habitica/res/layout/drawer_main_item.xml b/Habitica/res/layout/drawer_main_item.xml index 55f4b487a..b93f50008 100644 --- a/Habitica/res/layout/drawer_main_item.xml +++ b/Habitica/res/layout/drawer_main_item.xml @@ -37,4 +37,12 @@ tools:visibility="visible" tools:text="Test" android:visibility="gone"/> + \ No newline at end of file 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 a56c323df..b594e26a0 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 @@ -42,4 +42,17 @@ class Notification { else -> null } } + + val priority: Int + get() { + return when (type) { + Type.NEW_STUFF.type -> 1 + Type.GUILD_INVITATION.type -> 2 + Type.PARTY_INVITATION.type -> 3 + Type.UNALLOCATED_STATS_POINTS.type -> 4 + Type.NEW_MYSTERY_ITEMS.type -> 5 + Type.NEW_CHAT_MESSAGE.type -> 6 + else -> 100 + } + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt index 61cc533e5..a825f7642 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt @@ -150,7 +150,11 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget private fun createNewStuffNotification(notification: Notification): View? { val data = notification.data as? NewStuffData - val text = fromHtml("" + getString(R.string.new_bailey_update) + "
" + data?.title) + val text = if (data?.title != null) { + fromHtml("" + getString(R.string.new_bailey_update) + "
" + data.title) + } else { + fromHtml("" + getString(R.string.new_bailey_update) + "") + } return createDismissableNotificationItem( notification, diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/NavigationDrawerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/NavigationDrawerAdapter.kt index f3b087cba..df3fbedc7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/NavigationDrawerAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/NavigationDrawerAdapter.kt @@ -98,6 +98,7 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int): Recycle private val titleTextView: TextView? by bindOptionalView(itemView, R.id.titleTextView) private val pillView: TextView? by bindOptionalView(itemView, R.id.pillView) + private val bubbleView: View? by bindOptionalView(itemView, R.id.bubble_view) private val additionalInfoView: TextView? by bindOptionalView(itemView, R.id.additionalInfoView) fun bind(drawerItem: HabiticaDrawerItem, isSelected: Boolean) { @@ -141,6 +142,7 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int): Recycle } } } + bubbleView?.visibility = if (drawerItem.showBubble) View.VISIBLE else View.GONE } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt index 9ae046a0f..91b2687fe 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt @@ -228,6 +228,9 @@ class NavigationDrawerFragment : DialogFragment() { } updateItem(statsItem) } + getItemWithIdentifier(SIDEBAR_NEWS)?.let { + it.showBubble = user.flags?.newStuff ?: false + } } override fun onDestroy() { @@ -315,11 +318,7 @@ class NavigationDrawerFragment : DialogFragment() { })) subscriptions?.add(viewModel.getHasPartyNotification().subscribeWithErrorHandler(Consumer { val partyMenuItem = getItemWithIdentifier(SIDEBAR_PARTY) - if (it) { - partyMenuItem?.additionalInfo = "" - } else { - partyMenuItem?.additionalInfo = null - } + partyMenuItem?.showBubble = it })) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.kt index 9c5b4c249..0cf5b635a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.kt @@ -1,15 +1,17 @@ package com.habitrpg.android.habitica.ui.fragments +import android.annotation.SuppressLint import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.webkit.ConsoleMessage import android.webkit.WebChromeClient import com.habitrpg.android.habitica.BuildConfig import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.extensions.inflate +import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler +import io.reactivex.functions.Consumer import kotlinx.android.synthetic.main.fragment_news.* @@ -21,6 +23,7 @@ class NewsFragment : BaseMainFragment() { return container?.inflate(R.layout.fragment_news) } + @SuppressLint("SetJavaScriptEnabled") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val address = if (BuildConfig.DEBUG) BuildConfig.BASE_URL else context?.getString(R.string.base_url) @@ -36,5 +39,8 @@ class NewsFragment : BaseMainFragment() { component.inject(this) } - + override fun onResume() { + super.onResume() + compositeSubscription.add(userRepository.updateUser(user, "flags.newStuff", false).subscribeWithErrorHandler(Consumer {})) + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/HabiticaDrawerItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/HabiticaDrawerItem.kt index 04baf59dc..59f26bd7c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/HabiticaDrawerItem.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/HabiticaDrawerItem.kt @@ -3,6 +3,7 @@ package com.habitrpg.android.habitica.ui.menu class HabiticaDrawerItem(val transitionId: Int,val identifier: String, val text: String, val isHeader: Boolean = false, var additionalInfoAsPill: Boolean = true) { var additionalInfo: String? = null + var showBubble: Boolean = false var isVisible: Boolean = true var isEnabled: Boolean = true } \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt index b3b949587..a95f823f9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt @@ -72,7 +72,16 @@ open class NotificationsViewModel : BaseViewModel() { disposable.add(userRepository.getUser() .subscribe(Consumer { party = it.party - customNotifications.onNext(convertInvitationsToNotifications(it)) + var notifications = convertInvitationsToNotifications(it) + if (it.flags?.newStuff == true) { + val notification = Notification() + notification.id = "new-stuff-notification" + notification.type = Notification.Type.NEW_STUFF.type + val data = NewStuffData() + notification.data = data + notifications.add(notification) + } + customNotifications.onNext(notifications) }, RxErrorHandler.handleEmptyError())) } @@ -85,9 +94,15 @@ open class NotificationsViewModel : BaseViewModel() { serverNotifications, customNotifications.toFlowable(BackpressureStrategy.LATEST), BiFunction, List, List> { - serverNotificationsList, customNotificationsList -> serverNotificationsList + customNotificationsList + serverNotificationsList, customNotificationsList -> + if (serverNotificationsList.firstOrNull { notification -> notification.type == Notification.Type.NEW_STUFF.type } != null) { + return@BiFunction serverNotificationsList + customNotificationsList.filter { notification -> notification.type != Notification.Type.NEW_STUFF.type } + } + return@BiFunction serverNotificationsList + customNotificationsList } - ).observeOn(AndroidSchedulers.mainThread()) + ) + .map { it.sortedBy { notification -> notification.priority } } + .observeOn(AndroidSchedulers.mainThread()) } fun getNotificationCount(): Flowable { @@ -121,8 +136,8 @@ open class NotificationsViewModel : BaseViewModel() { return notifications.filter { supportedNotificationTypes.contains(it.type) } } - private fun convertInvitationsToNotifications(user: User): List { - val notifications = arrayListOf() + private fun convertInvitationsToNotifications(user: User): MutableList { + val notifications = mutableListOf() notifications.addAll(user.invitations?.parties?.map { val notification = Notification()