mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-05-21 21:29:00 +00:00
Better error display
This commit is contained in:
parent
5db99ba7d9
commit
2ea0757985
16 changed files with 126 additions and 32 deletions
|
|
@ -51,7 +51,7 @@
|
|||
<activity android:name="com.habitrpg.wearos.habitica.ui.activities.ContinuePhoneActivity" />
|
||||
<activity android:name="com.habitrpg.wearos.habitica.ui.activities.LevelupActivity" />
|
||||
|
||||
<activity android:name="androidx.wear.activity.ConfirmationActivity" />
|
||||
<activity android:name="com.habitrpg.wearos.habitica.ui.activities.ConfirmationActivity" />
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
|
|
@ -8,7 +8,6 @@ import com.google.firebase.ktx.Firebase
|
|||
import com.habitrpg.android.habitica.BuildConfig
|
||||
import com.habitrpg.common.habitica.extensions.setupCoil
|
||||
import com.habitrpg.common.habitica.helpers.MarkdownParser
|
||||
import com.habitrpg.common.habitica.models.tasks.TaskType
|
||||
import com.habitrpg.wearos.habitica.data.repositories.TaskRepository
|
||||
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
|
||||
import com.habitrpg.wearos.habitica.ui.activities.BaseActivity
|
||||
|
|
@ -18,8 +17,6 @@ import dagger.hilt.android.HiltAndroidApp
|
|||
import kotlinx.coroutines.CoroutineExceptionHandler
|
||||
import kotlinx.coroutines.MainScope
|
||||
import kotlinx.coroutines.flow.collect
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.launch
|
||||
import javax.inject.Inject
|
||||
|
|
@ -43,13 +40,6 @@ class MainApplication : Application() {
|
|||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
startActivity(intent)
|
||||
} else if (it.needsCron && BaseActivity.currentActivityClassName != RYAActivity::class.java.name) {
|
||||
val dueDailies = taskRepository.getTasks(TaskType.DAILY)
|
||||
.map { it.filter { task -> task.isDisplayedActive } }
|
||||
.first()
|
||||
if (dueDailies.isEmpty()) {
|
||||
userRepository.runCron()
|
||||
return@onEach
|
||||
}
|
||||
val intent = Intent(this@MainApplication, RYAActivity::class.java)
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
startActivity(intent)
|
||||
|
|
|
|||
|
|
@ -157,12 +157,7 @@ class ApiClient @Inject constructor(
|
|||
}
|
||||
|
||||
private suspend fun <T: Any> process(call: suspend () -> Response<WearableHabitResponse<T>>): NetworkResult<T> {
|
||||
val response: Response<WearableHabitResponse<T>>
|
||||
try {
|
||||
response = call.invoke()
|
||||
} catch (t: Exception) {
|
||||
return NetworkResult.Error(t, false)
|
||||
}
|
||||
val response: Response<WearableHabitResponse<T>> = call.invoke()
|
||||
|
||||
val wasCached = response.headers()["was-cached"] == "true"
|
||||
|
||||
|
|
@ -170,6 +165,7 @@ class ApiClient @Inject constructor(
|
|||
val errorBody = response.errorBody()
|
||||
@Suppress("BlockingMethodInNonBlockingContext")
|
||||
NetworkResult.Error(Exception((response.message() + errorBody?.string())), !wasCached)
|
||||
throw(java.lang.Exception(response.message()))
|
||||
} else {
|
||||
val body = response.body()
|
||||
return if (body?.data != null) {
|
||||
|
|
|
|||
|
|
@ -8,11 +8,11 @@ import androidx.activity.ComponentActivity
|
|||
import androidx.core.view.children
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.viewbinding.ViewBinding
|
||||
import androidx.wear.activity.ConfirmationActivity
|
||||
import com.google.android.gms.tasks.Tasks
|
||||
import com.google.android.gms.wearable.CapabilityClient
|
||||
import com.google.android.gms.wearable.MessageClient
|
||||
import com.google.android.gms.wearable.Wearable
|
||||
import com.habitrpg.android.habitica.R
|
||||
import com.habitrpg.android.habitica.databinding.ActivityWrapperBinding
|
||||
import com.habitrpg.wearos.habitica.managers.LoadingManager
|
||||
import com.habitrpg.wearos.habitica.ui.viewmodels.BaseViewModel
|
||||
|
|
@ -44,9 +44,8 @@ abstract class BaseActivity<B: ViewBinding, VM: BaseViewModel> : ComponentActivi
|
|||
|
||||
viewModel.errorValues.observe(this) {
|
||||
val intent = Intent(this, ConfirmationActivity::class.java).apply {
|
||||
putExtra(ConfirmationActivity.EXTRA_ANIMATION_TYPE, ConfirmationActivity.FAILURE_ANIMATION)
|
||||
putExtra(ConfirmationActivity.EXTRA_MESSAGE, it.title)
|
||||
putExtra(ConfirmationActivity.EXTRA_ANIMATION_DURATION_MILLIS, 3000)
|
||||
putExtra("text", it.title)
|
||||
putExtra("icon", R.drawable.error)
|
||||
}
|
||||
startActivity(intent)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,35 @@
|
|||
package com.habitrpg.wearos.habitica.ui.activities
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.activity.viewModels
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.habitrpg.android.habitica.databinding.ActivityConfirmationBinding
|
||||
import com.habitrpg.wearos.habitica.ui.viewmodels.ConfirmactionActivityViewModel
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlin.time.DurationUnit
|
||||
import kotlin.time.toDuration
|
||||
|
||||
@AndroidEntryPoint
|
||||
class ConfirmationActivity:
|
||||
BaseActivity<ActivityConfirmationBinding, ConfirmactionActivityViewModel>() {
|
||||
override val viewModel: ConfirmactionActivityViewModel by viewModels()
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
binding = ActivityConfirmationBinding.inflate(layoutInflater)
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
binding.root.setOnClickListener {
|
||||
finish()
|
||||
}
|
||||
|
||||
lifecycleScope.launch {
|
||||
delay(4.toDuration(DurationUnit.SECONDS))
|
||||
finish()
|
||||
}
|
||||
|
||||
binding.textView.setCompoundDrawablesWithIntrinsicBounds(0, viewModel.icon, 0, 0)
|
||||
binding.textView.text = viewModel.text
|
||||
}
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
package com.habitrpg.wearos.habitica.ui.activities
|
||||
|
||||
import android.os.Bundle
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.LinearLayout
|
||||
import androidx.activity.viewModels
|
||||
import androidx.core.view.isVisible
|
||||
import com.habitrpg.android.habitica.R
|
||||
|
|
@ -22,6 +22,10 @@ class RYAActivity : BaseActivity<ActivityRyaBinding, RYAViewModel>() {
|
|||
super.onCreate(savedInstanceState)
|
||||
|
||||
viewModel.tasks.observe(this) {
|
||||
if (it.isEmpty()) {
|
||||
runCron()
|
||||
return@observe
|
||||
}
|
||||
createTaskListViews(it)
|
||||
}
|
||||
|
||||
|
|
@ -39,15 +43,33 @@ class RYAActivity : BaseActivity<ActivityRyaBinding, RYAViewModel>() {
|
|||
}
|
||||
|
||||
binding.startDayButton.setOnClickListener {
|
||||
startAnimatingProgress()
|
||||
binding.startDayButton.isEnabled = false
|
||||
viewModel.runCron {
|
||||
stopAnimatingProgress()
|
||||
if (it) {
|
||||
finish()
|
||||
} else {
|
||||
binding.startDayButton.isEnabled = true
|
||||
}
|
||||
runCron()
|
||||
}
|
||||
}
|
||||
|
||||
private fun runCron() {
|
||||
startAnimatingProgress()
|
||||
binding.startDayButton.isEnabled = false
|
||||
binding.startingTextView.isVisible = true
|
||||
binding.startDayButton.isVisible = false
|
||||
binding.taskView.isVisible = false
|
||||
binding.descriptionView.isVisible = false
|
||||
binding.titleView.isVisible = false
|
||||
binding.phoneDescriptionView.isVisible = false
|
||||
binding.ryaButton.isVisible = false
|
||||
binding.phoneButton.isVisible = false
|
||||
viewModel.runCron {
|
||||
stopAnimatingProgress()
|
||||
if (it) {
|
||||
finish()
|
||||
} else {
|
||||
binding.startDayButton.isEnabled = true
|
||||
binding.startingTextView.isVisible = false
|
||||
binding.startDayButton.isVisible = true
|
||||
binding.taskView.isVisible = true
|
||||
binding.descriptionView.isVisible = true
|
||||
binding.titleView.isVisible = true
|
||||
binding.phoneDescriptionView.isVisible = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -61,7 +83,7 @@ class RYAActivity : BaseActivity<ActivityRyaBinding, RYAViewModel>() {
|
|||
viewModel.tappedTask(task)
|
||||
}
|
||||
holder.onTaskScore = { viewModel.tappedTask(task) }
|
||||
val layoutParams = taskBinding.chip.layoutParams as FrameLayout.LayoutParams
|
||||
val layoutParams = taskBinding.chip.layoutParams as LinearLayout.LayoutParams
|
||||
layoutParams.marginStart = 0
|
||||
layoutParams.marginEnd = 0
|
||||
taskBinding.chip.layoutParams = layoutParams
|
||||
|
|
|
|||
|
|
@ -0,0 +1,22 @@
|
|||
package com.habitrpg.wearos.habitica.ui.viewmodels
|
||||
|
||||
import androidx.lifecycle.SavedStateHandle
|
||||
import com.habitrpg.android.habitica.R
|
||||
import com.habitrpg.wearos.habitica.data.repositories.TaskRepository
|
||||
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
|
||||
import com.habitrpg.wearos.habitica.managers.LoadingManager
|
||||
import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
class ConfirmactionActivityViewModel @Inject constructor(
|
||||
savedStateHandle: SavedStateHandle,
|
||||
userRepository: UserRepository,
|
||||
taskRepository: TaskRepository,
|
||||
exceptionBuilder: ExceptionHandlerBuilder,
|
||||
loadingManager: LoadingManager
|
||||
) : BaseViewModel(userRepository, taskRepository, exceptionBuilder, loadingManager) {
|
||||
val icon: Int = savedStateHandle.get("icon") ?: R.drawable.error
|
||||
val text: String? = savedStateHandle.get("text")
|
||||
}
|
||||
BIN
wearos/src/main/res/drawable-mdpi/disconnected.png
Normal file
BIN
wearos/src/main/res/drawable-mdpi/disconnected.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 577 B |
BIN
wearos/src/main/res/drawable-mdpi/error.png
Normal file
BIN
wearos/src/main/res/drawable-mdpi/error.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 693 B |
BIN
wearos/src/main/res/drawable-xhdpi/disconnected.png
Normal file
BIN
wearos/src/main/res/drawable-xhdpi/disconnected.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
BIN
wearos/src/main/res/drawable-xhdpi/error.png
Normal file
BIN
wearos/src/main/res/drawable-xhdpi/error.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.3 KiB |
BIN
wearos/src/main/res/drawable-xxhdpi/disconnected.png
Normal file
BIN
wearos/src/main/res/drawable-xxhdpi/disconnected.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.5 KiB |
BIN
wearos/src/main/res/drawable-xxhdpi/error.png
Normal file
BIN
wearos/src/main/res/drawable-xxhdpi/error.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.9 KiB |
18
wearos/src/main/res/layout/activity_confirmation.xml
Normal file
18
wearos/src/main/res/layout/activity_confirmation.xml
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center">
|
||||
<TextView
|
||||
android:id="@+id/text_view"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/spacing_xlarge"
|
||||
tools:visibility="visible"
|
||||
style="@style/Text.Body1"
|
||||
android:textColor="@color/gray_200"
|
||||
android:drawablePadding="@dimen/spacing_medium"
|
||||
android:gravity="center"/>
|
||||
</LinearLayout>
|
||||
|
|
@ -57,6 +57,7 @@
|
|||
android:layout_marginTop="2dp"
|
||||
android:visibility="gone"/>
|
||||
<TextView
|
||||
android:id="@+id/phone_description_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/checklist_disclaimer"
|
||||
|
|
@ -64,5 +65,15 @@
|
|||
android:gravity="center"
|
||||
style="@style/Text.Body1"
|
||||
android:layout_marginTop="@dimen/spacing_medium" />
|
||||
<TextView
|
||||
android:id="@+id/starting_text_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="400dp"
|
||||
android:text="@string/starting_your_day"
|
||||
style="@style/Text.SubHeader1"
|
||||
android:textColor="@color/gray_500"
|
||||
android:gravity="center"
|
||||
android:layout_margin="@dimen/spacing_xlarge"
|
||||
android:visibility="gone"/>
|
||||
</LinearLayout>
|
||||
</com.habitrpg.wearos.habitica.ui.views.HabiticaScrollView>
|
||||
|
|
@ -38,4 +38,5 @@
|
|||
<string name="continue_on_your_phone">Continue on your phone</string>
|
||||
<string name="levelup_description">You leveled up through all your hard work!</string>
|
||||
<string name="all_done_today">All done today!</string>
|
||||
<string name="starting_your_day">Starting your Day...</string>
|
||||
</resources>
|
||||
Loading…
Reference in a new issue