fix displaying filtered notifications (#4535)

```
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
       at com.keylesspalace.tusky.adapter.StatusBaseViewHolder.setupFilterPlaceholder(StatusBaseViewHolder.java:894)
       at com.keylesspalace.tusky.adapter.StatusBaseViewHolder.setupWithStatus(StatusBaseViewHolder.java:825)
       at com.keylesspalace.tusky.adapter.StatusViewHolder.setupWithStatus(StatusViewHolder.java:91)
       at com.keylesspalace.tusky.components.notifications.StatusViewHolder.bind(StatusViewHolder.kt:46)
       at com.keylesspalace.tusky.components.notifications.NotificationsPagingAdapter.bindViewHolder(NotificationsPagingAdapter.kt:150)
       at com.keylesspalace.tusky.components.notifications.NotificationsPagingAdapter.onBindViewHolder(NotificationsPagingAdapter.kt:143)
       at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7847)
       at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6646)
       at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6917)
       at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6757)
       at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6753)
       at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2362)
       at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1662)
       at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1622)
       at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:687)
       at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4645)
       at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:4348)
       at androidx.recyclerview.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:2106)
       at androidx.recyclerview.widget.RecyclerView$1.run(RecyclerView.java:468)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1231)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
       at android.view.Choreographer.doCallbacks(Choreographer.java:899)
       at android.view.Choreographer.doFrame(Choreographer.java:827)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
       at android.os.Handler.handleCallback(Handler.java:942)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loopOnce(Looper.java:201)
       at android.os.Looper.loop(Looper.java:288)
       at android.app.ActivityThread.main(ActivityThread.java:7872)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
```
This commit is contained in:
Konrad Pozniak 2024-06-30 16:51:58 +02:00 committed by GitHub
parent 6a5d1b5ef6
commit c0ad50b6e6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 23 additions and 11 deletions

View File

@ -29,7 +29,9 @@ import com.keylesspalace.tusky.databinding.ItemReportNotificationBinding
import com.keylesspalace.tusky.databinding.ItemStatusBinding import com.keylesspalace.tusky.databinding.ItemStatusBinding
import com.keylesspalace.tusky.databinding.ItemStatusNotificationBinding import com.keylesspalace.tusky.databinding.ItemStatusNotificationBinding
import com.keylesspalace.tusky.databinding.ItemStatusPlaceholderBinding import com.keylesspalace.tusky.databinding.ItemStatusPlaceholderBinding
import com.keylesspalace.tusky.databinding.ItemStatusWrapperBinding
import com.keylesspalace.tusky.databinding.ItemUnknownNotificationBinding import com.keylesspalace.tusky.databinding.ItemUnknownNotificationBinding
import com.keylesspalace.tusky.entity.Filter
import com.keylesspalace.tusky.entity.Notification import com.keylesspalace.tusky.entity.Notification
import com.keylesspalace.tusky.interfaces.AccountActionListener import com.keylesspalace.tusky.interfaces.AccountActionListener
import com.keylesspalace.tusky.interfaces.StatusActionListener import com.keylesspalace.tusky.interfaces.StatusActionListener
@ -77,7 +79,11 @@ class NotificationsPagingAdapter(
is NotificationViewData.Concrete -> { is NotificationViewData.Concrete -> {
when (notification.type) { when (notification.type) {
Notification.Type.MENTION, Notification.Type.MENTION,
Notification.Type.POLL -> VIEW_TYPE_STATUS Notification.Type.POLL -> if (notification.statusViewData?.filterAction == Filter.Action.WARN) {
VIEW_TYPE_STATUS_FILTERED
} else {
VIEW_TYPE_STATUS
}
Notification.Type.STATUS, Notification.Type.STATUS,
Notification.Type.FAVOURITE, Notification.Type.FAVOURITE,
Notification.Type.REBLOG, Notification.Type.REBLOG,
@ -97,7 +103,12 @@ class NotificationsPagingAdapter(
val inflater = LayoutInflater.from(parent.context) val inflater = LayoutInflater.from(parent.context)
return when (viewType) { return when (viewType) {
VIEW_TYPE_STATUS -> StatusViewHolder( VIEW_TYPE_STATUS -> StatusViewHolder(
ItemStatusBinding.inflate(inflater, parent, false), ItemStatusBinding.inflate(inflater, parent, false).root,
statusListener,
accountId
)
VIEW_TYPE_STATUS_FILTERED -> StatusViewHolder(
ItemStatusWrapperBinding.inflate(inflater, parent, false).root,
statusListener, statusListener,
accountId accountId
) )
@ -157,12 +168,13 @@ class NotificationsPagingAdapter(
companion object { companion object {
private const val VIEW_TYPE_STATUS = 0 private const val VIEW_TYPE_STATUS = 0
private const val VIEW_TYPE_STATUS_NOTIFICATION = 1 private const val VIEW_TYPE_STATUS_FILTERED = 1
private const val VIEW_TYPE_FOLLOW = 2 private const val VIEW_TYPE_STATUS_NOTIFICATION = 2
private const val VIEW_TYPE_FOLLOW_REQUEST = 3 private const val VIEW_TYPE_FOLLOW = 3
private const val VIEW_TYPE_PLACEHOLDER = 4 private const val VIEW_TYPE_FOLLOW_REQUEST = 4
private const val VIEW_TYPE_REPORT = 5 private const val VIEW_TYPE_PLACEHOLDER = 5
private const val VIEW_TYPE_UNKNOWN = 6 private const val VIEW_TYPE_REPORT = 6
private const val VIEW_TYPE_UNKNOWN = 7
val NotificationsDifferCallback = object : DiffUtil.ItemCallback<NotificationViewData>() { val NotificationsDifferCallback = object : DiffUtil.ItemCallback<NotificationViewData>() {
override fun areItemsTheSame( override fun areItemsTheSame(

View File

@ -17,18 +17,18 @@
package com.keylesspalace.tusky.components.notifications package com.keylesspalace.tusky.components.notifications
import android.view.View
import com.keylesspalace.tusky.adapter.StatusViewHolder import com.keylesspalace.tusky.adapter.StatusViewHolder
import com.keylesspalace.tusky.databinding.ItemStatusBinding
import com.keylesspalace.tusky.entity.Notification import com.keylesspalace.tusky.entity.Notification
import com.keylesspalace.tusky.interfaces.StatusActionListener import com.keylesspalace.tusky.interfaces.StatusActionListener
import com.keylesspalace.tusky.util.StatusDisplayOptions import com.keylesspalace.tusky.util.StatusDisplayOptions
import com.keylesspalace.tusky.viewdata.NotificationViewData import com.keylesspalace.tusky.viewdata.NotificationViewData
internal class StatusViewHolder( internal class StatusViewHolder(
binding: ItemStatusBinding, itemView: View,
private val statusActionListener: StatusActionListener, private val statusActionListener: StatusActionListener,
private val accountId: String private val accountId: String
) : NotificationsViewHolder, StatusViewHolder(binding.root) { ) : NotificationsViewHolder, StatusViewHolder(itemView) {
override fun bind( override fun bind(
viewData: NotificationViewData.Concrete, viewData: NotificationViewData.Concrete,