From 741002012d3860e2a50f52b34ad880237fef0d3b Mon Sep 17 00:00:00 2001 From: Amr Hossam Date: Sat, 18 May 2024 20:21:54 +0300 Subject: [PATCH] Handle error in the network base --- .../com/modarb/android/network/ApiResult.kt | 2 ++ .../modarb/android/network/NetworkHelper.kt | 18 ++++++++++++ .../android/ui/home/ui/home/HomeFragment.kt | 28 +++++++++++-------- .../home/ui/home/data/HomeRepositoryImpl.kt | 2 +- .../ui/home/ui/plan/data/PlanRepositoryImp.kt | 2 +- 5 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/com/modarb/android/network/NetworkHelper.kt diff --git a/app/src/main/java/com/modarb/android/network/ApiResult.kt b/app/src/main/java/com/modarb/android/network/ApiResult.kt index 0593e81..a9c5a8a 100644 --- a/app/src/main/java/com/modarb/android/network/ApiResult.kt +++ b/app/src/main/java/com/modarb/android/network/ApiResult.kt @@ -2,5 +2,7 @@ package com.modarb.android.network sealed class ApiResult { data class Success(val data: T) : ApiResult() + data class Error(val data: T) : ApiResult() + data class Failure(val exception: Throwable) : ApiResult() } diff --git a/app/src/main/java/com/modarb/android/network/NetworkHelper.kt b/app/src/main/java/com/modarb/android/network/NetworkHelper.kt new file mode 100644 index 0000000..0f89d15 --- /dev/null +++ b/app/src/main/java/com/modarb/android/network/NetworkHelper.kt @@ -0,0 +1,18 @@ +package com.modarb.android.network + +import android.content.Context +import android.widget.Toast +import com.modarb.android.R +import com.modarb.android.network.models.BaseResponse + +class NetworkHelper { + + companion object { + fun showErrorMessage(context: Context, errorResponse: BaseResponse) { + val defaultErrorMessage = context.getString(R.string.an_error_occurred) + val message = + errorResponse.errors?.firstOrNull() ?: errorResponse.error ?: defaultErrorMessage + Toast.makeText(context, message, Toast.LENGTH_SHORT).show() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/modarb/android/ui/home/ui/home/HomeFragment.kt b/app/src/main/java/com/modarb/android/ui/home/ui/home/HomeFragment.kt index 68189ba..0f67ad3 100644 --- a/app/src/main/java/com/modarb/android/ui/home/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/modarb/android/ui/home/ui/home/HomeFragment.kt @@ -15,6 +15,7 @@ import androidx.lifecycle.lifecycleScope import com.modarb.android.R import com.modarb.android.databinding.FragmentHomeBinding import com.modarb.android.network.ApiResult +import com.modarb.android.network.NetworkHelper import com.modarb.android.ui.home.HomeActivity import com.modarb.android.ui.home.helpers.WorkoutData import com.modarb.android.ui.home.ui.home.domain.models.HomePageResponse @@ -73,7 +74,8 @@ class HomeFragment : Fragment() { homeViewModel.homeResponse.collect { when (it) { is ApiResult.Success<*> -> handleHomeSuccess(it.data as HomePageResponse) - is ApiResult.Failure -> handleHomeError(it.exception) + is ApiResult.Error -> handleHomeError(it.data as HomePageResponse) + is ApiResult.Failure -> handleHomeFail(it.exception) else -> {} } } @@ -81,6 +83,11 @@ class HomeFragment : Fragment() { } + private fun handleHomeFail(exception: Throwable) { + Toast.makeText(requireContext(), exception.message, Toast.LENGTH_SHORT).show() + binding.progressView.progressOverlay.visibility = View.GONE + } + private fun handleHomeSuccess(res: HomePageResponse) { WorkoutData.workoutId = res.data.myWorkout.id setData(res) @@ -88,8 +95,8 @@ class HomeFragment : Fragment() { binding.progressView.progressOverlay.visibility = View.GONE } - private fun handleHomeError(exception: Throwable) { - Toast.makeText(requireContext(), exception.message, Toast.LENGTH_SHORT).show() + private fun handleHomeError(errorResponse: HomePageResponse) { + NetworkHelper.showErrorMessage(requireContext(), errorResponse) binding.progressView.progressOverlay.visibility = View.GONE } @@ -99,7 +106,8 @@ class HomeFragment : Fragment() { planViewModel.planResponse.collect { when (it) { is ApiResult.Success<*> -> handlePlanSuccess(it.data as PlanPageResponse) - is ApiResult.Failure -> handlePlanError(it.exception) + is ApiResult.Error -> handlePlanError(it.data) + is ApiResult.Failure -> handlePlanFail(it.exception) else -> {} } } @@ -110,14 +118,12 @@ class HomeFragment : Fragment() { } - private fun handlePlanError(exception: Throwable) { - - // TODO handle plan error -// val defaultErrorMessage = getString(R.string.an_error_occurred) -// val message = errResponse.errors?.firstOrNull() ?: errResponse.error ?: defaultErrorMessage -// Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show() - + private fun handlePlanFail(exception: Throwable) { + Toast.makeText(requireContext(), exception.message, Toast.LENGTH_SHORT).show() + } + private fun handlePlanError(errorResponse: PlanPageResponse) { + NetworkHelper.showErrorMessage(requireContext(), errorResponse) } private fun handlePlanSuccess(res: PlanPageResponse) { diff --git a/app/src/main/java/com/modarb/android/ui/home/ui/home/data/HomeRepositoryImpl.kt b/app/src/main/java/com/modarb/android/ui/home/ui/home/data/HomeRepositoryImpl.kt index a118e44..8815af2 100644 --- a/app/src/main/java/com/modarb/android/ui/home/ui/home/data/HomeRepositoryImpl.kt +++ b/app/src/main/java/com/modarb/android/ui/home/ui/home/data/HomeRepositoryImpl.kt @@ -15,7 +15,7 @@ class HomeRepositoryImpl(private val apiService: ApiService) : HomeRepository { ApiResult.Success(it) } ?: ApiResult.Failure(Throwable("Response body is null")) } else { - ApiResult.Failure(Throwable(response.errorBody()?.string() ?: "Unknown error")) + ApiResult.Error(response.body() as HomePageResponse) } } catch (E: Exception) { ApiResult.Failure(E) diff --git a/app/src/main/java/com/modarb/android/ui/home/ui/plan/data/PlanRepositoryImp.kt b/app/src/main/java/com/modarb/android/ui/home/ui/plan/data/PlanRepositoryImp.kt index eb7180b..532dfbd 100644 --- a/app/src/main/java/com/modarb/android/ui/home/ui/plan/data/PlanRepositoryImp.kt +++ b/app/src/main/java/com/modarb/android/ui/home/ui/plan/data/PlanRepositoryImp.kt @@ -30,7 +30,7 @@ class PlanRepositoryImp(private val apiService: ApiService) : MyPlanRepository { ApiResult.Success(it) } ?: ApiResult.Failure(Throwable("Response body is null")) } else { - ApiResult.Failure(Throwable(response.errorBody()?.string() ?: "Unknown error")) + ApiResult.Error(response.body() as PlanPageResponse) } } catch (e: Exception) { ApiResult.Failure(e)