diff --git a/vector/src/main/java/im/vector/riotx/core/platform/OnBackPressed.kt b/vector/src/main/java/im/vector/riotx/core/platform/OnBackPressed.kt index 17f7730f86..c8a58997a1 100644 --- a/vector/src/main/java/im/vector/riotx/core/platform/OnBackPressed.kt +++ b/vector/src/main/java/im/vector/riotx/core/platform/OnBackPressed.kt @@ -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 } diff --git a/vector/src/main/java/im/vector/riotx/core/platform/VectorBaseActivity.kt b/vector/src/main/java/im/vector/riotx/core/platform/VectorBaseActivity.kt index 4a3056657f..79b040cd41 100644 --- a/vector/src/main/java/im/vector/riotx/core/platform/VectorBaseActivity.kt +++ b/vector/src/main/java/im/vector/riotx/core/platform/VectorBaseActivity.kt @@ -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().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 } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListFragment.kt index a5e9a7b4bf..04d1802264 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListFragment.kt @@ -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 } diff --git a/vector/src/main/java/im/vector/riotx/features/login/AbstractLoginFragment.kt b/vector/src/main/java/im/vector/riotx/features/login/AbstractLoginFragment.kt index 9e57350b79..1d8ad9b05f 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/AbstractLoginFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/AbstractLoginFragment.kt @@ -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 diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginActivity.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginActivity.kt index e7cb90f5df..f273316c69 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginActivity.kt @@ -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" diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginWebFragment.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginWebFragment.kt index 5b0fe743cf..4416a9261f 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginWebFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginWebFragment.kt @@ -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) } } }