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 codeUse 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 establishedCheck 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 deviceSigning in a mobile device?Scan QR code
@@ -3356,5 +3358,7 @@
Signing you inNo 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" />
@@ -46,6 +46,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
+ android:visibility="gone"
app:layout_constraintBottom_toTopOf="@id/qrCodeLoginInstructionsShowQrCodeButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
diff --git a/vector/src/main/res/layout/fragment_qr_code_login_show_qr_code.xml b/vector/src/main/res/layout/fragment_qr_code_login_show_qr_code.xml
index 060d02498e..539f019848 100644
--- a/vector/src/main/res/layout/fragment_qr_code_login_show_qr_code.xml
+++ b/vector/src/main/res/layout/fragment_qr_code_login_show_qr_code.xml
@@ -13,13 +13,13 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
- app:qrCodeLoginHeaderDescription="@string/qr_code_login_header_show_qr_code_description"
+ app:qrCodeLoginHeaderDescription="@string/qr_code_login_header_show_qr_code_link_a_device_description"
app:qrCodeLoginHeaderImageBackgroundTint="?colorPrimary"
app:qrCodeLoginHeaderImageResource="@drawable/ic_camera"
app:qrCodeLoginHeaderTitle="@string/qr_code_login_header_show_qr_code_title" />
+
+
+
+
+
+
+
+
+
+
-
-