Handle clicking notifications

Pass notificationId to main activity via result intent so that we can navigate (can't navigate straight from notifications activity)
This commit is contained in:
Carl Vuorinen 2019-05-16 20:38:52 +03:00
parent 615dbe03c0
commit aa35cd880d
6 changed files with 69 additions and 1 deletions

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/notification_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"

View file

@ -45,6 +45,10 @@ class NotificationsManager (private val context: Context) {
return this.notifications.toFlowable(BackpressureStrategy.LATEST)
}
fun getNotification(id: String): Notification? {
return this.notifications.value?.find { it.id == id }
}
fun setApiClient(apiClient: ApiClient?) {
this.apiClient = apiClient
}

View file

@ -145,6 +145,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
var user: User? = null
private var avatarInHeader: AvatarWithBarsViewModel? = null
private var notificationsViewModel: NotificationsViewModel? = null
private var faintDialog: HabiticaAlertDialog? = null
private var sideAvatarView: AvatarView? = null
private var activeTutorialView: TutorialView? = null
@ -215,6 +216,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
val viewModel = ViewModelProviders.of(this)
.get(NotificationsViewModel::class.java)
notificationsViewModel = viewModel
compositeSubscription.add(viewModel.getNotificationCount().subscribe(Consumer {
drawerFragment?.setNotificationsCount(it)
@ -462,6 +464,13 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
retrieveUser()
}
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == NOTIFICATION_CLICK && data?.hasExtra("notificationId") == true) {
notificationsViewModel?.click(
data.getStringExtra("notificationId"),
MainNavigationController
)
}
}
// region Events
@ -880,5 +889,6 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
const val SELECT_CLASS_RESULT = 11
const val GEM_PURCHASE_REQUEST = 111
const val NOTIFICATION_CLICK = 222
}
}

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.activities
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.text.Html
import android.view.LayoutInflater
@ -15,6 +16,7 @@ import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.Notification
import com.habitrpg.android.habitica.models.notifications.*
import com.habitrpg.android.habitica.ui.activities.MainActivity.Companion.NOTIFICATION_CLICK
import com.habitrpg.android.habitica.ui.viewmodels.NotificationsViewModel
import io.reactivex.functions.Consumer
import kotlinx.android.synthetic.main.activity_notifications.*
@ -205,6 +207,14 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
): View? {
val item = inflater.inflate(R.layout.notification_item, notification_items, false)
val container = item?.findViewById(R.id.notification_item) as? View
container?.setOnClickListener {
val resultIntent = Intent()
resultIntent.putExtra("notificationId", notification.id)
setResult(NOTIFICATION_CLICK, resultIntent)
finish()
}
val dismissButton = item?.findViewById(R.id.dismiss_button) as? ImageView
dismissButton?.setOnClickListener { viewModel.dismissNotification(notification) }

View file

@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.ui.fragments
import android.app.ActionBar
import android.content.Intent
import android.content.res.ColorStateList
import android.graphics.drawable.GradientDrawable
import android.os.Bundle
@ -24,6 +25,8 @@ import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.inventory.QuestContent
import com.habitrpg.android.habitica.models.social.Group
import com.habitrpg.android.habitica.ui.activities.MainActivity
import com.habitrpg.android.habitica.ui.activities.MainActivity.Companion.NOTIFICATION_CLICK
import com.habitrpg.android.habitica.ui.activities.NotificationsActivity
import com.habitrpg.android.habitica.ui.adapter.NavigationDrawerAdapter
import com.habitrpg.android.habitica.ui.fragments.social.TavernDetailFragment
import com.habitrpg.android.habitica.ui.helpers.NavbarUtils
@ -196,7 +199,7 @@ class NavigationDrawerFragment : DialogFragment() {
messagesButtonWrapper.setOnClickListener { setSelection(R.id.inboxFragment) }
settingsButtonWrapper.setOnClickListener { setSelection(R.id.prefsActivity) }
notificationsButtonWrapper.setOnClickListener { setSelection(R.id.notificationsActivity) }
notificationsButtonWrapper.setOnClickListener { startNotificationsActivity() }
}
override fun onDestroy() {
@ -249,6 +252,18 @@ class NavigationDrawerFragment : DialogFragment() {
}
}
fun startNotificationsActivity() {
closeDrawer()
val activity = activity as? MainActivity
if (activity != null) {
// NotificationsActivity will return a result intent with a notificationId if a
// notification item was clicked
val intent = Intent(activity, NotificationsActivity::class.java)
activity.startActivityForResult(intent, NOTIFICATION_CLICK)
}
}
/**
* Users of this fragment must call this method to set UP the navigation drawer interactions.
*

View file

@ -1,6 +1,9 @@
package com.habitrpg.android.habitica.ui.viewmodels
import android.os.Bundle
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.NotificationsManager
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.Notification
@ -113,4 +116,29 @@ open class NotificationsViewModel : BaseViewModel() {
.subscribe(Consumer {}, RxErrorHandler.handleEmptyError()))
}
fun click(notificationId: String, navController: MainNavigationController) {
val notification = notificationsManager.getNotification(notificationId) ?: return
dismissNotification(notification)
when (notification.type) {
Notification.Type.NEW_STUFF.type -> navController.navigate(R.id.newsFragment)
Notification.Type.NEW_CHAT_MESSAGE.type -> clickNewChatMessage(notification, navController)
Notification.Type.NEW_MYSTERY_ITEMS.type -> navController.navigate(R.id.itemsFragment)
Notification.Type.UNALLOCATED_STATS_POINTS.type -> navController.navigate(R.id.statsFragment)
}
}
private fun clickNewChatMessage(notification: Notification, navController: MainNavigationController) {
val data = notification.data as? NewChatMessageData
if (isPartyMessage(data)) {
navController.navigate(R.id.partyFragment)
} else {
val bundle = Bundle()
bundle.putString("groupID", data?.group?.id)
bundle.putBoolean("isMember", true) // safe to assume user is member since they got the notification
navController.navigate(R.id.guildFragment, bundle)
}
}
}