Clarify seen and checked app filtering

This commit is contained in:
ajp_anton
2026-07-27 13:27:08 +00:00
parent cad73e33a0
commit 55057767c1
3 changed files with 87 additions and 11 deletions
@@ -70,7 +70,6 @@ class FilterAppsFragment : Fragment(R.layout.fragment_event_settings) {
binding!!.appRuleToggle.isChecked = rule.mode == AppRuleMode.WHITELIST
binding!!.onlySeenToggle.isChecked = rule.onlySeenApps
binding!!.seenFirstToggle.isChecked = rule.seenAppsFirst
binding!!.seenFirstToggle.isEnabled = !rule.onlySeenApps
updateRuleLabels(rule)
binding!!.appRuleToggle.setOnCheckedChangeListener { _, checked ->
save { copy(mode = if (checked) AppRuleMode.WHITELIST else AppRuleMode.BLACKLIST) }
@@ -87,7 +86,7 @@ class FilterAppsFragment : Fragment(R.layout.fragment_event_settings) {
private fun updateRuleLabels(rule: AppFilterSettings) {
binding!!.appRuleToggle.text = modeLabel(rule.mode)
binding!!.onlySeenToggle.text = "Show only seen apps"
binding!!.onlySeenToggle.text = "Show only seen and checked apps"
binding!!.seenFirstToggle.text = "Show seen apps first"
}
@@ -121,7 +120,7 @@ class FilterAppsFragment : Fragment(R.layout.fragment_event_settings) {
selected = info.packageName in rule.selectedPackages,
)
}
val items = AppListOrdering.items(apps, rule.onlySeenApps, rule.seenAppsFirst)
val items = AppListOrdering.items(apps, rule.onlySeenApps, rule.seenAppsFirst, rule.mode)
activity?.runOnUiThread {
if (binding === currentBinding && generation == appLoadGeneration) {
appAdapter.submit(items)
@@ -151,7 +150,11 @@ class FilterAppsFragment : Fragment(R.layout.fragment_event_settings) {
notifyDataSetChanged()
}
override fun getItemViewType(position: Int): Int = if (items[position] is AppListItem.App) APP else SEPARATOR
override fun getItemViewType(position: Int): Int = when (items[position]) {
is AppListItem.App -> APP
is AppListItem.SectionTitle -> SECTION_TITLE
AppListItem.Separator -> SEPARATOR
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder = if (viewType == APP) {
val row = LinearLayout(parent.context).apply {
@@ -170,6 +173,15 @@ class FilterAppsFragment : Fragment(R.layout.fragment_event_settings) {
row.addView(checkbox)
row.addView(textColumn)
AppHolder(row, checkbox, label, packageName)
} else if (viewType == SECTION_TITLE) {
SectionTitleHolder(TextView(parent.context).apply {
layoutParams = RecyclerView.LayoutParams(
RecyclerView.LayoutParams.MATCH_PARENT,
RecyclerView.LayoutParams.WRAP_CONTENT,
).apply { setMargins(0, dp(parent, 8), 0, dp(parent, 4)) }
setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 12f)
setTypeface(typeface, android.graphics.Typeface.BOLD)
})
} else {
val divider = View(parent.context).apply {
layoutParams = RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, dp(parent, 1)).apply {
@@ -197,6 +209,9 @@ class FilterAppsFragment : Fragment(R.layout.fragment_event_settings) {
}
}
}
if (holder is SectionTitleHolder && item is AppListItem.SectionTitle) {
holder.text.text = item.value
}
}
override fun getItemCount(): Int = items.size
@@ -210,9 +225,12 @@ class FilterAppsFragment : Fragment(R.layout.fragment_event_settings) {
private class SeparatorHolder(view: View) : RecyclerView.ViewHolder(view)
private class SectionTitleHolder(val text: TextView) : RecyclerView.ViewHolder(text)
private companion object {
const val APP = 0
const val SEPARATOR = 1
const val SECTION_TITLE = 2
fun dp(parent: ViewGroup, value: Int): Int = (value * parent.resources.displayMetrics.density).toInt()
}
}