isolaatti-android/app/src/main/java/com/isolaatti/common/IsolaattiBaseActivity.kt

158 lines
5.6 KiB
Kotlin
Raw Normal View History

2023-07-15 20:58:57 -06:00
package com.isolaatti.common
import android.app.Activity
import android.content.DialogInterface
import android.content.Intent
import android.os.Bundle
import android.util.Log
2023-09-09 16:09:22 -06:00
import android.view.View
2023-07-15 20:58:57 -06:00
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import com.google.android.material.dialog.MaterialAlertDialogBuilder
2023-09-09 16:09:22 -06:00
import com.google.android.material.snackbar.Snackbar
2023-07-15 20:58:57 -06:00
import com.isolaatti.R
2023-09-09 16:09:22 -06:00
import com.isolaatti.connectivity.ConnectivityCallbackImpl
import com.isolaatti.connectivity.NetworkStatus
2023-07-15 20:58:57 -06:00
import com.isolaatti.home.HomeActivity
import com.isolaatti.login.LogInActivity
2023-07-15 20:58:57 -06:00
import com.isolaatti.utils.Resource
import dagger.hilt.android.AndroidEntryPoint
2023-09-10 13:17:50 -06:00
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
2023-07-15 20:58:57 -06:00
@AndroidEntryPoint
abstract class IsolaattiBaseActivity : AppCompatActivity() {
val errorViewModel: ErrorMessageViewModel by viewModels()
2023-09-09 16:09:22 -06:00
private var snackbarNetworkStatus: Snackbar? = null
2023-09-10 13:17:50 -06:00
private var snackbarError: Snackbar? = null
2023-09-09 16:09:22 -06:00
private var connectionHasBeenLost: Boolean = false
2023-09-10 13:17:50 -06:00
private val errorObserver: Observer<Resource.Error.ErrorType?> = Observer {
2023-07-15 20:58:57 -06:00
when(it) {
Resource.Error.ErrorType.AuthError -> showReAuthDialog()
Resource.Error.ErrorType.NetworkError -> showNetworkErrorMessage()
Resource.Error.ErrorType.NotFoundError -> showNotFoundErrorMessage()
Resource.Error.ErrorType.ServerError -> showServerErrorMessage()
Resource.Error.ErrorType.OtherError -> showUnknownErrorMessage()
else -> {}
}
2023-09-10 13:17:50 -06:00
errorViewModel.error.postValue(null)
2023-07-15 20:58:57 -06:00
}
2023-09-09 16:09:22 -06:00
private val connectivityObserver: Observer<Boolean> = Observer { networkAvailable ->
val view: View = window.decorView.findViewById(android.R.id.content) ?: return@Observer
if(!networkAvailable) {
connectionHasBeenLost = true
snackbarNetworkStatus = Snackbar.make(view, R.string.network_conn_lost, Snackbar.LENGTH_INDEFINITE)
snackbarNetworkStatus?.show()
} else if(connectionHasBeenLost) {
snackbarNetworkStatus?.dismiss()
snackbarNetworkStatus = Snackbar.make(view, R.string.network_conn_restored, Snackbar.LENGTH_SHORT)
snackbarNetworkStatus?.show()
connectionHasBeenLost = false
2023-09-10 13:17:50 -06:00
CoroutineScope(Dispatchers.Default).launch {
errorViewModel.askRetry()
}
2023-09-09 16:09:22 -06:00
}
}
2023-07-15 20:58:57 -06:00
private val signInActivityResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { activityResult ->
if(activityResult.resultCode == Activity.RESULT_OK) {
2023-09-10 13:17:50 -06:00
CoroutineScope(Dispatchers.Default).launch {
errorViewModel.handleRetry()
}
2023-07-15 20:58:57 -06:00
}
}
private val onAcceptReAuthClick = DialogInterface.OnClickListener { _, _ ->
signInActivityResult.launch(Intent(this, LogInActivity::class.java))
2023-07-15 20:58:57 -06:00
}
private fun showReAuthDialog() {
MaterialAlertDialogBuilder(this)
.setMessage(R.string.need_reauth_message)
.setPositiveButton(R.string.accept, onAcceptReAuthClick)
.setNegativeButton(R.string.close, null)
.show()
2023-09-10 13:17:50 -06:00
errorViewModel.error.postValue(null)
2023-07-15 20:58:57 -06:00
}
private fun showNetworkErrorMessage() {
2023-09-10 13:17:50 -06:00
val view: View = window.decorView.findViewById(android.R.id.content) ?: return
snackbarError = Snackbar.make(view, R.string.network_error, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.retry) {
CoroutineScope(Dispatchers.Default).launch {
errorViewModel.askRetry()
}
errorViewModel.error.postValue(null)
}
snackbarError?.show()
2023-07-15 20:58:57 -06:00
}
private fun showServerErrorMessage() {
2023-09-10 13:17:50 -06:00
val view: View = window.decorView.findViewById(android.R.id.content) ?: return
2023-07-15 20:58:57 -06:00
2023-09-10 13:17:50 -06:00
snackbarError = Snackbar.make(view, R.string.server_error, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.retry) {
CoroutineScope(Dispatchers.Default).launch {
errorViewModel.askRetry()
}
errorViewModel.error.postValue(null)
}
snackbarError?.show()
2023-07-15 20:58:57 -06:00
}
private fun showNotFoundErrorMessage() {
2023-09-10 13:17:50 -06:00
val view: View = window.decorView.findViewById(android.R.id.content) ?: return
snackbarError = Snackbar.make(view, R.string.not_found, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.retry) {
CoroutineScope(Dispatchers.Default).launch {
errorViewModel.askRetry()
}
errorViewModel.error.postValue(null)
}
2023-07-15 20:58:57 -06:00
2023-09-10 13:17:50 -06:00
snackbarError?.show()
2023-07-15 20:58:57 -06:00
}
private fun showUnknownErrorMessage() {
2023-09-10 13:17:50 -06:00
val view: View = window.decorView.findViewById(android.R.id.content) ?: return
snackbarError = Snackbar.make(view, R.string.unknown_error, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.retry) {
CoroutineScope(Dispatchers.Default).launch {
errorViewModel.askRetry()
}
errorViewModel.error.postValue(null)
}
2023-07-15 20:58:57 -06:00
2023-09-10 13:17:50 -06:00
snackbarError?.show()
2023-07-15 20:58:57 -06:00
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
errorViewModel.error.observe(this, errorObserver)
2023-09-09 16:09:22 -06:00
NetworkStatus.networkIsAvailable.observe(this, connectivityObserver)
2023-07-15 20:58:57 -06:00
Log.d("IsolaattiBaseActivity", errorViewModel.toString())
}
}