-
-
Notifications
You must be signed in to change notification settings - Fork 800
Expand file tree
/
Copy pathNotificationActionsOverflowView.kt
More file actions
147 lines (131 loc) · 6.92 KB
/
NotificationActionsOverflowView.kt
File metadata and controls
147 lines (131 loc) · 6.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package org.wikipedia.views
import android.content.Context
import android.content.res.ColorStateList
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.net.Uri
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.PopupWindow
import android.widget.TextView
import androidx.annotation.ColorInt
import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat
import androidx.core.widget.PopupWindowCompat
import androidx.core.widget.TextViewCompat
import org.wikipedia.Constants
import org.wikipedia.R
import org.wikipedia.databinding.ViewNotificationActionsOverflowBinding
import org.wikipedia.dataclient.WikiSite
import org.wikipedia.extensions.getString
import org.wikipedia.notifications.NotificationCategory
import org.wikipedia.notifications.NotificationLinkHandler
import org.wikipedia.notifications.NotificationListItemContainer
import org.wikipedia.notifications.db.Notification
import org.wikipedia.page.PageTitle
import org.wikipedia.talk.TalkTopicsActivity
import org.wikipedia.util.ResourceUtil
import org.wikipedia.util.StringUtil
import org.wikipedia.util.UriUtil
class NotificationActionsOverflowView(context: Context) : FrameLayout(context) {
fun interface Callback {
fun markAsReadClick(container: NotificationListItemContainer, markRead: Boolean)
}
private var binding = ViewNotificationActionsOverflowBinding.inflate(LayoutInflater.from(context), this, true)
private lateinit var container: NotificationListItemContainer
private lateinit var linkHandler: NotificationLinkHandler
private lateinit var callback: Callback
private var popupWindowHost: PopupWindow? = null
fun show(anchorView: View, container: NotificationListItemContainer, callback: Callback) {
this.callback = callback
this.container = container
popupWindowHost = PopupWindow(this, ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT, true)
popupWindowHost?.let {
it.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
PopupWindowCompat.setOverlapAnchor(it, true)
PopupWindowCompat.showAsDropDown(it, anchorView, 0, 0, Gravity.END)
}
container.notification?.contents?.let {
val category = NotificationCategory.find(container.notification.category)
val iconColor = ContextCompat.getColor(context, ResourceUtil.getThemedAttributeId(context, category.iconColor))
this.linkHandler = NotificationLinkHandler(anchorView.context, category)
it.links?.getPrimary()?.let { primary ->
setUpViewForLink(binding.overflowViewPrimary, primary, category.iconResId, iconColor, iconColor)
binding.overflowViewPrimary.visibility = View.VISIBLE
}
it.links?.secondary?.let { secondary ->
if (secondary.isNotEmpty()) {
setUpViewForLink(binding.overflowViewSecondary, secondary.first())
binding.overflowViewSecondary.visibility = View.VISIBLE
val uri = Uri.parse(secondary.first().url)
val pageTitle = PageTitle.titleForUri(uri, WikiSite(uri))
if (pageTitle.isUserPage) {
binding.overflowViewSecondaryTalk.visibility = View.VISIBLE
binding.overflowViewSecondaryTalk.text = String.format(anchorView.context.getString(StringUtil.dbNameToLangCode(container.notification.wiki),
R.string.notifications_menu_user_talk_page), secondary.first().label)
binding.overflowViewSecondaryTalk.setOnClickListener {
if (UriUtil.isAppSupportedLink(uri)) {
context.startActivity(TalkTopicsActivity.newIntent(context, pageTitle, Constants.InvokeSource.NOTIFICATION))
} else {
linkHandler.onExternalLinkClicked(uri)
}
}
}
if (secondary.size > 1) {
setUpViewForLink(binding.overflowViewTertiary, secondary[1])
binding.overflowViewTertiary.visibility = View.VISIBLE
}
}
}
}
container.notification?.isUnread?.let {
binding.overflowMarkAsRead.text = anchorView.context.getString(StringUtil.dbNameToLangCode(container.notification.wiki),
if (it) R.string.notifications_menu_mark_as_read else R.string.notifications_menu_mark_as_unread)
binding.overflowMarkAsRead.setCompoundDrawablesRelativeWithIntrinsicBounds(if (it) R.drawable.ic_outline_markunread_24 else R.drawable.ic_outline_drafts_24, 0, 0, 0)
}
binding.overflowViewPrimary.setOnClickListener(actionClickListener)
binding.overflowViewSecondary.setOnClickListener(actionClickListener)
binding.overflowViewTertiary.setOnClickListener(actionClickListener)
binding.overflowMarkAsRead.setOnClickListener {
dismiss()
callback.markAsReadClick(container, container.notification?.isUnread == true)
}
}
fun dismiss() {
popupWindowHost?.dismiss()
popupWindowHost = null
}
private var actionClickListener = OnClickListener {
val link = it.tag as Notification.Link
val url = link.encodedUrl
val notification = container.notification
if (url.isNotEmpty() && notification != null) {
linkHandler.wikiSite = WikiSite(url)
linkHandler.onUrlClick(url, null, "")
}
dismiss()
}
private fun setUpViewForLink(textView: TextView, link: Notification.Link,
@DrawableRes customIcon: Int = R.drawable.ic_arrow_forward_black_24dp,
@ColorInt customIconColor: Int = ResourceUtil.getThemedColor(context, R.attr.secondary_color),
@ColorInt customTextColor: Int = ResourceUtil.getThemedColor(context, R.attr.primary_color)) {
textView.text = StringUtil.fromHtml(link.tooltip.ifEmpty { link.label })
val icon = when (link.icon()) {
"userAvatar" -> R.drawable.ic_user_avatar
"changes" -> R.drawable.ic_icon_revision_history_apps
"speechBubbles", "userSpeechBubble" -> R.drawable.ic_notification_article_talk
else -> customIcon
}
val iconColor = ColorStateList.valueOf(customIconColor)
val textColor = ColorStateList.valueOf(customTextColor)
textView.setCompoundDrawablesRelativeWithIntrinsicBounds(icon, 0, 0, 0)
TextViewCompat.setCompoundDrawableTintList(textView, iconColor)
textView.setTextColor(textColor)
textView.tag = link
textView.visibility = View.VISIBLE
}
}