mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-05-24 14:45:46 +00:00
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:
parent
615dbe03c0
commit
aa35cd880d
6 changed files with 69 additions and 1 deletions
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) }
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue