Login screens: back button management for SSO

This commit is contained in:
Benoit Marty 2019-11-20 11:12:08 +01:00
parent f12e6c941d
commit 62d5aba796
6 changed files with 30 additions and 20 deletions

View file

@ -21,6 +21,7 @@ interface OnBackPressed {
/**
* Returns true, if the on back pressed event has been handled by this Fragment.
* Otherwise return false
* @param toolbarButton true if this is the back button from the toolbar
*/
fun onBackPressed(): Boolean
fun onBackPressed(toolbarButton: Boolean): Boolean
}

View file

@ -278,7 +278,7 @@ abstract class VectorBaseActivity : AppCompatActivity(), HasScreenInjector {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
onBackPressed()
onBackPressed(true)
return true
}
@ -286,20 +286,24 @@ abstract class VectorBaseActivity : AppCompatActivity(), HasScreenInjector {
}
override fun onBackPressed() {
val handled = recursivelyDispatchOnBackPressed(supportFragmentManager)
onBackPressed(false)
}
private fun onBackPressed(fromToolbar: Boolean) {
val handled = recursivelyDispatchOnBackPressed(supportFragmentManager, fromToolbar)
if (!handled) {
super.onBackPressed()
}
}
private fun recursivelyDispatchOnBackPressed(fm: FragmentManager): Boolean {
val reverseOrder = fm.fragments.filter { it is VectorBaseFragment }.reversed()
private fun recursivelyDispatchOnBackPressed(fm: FragmentManager, fromToolbar: Boolean): Boolean {
val reverseOrder = fm.fragments.filterIsInstance<VectorBaseFragment>().reversed()
for (f in reverseOrder) {
val handledByChildFragments = recursivelyDispatchOnBackPressed(f.childFragmentManager)
val handledByChildFragments = recursivelyDispatchOnBackPressed(f.childFragmentManager, fromToolbar)
if (handledByChildFragments) {
return true
}
if (f is OnBackPressed && f.onBackPressed()) {
if (f is OnBackPressed && f.onBackPressed(fromToolbar)) {
return true
}
}

View file

@ -329,7 +329,7 @@ class RoomListFragment @Inject constructor(
stateView.state = StateView.State.Error(message)
}
override fun onBackPressed(): Boolean {
override fun onBackPressed(toolbarButton: Boolean): Boolean {
if (createChatFabMenu.onBackPressed()) {
return true
}

View file

@ -38,7 +38,7 @@ abstract class AbstractLoginFragment : VectorBaseFragment(), OnBackPressed {
loginSharedActionViewModel = activityViewModelProvider.get(LoginSharedActionViewModel::class.java)
}
override fun onBackPressed(): Boolean {
override fun onBackPressed(toolbarButton: Boolean): Boolean {
resetViewModel()
// Do not consume the Back event
return false

View file

@ -20,6 +20,7 @@ import android.content.Context
import android.content.Intent
import android.view.View
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.Toolbar
import androidx.core.view.ViewCompat
import androidx.core.view.isVisible
import androidx.fragment.app.FragmentManager
@ -34,6 +35,7 @@ import im.vector.riotx.core.di.ScreenComponent
import im.vector.riotx.core.error.ErrorFormatter
import im.vector.riotx.core.extensions.addFragment
import im.vector.riotx.core.extensions.addFragmentToBackstack
import im.vector.riotx.core.platform.ToolbarConfigurable
import im.vector.riotx.core.platform.VectorBaseActivity
import im.vector.riotx.features.home.HomeActivity
import im.vector.riotx.features.login.terms.LoginTermsFragment
@ -46,7 +48,7 @@ import javax.net.ssl.HttpsURLConnection
/**
* The LoginActivity manages the fragment navigation and also display the loading View
*/
class LoginActivity : VectorBaseActivity() {
class LoginActivity : VectorBaseActivity(), ToolbarConfigurable {
private val loginViewModel: LoginViewModel by viewModel()
private lateinit var loginSharedActionViewModel: LoginSharedActionViewModel
@ -134,16 +136,16 @@ class LoginActivity : VectorBaseActivity() {
}
private fun displayRegistrationError(throwable: Throwable) {
val message = when(throwable) {
val message = when (throwable) {
is Failure.ServerError -> {
if(throwable.error.code == MatrixError.FORBIDDEN
if (throwable.error.code == MatrixError.FORBIDDEN
&& throwable.httpCode == HttpsURLConnection.HTTP_FORBIDDEN /* 403 */) {
getString(R.string.login_registration_disabled)
} else {
null
}
}
else -> null
else -> null
}
?: errorFormatter.toHumanReadable(throwable)
@ -274,6 +276,10 @@ class LoginActivity : VectorBaseActivity() {
}
}
override fun configure(toolbar: Toolbar) {
configureToolbar(toolbar)
}
companion object {
private const val FRAGMENT_REGISTRATION_STAGE_TAG = "FRAGMENT_REGISTRATION_STAGE_TAG"

View file

@ -40,7 +40,7 @@ import javax.inject.Inject
/**
* This screen is displayed for SSO login and also when the application does not support login flow or registration flow
* of the homeserfver, as a fallback to login or to create an account
* of the homeserver, as a fallback to login or to create an account
*/
class LoginWebFragment @Inject constructor(private val assetReader: AssetReader) : AbstractLoginFragment() {
@ -241,12 +241,11 @@ class LoginWebFragment @Inject constructor(private val assetReader: AssetReader)
// Nothing to do
}
override fun onBackPressed(): Boolean {
return if (loginWebWebView.canGoBack()) {
loginWebWebView.goBack()
true
} else {
super.onBackPressed()
override fun onBackPressed(toolbarButton: Boolean): Boolean {
return when {
toolbarButton -> super.onBackPressed(toolbarButton)
loginWebWebView.canGoBack() -> loginWebWebView.goBack().run { true }
else -> super.onBackPressed(toolbarButton)
}
}
}