diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index d04832bc8..411a450fe 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -433,6 +433,7 @@
Remove
Keep
My Challenges
+ Challenges
Official
Challenge
You’re not part of any Challenges right now!
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/Tag.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/Tag.kt
index 0482f9ea2..acf94c6fe 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/Tag.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/Tag.kt
@@ -10,6 +10,7 @@ open class Tag : RealmObject(), BaseObject {
var userId: String? = null
var name: String = ""
+ var group: String? = null
internal var challenge: Boolean = false
override fun equals(other: Any?): Boolean {
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 c5feab3eb..334df7a0e 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
@@ -19,6 +19,7 @@ import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.CheckBox
+import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.appcompat.widget.AppCompatCheckBox
@@ -217,6 +218,7 @@ class TaskFormActivity : BaseActivity() {
.map { tagRepository.getUnmanagedCopy(it) }
.collect {
tags = it
+ sortTagPositions()
setTagViews()
}
}
@@ -525,18 +527,65 @@ class TaskFormActivity : BaseActivity() {
}
}
+ 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 = getString(R.string.challenges)
+ }
+ val groupsTagTitle = Tag().apply {
+ name = getString(R.string.groups)
+ }
+ val otherTagTitle = Tag().apply {
+ name = getString(R.string.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 setTagViews() {
binding.tagsWrapper.removeAllViews()
val padding = 20.dpToPx(this)
- for (tag in tags) {
- val view = CheckBox(this)
- view.setPadding(padding, view.paddingTop, view.paddingRight, view.paddingBottom)
- view.text = tag.name
- view.setTextColor(getThemeColor(R.attr.textColorTintedPrimary))
- if (preselectedTags?.contains(tag.id) == true) {
- view.isChecked = true
+ tags.forEach { tag ->
+ if (tag.id.isBlank()) {
+ // This is a title for a tag group
+ val view = TextView(this)
+ view.setPadding(0, view.paddingTop, view.paddingRight, view.paddingBottom)
+ view.text = tag.name
+ view.setTextColor(getThemeColor(R.attr.textColorTintedPrimary))
+ binding.tagsWrapper.addView(view)
+ } else {
+ val view = CheckBox(this)
+ view.setPadding(padding, view.paddingTop, view.paddingRight, view.paddingBottom)
+ view.text = tag.name
+ view.setTextColor(getThemeColor(R.attr.textColorTintedPrimary))
+ if (preselectedTags?.contains(tag.id) == true) {
+ view.isChecked = true
+ }
+ binding.tagsWrapper.addView(view)
}
- binding.tagsWrapper.addView(view)
}
setAllTagSelections()
updateTagViewsColors()
@@ -678,7 +727,7 @@ class TaskFormActivity : BaseActivity() {
thisTask.tags = RealmList()
binding.tagsWrapper.forEachIndexed { index, view ->
val tagView = view as? CheckBox
- if (tagView?.isChecked == true) {
+ if (tagView?.isChecked == true && tags[index].id.isNotBlank()) {
thisTask.tags?.add(tags[index])
}
}