From 149e5b01a73e411cc7fc75c6b5b4f8ca3e7b50fd Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 15 Aug 2022 15:23:29 +0200 Subject: [PATCH] Fixes #1826 --- .../social/ChallengesListViewAdapter.kt | 4 +- .../ChallengesFilterRecyclerViewAdapter.kt | 62 +++++-------------- .../challenges/ChallengeFilterDialogHolder.kt | 27 +++++--- .../challenges/ChallengeFilterOptions.java | 11 ---- .../challenges/ChallengeFilterOptions.kt | 8 +++ version.properties | 2 +- 6 files changed, 44 insertions(+), 70 deletions(-) delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterOptions.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterOptions.kt diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChallengesListViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChallengesListViewAdapter.kt index 950f6e00d..92d62dffe 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChallengesListViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChallengesListViewAdapter.kt @@ -10,8 +10,8 @@ import com.habitrpg.android.habitica.models.social.Challenge import com.habitrpg.android.habitica.models.social.ChallengeMembership import com.habitrpg.android.habitica.ui.adapter.BaseRecyclerViewAdapter import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeFilterOptions -import com.habitrpg.common.habitica.helpers.EmojiParser import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper +import com.habitrpg.common.habitica.helpers.EmojiParser import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.subjects.PublishSubject @@ -53,7 +53,7 @@ class ChallengesListViewAdapter( var query = unfilteredData.where() - if (filterOptions.showByGroups != null && filterOptions.showByGroups.size > 0) { + if (filterOptions.showByGroups.isNotEmpty()) { val groupIds = arrayOfNulls(filterOptions.showByGroups.size) var index = 0 for (group in filterOptions.showByGroups) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengesFilterRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengesFilterRecyclerViewAdapter.kt index d57cf4656..9eed6e944 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengesFilterRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengesFilterRecyclerViewAdapter.kt @@ -3,79 +3,47 @@ package com.habitrpg.android.habitica.ui.adapter.social.challenges import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.CheckBox import androidx.recyclerview.widget.RecyclerView import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.databinding.DialogChallengeFilterGroupItemBinding import com.habitrpg.android.habitica.models.social.Group class ChallengesFilterRecyclerViewAdapter(entries: List) : RecyclerView.Adapter() { private val entries: List - private val holderList: MutableList - val checkedEntries: List - get() { - val result = ArrayList() - - for (h in holderList) { - if (h.checkbox.isChecked) { - h.group?.let { - result.add(it) - } - } - } - return result - } + val checkedEntries: MutableList = mutableListOf() init { this.entries = ArrayList(entries) - this.holderList = ArrayList() } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChallengeViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.dialog_challenge_filter_group_item, parent, false) - - val challengeViewHolder = ChallengeViewHolder(view) - holderList.add(challengeViewHolder) - - return challengeViewHolder + return ChallengeViewHolder(view) } override fun onBindViewHolder(holder: ChallengeViewHolder, position: Int) { - holder.bind(entries[position]) + holder.bind(entries[position], checkedEntries) } override fun getItemCount(): Int { return entries.size } - fun deSelectAll() { - for (h in holderList) { - h.checkbox.isChecked = false - } - } - - fun selectAll() { - for (h in holderList) { - h.checkbox.isChecked = true - } - } - - fun selectAll(groupsToCheck: List) { - for (h in holderList) { - h.checkbox.isChecked = groupsToCheck.find { g -> h.group?.id == g.id } != null - } - } - class ChallengeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - internal val checkbox: CheckBox = itemView.findViewById(R.id.challenge_filter_group_checkbox) + private val binding = DialogChallengeFilterGroupItemBinding.bind(itemView) - var group: Group? = null - - fun bind(group: Group) { - this.group = group - - checkbox.text = group.name + fun bind(group: Group, checkedEntries: MutableList) { + binding.root.text = group.name + binding.root.isChecked = checkedEntries.contains(group) + binding.root.setOnCheckedChangeListener { _, isChecked -> + if (isChecked && !checkedEntries.contains(group)) { + checkedEntries.add(group) + } else if (!isChecked && checkedEntries.contains(group)) { + checkedEntries.remove(group) + } + } } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterDialogHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterDialogHolder.kt index 51e095756..60eb6ad69 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterDialogHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterDialogHolder.kt @@ -15,7 +15,7 @@ internal class ChallengeFilterDialogHolder private constructor( ) { private val binding = DialogChallengeFilterBinding.bind(view) - private var filterGroups: List? = null + private var filterGroups: List = emptyList() private var currentFilter: ChallengeFilterOptions? = null private var selectedGroupsCallback: ((ChallengeFilterOptions) -> Unit)? = null private var adapter: ChallengesFilterRecyclerViewAdapter? = null @@ -23,6 +23,12 @@ internal class ChallengeFilterDialogHolder private constructor( init { binding.challengeFilterButtonAll.setOnClickListener { allClicked() } binding.challengeFilterButtonNone.setOnClickListener { noneClicked() } + binding.challengeFilterOwned.setOnCheckedChangeListener { _, isChecked -> + currentFilter?.showOwned = isChecked + } + binding.challengeFilterNotOwned.setOnCheckedChangeListener { _, isChecked -> + currentFilter?.notOwned = isChecked + } } fun bind( @@ -43,38 +49,41 @@ internal class ChallengeFilterDialogHolder private constructor( private fun fillChallengeGroups() { binding.challengeFilterRecyclerView.layoutManager = LinearLayoutManager(context) - adapter = filterGroups?.let { ChallengesFilterRecyclerViewAdapter(it) } + adapter = ChallengesFilterRecyclerViewAdapter(filterGroups) if (currentFilter != null && currentFilter?.showByGroups != null) { - adapter?.selectAll(currentFilter?.showByGroups ?: emptyList()) + adapter?.checkedEntries?.addAll(currentFilter?.showByGroups ?: emptyList()) } binding.challengeFilterRecyclerView.adapter = adapter } private fun allClicked() { - this.adapter?.selectAll() + this.adapter?.checkedEntries?.clear() + adapter?.checkedEntries?.addAll(filterGroups) } private fun noneClicked() { - this.adapter?.deSelectAll() + this.adapter?.checkedEntries?.clear() } companion object { - fun showDialog( activity: Activity, filterGroups: List, currentFilter: ChallengeFilterOptions?, - selectedGroupsCallback: ((ChallengeFilterOptions) -> Unit)? + selectedGroupsCallback: ((ChallengeFilterOptions) -> Unit) ) { val dialogLayout = activity.layoutInflater.inflate(R.layout.dialog_challenge_filter, null) - val challengeFilterDialogHolder = ChallengeFilterDialogHolder(dialogLayout, activity) + val holder = ChallengeFilterDialogHolder(dialogLayout, activity) val sheet = HabiticaBottomSheetDialog(activity) sheet.setContentView(dialogLayout) + sheet.setOnDismissListener { + selectedGroupsCallback(ChallengeFilterOptions(holder.adapter?.checkedEntries ?: emptyList(), holder.binding.challengeFilterOwned.isChecked, holder.binding.challengeFilterNotOwned.isChecked)) + } - challengeFilterDialogHolder.bind(filterGroups, currentFilter, selectedGroupsCallback) + holder.bind(filterGroups, currentFilter, selectedGroupsCallback) sheet.show() } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterOptions.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterOptions.java deleted file mode 100644 index d3640627b..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterOptions.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.habitrpg.android.habitica.ui.fragments.social.challenges; - -import com.habitrpg.android.habitica.models.social.Group; - -import java.util.List; - -public class ChallengeFilterOptions { - public List showByGroups; - public boolean showOwned; - public boolean notOwned; -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterOptions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterOptions.kt new file mode 100644 index 000000000..9aa7457f0 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeFilterOptions.kt @@ -0,0 +1,8 @@ +package com.habitrpg.android.habitica.ui.fragments.social.challenges + +import com.habitrpg.android.habitica.models.social.Group + +data class ChallengeFilterOptions(var showByGroups: List, + var showOwned: Boolean = false, + var notOwned: Boolean = false +) \ No newline at end of file diff --git a/version.properties b/version.properties index 281ddb808..9118e3a28 100644 --- a/version.properties +++ b/version.properties @@ -1,2 +1,2 @@ NAME=4.0.1 -CODE=4330 \ No newline at end of file +CODE=4360 \ No newline at end of file