Fixes new device detections banner problems

This commit is contained in:
valere 2023-06-14 11:01:11 +02:00
parent dfadc8eca1
commit 3e73137c18
6 changed files with 37 additions and 33 deletions

View File

@ -187,8 +187,7 @@ internal class Device @AssistedInject constructor(
locallyVerified = innerDevice.locallyTrusted locallyVerified = innerDevice.locallyTrusted
), ),
isBlocked = innerDevice.isBlocked, isBlocked = innerDevice.isBlocked,
// TODO firstTimeSeenLocalTs = innerDevice.firstTimeSeenTs.toLong() * 1000
firstTimeSeenLocalTs = null
) )
} }
} }

View File

@ -229,6 +229,9 @@ class SelfVerificationBottomSheet : VectorBaseBottomSheetDialogFragment<BottomSh
} }
companion object { companion object {
val TAG: String = "VERIF"
fun verifyOwnUntrustedDevice(): SelfVerificationBottomSheet { fun verifyOwnUntrustedDevice(): SelfVerificationBottomSheet {
return SelfVerificationBottomSheet().apply { return SelfVerificationBottomSheet().apply {
setArguments( setArguments(

View File

@ -47,6 +47,7 @@ import im.vector.app.features.call.SharedKnownCallsViewModel
import im.vector.app.features.call.VectorCallActivity import im.vector.app.features.call.VectorCallActivity
import im.vector.app.features.call.dialpad.PstnDialActivity import im.vector.app.features.call.dialpad.PstnDialActivity
import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.call.webrtc.WebRtcCallManager
import im.vector.app.features.crypto.verification.self.SelfVerificationBottomSheet
import im.vector.app.features.home.room.list.UnreadCounterBadgeView import im.vector.app.features.home.room.list.UnreadCounterBadgeView
import im.vector.app.features.home.room.list.actions.RoomListSharedAction import im.vector.app.features.home.room.list.actions.RoomListSharedAction
import im.vector.app.features.home.room.list.actions.RoomListSharedActionViewModel import im.vector.app.features.home.room.list.actions.RoomListSharedActionViewModel
@ -54,6 +55,7 @@ import im.vector.app.features.home.room.list.home.HomeRoomListFragment
import im.vector.app.features.home.room.list.home.NewChatBottomSheet import im.vector.app.features.home.room.list.home.NewChatBottomSheet
import im.vector.app.features.popup.PopupAlertManager import im.vector.app.features.popup.PopupAlertManager
import im.vector.app.features.popup.VerificationVectorAlert import im.vector.app.features.popup.VerificationVectorAlert
import im.vector.app.features.qrcode.QrCodeScannerActivity
import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.settings.VectorPreferences
import im.vector.app.features.settings.VectorSettingsActivity.Companion.EXTRA_DIRECT_ACCESS_SECURITY_PRIVACY_MANAGE_SESSIONS import im.vector.app.features.settings.VectorSettingsActivity.Companion.EXTRA_DIRECT_ACCESS_SECURITY_PRIVACY_MANAGE_SESSIONS
import im.vector.app.features.spaces.SpaceListBottomSheet import im.vector.app.features.spaces.SpaceListBottomSheet
@ -161,8 +163,8 @@ class NewHomeDetailFragment :
unknownDeviceDetectorSharedViewModel.onEach { state -> unknownDeviceDetectorSharedViewModel.onEach { state ->
state.unknownSessions.invoke()?.let { unknownDevices -> state.unknownSessions.invoke()?.let { unknownDevices ->
if (unknownDevices.firstOrNull()?.currentSessionTrust == true) {
val uid = PopupAlertManager.REVIEW_LOGIN_UID val uid = PopupAlertManager.REVIEW_LOGIN_UID
if (unknownDevices.firstOrNull()?.currentSessionTrust == true) {
alertManager.cancelAlert(uid) alertManager.cancelAlert(uid)
val olderUnverified = unknownDevices.filter { !it.isNew } val olderUnverified = unknownDevices.filter { !it.isNew }
val newest = unknownDevices.firstOrNull { it.isNew }?.deviceInfo val newest = unknownDevices.firstOrNull { it.isNew }?.deviceInfo
@ -172,6 +174,9 @@ class NewHomeDetailFragment :
// In this case we prompt to go to settings to review logins // In this case we prompt to go to settings to review logins
promptToReviewChanges(uid, state, olderUnverified.map { it.deviceInfo }) promptToReviewChanges(uid, state, olderUnverified.map { it.deviceInfo })
} }
} else {
// cancel as there are not anymore untrusted devices
alertManager.cancelAlert(uid)
} }
} }
} }
@ -278,7 +283,14 @@ class NewHomeDetailFragment :
uid = uid, uid = uid,
title = getString(R.string.review_unverified_sessions_title), title = getString(R.string.review_unverified_sessions_title),
description = getString(R.string.review_unverified_sessions_description), description = getString(R.string.review_unverified_sessions_description),
iconId = R.drawable.ic_shield_warning iconId = R.drawable.ic_shield_warning,
shouldBeDisplayedIn = { activity ->
// do not show when there is an ongoing verification flow
if (activity is VectorBaseActivity<*>) {
activity.supportFragmentManager.findFragmentByTag(SelfVerificationBottomSheet.TAG) == null &&
activity !is QrCodeScannerActivity
} else true
}
).apply { ).apply {
viewBinder = VerificationVectorAlert.ViewBinder(user, avatarRenderer) viewBinder = VerificationVectorAlert.ViewBinder(user, avatarRenderer)
colorInt = colorProvider.getColorFromAttribute(R.attr.colorPrimary) colorInt = colorProvider.getColorFromAttribute(R.attr.colorPrimary)

View File

@ -39,7 +39,6 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.sample import kotlinx.coroutines.flow.sample
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo
@ -116,8 +115,14 @@ class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor(
session.sessionParams.deviceId != it.deviceId session.sessionParams.deviceId != it.deviceId
} }
.filter { info -> .filter { info ->
val matchingDeviceWithKeys = cryptoList.firstOrNull { it.deviceId == info.deviceId }
if (matchingDeviceWithKeys == null) {
// filter out verified sessions or those which do not support encryption (i.e. without crypto info) // filter out verified sessions or those which do not support encryption (i.e. without crypto info)
cryptoList.firstOrNull { info.deviceId == it.deviceId }?.isVerified?.not().orFalse() false
} else {
// Only report unverified
!matchingDeviceWithKeys.isVerified
}
} }
// filter out ignored devices // filter out ignored devices
.filter { shouldShowUnverifiedSessionsAlertUseCase.execute(it.deviceId) } .filter { shouldShowUnverifiedSessionsAlertUseCase.execute(it.deviceId) }
@ -136,7 +141,7 @@ class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor(
} }
.distinctUntilChanged() .distinctUntilChanged()
.execute { async -> .execute { async ->
Timber.v("## Detector trigger passed distinct") Timber.v("## Detector trigger passed distinct ${async.invoke()}")
copy( copy(
myMatrixItem = session.getUserOrDefault(session.myUserId).toMatrixItem(), myMatrixItem = session.getUserOrDefault(session.myUserId).toMatrixItem(),
unknownSessions = async unknownSessions = async

View File

@ -258,7 +258,7 @@ class DefaultNavigator @Inject constructor(
) )
if (context is AppCompatActivity) { if (context is AppCompatActivity) {
context.supportFragmentManager.commitTransaction(allowStateLoss = true) { context.supportFragmentManager.commitTransaction(allowStateLoss = true) {
add(SelfVerificationBottomSheet.forTransaction(request.transactionId), "VERIF") add(SelfVerificationBottomSheet.forTransaction(request.transactionId), SelfVerificationBottomSheet.TAG)
} }
} }
} }
@ -266,25 +266,10 @@ class DefaultNavigator @Inject constructor(
override fun requestSelfSessionVerification(context: Context) { override fun requestSelfSessionVerification(context: Context) {
coroutineScope.launch { coroutineScope.launch {
// TODO
// val session = sessionHolder.getSafeActiveSession() ?: return@launch
// val otherSessions = session.cryptoService()
// .getCryptoDeviceInfoList(session.myUserId)
// .filter { it.deviceId != session.sessionParams.deviceId }
// .map { it.deviceId }
if (context is AppCompatActivity) { if (context is AppCompatActivity) {
context.supportFragmentManager.commitTransaction(allowStateLoss = true) { context.supportFragmentManager.commitTransaction(allowStateLoss = true) {
add(SelfVerificationBottomSheet.verifyOwnUntrustedDevice(), "VERIF") add(SelfVerificationBottomSheet.verifyOwnUntrustedDevice(), SelfVerificationBottomSheet.TAG)
} }
// if (otherSessions.isNotEmpty()) {
// val pr = session.cryptoService().verificationService().requestSelfKeyVerification(
// supportedVerificationMethodsProvider.provide())
// VerificationBottomSheet.forSelfVerification(session, pr.transactionId)
// .show(context.supportFragmentManager, VerificationBottomSheet.WAITING_SELF_VERIF_TAG)
// } else {
// VerificationBottomSheet.forSelfVerification(session)
// .show(context.supportFragmentManager, VerificationBottomSheet.WAITING_SELF_VERIF_TAG)
// }
} }
} }
} }
@ -293,7 +278,7 @@ class DefaultNavigator @Inject constructor(
// val session = sessionHolder.getSafeActiveSession() ?: return // val session = sessionHolder.getSafeActiveSession() ?: return
coroutineScope.launch(Dispatchers.Main) { coroutineScope.launch(Dispatchers.Main) {
SelfVerificationBottomSheet.forTransaction(transactionId) SelfVerificationBottomSheet.forTransaction(transactionId)
.show(fragmentActivity.supportFragmentManager, "SELF_VERIF_TAG") .show(fragmentActivity.supportFragmentManager, SelfVerificationBottomSheet.TAG)
} }
} }

View File

@ -164,7 +164,7 @@ class PopupAlertManager @Inject constructor(
next = alertQueue.maxByOrNull { it.priority } next = alertQueue.maxByOrNull { it.priority }
// If next alert with highest priority is higher than the current one, we should display it // If next alert with highest priority is higher than the current one, we should display it
// and add the current one to queue again. // and add the current one to queue again.
if (next != null && next.priority > currentAlerter?.priority ?: Int.MIN_VALUE) { if (next != null && next.priority > (currentAlerter?.priority ?: Int.MIN_VALUE)) {
alertQueue.remove(next) alertQueue.remove(next)
currentAlerter?.also { currentAlerter?.also {
alertQueue.add(0, it) alertQueue.add(0, it)