Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Flash and Haptic Feedback to In-App Notifications #2036

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.HapticFeedbackConstants
import android.view.LayoutInflater
import android.view.View
import android.widget.Button
Expand All @@ -19,7 +20,9 @@ import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.databinding.ActivityNotificationsBinding
import com.habitrpg.android.habitica.extensions.fadeInAnimation
import com.habitrpg.android.habitica.extensions.flash
import com.habitrpg.android.habitica.extensions.observeOnce
import com.habitrpg.android.habitica.helpers.HapticFeedbackManager
import com.habitrpg.android.habitica.models.inventory.QuestContent
import com.habitrpg.android.habitica.ui.viewmodels.NotificationsViewModel
import com.habitrpg.common.habitica.extensions.fromHtml
Expand Down Expand Up @@ -197,7 +200,11 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
badge?.text = notificationCount.toString()

val dismissAllButton = header?.findViewById(R.id.dismiss_all_button) as? Button
dismissAllButton?.setOnClickListener { viewModel.dismissAllNotifications(notifications) }
dismissAllButton?.setOnClickListener {
binding.root.flash()
HapticFeedbackManager.tap(it)
viewModel.dismissAllNotifications(notifications)
}

return header
}
Expand Down Expand Up @@ -324,6 +331,8 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget

val container = item?.findViewById(R.id.notification_item) as? View
container?.setOnClickListener {
it.flash()
HapticFeedbackManager.tap(it)
val resultIntent = Intent()
resultIntent.putExtra("notificationId", notification.id)
setResult(Activity.RESULT_OK, resultIntent)
Expand All @@ -332,6 +341,8 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget

val dismissButton = item?.findViewById(R.id.dismiss_button) as? ImageView
dismissButton?.setOnClickListener {
container?.flash()
HapticFeedbackManager.tap(it)
removeNotificationAndRefresh(notification)
viewModel.dismissNotification(notification)
}
Expand Down Expand Up @@ -433,6 +444,8 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
if (openable) {
val container = item?.findViewById(R.id.notification_item) as? View
container?.setOnClickListener {
it.flash()
HapticFeedbackManager.tap(it)
if (inviterId != null) {
FullProfileActivity.open(inviterId)
} else {
Expand All @@ -446,12 +459,16 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget

val acceptButton = item?.findViewById(R.id.accept_button) as? Button
acceptButton?.setOnClickListener {
binding.root.flash()
HapticFeedbackManager.tap(it)
removeNotificationAndRefresh(notification)
viewModel.accept(notification.id)
}

val rejectButton = item?.findViewById(R.id.reject_button) as? Button
rejectButton?.setOnClickListener {
binding.root.flash()
HapticFeedbackManager.tap(it)
removeNotificationAndRefresh(notification)
viewModel.reject(notification.id)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import androidx.lifecycle.lifecycleScope
import com.habitrpg.android.habitica.MainNavDirections
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.ViewInvitationBinding
import com.habitrpg.android.habitica.extensions.flash
import com.habitrpg.android.habitica.helpers.HapticFeedbackManager
import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.invitations.GenericInvitation
import com.habitrpg.android.habitica.models.members.Member
Expand Down Expand Up @@ -53,15 +55,21 @@ class InvitationsView @JvmOverloads constructor(

binding.root.setOnClickListener {
leaderID?.let { id ->
it.flash()
HapticFeedbackManager.tap(it)
val profileDirections = MainNavDirections.openProfileActivity(id)
MainNavigationController.navigate(profileDirections)
}
}

binding.acceptButton.setOnClickListener {
binding.root.flash()
HapticFeedbackManager.tap(it)
invitation.id?.let { it1 -> acceptCall?.invoke(it1) }
}
binding.rejectButton.setOnClickListener {
binding.root.flash()
HapticFeedbackManager.tap(it)
invitation.id?.let { it1 -> rejectCall?.invoke(it1) }
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package com.habitrpg.android.habitica.extensions

import android.animation.ObjectAnimator
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.view.View
import android.view.ViewTreeObserver
import com.habitrpg.common.habitica.extensions.dpToPx
Expand Down Expand Up @@ -38,3 +40,12 @@ fun View.fadeInAnimation(duration: Long = 500) {
fadeInAnimation.duration = duration
fadeInAnimation.start()
}

fun View.flash() {
val originalColor = (background as? ColorDrawable)?.color
setBackgroundColor(Color.LTGRAY)
postDelayed({
originalColor?.let { setBackgroundColor(it) } ?: setBackgroundResource(0)
}, 100)
}

Loading