Fixes new device detections banner problems
This commit is contained in:
parent
dfadc8eca1
commit
3e73137c18
|
@ -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
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue