mirror of
https://github.com/SchildiChat/SchildiChat-android.git
synced 2025-02-17 04:20:00 +03:00
Implement qr code login failed states.
This commit is contained in:
parent
2527cab73e
commit
2b452d6fe5
6 changed files with 80 additions and 0 deletions
|
@ -3337,6 +3337,10 @@
|
||||||
<string name="qr_code_login_header_show_qr_code_description">Use your signed in device to scan the QR code below:</string>
|
<string name="qr_code_login_header_show_qr_code_description">Use your signed in device to scan the QR code below:</string>
|
||||||
<string name="qr_code_login_header_connected_title">Secure connection established</string>
|
<string name="qr_code_login_header_connected_title">Secure connection established</string>
|
||||||
<string name="qr_code_login_header_connected_description">Check your signed in device, the code below should be displayed. Confirm that the code below matches with that device:</string>
|
<string name="qr_code_login_header_connected_description">Check your signed in device, the code below should be displayed. Confirm that the code below matches with that device:</string>
|
||||||
|
<string name="qr_code_login_header_failed_title">Unsuccessful connection</string>
|
||||||
|
<string name="qr_code_login_header_failed_device_is_not_supported_description">Linking with this device is not supported.</string>
|
||||||
|
<string name="qr_code_login_header_failed_timeout_description">The linking wasn’t completed in the required time.</string>
|
||||||
|
<string name="qr_code_login_header_failed_denied_description">The request was denied on the other device.</string>
|
||||||
<string name="qr_code_login_new_device_instruction_1">Open Element on your other device</string>
|
<string name="qr_code_login_new_device_instruction_1">Open Element on your other device</string>
|
||||||
<string name="qr_code_login_new_device_instruction_2">Go to Settings -> Security & Privacy</string>
|
<string name="qr_code_login_new_device_instruction_2">Go to Settings -> Security & Privacy</string>
|
||||||
<string name="qr_code_login_new_device_instruction_3">Select \'Link a device\'</string>
|
<string name="qr_code_login_new_device_instruction_3">Select \'Link a device\'</string>
|
||||||
|
@ -3347,5 +3351,6 @@
|
||||||
<string name="qr_code_login_connecting_to_device">Connecting to device</string>
|
<string name="qr_code_login_connecting_to_device">Connecting to device</string>
|
||||||
<string name="qr_code_login_signing_in">Signing you in</string>
|
<string name="qr_code_login_signing_in">Signing you in</string>
|
||||||
<string name="qr_code_login_status_no_match">No match?</string>
|
<string name="qr_code_login_status_no_match">No match?</string>
|
||||||
|
<string name="qr_code_login_try_again">Try again</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -20,4 +20,5 @@ sealed class QrCodeLoginConnectionStatus {
|
||||||
object ConnectingToDevice : QrCodeLoginConnectionStatus()
|
object ConnectingToDevice : QrCodeLoginConnectionStatus()
|
||||||
data class Connected(val securityCode: String) : QrCodeLoginConnectionStatus()
|
data class Connected(val securityCode: String) : QrCodeLoginConnectionStatus()
|
||||||
object SigningIn : QrCodeLoginConnectionStatus()
|
object SigningIn : QrCodeLoginConnectionStatus()
|
||||||
|
data class Failed(val errorType: QrCodeLoginErrorType, val canTryAgain: Boolean) : QrCodeLoginConnectionStatus()
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 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.app.features.login.qr
|
||||||
|
|
||||||
|
enum class QrCodeLoginErrorType {
|
||||||
|
DEVICE_IS_NOT_SUPPORTED,
|
||||||
|
TIMEOUT,
|
||||||
|
REQUEST_WAS_DENIED,
|
||||||
|
}
|
|
@ -55,17 +55,42 @@ class QrCodeLoginStatusFragment : VectorBaseFragment<FragmentQrCodeLoginStatusBi
|
||||||
is QrCodeLoginConnectionStatus.Connected -> handleConnectionEstablished(it.connectionStatus)
|
is QrCodeLoginConnectionStatus.Connected -> handleConnectionEstablished(it.connectionStatus)
|
||||||
QrCodeLoginConnectionStatus.ConnectingToDevice -> handleConnectingToDevice()
|
QrCodeLoginConnectionStatus.ConnectingToDevice -> handleConnectingToDevice()
|
||||||
QrCodeLoginConnectionStatus.SigningIn -> handleSigningIn()
|
QrCodeLoginConnectionStatus.SigningIn -> handleSigningIn()
|
||||||
|
is QrCodeLoginConnectionStatus.Failed -> handleFailed(it.connectionStatus)
|
||||||
null -> { /* NOOP */ }
|
null -> { /* NOOP */ }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun handleFailed(connectionStatus: QrCodeLoginConnectionStatus.Failed) {
|
||||||
|
views.qrCodeLoginStatusLoadingLayout.isVisible = false
|
||||||
|
views.qrCodeLoginStatusHeaderView.isVisible = true
|
||||||
|
views.qrCodeLoginStatusSecurityCode.isVisible = false
|
||||||
|
views.qrCodeLoginStatusNoMatchLayout.isVisible = false
|
||||||
|
views.qrCodeLoginStatusCancelButton.isVisible = true
|
||||||
|
views.qrCodeLoginStatusTryAgainButton.isVisible = connectionStatus.canTryAgain
|
||||||
|
views.qrCodeLoginStatusHeaderView.setTitle(getString(R.string.qr_code_login_header_failed_title))
|
||||||
|
views.qrCodeLoginStatusHeaderView.setDescription(getErrorCode(connectionStatus.errorType))
|
||||||
|
views.qrCodeLoginStatusHeaderView.setImage(
|
||||||
|
imageResource = R.drawable.ic_qr_code_login_failed,
|
||||||
|
backgroundTintColor = ThemeUtils.getColor(requireContext(), R.attr.colorError)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getErrorCode(errorType: QrCodeLoginErrorType): String {
|
||||||
|
return when (errorType) {
|
||||||
|
QrCodeLoginErrorType.DEVICE_IS_NOT_SUPPORTED -> getString(R.string.qr_code_login_header_failed_device_is_not_supported_description)
|
||||||
|
QrCodeLoginErrorType.TIMEOUT -> getString(R.string.qr_code_login_header_failed_timeout_description)
|
||||||
|
QrCodeLoginErrorType.REQUEST_WAS_DENIED -> getString(R.string.qr_code_login_header_failed_denied_description)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun handleConnectingToDevice() {
|
private fun handleConnectingToDevice() {
|
||||||
views.qrCodeLoginStatusLoadingLayout.isVisible = true
|
views.qrCodeLoginStatusLoadingLayout.isVisible = true
|
||||||
views.qrCodeLoginStatusHeaderView.isVisible = false
|
views.qrCodeLoginStatusHeaderView.isVisible = false
|
||||||
views.qrCodeLoginStatusSecurityCode.isVisible = false
|
views.qrCodeLoginStatusSecurityCode.isVisible = false
|
||||||
views.qrCodeLoginStatusNoMatchLayout.isVisible = false
|
views.qrCodeLoginStatusNoMatchLayout.isVisible = false
|
||||||
views.qrCodeLoginStatusCancelButton.isVisible = true
|
views.qrCodeLoginStatusCancelButton.isVisible = true
|
||||||
|
views.qrCodeLoginStatusTryAgainButton.isVisible = false
|
||||||
views.qrCodeLoginStatusLoadingTextView.setText(R.string.qr_code_login_connecting_to_device)
|
views.qrCodeLoginStatusLoadingTextView.setText(R.string.qr_code_login_connecting_to_device)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,6 +100,7 @@ class QrCodeLoginStatusFragment : VectorBaseFragment<FragmentQrCodeLoginStatusBi
|
||||||
views.qrCodeLoginStatusSecurityCode.isVisible = false
|
views.qrCodeLoginStatusSecurityCode.isVisible = false
|
||||||
views.qrCodeLoginStatusNoMatchLayout.isVisible = false
|
views.qrCodeLoginStatusNoMatchLayout.isVisible = false
|
||||||
views.qrCodeLoginStatusCancelButton.isVisible = false
|
views.qrCodeLoginStatusCancelButton.isVisible = false
|
||||||
|
views.qrCodeLoginStatusTryAgainButton.isVisible = false
|
||||||
views.qrCodeLoginStatusLoadingTextView.setText(R.string.qr_code_login_signing_in)
|
views.qrCodeLoginStatusLoadingTextView.setText(R.string.qr_code_login_signing_in)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,6 +110,7 @@ class QrCodeLoginStatusFragment : VectorBaseFragment<FragmentQrCodeLoginStatusBi
|
||||||
views.qrCodeLoginStatusSecurityCode.isVisible = true
|
views.qrCodeLoginStatusSecurityCode.isVisible = true
|
||||||
views.qrCodeLoginStatusNoMatchLayout.isVisible = true
|
views.qrCodeLoginStatusNoMatchLayout.isVisible = true
|
||||||
views.qrCodeLoginStatusCancelButton.isVisible = true
|
views.qrCodeLoginStatusCancelButton.isVisible = true
|
||||||
|
views.qrCodeLoginStatusTryAgainButton.isVisible = false
|
||||||
views.qrCodeLoginStatusSecurityCode.text = connectionStatus.securityCode
|
views.qrCodeLoginStatusSecurityCode.text = connectionStatus.securityCode
|
||||||
views.qrCodeLoginStatusHeaderView.setTitle(getString(R.string.qr_code_login_header_connected_title))
|
views.qrCodeLoginStatusHeaderView.setTitle(getString(R.string.qr_code_login_header_connected_title))
|
||||||
views.qrCodeLoginStatusHeaderView.setDescription(getString(R.string.qr_code_login_header_connected_description))
|
views.qrCodeLoginStatusHeaderView.setDescription(getString(R.string.qr_code_login_header_connected_description))
|
||||||
|
|
|
@ -70,10 +70,22 @@ class QrCodeLoginViewModel @AssistedInject constructor(
|
||||||
|
|
||||||
// TODO. UI test purpose. Fixme remove!
|
// TODO. UI test purpose. Fixme remove!
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
|
delay(3000)
|
||||||
|
onFailed(QrCodeLoginErrorType.TIMEOUT, false)
|
||||||
delay(3000)
|
delay(3000)
|
||||||
onConnectionEstablished("1234-ABCD-5678-EFGH")
|
onConnectionEstablished("1234-ABCD-5678-EFGH")
|
||||||
delay(3000)
|
delay(3000)
|
||||||
onSigningIn()
|
onSigningIn()
|
||||||
|
delay(3000)
|
||||||
|
onFailed(QrCodeLoginErrorType.DEVICE_IS_NOT_SUPPORTED, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun onFailed(errorType: QrCodeLoginErrorType, canTryAgain: Boolean) {
|
||||||
|
setState {
|
||||||
|
copy(
|
||||||
|
connectionStatus = QrCodeLoginConnectionStatus.Failed(errorType, canTryAgain)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,18 @@
|
||||||
app:drawableTint="@color/alert_default_error_background" />
|
app:drawableTint="@color/alert_default_error_background" />
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/qrCodeLoginStatusTryAgainButton"
|
||||||
|
style="@style/Widget.Vector.Button.Login"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="12dp"
|
||||||
|
android:text="@string/qr_code_login_try_again"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_constraintBottom_toTopOf="@id/qrCodeLoginStatusNoMatchLayout"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/qrCodeLoginStatusCancelButton"
|
android:id="@+id/qrCodeLoginStatusCancelButton"
|
||||||
|
|
Loading…
Add table
Reference in a new issue