Better error display

This commit is contained in:
Phillip Thelen 2022-07-07 17:18:25 +02:00
parent 5db99ba7d9
commit 2ea0757985
16 changed files with 126 additions and 32 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 693 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

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

View file

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

View file

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