mirror of https://github.com/tuskyapp/Tusky.git
Browse Source
This is way more efficient than before as less views need to be inflated and bound for a filtered status to be rendered. It also should fix the bug where sometimes a `StatusViewHolder` that is set up for showing a status gets bound to a status that is filtered, leading to a crash.pull/4545/head
8 changed files with 107 additions and 96 deletions
@ -0,0 +1,57 @@
|
||||
/* Copyright 2024 Tusky Contributors |
||||
* |
||||
* This file is a part of Tusky. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it under the terms of the |
||||
* GNU General Public License as published by the Free Software Foundation; either version 3 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even |
||||
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General |
||||
* Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License along with Tusky; if not, |
||||
* see <http://www.gnu.org/licenses>. */ |
||||
package com.keylesspalace.tusky.adapter |
||||
|
||||
import androidx.recyclerview.widget.RecyclerView |
||||
import com.keylesspalace.tusky.R |
||||
import com.keylesspalace.tusky.components.notifications.NotificationsViewHolder |
||||
import com.keylesspalace.tusky.databinding.ItemStatusFilteredBinding |
||||
import com.keylesspalace.tusky.entity.Filter |
||||
import com.keylesspalace.tusky.entity.FilterResult |
||||
import com.keylesspalace.tusky.interfaces.StatusActionListener |
||||
import com.keylesspalace.tusky.util.StatusDisplayOptions |
||||
import com.keylesspalace.tusky.viewdata.NotificationViewData |
||||
import com.keylesspalace.tusky.viewdata.StatusViewData |
||||
|
||||
class FilteredStatusViewHolder( |
||||
private val binding: ItemStatusFilteredBinding, |
||||
listener: StatusActionListener |
||||
) : NotificationsViewHolder, RecyclerView.ViewHolder(binding.root) { |
||||
|
||||
init { |
||||
binding.statusFilterShowAnyway.setOnClickListener { |
||||
listener.clearWarningAction(bindingAdapterPosition) |
||||
} |
||||
} |
||||
|
||||
override fun bind( |
||||
viewData: NotificationViewData.Concrete, |
||||
payloads: List<*>, |
||||
statusDisplayOptions: StatusDisplayOptions |
||||
) = bind(viewData.statusViewData!!) |
||||
|
||||
fun bind(viewData: StatusViewData.Concrete) { |
||||
val matchedFilterResult: FilterResult? = viewData.actionable.filtered.orEmpty().find { filterResult -> |
||||
filterResult.filter.action == Filter.Action.WARN |
||||
} |
||||
|
||||
val matchedFilterTitle = matchedFilterResult?.filter?.title.orEmpty() |
||||
|
||||
binding.statusFilterLabel.text = itemView.context.getString( |
||||
R.string.status_filter_placeholder_label_format, |
||||
matchedFilterTitle |
||||
) |
||||
} |
||||
} |
||||
@ -1,13 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||
android:orientation="vertical" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="wrap_content"> |
||||
|
||||
<include layout="@layout/item_status" /> |
||||
|
||||
<include |
||||
layout="@layout/item_status_filtered" |
||||
android:visibility="gone" |
||||
/> |
||||
</FrameLayout> |
||||
Loading…
Reference in new issue