mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-07-15 02:31:57 +00:00
create empty missing activities
This commit is contained in:
parent
f6fd3289ba
commit
71356a491c
17 changed files with 229 additions and 69 deletions
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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
|
||||
)
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
10
wearos/src/main/res/layout/activity_settings.xml
Normal file
10
wearos/src/main/res/layout/activity_settings.xml
Normal 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>
|
||||
7
wearos/src/main/res/layout/activity_stats.xml
Normal file
7
wearos/src/main/res/layout/activity_stats.xml
Normal 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>
|
||||
7
wearos/src/main/res/layout/activity_task_form.xml
Normal file
7
wearos/src/main/res/layout/activity_task_form.xml
Normal 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>
|
||||
Loading…
Reference in a new issue