diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index 2920eaa6b..aec444b80 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -815,7 +815,6 @@
Guild Members
Guild Bank
Invite to Party
- Are you sure?
Delete Task
Delete Reminder
Not right now
diff --git a/Habitica/res/drawable-hdpi/ic_gryphon_white.webp b/common/src/main/res/drawable-hdpi/ic_gryphon_white.webp
similarity index 100%
rename from Habitica/res/drawable-hdpi/ic_gryphon_white.webp
rename to common/src/main/res/drawable-hdpi/ic_gryphon_white.webp
diff --git a/Habitica/res/drawable-mdpi/ic_gryphon_white.webp b/common/src/main/res/drawable-mdpi/ic_gryphon_white.webp
similarity index 100%
rename from Habitica/res/drawable-mdpi/ic_gryphon_white.webp
rename to common/src/main/res/drawable-mdpi/ic_gryphon_white.webp
diff --git a/Habitica/res/drawable-xhdpi/ic_gryphon_white.webp b/common/src/main/res/drawable-xhdpi/ic_gryphon_white.webp
similarity index 100%
rename from Habitica/res/drawable-xhdpi/ic_gryphon_white.webp
rename to common/src/main/res/drawable-xhdpi/ic_gryphon_white.webp
diff --git a/Habitica/res/drawable-xxhdpi/ic_gryphon_white.webp b/common/src/main/res/drawable-xxhdpi/ic_gryphon_white.webp
similarity index 100%
rename from Habitica/res/drawable-xxhdpi/ic_gryphon_white.webp
rename to common/src/main/res/drawable-xxhdpi/ic_gryphon_white.webp
diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml
index ca0db2249..4e8ec2384 100644
--- a/common/src/main/res/values/strings.xml
+++ b/common/src/main/res/values/strings.xml
@@ -54,4 +54,6 @@
Create a Task
Complete a Task
Create %s
+
+ Are you sure?
\ No newline at end of file
diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskLocalRepository.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskLocalRepository.kt
index 214bb1e33..1268a5947 100644
--- a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskLocalRepository.kt
+++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskLocalRepository.kt
@@ -62,4 +62,11 @@ class TaskLocalRepository @Inject constructor() {
}
return emptyFlow()
}
+
+ fun getTaskCounts() = flowOf(mapOf(
+ TaskType.HABIT.value to (tasks[TaskType.HABIT]?.value?.size ?: 0),
+ TaskType.DAILY.value to (tasks[TaskType.DAILY]?.value?.size ?: 0),
+ TaskType.TODO.value to (tasks[TaskType.TODO]?.value?.size ?: 0),
+ TaskType.REWARD.value to (tasks[TaskType.REWARD]?.value?.size ?: 0),
+ ))
}
\ No newline at end of file
diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskRepository.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskRepository.kt
index d7da7cf13..14504050e 100644
--- a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskRepository.kt
+++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskRepository.kt
@@ -18,8 +18,7 @@ class TaskRepository @Inject constructor(val apiClient: ApiClient, val localRepo
tasks?.let { localRepository.saveTasks(tasks) }
return tasks
}
- fun getTasks(taskType: TaskType): Flow> = localRepository.getTasks(taskType)
-
+ fun getTasks(taskType: TaskType) = localRepository.getTasks(taskType)
suspend fun scoreTask(user: User?, task: Task, direction: TaskDirection): TaskScoringResult? {
val id = task.id ?: return null
@@ -42,4 +41,6 @@ class TaskRepository @Inject constructor(val apiClient: ApiClient, val localRepo
localRepository.updateTask(newTask)
}
}
+
+ fun getTaskCounts() = localRepository.getTaskCounts()
}
\ No newline at end of file
diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/user/MenuItem.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/user/MenuItem.kt
index 22dbbae8e..ab787fcbf 100644
--- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/user/MenuItem.kt
+++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/user/MenuItem.kt
@@ -9,5 +9,6 @@ data class MenuItem(
val color: Int,
val textColor: Int,
val isProminent: Boolean = false,
+ var detailText: String? = null,
val onClick: () -> Unit
)
\ No newline at end of file
diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/LoginActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/LoginActivity.kt
index b7313743a..bce7dbe63 100644
--- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/LoginActivity.kt
+++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/LoginActivity.kt
@@ -21,7 +21,7 @@ class LoginActivity: BaseActivity() {
INPUT
}
override val viewModel: LoginViewModel by viewModels()
- var currentState: State = State.INITIAL
+ private var currentState: State = State.INITIAL
set(value) {
field = value
when(value) {
@@ -59,6 +59,7 @@ class LoginActivity: BaseActivity() {
binding.loginButton.isVisible = true
}
}
+ binding.root.smoothScrollTo(0, 0)
}
override fun onCreate(savedInstanceState: Bundle?) {
diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/MainActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/MainActivity.kt
index 2193f73bc..a15220cec 100644
--- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/MainActivity.kt
+++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/MainActivity.kt
@@ -44,7 +44,7 @@ class MainActivity : BaseActivity() {
openTaskFormActivity()
},
MenuItem(
- "habits",
+ TaskType.HABIT.value,
getString(R.string.habits),
AppCompatResources.getDrawable(this, R.drawable.icon_habits),
ContextCompat.getColor(this, R.color.watch_purple_200),
@@ -53,7 +53,7 @@ class MainActivity : BaseActivity() {
openTasklist(TaskType.HABIT)
},
MenuItem(
- "dailies",
+ TaskType.DAILY.value,
getString(R.string.dailies),
AppCompatResources.getDrawable(this, R.drawable.icon_dailies),
ContextCompat.getColor(this, R.color.watch_purple_200),
@@ -62,7 +62,7 @@ class MainActivity : BaseActivity() {
openTasklist(TaskType.DAILY)
},
MenuItem(
- "todos",
+ TaskType.TODO.value,
getString(R.string.todos),
AppCompatResources.getDrawable(this, R.drawable.icon_todos),
ContextCompat.getColor(this, R.color.watch_purple_200),
@@ -71,7 +71,7 @@ class MainActivity : BaseActivity() {
openTasklist(TaskType.TODO)
},
MenuItem(
- "rewards",
+ TaskType.REWARD.value,
getString(R.string.rewards),
AppCompatResources.getDrawable(this, R.drawable.icon_rewards),
ContextCompat.getColor(this, R.color.watch_purple_200),
@@ -111,6 +111,16 @@ class MainActivity : BaseActivity() {
adapter.title = it.profile?.name ?: ""
adapter.notifyItemChanged(0)
}
+ viewModel.taskCounts.observe(this) {
+ adapter.data.forEach { menuItem ->
+ if (it.containsKey(menuItem.identifier) && it[menuItem.identifier]!! > 0) {
+ menuItem.detailText = it[menuItem.identifier].toString()
+ } else {
+ menuItem.detailText = null
+ }
+ }
+ adapter.notifyDataSetChanged()
+ }
}
private fun openTaskFormActivity() {
diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/RYAActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/RYAActivity.kt
index 6cee407b3..a7e077d2a 100644
--- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/RYAActivity.kt
+++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/RYAActivity.kt
@@ -7,7 +7,6 @@ import androidx.core.view.isVisible
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.ActivityRyaBinding
import com.habitrpg.android.habitica.databinding.RowDailyBinding
-import com.habitrpg.common.habitica.extensions.dpToPx
import com.habitrpg.wearos.habitica.models.tasks.Task
import com.habitrpg.wearos.habitica.ui.viewHolders.tasks.DailyViewHolder
import com.habitrpg.wearos.habitica.ui.viewmodels.RYAViewModel
@@ -60,7 +59,6 @@ class RYAActivity : BaseActivity() {
taskBinding.root.setOnClickListener {
viewModel.tappedTask(task)
}
- val verticalPadding = 2.dpToPx(this)
val layoutParams = taskBinding.root.layoutParams as LinearLayout.LayoutParams
layoutParams.marginStart = 0
layoutParams.marginEnd = 0
diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SettingsActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SettingsActivity.kt
index 1ae80da42..c4f5f7a9e 100644
--- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SettingsActivity.kt
+++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SettingsActivity.kt
@@ -1,5 +1,6 @@
package com.habitrpg.wearos.habitica.ui.activities
+import android.app.AlertDialog
import android.content.Intent
import android.os.Bundle
import androidx.activity.viewModels
@@ -39,14 +40,59 @@ class SettingsActivity: BaseActivity
private fun buildSettings(): List {
return listOf(
+ SettingsItem(
+ "header",
+ getString(R.string.settings),
+ SettingsItem.Types.HEADER,
+ null
+ ) {
+ },
+ SettingsItem(
+ "sync",
+ getString(R.string.sync_data),
+ SettingsItem.Types.BUTTON,
+ null
+ ) {
+ viewModel.resyncData()
+ },
+ SettingsItem(
+ "hide_results",
+ getString(R.string.hide_task_rewards),
+ SettingsItem.Types.TOGGLE,
+ viewModel.isTaskResultHidden()
+ ) {
+ viewModel.setHideTaskResults(!viewModel.isTaskResultHidden())
+ val index = adapter.data.indexOfFirst { it.identifier == "hide_results" }
+ adapter.data[index].value = viewModel.isTaskResultHidden()
+ adapter.notifyItemChanged(index)
+ },
+ SettingsItem(
+ "spacer",
+ getString(R.string.settings),
+ SettingsItem.Types.SPACER,
+ null
+ ) {
+ },
SettingsItem(
"logout",
getString(R.string.logout),
SettingsItem.Types.DESTRUCTIVE_BUTTON,
null
) {
- logout()
+ showLogoutConfirmation()
}
)
}
+
+ private fun showLogoutConfirmation() {
+ AlertDialog.Builder(this)
+ .setTitle(R.string.are_you_sure)
+ .setPositiveButton(R.string.logout) { alert, _ ->
+ logout()
+ alert.dismiss()
+ }
+ .setPositiveButton(R.string.action_cancel) { alert, _ ->
+ alert.dismiss()
+ }.show()
+ }
}
\ No newline at end of file
diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskResultActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskResultActivity.kt
index 03f229771..ee759ede2 100644
--- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskResultActivity.kt
+++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskResultActivity.kt
@@ -8,6 +8,7 @@ import android.view.animation.AlphaAnimation
import android.widget.GridLayout
import androidx.activity.viewModels
import androidx.lifecycle.lifecycleScope
+import androidx.preference.PreferenceManager
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.ActivityTaskResultBinding
import com.habitrpg.android.habitica.databinding.TaskRewardDropBinding
@@ -167,6 +168,8 @@ class TaskResultActivity : BaseActivity() {
+class SettingsAdapter: RecyclerView.Adapter() {
var data = listOf()
set(value) {
field = value
notifyDataSetChanged()
}
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SettingsViewHolder {
- return SettingsViewHolder(RowSettingsBinding.inflate(parent.context.layoutInflater, parent, false).root)
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
+ if (viewType == 0) {
+ return HeaderViewHolder(RowHeaderBinding.inflate(parent.context.layoutInflater, parent, false).root)
+ } else if (viewType == 1) {
+ return SpacerViewHolder(RowSpacerBinding.inflate(parent.context.layoutInflater, parent, false).root)
+ } else {
+ return SettingsViewHolder(RowSettingsBinding.inflate(parent.context.layoutInflater, parent, false).root)
+ }
}
- override fun onBindViewHolder(holder: SettingsViewHolder, position: Int) {
- holder.bind(data[position])
+ override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
+ if (holder is SettingsViewHolder) {
+ holder.bind(data[position])
+ } else if (holder is HeaderViewHolder) {
+ holder.bind(data[position].title)
+ } else if (holder is SpacerViewHolder) {
+ holder.bind(16.dpToPx(holder.itemView.context))
+ }
}
override fun getItemCount(): Int = data.size
+
+ override fun getItemViewType(position: Int): Int {
+ val item = data[position]
+ return when (item.type) {
+ SettingsItem.Types.HEADER -> 0
+ SettingsItem.Types.SPACER -> 1
+ else -> 2
+ }
+ }
}
class SettingsViewHolder(itemView: View) : BindableViewHolder(itemView) {
private val binding = RowSettingsBinding.bind(itemView)
+ private var widget: View? = null
+
override fun bind(data: SettingsItem) {
+ if (widget != null) {
+ (widget?.parent as? ViewGroup)?.removeView(widget)
+ widget = null
+ }
binding.titleView.text = data.title
if (data.type == SettingsItem.Types.DESTRUCTIVE_BUTTON) {
binding.titleView.setTextColor(ContextCompat.getColor(itemView.context, R.color.text_red))
@@ -37,6 +71,22 @@ class SettingsViewHolder(itemView: View) : BindableViewHolder(item
binding.titleView.setTextColor(ContextCompat.getColor(itemView.context, R.color.white))
}
+ if (data.type == SettingsItem.Types.TOGGLE) {
+ val radio = RadioButton(itemView.context)
+ radio.isChecked = data.value as? Boolean == true
+ radio.isEnabled = false
+ widget = radio
+ binding.row.addView(radio)
+
+ if (data.value as? Boolean == true) {
+ binding.row.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(itemView.context, R.color.watch_purple_100))
+ binding.row.background.alpha = 127
+ } else {
+ binding.row.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(itemView.context, R.color.watch_purple_5))
+ binding.row.background.alpha = 255
+ }
+ }
+
binding.root.setOnClickListener {
data.onTap()
}
@@ -47,12 +97,14 @@ data class SettingsItem(
val identifier: String,
val title: String,
val type: Types,
- val value: Any?,
+ var value: Any?,
val onTap: () -> Unit
) {
enum class Types {
BUTTON,
DESTRUCTIVE_BUTTON,
- TOGGLE
+ SPACER,
+ TOGGLE,
+ HEADER
}
}
diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/HubViewHolder.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/HubViewHolder.kt
index 8ff3311df..8c07f4419 100644
--- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/HubViewHolder.kt
+++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/HubViewHolder.kt
@@ -12,7 +12,9 @@ class HubViewHolder(itemView: View): BindableViewHolder