Fix pressing back on AuthenticationFragment

If login request isn't disabled when user presses
back then they might get navigated back to
authentication again.
This commit is contained in:
Kirill Kamakin
2022-04-04 18:54:48 +05:00
parent e6dbff4a67
commit c98feceab4
7 changed files with 50 additions and 9 deletions

View File

@@ -0,0 +1,30 @@
package gq.kirmanak.mealient.extensions
import androidx.activity.OnBackPressedDispatcher
import androidx.activity.addCallback
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
fun Fragment.executeOnceOnBackPressed(action: () -> Unit) {
val onBackPressedDispatcher = requireActivity().onBackPressedDispatcher
lifecycleScope.launch {
onBackPressedDispatcher.backPressedFlow().first()
action()
onBackPressedDispatcher.onBackPressed() // Execute other callbacks now
}
}
@OptIn(ExperimentalCoroutinesApi::class)
fun OnBackPressedDispatcher.backPressedFlow(): Flow<Unit> = callbackFlow {
val callback = addCallback { trySend(Unit) }
awaitClose {
callback.isEnabled = false
callback.remove()
}
}

View File

@@ -1,4 +1,4 @@
package gq.kirmanak.mealient.ui
package gq.kirmanak.mealient.extensions
import android.app.Activity
import android.os.Build

View File

@@ -13,7 +13,8 @@ import dagger.hilt.android.AndroidEntryPoint
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.data.network.NetworkError.Unauthorized
import gq.kirmanak.mealient.databinding.FragmentAuthenticationBinding
import gq.kirmanak.mealient.ui.checkIfInputIsEmpty
import gq.kirmanak.mealient.extensions.checkIfInputIsEmpty
import gq.kirmanak.mealient.extensions.executeOnceOnBackPressed
import timber.log.Timber
@AndroidEntryPoint
@@ -28,6 +29,7 @@ class AuthenticationFragment : Fragment(R.layout.fragment_authentication) {
super.onCreate(savedInstanceState)
Timber.v("onCreate() called with: savedInstanceState = $savedInstanceState")
authStatuses.observe(this, ::onAuthStatusChange)
executeOnceOnBackPressed { viewModel.disableLoginRequest() }
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

View File

@@ -45,8 +45,17 @@ class AuthenticationViewModel @Inject constructor(
}
}
fun login() {
Timber.v("login() called")
viewModelScope.launch { loginRequestsFlow.emit(true) }
fun enableLoginRequest() {
Timber.v("enableLoginRequest() called")
updateIsLoginRequested(true)
}
fun disableLoginRequest() {
Timber.v("disableLoginRequest() called")
updateIsLoginRequested(false)
}
private fun updateIsLoginRequested(isRequested: Boolean) {
viewModelScope.launch { loginRequestsFlow.emit(isRequested) }
}
}

View File

@@ -11,7 +11,7 @@ import dagger.hilt.android.AndroidEntryPoint
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.data.network.NetworkError
import gq.kirmanak.mealient.databinding.FragmentBaseUrlBinding
import gq.kirmanak.mealient.ui.checkIfInputIsEmpty
import gq.kirmanak.mealient.extensions.checkIfInputIsEmpty
import timber.log.Timber
@AndroidEntryPoint

View File

@@ -13,9 +13,9 @@ import dagger.hilt.android.AndroidEntryPoint
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.data.recipes.db.entity.RecipeSummaryEntity
import gq.kirmanak.mealient.databinding.FragmentRecipesBinding
import gq.kirmanak.mealient.extensions.refreshesLiveData
import gq.kirmanak.mealient.ui.auth.AuthenticationState
import gq.kirmanak.mealient.ui.auth.AuthenticationViewModel
import gq.kirmanak.mealient.ui.refreshesLiveData
import kotlinx.coroutines.flow.collect
import timber.log.Timber

View File

@@ -9,8 +9,8 @@ import androidx.navigation.NavDirections
import androidx.navigation.fragment.findNavController
import dagger.hilt.android.AndroidEntryPoint
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.ui.setActionBarVisibility
import gq.kirmanak.mealient.ui.setSystemUiVisibility
import gq.kirmanak.mealient.extensions.setActionBarVisibility
import gq.kirmanak.mealient.extensions.setSystemUiVisibility
import timber.log.Timber
@AndroidEntryPoint