From 3bace6ffcb1492a03f5bce3ffec6691a34e2d0fd Mon Sep 17 00:00:00 2001 From: Hafizzle Date: Fri, 8 Sep 2023 12:56:24 -0400 Subject: [PATCH] Add task tag filters --- Habitica/res/values/strings.xml | 4 + .../ui/activities/TaskFormActivity.kt | 6 +- .../ui/views/tasks/TaskFilterDialog.kt | 87 +++++++++++++++---- 3 files changed, 75 insertions(+), 22 deletions(-) diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 9c46bbf10..f374adcf3 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -337,6 +337,9 @@ Edit Are you sure? Do you really want to delete? + Your Tags + Challenge Tags + Group Tags Choose Message Recipient @@ -1455,6 +1458,7 @@ \@Mentions in Group Plans Subscribe to hold on with 1HP! + You You, %d other diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt index 738b8e774..43082195d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt @@ -546,13 +546,13 @@ class TaskFormActivity : BaseActivity() { } } val challengesTagTitle = Tag().apply { - name = getString(R.string.challenges) + name = getString(R.string.challenge_tags) } val groupsTagTitle = Tag().apply { - name = getString(R.string.groups) + name = getString(R.string.group_tags) } val otherTagTitle = Tag().apply { - name = getString(R.string.tags) + name = getString(R.string.your_tags) } if (challengeTagList.isNotEmpty()) { sortedTagList.add(challengesTagTitle) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/TaskFilterDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/TaskFilterDialog.kt index eb77a04e8..e5e4c813b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/TaskFilterDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/TaskFilterDialog.kt @@ -9,6 +9,7 @@ import android.view.LayoutInflater import android.view.WindowManager import android.widget.Button import android.widget.RadioGroup +import android.widget.TextView import androidx.annotation.IdRes import androidx.appcompat.widget.AppCompatCheckBox import androidx.core.content.ContextCompat @@ -135,28 +136,38 @@ class TaskFilterDialog(context: Context, private val repository: TagRepository, ) val leftPadding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 12f, context.resources.displayMetrics).toInt() val verticalPadding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8f, context.resources.displayMetrics).toInt() + sortTagPositions() for (tag in tags) { - val tagCheckbox = AppCompatCheckBox(context) - tagCheckbox.text = tag.name - tagCheckbox.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16f) - tagCheckbox.isChecked = viewModel.tags.contains(tag.id) - tagCheckbox.setPadding( - tagCheckbox.paddingLeft + leftPadding, - verticalPadding, - tagCheckbox.paddingRight, - verticalPadding - ) - tagCheckbox.setTextColor(ContextCompat.getColor(context, R.color.text_secondary)) - CompoundButtonCompat.setButtonTintList(tagCheckbox, colorStateList) - tagCheckbox.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - viewModel.addActiveTag(tag.id) - } else { - viewModel.removeActiveTag(tag.id) + if (tag.id.isBlank()) { + // This is a title for a tag group + val view = TextView(context) + view.setPadding(0, view.paddingTop, view.paddingRight, view.paddingBottom) + view.text = tag.name + view.setTextColor(context.getThemeColor(R.attr.textColorTintedPrimary)) + binding.tagsList.addView(view) + } else { + val tagCheckbox = AppCompatCheckBox(context) + tagCheckbox.text = tag.name + tagCheckbox.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16f) + tagCheckbox.isChecked = viewModel.tags.contains(tag.id) + tagCheckbox.setPadding( + tagCheckbox.paddingLeft + leftPadding, + verticalPadding, + tagCheckbox.paddingRight, + verticalPadding + ) + tagCheckbox.setTextColor(ContextCompat.getColor(context, R.color.text_secondary)) + CompoundButtonCompat.setButtonTintList(tagCheckbox, colorStateList) + tagCheckbox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + viewModel.addActiveTag(tag.id) + } else { + viewModel.removeActiveTag(tag.id) + } + filtersChanged() } - filtersChanged() + binding.tagsList.addView(tagCheckbox) } - binding.tagsList.addView(tagCheckbox) } createAddTagButton() } @@ -320,6 +331,44 @@ class TaskFilterDialog(context: Context, private val repository: TagRepository, filtersChanged() } + private fun sortTagPositions() { + val sortedTagList = arrayListOf() + val challengeTagList = arrayListOf() + val groupTagList = arrayListOf() + val otherTagList = arrayListOf() + tags.forEach { + if (it.challenge) { + challengeTagList.add(it) + } else if (it.group != null) { + groupTagList.add(it) + } else { + otherTagList.add(it) + } + } + val challengesTagTitle = Tag().apply { + name = context.getString(R.string.challenge_tags) + } + val groupsTagTitle = Tag().apply { + name = context.getString(R.string.group_tags) + } + val otherTagTitle = Tag().apply { + name = context.getString(R.string.your_tags) + } + if (challengeTagList.isNotEmpty()) { + sortedTagList.add(challengesTagTitle) + sortedTagList.addAll(challengeTagList) + } + if (groupTagList.isNotEmpty()) { + sortedTagList.add(groupsTagTitle) + sortedTagList.addAll(groupTagList) + } + if (otherTagList.isNotEmpty()) { + sortedTagList.add(otherTagTitle) + sortedTagList.addAll(otherTagList) + } + tags = sortedTagList + } + private fun editButtonClicked() { isEditing = !isEditing if (isEditing) {