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!
+