From 9fa131c297bd97fa4ffb3114a6bb4772e90ac3df Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 22 Nov 2019 00:04:36 +0100 Subject: [PATCH] Login screens: reset password: display a better popup when link is not clicked yet --- docs/signin.md | 2 ++ .../im/vector/riotx/core/error/Extensions.kt | 26 +++++++++++++++++++ .../LoginGenericTextInputFormFragment.kt | 8 +----- ...inResetPasswordMailConfirmationFragment.kt | 9 ++++++- .../login/LoginWaitForEmailFragment.kt | 9 +------ 5 files changed, 38 insertions(+), 16 deletions(-) create mode 100644 vector/src/main/java/im/vector/riotx/core/error/Extensions.kt diff --git a/docs/signin.md b/docs/signin.md index d90f00d361..6a99874263 100644 --- a/docs/signin.md +++ b/docs/signin.md @@ -79,10 +79,12 @@ If the user confirms before the link is clicked, we get an error: 401 +```json { "errcode": "M_UNAUTHORIZED", "error": "" } +``` ### User clicks on the link diff --git a/vector/src/main/java/im/vector/riotx/core/error/Extensions.kt b/vector/src/main/java/im/vector/riotx/core/error/Extensions.kt new file mode 100644 index 0000000000..dd4257fe1f --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/core/error/Extensions.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotx.core.error + +import im.vector.matrix.android.api.failure.Failure +import im.vector.matrix.android.api.failure.MatrixError +import javax.net.ssl.HttpsURLConnection + +fun Throwable.is401(): Boolean { + return (this is Failure.ServerError && this.httpCode == HttpsURLConnection.HTTP_UNAUTHORIZED /* 401 */ + && this.error.code == MatrixError.UNAUTHORIZED) +} diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginGenericTextInputFormFragment.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginGenericTextInputFormFragment.kt index bc7ab56500..146015adc9 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginGenericTextInputFormFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginGenericTextInputFormFragment.kt @@ -30,16 +30,15 @@ import com.google.i18n.phonenumbers.PhoneNumberUtil import com.jakewharton.rxbinding3.widget.textChanges import im.vector.matrix.android.api.auth.registration.RegisterThreePid import im.vector.matrix.android.api.failure.Failure -import im.vector.matrix.android.api.failure.MatrixError import im.vector.riotx.R import im.vector.riotx.core.error.ErrorFormatter +import im.vector.riotx.core.error.is401 import im.vector.riotx.core.extensions.hideKeyboard import im.vector.riotx.core.extensions.isEmail import im.vector.riotx.core.extensions.setTextOrHide import kotlinx.android.parcel.Parcelize import kotlinx.android.synthetic.main.fragment_login_generic_text_input_form.* import javax.inject.Inject -import javax.net.ssl.HttpsURLConnection enum class TextInputFormFragmentMode { SetEmail, @@ -242,11 +241,6 @@ class LoginGenericTextInputFormFragment @Inject constructor(private val errorFor } } - private fun Throwable.is401(): Boolean { - return (this is Failure.ServerError && this.httpCode == HttpsURLConnection.HTTP_UNAUTHORIZED /* 401 */ - && this.error.code == MatrixError.UNAUTHORIZED) - } - override fun resetViewModel() { loginViewModel.handle(LoginAction.ResetLogin) } diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginResetPasswordMailConfirmationFragment.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginResetPasswordMailConfirmationFragment.kt index a3a015ce0c..d01b0145a2 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginResetPasswordMailConfirmationFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginResetPasswordMailConfirmationFragment.kt @@ -25,6 +25,7 @@ import com.airbnb.mvrx.Success import com.airbnb.mvrx.withState import im.vector.riotx.R import im.vector.riotx.core.error.ErrorFormatter +import im.vector.riotx.core.error.is401 import kotlinx.android.synthetic.main.fragment_login_reset_password_mail_confirmation.* import javax.inject.Inject @@ -64,9 +65,15 @@ class LoginResetPasswordMailConfirmationFragment @Inject constructor( when (state.asyncResetMailConfirmed) { is Fail -> { // Link in email not yet clicked ? + val message = if (state.asyncResetMailConfirmed.error.is401()) { + getString(R.string.auth_reset_password_error_unauthorized) + } else { + errorFormatter.toHumanReadable(state.asyncResetMailConfirmed.error) + } + AlertDialog.Builder(requireActivity()) .setTitle(R.string.dialog_title_error) - .setMessage(errorFormatter.toHumanReadable(state.asyncResetMailConfirmed.error)) + .setMessage(message) .setPositiveButton(R.string.ok, null) .show() } diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginWaitForEmailFragment.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginWaitForEmailFragment.kt index 651c594561..8302e62a31 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginWaitForEmailFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginWaitForEmailFragment.kt @@ -21,14 +21,12 @@ import android.os.Parcelable import android.view.View import androidx.appcompat.app.AlertDialog import com.airbnb.mvrx.args -import im.vector.matrix.android.api.failure.Failure -import im.vector.matrix.android.api.failure.MatrixError import im.vector.riotx.R import im.vector.riotx.core.error.ErrorFormatter +import im.vector.riotx.core.error.is401 import kotlinx.android.parcel.Parcelize import kotlinx.android.synthetic.main.fragment_login_wait_for_email.* import javax.inject.Inject -import javax.net.ssl.HttpsURLConnection @Parcelize data class LoginWaitForEmailFragmentArgument( @@ -79,11 +77,6 @@ class LoginWaitForEmailFragment @Inject constructor(private val errorFormatter: } } - private fun Throwable.is401(): Boolean { - return (this is Failure.ServerError && this.httpCode == HttpsURLConnection.HTTP_UNAUTHORIZED /* 401 */ - && this.error.code == MatrixError.UNAUTHORIZED) - } - override fun resetViewModel() { loginViewModel.handle(LoginAction.ResetLogin) }