From 71356a491cad1ff23f58b1990129edd8ce59f550 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 6 Jun 2022 12:17:13 +0200 Subject: [PATCH] create empty missing activities --- Habitica/res/values/strings.xml | 1 - common/src/main/res/values/strings.xml | 2 + .../wearos/habitica/models/MenuItem.kt | 12 +++ .../habitica/ui/activities/MainActivity.kt | 89 ++++++++----------- .../ui/activities/SettingsActivity.kt | 17 ++++ .../habitica/ui/activities/StatsActivity.kt | 17 ++++ .../ui/activities/TaskFormActivity.kt | 17 ++++ .../ui/activities/TaskListActivity.kt | 1 + .../wearos/habitica/ui/adapters/HubAdapter.kt | 17 +--- .../habitica/ui/viewHolders/HubViewHolder.kt | 27 ++++++ .../ui/viewmodels/SettingsViewModel.kt | 12 +++ .../habitica/ui/viewmodels/StatsViewModel.kt | 12 +++ .../ui/viewmodels/TaskFormViewModel.kt | 14 +++ .../util/HabiticaScrollingLayoutCallback.kt | 36 ++++++++ .../src/main/res/layout/activity_settings.xml | 10 +++ wearos/src/main/res/layout/activity_stats.xml | 7 ++ .../main/res/layout/activity_task_form.xml | 7 ++ 17 files changed, 229 insertions(+), 69 deletions(-) create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/models/MenuItem.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SettingsActivity.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskFormActivity.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/HubViewHolder.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/SettingsViewModel.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/StatsViewModel.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskFormViewModel.kt create mode 100644 wearos/src/main/java/com/habitrpg/wearos/habitica/util/HabiticaScrollingLayoutCallback.kt create mode 100644 wearos/src/main/res/layout/activity_settings.xml create mode 100644 wearos/src/main/res/layout/activity_stats.xml create mode 100644 wearos/src/main/res/layout/activity_task_form.xml diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 2b86f63e2..f598bc9f6 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -855,7 +855,6 @@ Switch to list view Switch to grid view Confirm deletion - New Task Create %s Details Share Challenge with diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index 000f05950..2549edd4e 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -21,4 +21,6 @@ Rewards Stats Settings + New Task + Avatar \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/MenuItem.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/MenuItem.kt new file mode 100644 index 000000000..a15f71089 --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/MenuItem.kt @@ -0,0 +1,12 @@ +package com.habitrpg.wearos.habitica.models + +import android.graphics.drawable.Drawable + +data class MenuItem( + val identifier: String, + val title: String, + val icon: Drawable?, + val color: Int, + val isProminent: Boolean = false, + val onClick: () -> Unit +) \ No newline at end of file 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 f31e7cc9c..5134cf788 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 @@ -1,29 +1,19 @@ package com.habitrpg.wearos.habitica.ui.activities import android.content.Intent -import android.graphics.drawable.Drawable import android.os.Bundle -import android.view.View import androidx.activity.viewModels import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.ContextCompat -import androidx.recyclerview.widget.RecyclerView import androidx.wear.widget.WearableLinearLayoutManager import com.habitrpg.common.habitica.models.tasks.TaskType import com.habitrpg.wearos.habitica.R import com.habitrpg.wearos.habitica.databinding.ActivityMainBinding +import com.habitrpg.wearos.habitica.models.MenuItem import com.habitrpg.wearos.habitica.ui.adapters.HubAdapter import com.habitrpg.wearos.habitica.ui.viewmodels.MainViewModel +import com.habitrpg.wearos.habitica.util.HabiticaScrollingLayoutCallback import dagger.hilt.android.AndroidEntryPoint -import kotlin.math.abs - -data class MenuItem( - val identifier: String, - val title: String, - val icon: Drawable?, - val color: Int, - val onClick: () -> Unit -) @AndroidEntryPoint class MainActivity : BaseActivity() { @@ -47,19 +37,28 @@ class MainActivity : BaseActivity() { override fun onStart() { super.onStart() adapter.data = listOf( + MenuItem( + "createTask", + getString(R.string.new_task), + AppCompatResources.getDrawable(this, R.drawable.icon_plus), + ContextCompat.getColor(this, R.color.brand_400), + true + ) { + openAvatarActivity() + }, MenuItem( "avatar", - "Avatar", - AppCompatResources.getDrawable(this, R.drawable.ic_avatar), + getString(R.string.avatar), + AppCompatResources.getDrawable(this, R.drawable.icon_avatar), ContextCompat.getColor(this, R.color.brand_400) ) { - openAvatarActivity() + openStatsActivity() }, MenuItem( "Stats", getString(R.string.stats), - AppCompatResources.getDrawable(this, R.drawable.ic_stats), - ContextCompat.getColor(this, R.color.red_100) + AppCompatResources.getDrawable(this, R.drawable.icon_stats), + ContextCompat.getColor(this, R.color.brand_400) ) { }, @@ -67,7 +66,7 @@ class MainActivity : BaseActivity() { "habits", getString(R.string.habits), AppCompatResources.getDrawable(this, R.drawable.icon_habits), - ContextCompat.getColor(this, R.color.orange_100) + ContextCompat.getColor(this, R.color.brand_400) ) { openTasklist(TaskType.HABIT) }, @@ -75,7 +74,7 @@ class MainActivity : BaseActivity() { "dailies", getString(R.string.dailies), AppCompatResources.getDrawable(this, R.drawable.icon_dailies), - ContextCompat.getColor(this, R.color.yellow_100) + ContextCompat.getColor(this, R.color.brand_400) ) { openTasklist(TaskType.DAILY) }, @@ -83,7 +82,7 @@ class MainActivity : BaseActivity() { "todos", getString(R.string.todos), AppCompatResources.getDrawable(this, R.drawable.icon_todos), - ContextCompat.getColor(this, R.color.green_100) + ContextCompat.getColor(this, R.color.brand_400) ) { openTasklist(TaskType.TODO) }, @@ -91,16 +90,17 @@ class MainActivity : BaseActivity() { "rewards", getString(R.string.rewards), AppCompatResources.getDrawable(this, R.drawable.icon_rewards), - ContextCompat.getColor(this, R.color.teal_100) + ContextCompat.getColor(this, R.color.brand_400) ) { openTasklist(TaskType.REWARD) }, MenuItem( "settings", getString(R.string.settings), - AppCompatResources.getDrawable(this, R.drawable.ic_settings), - ContextCompat.getColor(this, R.color.blue_100) + AppCompatResources.getDrawable(this, R.drawable.icon_settings), + ContextCompat.getColor(this, R.color.brand_400) ) { + openSettingsActivity() } ) viewModel.user.observe(this) { @@ -109,44 +109,27 @@ class MainActivity : BaseActivity() { } } + private fun openTaskFormActivity() { + startActivity(Intent(this, TaskFormActivity::class.java)) + } + private fun openAvatarActivity() { startActivity(Intent(this, AvatarActivity::class.java)) } + + private fun openStatsActivity() { + startActivity(Intent(this, StatsActivity::class.java)) + } + + private fun openSettingsActivity() { + startActivity(Intent(this, SettingsActivity::class.java)) + } + private fun openTasklist(type: TaskType) { val intent = Intent(this, TaskListActivity::class.java).apply { putExtra("task_type", type.value) } startActivity(intent) } -} - -private const val MAX_ICON_PROGRESS = 0.8f - -class HabiticaScrollingLayoutCallback : WearableLinearLayoutManager.LayoutCallback() { - - private var progressToCenter: Float = 0f - - override fun onLayoutFinished(child: View, parent: RecyclerView) { - child.apply { - // Figure out % progress from top to bottom - val centerOffset = height.toFloat() / 2.0f / parent.height.toFloat() - val yRelativeToCenterOffset = y / parent.height + centerOffset - - // Normalize for center - progressToCenter = abs(0.5f - yRelativeToCenterOffset) - 0.25f - if (progressToCenter < 0) { - scaleX = 1f - scaleY = 1f - alpha = 1f - return - } - // Adjust to the maximum scale - progressToCenter = Math.min(progressToCenter * 1.5f, MAX_ICON_PROGRESS) - - scaleX = 1 - progressToCenter - scaleY = 1 - progressToCenter - alpha = 1 - progressToCenter * 2 - } - } } \ No newline at end of file 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 new file mode 100644 index 000000000..da3e0e0ce --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/SettingsActivity.kt @@ -0,0 +1,17 @@ +package com.habitrpg.wearos.habitica.ui.activities + +import android.os.Bundle +import androidx.activity.viewModels +import com.habitrpg.wearos.habitica.databinding.ActivitySettingsBinding +import com.habitrpg.wearos.habitica.ui.viewmodels.SettingsViewModel +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class SettingsActivity: BaseActivity() { + override val viewModel: SettingsViewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + binding = ActivitySettingsBinding.inflate(layoutInflater) + super.onCreate(savedInstanceState) + } +} \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt new file mode 100644 index 000000000..8c13afa33 --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/StatsActivity.kt @@ -0,0 +1,17 @@ +package com.habitrpg.wearos.habitica.ui.activities + +import android.os.Bundle +import androidx.activity.viewModels +import com.habitrpg.wearos.habitica.databinding.ActivityStatsBinding +import com.habitrpg.wearos.habitica.ui.viewmodels.StatsViewModel +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class StatsActivity: BaseActivity() { + override val viewModel: StatsViewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + binding = ActivityStatsBinding.inflate(layoutInflater) + super.onCreate(savedInstanceState) + } +} \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskFormActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskFormActivity.kt new file mode 100644 index 000000000..80508c1dc --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskFormActivity.kt @@ -0,0 +1,17 @@ +package com.habitrpg.wearos.habitica.ui.activities + +import android.os.Bundle +import androidx.activity.viewModels +import com.habitrpg.wearos.habitica.databinding.ActivityTaskFormBinding +import com.habitrpg.wearos.habitica.ui.viewmodels.TaskFormViewModel +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class TaskFormActivity: BaseActivity() { + override val viewModel: TaskFormViewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + binding = ActivityTaskFormBinding.inflate(layoutInflater) + super.onCreate(savedInstanceState) + } +} \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskListActivity.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskListActivity.kt index a16cb6fe7..543107776 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskListActivity.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/activities/TaskListActivity.kt @@ -12,6 +12,7 @@ import com.habitrpg.wearos.habitica.ui.adapters.RewardListAdapter import com.habitrpg.wearos.habitica.ui.adapters.TaskListAdapter import com.habitrpg.wearos.habitica.ui.adapters.ToDoListAdapter import com.habitrpg.wearos.habitica.ui.viewmodels.TaskListViewModel +import com.habitrpg.wearos.habitica.util.HabiticaScrollingLayoutCallback import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/HubAdapter.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/HubAdapter.kt index 44f6624c3..4b6fb02dc 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/HubAdapter.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/adapters/HubAdapter.kt @@ -1,14 +1,13 @@ package com.habitrpg.wearos.habitica.ui.adapters -import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.habitrpg.common.habitica.extensions.layoutInflater import com.habitrpg.wearos.habitica.databinding.RowHeaderBinding import com.habitrpg.wearos.habitica.databinding.RowHubBinding -import com.habitrpg.wearos.habitica.ui.activities.MenuItem -import com.habitrpg.wearos.habitica.ui.viewHolders.BindableViewHolder +import com.habitrpg.wearos.habitica.models.MenuItem import com.habitrpg.wearos.habitica.ui.viewHolders.HeaderViewHolder +import com.habitrpg.wearos.habitica.ui.viewHolders.HubViewHolder class HubAdapter: RecyclerView.Adapter() { var title: String = "" @@ -44,15 +43,3 @@ class HubAdapter: RecyclerView.Adapter() { } } -class HubViewHolder(itemView: View): BindableViewHolder(itemView) { - val binding = RowHubBinding.bind(itemView) - - override fun bind(data: MenuItem) { - binding.title.text = data.title - binding.iconView.setImageDrawable(data.icon) - binding.iconView.setColorFilter(data.color) - binding.root.setOnClickListener { - data.onClick() - } - } -} \ No newline at end of file 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 new file mode 100644 index 000000000..d0bd6016d --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewHolders/HubViewHolder.kt @@ -0,0 +1,27 @@ +package com.habitrpg.wearos.habitica.ui.viewHolders + +import android.content.res.ColorStateList +import android.view.View +import androidx.core.content.ContextCompat +import com.habitrpg.wearos.habitica.R +import com.habitrpg.wearos.habitica.databinding.RowHubBinding +import com.habitrpg.wearos.habitica.models.MenuItem + +class HubViewHolder(itemView: View): BindableViewHolder(itemView) { + val binding = RowHubBinding.bind(itemView) + + override fun bind(data: MenuItem) { + binding.title.text = data.title + binding.iconView.setImageDrawable(data.icon) + if (data.isProminent) { + binding.iconView.setColorFilter(ContextCompat.getColor(itemView.context, R.color.white)) + binding.rowContainer.backgroundTintList = ColorStateList.valueOf(data.color) + } else { + binding.iconView.setColorFilter(data.color) + binding.rowContainer.backgroundTintList = ContextCompat.getColorStateList(itemView.context, R.color.gray_5) + } + binding.root.setOnClickListener { + data.onClick() + } + } +} \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/SettingsViewModel.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/SettingsViewModel.kt new file mode 100644 index 000000000..7948d316a --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/SettingsViewModel.kt @@ -0,0 +1,12 @@ +package com.habitrpg.wearos.habitica.ui.viewmodels + +import com.habitrpg.wearos.habitica.data.repositories.UserRepository +import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder +import dagger.hilt.android.lifecycle.HiltViewModel + +@HiltViewModel +class SettingsViewModel(userRepository: UserRepository, + exceptionBuilder: ExceptionHandlerBuilder +) : BaseViewModel(userRepository, exceptionBuilder) { + +} diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/StatsViewModel.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/StatsViewModel.kt new file mode 100644 index 000000000..9c9084dfe --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/StatsViewModel.kt @@ -0,0 +1,12 @@ +package com.habitrpg.wearos.habitica.ui.viewmodels + +import com.habitrpg.wearos.habitica.data.repositories.UserRepository +import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder +import dagger.hilt.android.lifecycle.HiltViewModel + +@HiltViewModel +class StatsViewModel(userRepository: UserRepository, + exceptionBuilder: ExceptionHandlerBuilder +) : BaseViewModel(userRepository, exceptionBuilder) { + +} \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskFormViewModel.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskFormViewModel.kt new file mode 100644 index 000000000..40c9d147a --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskFormViewModel.kt @@ -0,0 +1,14 @@ +package com.habitrpg.wearos.habitica.ui.viewmodels + +import com.habitrpg.wearos.habitica.data.repositories.TaskRepository +import com.habitrpg.wearos.habitica.data.repositories.UserRepository +import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder +import dagger.hilt.android.lifecycle.HiltViewModel + +@HiltViewModel +class TaskFormViewModel(userRepository: UserRepository, + taskRepository: TaskRepository, + exceptionBuilder: ExceptionHandlerBuilder +) : BaseViewModel(userRepository, exceptionBuilder) { + +} \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/util/HabiticaScrollingLayoutCallback.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/util/HabiticaScrollingLayoutCallback.kt new file mode 100644 index 000000000..761a9dca4 --- /dev/null +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/util/HabiticaScrollingLayoutCallback.kt @@ -0,0 +1,36 @@ +package com.habitrpg.wearos.habitica.util + +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import androidx.wear.widget.WearableLinearLayoutManager +import kotlin.math.abs + +private const val MAX_ICON_PROGRESS = 0.8f + +class HabiticaScrollingLayoutCallback : WearableLinearLayoutManager.LayoutCallback() { + + private var progressToCenter: Float = 0f + + override fun onLayoutFinished(child: View, parent: RecyclerView) { + child.apply { + // Figure out % progress from top to bottom + val centerOffset = height.toFloat() / 2.0f / parent.height.toFloat() + val yRelativeToCenterOffset = y / parent.height + centerOffset + + // Normalize for center + progressToCenter = abs(0.5f - yRelativeToCenterOffset) - 0.25f + if (progressToCenter < 0) { + scaleX = 1f + scaleY = 1f + alpha = 1f + return + } + // Adjust to the maximum scale + progressToCenter = Math.min(progressToCenter * 1.5f, MAX_ICON_PROGRESS) + + scaleX = 1 - progressToCenter + scaleY = 1 - progressToCenter + alpha = 1 - progressToCenter * 2 + } + } +} \ No newline at end of file diff --git a/wearos/src/main/res/layout/activity_settings.xml b/wearos/src/main/res/layout/activity_settings.xml new file mode 100644 index 000000000..864c349f9 --- /dev/null +++ b/wearos/src/main/res/layout/activity_settings.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/wearos/src/main/res/layout/activity_stats.xml b/wearos/src/main/res/layout/activity_stats.xml new file mode 100644 index 000000000..d829e291c --- /dev/null +++ b/wearos/src/main/res/layout/activity_stats.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/wearos/src/main/res/layout/activity_task_form.xml b/wearos/src/main/res/layout/activity_task_form.xml new file mode 100644 index 000000000..d829e291c --- /dev/null +++ b/wearos/src/main/res/layout/activity_task_form.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file