mirror of
https://github.com/imcarlost/Friendlists.git
synced 2026-04-10 02:46:54 -04:00
add loading and error status, with a simple implementation
This commit is contained in:
@@ -5,6 +5,34 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.annotation.LayoutRes
|
import androidx.annotation.LayoutRes
|
||||||
|
|
||||||
|
fun View.enable() {
|
||||||
|
isEnabled = true
|
||||||
|
}
|
||||||
|
|
||||||
|
fun View.disable() {
|
||||||
|
isEnabled = false
|
||||||
|
}
|
||||||
|
|
||||||
|
fun View.visible() {
|
||||||
|
visibility = View.VISIBLE
|
||||||
|
}
|
||||||
|
|
||||||
|
fun View.invisible() {
|
||||||
|
visibility = View.INVISIBLE
|
||||||
|
}
|
||||||
|
|
||||||
|
fun View.transparent() {
|
||||||
|
alpha = 0f
|
||||||
|
}
|
||||||
|
|
||||||
|
fun View.opaque() {
|
||||||
|
alpha = 1f
|
||||||
|
}
|
||||||
|
|
||||||
|
fun View.gone() {
|
||||||
|
visibility = View.GONE
|
||||||
|
}
|
||||||
|
|
||||||
fun ViewGroup.inflate(@LayoutRes layout: Int, attachToRoot: Boolean = false): View =
|
fun ViewGroup.inflate(@LayoutRes layout: Int, attachToRoot: Boolean = false): View =
|
||||||
LayoutInflater
|
LayoutInflater
|
||||||
.from(context)
|
.from(context)
|
||||||
|
|||||||
18
base/src/main/java/com/hako/base/widgets/LoadingOverlay.kt
Normal file
18
base/src/main/java/com/hako/base/widgets/LoadingOverlay.kt
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
package com.hako.base.widgets
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.widget.FrameLayout
|
||||||
|
import com.hako.base.R
|
||||||
|
import com.hako.base.extensions.inflate
|
||||||
|
|
||||||
|
class LoadingOverlay @JvmOverloads constructor(
|
||||||
|
context: Context,
|
||||||
|
attrs: AttributeSet? = null,
|
||||||
|
defStyleAttr: Int = 0
|
||||||
|
) : FrameLayout(context, attrs, defStyleAttr) {
|
||||||
|
|
||||||
|
init {
|
||||||
|
inflate(R.layout.loading_overlay, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package com.hako.base.widgets
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.widget.FrameLayout
|
||||||
|
import com.hako.base.R
|
||||||
|
import com.hako.base.extensions.inflate
|
||||||
|
|
||||||
|
class NetworkErrorOverlay @JvmOverloads constructor(
|
||||||
|
context: Context,
|
||||||
|
attrs: AttributeSet? = null,
|
||||||
|
defStyleAttr: Int = 0
|
||||||
|
) : FrameLayout(context, attrs, defStyleAttr) {
|
||||||
|
|
||||||
|
init {
|
||||||
|
inflate(R.layout.network_error_overlay, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
21
base/src/main/res/layout/loading_overlay.xml
Normal file
21
base/src/main/res/layout/loading_overlay.xml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:background="@color/soft_background">
|
||||||
|
|
||||||
|
<com.airbnb.lottie.LottieAnimationView
|
||||||
|
android:id="@+id/loading_overlay_animation_view"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:scaleType="centerInside"
|
||||||
|
app:lottie_autoPlay="true"
|
||||||
|
app:lottie_loop="true"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:lottie_rawRes="@raw/loading_animation" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
33
base/src/main/res/layout/network_error_overlay.xml
Normal file
33
base/src/main/res/layout/network_error_overlay.xml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:background="@color/soft_background">
|
||||||
|
|
||||||
|
<com.airbnb.lottie.LottieAnimationView
|
||||||
|
android:id="@+id/loading_overlay_animation_view"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:scaleType="centerInside"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintVertical_bias="0.48"
|
||||||
|
app:lottie_autoPlay="true"
|
||||||
|
app:lottie_loop="true"
|
||||||
|
app:lottie_rawRes="@raw/network_animation" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:text="Network error!"
|
||||||
|
android:textSize="24sp"
|
||||||
|
app:layout_constraintEnd_toEndOf="@+id/loading_overlay_animation_view"
|
||||||
|
app:layout_constraintStart_toStartOf="@+id/loading_overlay_animation_view"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/loading_overlay_animation_view" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
1
base/src/main/res/raw/loading_animation.json
Normal file
1
base/src/main/res/raw/loading_animation.json
Normal file
File diff suppressed because one or more lines are too long
1
base/src/main/res/raw/network_animation.json
Normal file
1
base/src/main/res/raw/network_animation.json
Normal file
File diff suppressed because one or more lines are too long
@@ -7,8 +7,10 @@ import android.view.ViewGroup
|
|||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import com.hako.base.domain.network.RequestStatus
|
import com.hako.base.domain.network.RequestStatus
|
||||||
|
import com.hako.base.extensions.gone
|
||||||
import com.hako.base.extensions.observeNonNull
|
import com.hako.base.extensions.observeNonNull
|
||||||
import com.hako.base.extensions.toast
|
import com.hako.base.extensions.toast
|
||||||
|
import com.hako.base.extensions.visible
|
||||||
import com.hako.userlist.model.UserViewable
|
import com.hako.userlist.model.UserViewable
|
||||||
import com.hako.userlist.viewmodel.UserlistViewmodel
|
import com.hako.userlist.viewmodel.UserlistViewmodel
|
||||||
import com.hako.userlist.widget.UserlistAdapter
|
import com.hako.userlist.widget.UserlistAdapter
|
||||||
@@ -40,15 +42,23 @@ class UserlistFragment : Fragment() {
|
|||||||
|
|
||||||
viewModel.requestStatus.observeNonNull(this) {
|
viewModel.requestStatus.observeNonNull(this) {
|
||||||
when (it) {
|
when (it) {
|
||||||
RequestStatus.Ready -> { context?.toast("Ready") }
|
RequestStatus.Ready -> {
|
||||||
RequestStatus.Loading -> { context?.toast("Loading") }
|
fragment_userlist_error_overlay.gone()
|
||||||
RequestStatus.Errored -> { context?.toast("Errored") }
|
fragment_userlist_loading_overlay.gone()
|
||||||
|
}
|
||||||
|
RequestStatus.Loading -> {
|
||||||
|
fragment_userlist_error_overlay.gone()
|
||||||
|
fragment_userlist_loading_overlay.visible()
|
||||||
|
}
|
||||||
|
RequestStatus.Errored -> {
|
||||||
|
fragment_userlist_error_overlay.visible()
|
||||||
|
fragment_userlist_loading_overlay.gone()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleFetchError(throwable: Throwable) {
|
private fun handleFetchError(throwable: Throwable) {
|
||||||
context?.toast("Could't get data")
|
|
||||||
Timber.e(throwable)
|
Timber.e(throwable)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,4 +15,24 @@
|
|||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<com.hako.base.widgets.LoadingOverlay
|
||||||
|
android:id="@+id/fragment_userlist_loading_overlay"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<com.hako.base.widgets.NetworkErrorOverlay
|
||||||
|
android:id="@+id/fragment_userlist_error_overlay"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
Reference in New Issue
Block a user