diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index bf0bce8a8c..8fb019dcd8 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -3336,7 +3336,8 @@ Scan QR code Use the camera on this device to scan the QR code shown on your other device: Sign in with QR code - Use your signed in device to scan the QR code below: + Use your signed in device to scan the QR code below: + Scan the QR code below with your device that’s signed out. Secure connection established Check your signed in device, the code below should be displayed. Confirm that the code below matches with that device: Unsuccessful connection @@ -3344,11 +3345,12 @@ The linking wasn’t completed in the required time. The request was denied on the other device. Open ${app_name} on your other device - Go to Settings -> Security & Privacy - Are you on web? -> Select \'Show QR code\' - Are you on a mobile device? -> Select \'Scan QR code\' and then \'Show QR code\' - Open ${app_name} on your other device - Select \'Sign in with QR code\' + Go to Settings -> Security & Privacy -> Show All Sessions + Select \'Show QR code\' + Start at the sign in screen + Select \'Sign in with QR code\' + Start at the sign in screen + Select \'Scan QR code\' Show QR code in this device Signing in a mobile device? Scan QR code @@ -3356,5 +3358,7 @@ Signing you in No match? Try again + Confirm + Please ensure that you know the origin of this code. By linking devices, you will provide someone with full access to your account. diff --git a/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginActivity.kt b/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginActivity.kt index 7ca58088f8..e0323fdc2d 100644 --- a/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginActivity.kt +++ b/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginActivity.kt @@ -26,6 +26,8 @@ import dagger.hilt.android.AndroidEntryPoint import im.vector.app.core.extensions.addFragment import im.vector.app.core.extensions.addFragmentToBackstack import im.vector.app.core.platform.SimpleFragmentActivity +import org.matrix.android.sdk.api.extensions.orFalse +import timber.log.Timber @AndroidEntryPoint class QrCodeLoginActivity : SimpleFragmentActivity() { @@ -38,19 +40,36 @@ class QrCodeLoginActivity : SimpleFragmentActivity() { val qrCodeLoginArgs: QrCodeLoginArgs? = intent?.extras?.getParcelable(Mavericks.KEY_ARG) if (isFirstCreation()) { - if (qrCodeLoginArgs?.loginType == QrCodeLoginType.LOGIN) { - addFragment( - views.container, - QrCodeLoginInstructionsFragment::class.java, - qrCodeLoginArgs, - tag = FRAGMENT_QR_CODE_INSTRUCTIONS_TAG - ) + when (qrCodeLoginArgs?.loginType) { + QrCodeLoginType.LOGIN -> { + showInstructionsFragment(qrCodeLoginArgs) + } + QrCodeLoginType.LINK_A_DEVICE -> { + if (qrCodeLoginArgs.showQrCodeByDefault.orFalse()) { + handleNavigateToShowQrCodeScreen() + } else { + showInstructionsFragment(qrCodeLoginArgs) + } + } + null -> { + Timber.i("QrCodeLoginArgs is null. This is not expected.") + finish() + } } } observeViewEvents() } + private fun showInstructionsFragment(qrCodeLoginArgs: QrCodeLoginArgs) { + addFragment( + views.container, + QrCodeLoginInstructionsFragment::class.java, + qrCodeLoginArgs, + tag = FRAGMENT_QR_CODE_INSTRUCTIONS_TAG + ) + } + private fun observeViewEvents() { viewModel.observeViewEvents { when (it) { @@ -61,7 +80,7 @@ class QrCodeLoginActivity : SimpleFragmentActivity() { } private fun handleNavigateToShowQrCodeScreen() { - addFragmentToBackstack( + addFragment( views.container, QrCodeLoginShowQrCodeFragment::class.java, tag = FRAGMENT_SHOW_QR_CODE_TAG diff --git a/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginArgs.kt b/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginArgs.kt index 2f40b3ec4d..c7b681c488 100644 --- a/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginArgs.kt +++ b/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginArgs.kt @@ -22,4 +22,5 @@ import kotlinx.parcelize.Parcelize @Parcelize data class QrCodeLoginArgs( val loginType: QrCodeLoginType, + val showQrCodeByDefault: Boolean, ) : Parcelable diff --git a/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginConnectionStatus.kt b/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginConnectionStatus.kt index f2d50eafc4..330562b874 100644 --- a/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginConnectionStatus.kt +++ b/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginConnectionStatus.kt @@ -18,7 +18,7 @@ package im.vector.app.features.login.qr sealed class QrCodeLoginConnectionStatus { object ConnectingToDevice : QrCodeLoginConnectionStatus() - data class Connected(val securityCode: String) : QrCodeLoginConnectionStatus() + data class Connected(val securityCode: String, val canConfirmSecurityCode: Boolean) : QrCodeLoginConnectionStatus() object SigningIn : QrCodeLoginConnectionStatus() data class Failed(val errorType: QrCodeLoginErrorType, val canTryAgain: Boolean) : QrCodeLoginConnectionStatus() } diff --git a/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginInstructionsFragment.kt b/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginInstructionsFragment.kt index 6b48975e15..ae3ba9574b 100644 --- a/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginInstructionsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginInstructionsFragment.kt @@ -21,10 +21,9 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.core.view.isVisible import com.airbnb.mvrx.activityViewModel -import com.airbnb.mvrx.fragmentViewModel import dagger.hilt.android.AndroidEntryPoint +import im.vector.app.R import im.vector.app.core.extensions.registerStartForActivityResult import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.databinding.FragmentQrCodeLoginInstructionsBinding @@ -50,11 +49,20 @@ class QrCodeLoginInstructionsFragment : VectorBaseFragment) { setInstruction(binding.instructions1Layout, binding.instruction1TextView, instructions.getOrNull(0)) setInstruction(binding.instructions2Layout, binding.instruction2TextView, instructions.getOrNull(1)) setInstruction(binding.instructions3Layout, binding.instruction3TextView, instructions.getOrNull(2)) - setInstruction(binding.instructions4Layout, binding.instruction4TextView, instructions.getOrNull(3)) } private fun setInstruction(instructionLayout: LinearLayout, instructionTextView: TextView, instruction: String?) { diff --git a/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginShowQrCodeFragment.kt b/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginShowQrCodeFragment.kt index b5437626bc..9741b79f7a 100644 --- a/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginShowQrCodeFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginShowQrCodeFragment.kt @@ -22,6 +22,7 @@ import android.view.View import android.view.ViewGroup import com.airbnb.mvrx.activityViewModel import dagger.hilt.android.AndroidEntryPoint +import im.vector.app.R import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.databinding.FragmentQrCodeLoginShowQrCodeBinding @@ -49,12 +50,34 @@ class QrCodeLoginShowQrCodeFragment : VectorBaseFragment showQrCode(qrCodeData) } } } + private fun setInstructions(loginType: QrCodeLoginType) { + if (loginType == QrCodeLoginType.LOGIN) { + views.qrCodeLoginShowQrCodeHeaderView.setDescription(getString(R.string.qr_code_login_header_show_qr_code_new_device_description)) + views.qrCodeLoginShowQrCodeInstructionsView.setInstructions( + listOf( + getString(R.string.qr_code_login_new_device_instruction_1), + getString(R.string.qr_code_login_new_device_instruction_2), + getString(R.string.qr_code_login_new_device_instruction_3), + ) + ) + } else { + views.qrCodeLoginShowQrCodeHeaderView.setDescription(getString(R.string.qr_code_login_header_show_qr_code_link_a_device_description)) + views.qrCodeLoginShowQrCodeInstructionsView.setInstructions( + listOf( + getString(R.string.qr_code_login_link_a_device_show_qr_code_instruction_1), + getString(R.string.qr_code_login_link_a_device_show_qr_code_instruction_2), + ) + ) + } + } + private fun showQrCode(qrCodeData: String) { views.qrCodeLoginSHowQrCodeImageView.setData(qrCodeData) } diff --git a/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginStatusFragment.kt b/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginStatusFragment.kt index 26d24d9ed0..c1db1832ef 100644 --- a/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginStatusFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/qr/QrCodeLoginStatusFragment.kt @@ -52,7 +52,7 @@ class QrCodeLoginStatusFragment : VectorBaseFragment handleConnectionEstablished(it.connectionStatus) + is QrCodeLoginConnectionStatus.Connected -> handleConnectionEstablished(it.connectionStatus, it.loginType) QrCodeLoginConnectionStatus.ConnectingToDevice -> handleConnectingToDevice() QrCodeLoginConnectionStatus.SigningIn -> handleSigningIn() is QrCodeLoginConnectionStatus.Failed -> handleFailed(it.connectionStatus) @@ -62,6 +62,7 @@ class QrCodeLoginStatusFragment : VectorBaseFragment + app:qrCodeLoginInstruction3="@string/qr_code_login_new_device_instruction_3" />