create empty missing activities

This commit is contained in:
Phillip Thelen 2022-06-06 12:17:13 +02:00
parent f6fd3289ba
commit 71356a491c
17 changed files with 229 additions and 69 deletions

View file

@ -855,7 +855,6 @@
<string name="switch_to_list_view">Switch to list view</string>
<string name="switch_to_grid_view">Switch to grid view</string>
<string name="confirm_deletion">Confirm deletion</string>
<string name="new_task">New Task</string>
<string name="create_task">Create %s</string>
<string name="details">Details</string>
<string name="share_challenge_with">Share Challenge with</string>

View file

@ -21,4 +21,6 @@
<string name="rewards">Rewards</string>
<string name="stats">Stats</string>
<string name="settings">Settings</string>
<string name="new_task">New Task</string>
<string name="avatar">Avatar</string>
</resources>

View file

@ -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
)

View file

@ -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<ActivityMainBinding, MainViewModel>() {
@ -47,19 +37,28 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>() {
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<ActivityMainBinding, MainViewModel>() {
"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<ActivityMainBinding, MainViewModel>() {
"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<ActivityMainBinding, MainViewModel>() {
"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<ActivityMainBinding, MainViewModel>() {
"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<ActivityMainBinding, MainViewModel>() {
}
}
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
}
}
}

View file

@ -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<ActivitySettingsBinding, SettingsViewModel>() {
override val viewModel: SettingsViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
binding = ActivitySettingsBinding.inflate(layoutInflater)
super.onCreate(savedInstanceState)
}
}

View file

@ -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<ActivityStatsBinding, StatsViewModel>() {
override val viewModel: StatsViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
binding = ActivityStatsBinding.inflate(layoutInflater)
super.onCreate(savedInstanceState)
}
}

View file

@ -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<ActivityTaskFormBinding, TaskFormViewModel>() {
override val viewModel: TaskFormViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
binding = ActivityTaskFormBinding.inflate(layoutInflater)
super.onCreate(savedInstanceState)
}
}

View file

@ -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

View file

@ -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<RecyclerView.ViewHolder>() {
var title: String = ""
@ -44,15 +43,3 @@ class HubAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
}
}
class HubViewHolder(itemView: View): BindableViewHolder<MenuItem>(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()
}
}
}

View file

@ -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<MenuItem>(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()
}
}
}

View file

@ -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) {
}

View file

@ -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) {
}

View file

@ -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) {
}

View file

@ -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
}
}
}

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.wear.widget.WearableRecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.activities.MainActivity"
tools:deviceIds="wear">
</androidx.wear.widget.WearableRecyclerView>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>