From 2e024150de7a6dfef7bd78bdc3751c4b88160315 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sun, 23 Apr 2023 16:21:40 +0530 Subject: [PATCH] Notify user when they are ratelimited Signed-off-by: Aayush Gupta --- .../view/ui/search/SearchResultsActivity.kt | 31 ++++++++++++++++++- .../store/viewmodel/BaseAndroidViewModel.kt | 12 ++++++- .../viewmodel/search/SearchResultViewModel.kt | 11 +++++-- app/src/main/res/drawable/ic_problem.xml | 29 +++++++++++++++++ .../res/layout/activity_search_result.xml | 25 ++++++++++++++- app/src/main/res/values/strings.xml | 4 ++- 6 files changed, 105 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/drawable/ic_problem.xml diff --git a/app/src/main/java/com/aurora/store/view/ui/search/SearchResultsActivity.kt b/app/src/main/java/com/aurora/store/view/ui/search/SearchResultsActivity.kt index db40b70b3..90dc067fe 100644 --- a/app/src/main/java/com/aurora/store/view/ui/search/SearchResultsActivity.kt +++ b/app/src/main/java/com/aurora/store/view/ui/search/SearchResultsActivity.kt @@ -28,7 +28,10 @@ import android.view.KeyEvent import android.view.View import android.view.inputmethod.EditorInfo import android.widget.TextView +import androidx.lifecycle.Lifecycle import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import com.aurora.Constants import com.aurora.extensions.close import com.aurora.extensions.open @@ -48,6 +51,7 @@ import com.aurora.store.view.ui.downloads.DownloadActivity import com.aurora.store.view.ui.sheets.FilterSheet import com.aurora.store.viewmodel.search.SearchResultViewModel import com.google.android.material.textfield.TextInputEditText +import kotlinx.coroutines.launch class SearchResultsActivity : BaseActivity(), OnSharedPreferenceChangeListener { @@ -101,6 +105,18 @@ class SearchResultsActivity : BaseActivity(), OnSharedPreferenceChangeListener { query?.let { updateQuery(it) } + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + VM.responseCode.collect { + when (it) { + 429 -> attachErrorLayout(getString(R.string.rate_limited)) + else -> detachErrorLayout() + } + } + } + } + } override fun onDestroy() { @@ -110,6 +126,19 @@ class SearchResultsActivity : BaseActivity(), OnSharedPreferenceChangeListener { super.onDestroy() } + private fun attachErrorLayout(message: String) { + B.recycler.visibility = View.GONE + B.filterFab.visibility = View.GONE + B.errorLayout.visibility = View.VISIBLE + B.errorMessage.text = message + } + + private fun detachErrorLayout() { + B.recycler.visibility = View.VISIBLE + B.filterFab.visibility = View.VISIBLE + B.errorLayout.visibility = View.GONE + } + private fun attachToolbar() { searchView = B.layoutViewToolbar.inputSearch @@ -253,4 +282,4 @@ class SearchResultsActivity : BaseActivity(), OnSharedPreferenceChangeListener { } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/aurora/store/viewmodel/BaseAndroidViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/BaseAndroidViewModel.kt index b852296ce..7501f9675 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/BaseAndroidViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/BaseAndroidViewModel.kt @@ -21,18 +21,25 @@ package com.aurora.store.viewmodel import android.app.Application import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.viewModelScope import com.aurora.store.data.RequestState +import com.aurora.store.data.network.HttpClient import com.aurora.store.data.providers.NetworkProvider import com.aurora.store.util.Log +import com.google.android.material.snackbar.Snackbar import com.google.gson.Gson import com.google.gson.GsonBuilder import java.lang.reflect.Modifier +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach abstract class BaseAndroidViewModel(application: Application) : AndroidViewModel(application), NetworkProvider.NetworkListener { private lateinit var networkListener: NetworkProvider.NetworkListener + val responseCode = HttpClient.getPreferredClient().responseCode + protected val gson: Gson = GsonBuilder() .excludeFieldsWithModifiers(Modifier.TRANSIENT, Modifier.STATIC) .create() @@ -45,6 +52,9 @@ abstract class BaseAndroidViewModel(application: Application) : AndroidViewModel requestState = RequestState.Init NetworkProvider.addListener(this) + + // Start collecting response code for requests + responseCode.launchIn(viewModelScope) } abstract fun observe() @@ -77,4 +87,4 @@ abstract class BaseAndroidViewModel(application: Application) : AndroidViewModel NetworkProvider.removeListener(this) super.onCleared() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/aurora/store/viewmodel/search/SearchResultViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/search/SearchResultViewModel.kt index 640d5e272..2bad82731 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/search/SearchResultViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/search/SearchResultViewModel.kt @@ -20,7 +20,6 @@ package com.aurora.store.viewmodel.search import android.app.Application -import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import com.aurora.gplayapi.data.models.AuthData @@ -29,11 +28,13 @@ import com.aurora.gplayapi.helpers.SearchHelper import com.aurora.store.data.network.HttpClient import com.aurora.store.data.providers.AuthProvider import com.aurora.extensions.flushAndAdd +import com.aurora.store.data.RequestState +import com.aurora.store.viewmodel.BaseAndroidViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.supervisorScope -class SearchResultViewModel(application: Application) : AndroidViewModel(application) { +class SearchResultViewModel(application: Application) : BaseAndroidViewModel(application) { private val authData: AuthData = AuthProvider .with(application) @@ -91,4 +92,8 @@ class SearchResultViewModel(application: Application) : AndroidViewModel(applica } } } -} \ No newline at end of file + + override fun observe() { + requestState = RequestState.Init + } +} diff --git a/app/src/main/res/drawable/ic_problem.xml b/app/src/main/res/drawable/ic_problem.xml new file mode 100644 index 000000000..02e63aecb --- /dev/null +++ b/app/src/main/res/drawable/ic_problem.xml @@ -0,0 +1,29 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_search_result.xml b/app/src/main/res/layout/activity_search_result.xml index f77df06bc..8132dd4f1 100644 --- a/app/src/main/res/layout/activity_search_result.xml +++ b/app/src/main/res/layout/activity_search_result.xml @@ -40,6 +40,29 @@ app:itemSpacing="@dimen/margin_normal" /> + + + + + + + - \ No newline at end of file + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index daa12b6d7..ad5482d17 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -400,4 +400,6 @@ Deep blue update available updates available - \ No newline at end of file + Oops, This account is rate limited! + An error occurred! +