Notify user when they are ratelimited

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2023-04-23 16:21:40 +05:30
parent 2daa434dea
commit 2e024150de
6 changed files with 105 additions and 7 deletions

View File

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

View File

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

View File

@@ -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
}
}
}
}
override fun observe() {
requestState = RequestState.Init
}
}