mirror of
https://github.com/vector-im/element-android.git
synced 2024-11-15 01:35:07 +08:00
Implement new logic for new login banner.
This commit is contained in:
parent
8835e4d25e
commit
4050975a19
@ -88,6 +88,9 @@ class DebugVectorFeatures(
|
|||||||
override fun isVoiceBroadcastEnabled(): Boolean = read(DebugFeatureKeys.voiceBroadcastEnabled)
|
override fun isVoiceBroadcastEnabled(): Boolean = read(DebugFeatureKeys.voiceBroadcastEnabled)
|
||||||
?: vectorFeatures.isVoiceBroadcastEnabled()
|
?: vectorFeatures.isVoiceBroadcastEnabled()
|
||||||
|
|
||||||
|
override fun isUnverifiedSessionsAlertEnabled(): Boolean = read(DebugFeatureKeys.unverifiedSessionsAlertEnabled)
|
||||||
|
?: vectorFeatures.isUnverifiedSessionsAlertEnabled()
|
||||||
|
|
||||||
fun <T> override(value: T?, key: Preferences.Key<T>) = updatePreferences {
|
fun <T> override(value: T?, key: Preferences.Key<T>) = updatePreferences {
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
it.remove(key)
|
it.remove(key)
|
||||||
@ -151,4 +154,5 @@ object DebugFeatureKeys {
|
|||||||
val qrCodeLoginForAllServers = booleanPreferencesKey("qr-code-login-for-all-servers")
|
val qrCodeLoginForAllServers = booleanPreferencesKey("qr-code-login-for-all-servers")
|
||||||
val reciprocateQrCodeLogin = booleanPreferencesKey("reciprocate-qr-code-login")
|
val reciprocateQrCodeLogin = booleanPreferencesKey("reciprocate-qr-code-login")
|
||||||
val voiceBroadcastEnabled = booleanPreferencesKey("voice-broadcast-enabled")
|
val voiceBroadcastEnabled = booleanPreferencesKey("voice-broadcast-enabled")
|
||||||
|
val unverifiedSessionsAlertEnabled = booleanPreferencesKey("unverified-sessions-alert-enabled")
|
||||||
}
|
}
|
||||||
|
@ -64,5 +64,5 @@ class DefaultVectorFeatures : VectorFeatures {
|
|||||||
override fun isQrCodeLoginForAllServers(): Boolean = false
|
override fun isQrCodeLoginForAllServers(): Boolean = false
|
||||||
override fun isReciprocateQrCodeLogin(): Boolean = false
|
override fun isReciprocateQrCodeLogin(): Boolean = false
|
||||||
override fun isVoiceBroadcastEnabled(): Boolean = true
|
override fun isVoiceBroadcastEnabled(): Boolean = true
|
||||||
override fun isUnverifiedSessionsAlertEnabled(): Boolean = false
|
override fun isUnverifiedSessionsAlertEnabled(): Boolean = true
|
||||||
}
|
}
|
||||||
|
@ -239,12 +239,12 @@ class HomeDetailFragment :
|
|||||||
.requestSessionVerification(vectorBaseActivity, newest.deviceId ?: "")
|
.requestSessionVerification(vectorBaseActivity, newest.deviceId ?: "")
|
||||||
}
|
}
|
||||||
unknownDeviceDetectorSharedViewModel.handle(
|
unknownDeviceDetectorSharedViewModel.handle(
|
||||||
UnknownDeviceDetectorSharedViewModel.Action.IgnoreDevice(newest.deviceId?.let { listOf(it) }.orEmpty())
|
UnknownDeviceDetectorSharedViewModel.Action.IgnoreNewLogin(newest.deviceId?.let { listOf(it) }.orEmpty())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
dismissedAction = Runnable {
|
dismissedAction = Runnable {
|
||||||
unknownDeviceDetectorSharedViewModel.handle(
|
unknownDeviceDetectorSharedViewModel.handle(
|
||||||
UnknownDeviceDetectorSharedViewModel.Action.IgnoreDevice(newest.deviceId?.let { listOf(it) }.orEmpty())
|
UnknownDeviceDetectorSharedViewModel.Action.IgnoreNewLogin(newest.deviceId?.let { listOf(it) }.orEmpty())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* 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.home
|
||||||
|
|
||||||
|
import im.vector.app.features.settings.VectorPreferences
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class IsNewLoginAlertShownUseCase @Inject constructor(
|
||||||
|
private val vectorPreferences: VectorPreferences,
|
||||||
|
) {
|
||||||
|
|
||||||
|
fun execute(deviceId: String?): Boolean {
|
||||||
|
deviceId ?: return false
|
||||||
|
|
||||||
|
return vectorPreferences.isNewLoginAlertShownForDevice(deviceId)
|
||||||
|
}
|
||||||
|
}
|
@ -253,12 +253,12 @@ class NewHomeDetailFragment :
|
|||||||
.requestSessionVerification(vectorBaseActivity, newest.deviceId ?: "")
|
.requestSessionVerification(vectorBaseActivity, newest.deviceId ?: "")
|
||||||
}
|
}
|
||||||
unknownDeviceDetectorSharedViewModel.handle(
|
unknownDeviceDetectorSharedViewModel.handle(
|
||||||
UnknownDeviceDetectorSharedViewModel.Action.IgnoreDevice(newest.deviceId?.let { listOf(it) }.orEmpty())
|
UnknownDeviceDetectorSharedViewModel.Action.IgnoreNewLogin(newest.deviceId?.let { listOf(it) }.orEmpty())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
dismissedAction = Runnable {
|
dismissedAction = Runnable {
|
||||||
unknownDeviceDetectorSharedViewModel.handle(
|
unknownDeviceDetectorSharedViewModel.handle(
|
||||||
UnknownDeviceDetectorSharedViewModel.Action.IgnoreDevice(newest.deviceId?.let { listOf(it) }.orEmpty())
|
UnknownDeviceDetectorSharedViewModel.Action.IgnoreNewLogin(newest.deviceId?.let { listOf(it) }.orEmpty())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* 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.home
|
||||||
|
|
||||||
|
import im.vector.app.features.settings.VectorPreferences
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class SetNewLoginAlertShownUseCase @Inject constructor(
|
||||||
|
private val vectorPreferences: VectorPreferences,
|
||||||
|
) {
|
||||||
|
|
||||||
|
fun execute(deviceIds: List<String>) {
|
||||||
|
deviceIds.forEach {
|
||||||
|
vectorPreferences.setNewLoginAlertShownForDevice(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* 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.home
|
||||||
|
|
||||||
|
import im.vector.app.core.time.Clock
|
||||||
|
import im.vector.app.features.settings.VectorPreferences
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class SetUnverifiedSessionsAlertShownUseCase @Inject constructor(
|
||||||
|
private val vectorPreferences: VectorPreferences,
|
||||||
|
private val clock: Clock,
|
||||||
|
) {
|
||||||
|
|
||||||
|
fun execute(deviceIds: List<String>) {
|
||||||
|
val epochMillis = clock.epochMillis()
|
||||||
|
deviceIds.forEach {
|
||||||
|
vectorPreferences.setUnverifiedSessionsAlertLastShownMillis(it, epochMillis)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -28,9 +28,11 @@ class ShouldShowUnverifiedSessionsAlertUseCase @Inject constructor(
|
|||||||
private val clock: Clock,
|
private val clock: Clock,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun execute(): Boolean {
|
fun execute(deviceId: String?): Boolean {
|
||||||
|
deviceId ?: return false
|
||||||
|
|
||||||
val isUnverifiedSessionsAlertEnabled = vectorFeatures.isUnverifiedSessionsAlertEnabled()
|
val isUnverifiedSessionsAlertEnabled = vectorFeatures.isUnverifiedSessionsAlertEnabled()
|
||||||
val unverifiedSessionsAlertLastShownMillis = vectorPreferences.getUnverifiedSessionsAlertLastShownMillis()
|
val unverifiedSessionsAlertLastShownMillis = vectorPreferences.getUnverifiedSessionsAlertLastShownMillis(deviceId)
|
||||||
return isUnverifiedSessionsAlertEnabled &&
|
return isUnverifiedSessionsAlertEnabled &&
|
||||||
clock.epochMillis() - unverifiedSessionsAlertLastShownMillis >= Config.SHOW_UNVERIFIED_SESSIONS_ALERT_AFTER_MILLIS
|
clock.epochMillis() - unverifiedSessionsAlertLastShownMillis >= Config.SHOW_UNVERIFIED_SESSIONS_ALERT_AFTER_MILLIS
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,6 @@ package im.vector.app.features.home
|
|||||||
import com.airbnb.mvrx.Async
|
import com.airbnb.mvrx.Async
|
||||||
import com.airbnb.mvrx.MavericksState
|
import com.airbnb.mvrx.MavericksState
|
||||||
import com.airbnb.mvrx.MavericksViewModelFactory
|
import com.airbnb.mvrx.MavericksViewModelFactory
|
||||||
import com.airbnb.mvrx.Success
|
|
||||||
import com.airbnb.mvrx.Uninitialized
|
import com.airbnb.mvrx.Uninitialized
|
||||||
import com.airbnb.mvrx.ViewModelContext
|
import com.airbnb.mvrx.ViewModelContext
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
@ -33,7 +32,6 @@ import im.vector.app.core.platform.EmptyViewEvents
|
|||||||
import im.vector.app.core.platform.VectorViewModel
|
import im.vector.app.core.platform.VectorViewModel
|
||||||
import im.vector.app.core.platform.VectorViewModelAction
|
import im.vector.app.core.platform.VectorViewModelAction
|
||||||
import im.vector.app.core.time.Clock
|
import im.vector.app.core.time.Clock
|
||||||
import im.vector.app.features.settings.VectorPreferences
|
|
||||||
import kotlinx.coroutines.flow.combine
|
import kotlinx.coroutines.flow.combine
|
||||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
@ -63,12 +61,16 @@ data class DeviceDetectionInfo(
|
|||||||
class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor(
|
class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor(
|
||||||
@Assisted initialState: UnknownDevicesState,
|
@Assisted initialState: UnknownDevicesState,
|
||||||
session: Session,
|
session: Session,
|
||||||
private val vectorPreferences: VectorPreferences,
|
|
||||||
clock: Clock,
|
clock: Clock,
|
||||||
|
private val shouldShowUnverifiedSessionsAlertUseCase: ShouldShowUnverifiedSessionsAlertUseCase,
|
||||||
|
private val setUnverifiedSessionsAlertShownUseCase: SetUnverifiedSessionsAlertShownUseCase,
|
||||||
|
private val isNewLoginAlertShownUseCase: IsNewLoginAlertShownUseCase,
|
||||||
|
private val setNewLoginAlertShownUseCase: SetNewLoginAlertShownUseCase,
|
||||||
) : VectorViewModel<UnknownDevicesState, UnknownDeviceDetectorSharedViewModel.Action, EmptyViewEvents>(initialState) {
|
) : VectorViewModel<UnknownDevicesState, UnknownDeviceDetectorSharedViewModel.Action, EmptyViewEvents>(initialState) {
|
||||||
|
|
||||||
sealed class Action : VectorViewModelAction {
|
sealed class Action : VectorViewModelAction {
|
||||||
data class IgnoreDevice(val deviceIds: List<String>) : Action()
|
data class IgnoreDevice(val deviceIds: List<String>) : Action()
|
||||||
|
data class IgnoreNewLogin(val deviceIds: List<String>) : Action()
|
||||||
}
|
}
|
||||||
|
|
||||||
@AssistedFactory
|
@AssistedFactory
|
||||||
@ -86,8 +88,6 @@ class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val ignoredDeviceList = ArrayList<String>()
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
val currentSessionTs = session.cryptoService().getCryptoDeviceInfo(session.myUserId)
|
val currentSessionTs = session.cryptoService().getCryptoDeviceInfo(session.myUserId)
|
||||||
.firstOrNull { it.deviceId == session.sessionParams.deviceId }
|
.firstOrNull { it.deviceId == session.sessionParams.deviceId }
|
||||||
@ -95,12 +95,6 @@ class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor(
|
|||||||
?: clock.epochMillis()
|
?: clock.epochMillis()
|
||||||
Timber.v("## Detector - Current Session first time seen $currentSessionTs")
|
Timber.v("## Detector - Current Session first time seen $currentSessionTs")
|
||||||
|
|
||||||
ignoredDeviceList.addAll(
|
|
||||||
vectorPreferences.getUnknownDeviceDismissedList().also {
|
|
||||||
Timber.v("## Detector - Remembered ignored list $it")
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
combine(
|
combine(
|
||||||
session.flow().liveUserCryptoDevices(session.myUserId),
|
session.flow().liveUserCryptoDevices(session.myUserId),
|
||||||
session.flow().liveMyDevicesInfo(),
|
session.flow().liveMyDevicesInfo(),
|
||||||
@ -114,13 +108,15 @@ class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor(
|
|||||||
cryptoList.firstOrNull { info.deviceId == it.deviceId }?.isVerified?.not().orFalse()
|
cryptoList.firstOrNull { info.deviceId == it.deviceId }?.isVerified?.not().orFalse()
|
||||||
}
|
}
|
||||||
// filter out ignored devices
|
// filter out ignored devices
|
||||||
.filter { !ignoredDeviceList.contains(it.deviceId) }
|
.filter { shouldShowUnverifiedSessionsAlertUseCase.execute(it.deviceId) }
|
||||||
.sortedByDescending { it.lastSeenTs }
|
.sortedByDescending { it.lastSeenTs }
|
||||||
.map { deviceInfo ->
|
.map { deviceInfo ->
|
||||||
val deviceKnownSince = cryptoList.firstOrNull { it.deviceId == deviceInfo.deviceId }?.firstTimeSeenLocalTs ?: 0
|
val deviceKnownSince = cryptoList.firstOrNull { it.deviceId == deviceInfo.deviceId }?.firstTimeSeenLocalTs ?: 0
|
||||||
|
val isNew = isNewLoginAlertShownUseCase.execute(deviceInfo.deviceId).not() && deviceKnownSince > currentSessionTs
|
||||||
|
|
||||||
DeviceDetectionInfo(
|
DeviceDetectionInfo(
|
||||||
deviceInfo,
|
deviceInfo,
|
||||||
deviceKnownSince > currentSessionTs + 60_000, // short window to avoid false positive,
|
isNew,
|
||||||
pInfo.getOrNull()?.selfSigned != null // adding this to pass distinct when cross sign change
|
pInfo.getOrNull()?.selfSigned != null // adding this to pass distinct when cross sign change
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -150,22 +146,11 @@ class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor(
|
|||||||
override fun handle(action: Action) {
|
override fun handle(action: Action) {
|
||||||
when (action) {
|
when (action) {
|
||||||
is Action.IgnoreDevice -> {
|
is Action.IgnoreDevice -> {
|
||||||
ignoredDeviceList.addAll(action.deviceIds)
|
setUnverifiedSessionsAlertShownUseCase.execute(action.deviceIds)
|
||||||
// local echo
|
}
|
||||||
withState { state ->
|
is Action.IgnoreNewLogin -> {
|
||||||
state.unknownSessions.invoke()?.let { detectedSessions ->
|
setNewLoginAlertShownUseCase.execute(action.deviceIds)
|
||||||
val updated = detectedSessions.filter { !action.deviceIds.contains(it.deviceInfo.deviceId) }
|
|
||||||
setState {
|
|
||||||
copy(unknownSessions = Success(updated))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCleared() {
|
|
||||||
vectorPreferences.storeUnknownDeviceDismissedList(ignoredDeviceList)
|
|
||||||
super.onCleared()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -227,8 +227,6 @@ class VectorPreferences @Inject constructor(
|
|||||||
private const val MEDIA_SAVING_1_MONTH = 2
|
private const val MEDIA_SAVING_1_MONTH = 2
|
||||||
private const val MEDIA_SAVING_FOREVER = 3
|
private const val MEDIA_SAVING_FOREVER = 3
|
||||||
|
|
||||||
private const val SETTINGS_UNKNOWN_DEVICE_DISMISSED_LIST = "SETTINGS_UNKNWON_DEVICE_DISMISSED_LIST"
|
|
||||||
|
|
||||||
private const val TAKE_PHOTO_VIDEO_MODE = "TAKE_PHOTO_VIDEO_MODE"
|
private const val TAKE_PHOTO_VIDEO_MODE = "TAKE_PHOTO_VIDEO_MODE"
|
||||||
|
|
||||||
private const val SETTINGS_LABS_ENABLE_LIVE_LOCATION = "SETTINGS_LABS_ENABLE_LIVE_LOCATION"
|
private const val SETTINGS_LABS_ENABLE_LIVE_LOCATION = "SETTINGS_LABS_ENABLE_LIVE_LOCATION"
|
||||||
@ -245,7 +243,8 @@ class VectorPreferences @Inject constructor(
|
|||||||
// This key will be used to enable user for displaying live user info or not.
|
// This key will be used to enable user for displaying live user info or not.
|
||||||
const val SETTINGS_TIMELINE_SHOW_LIVE_SENDER_INFO = "SETTINGS_TIMELINE_SHOW_LIVE_SENDER_INFO"
|
const val SETTINGS_TIMELINE_SHOW_LIVE_SENDER_INFO = "SETTINGS_TIMELINE_SHOW_LIVE_SENDER_INFO"
|
||||||
|
|
||||||
const val SETTINGS_UNVERIFIED_SESSIONS_ALERT_LAST_SHOWN_MILLIS = "SETTINGS_UNVERIFIED_SESSIONS_ALERT_LAST_SHOWN_MILLIS"
|
const val SETTINGS_UNVERIFIED_SESSIONS_ALERT_LAST_SHOWN_MILLIS = "SETTINGS_UNVERIFIED_SESSIONS_ALERT_LAST_SHOWN_MILLIS_"
|
||||||
|
const val SETTINGS_NEW_LOGIN_ALERT_SHOWN_FOR_DEVICE = "SETTINGS_NEW_LOGIN_ALERT_SHOWN_FOR_DEVICE_"
|
||||||
|
|
||||||
// Possible values for TAKE_PHOTO_VIDEO_MODE
|
// Possible values for TAKE_PHOTO_VIDEO_MODE
|
||||||
const val TAKE_PHOTO_VIDEO_MODE_ALWAYS_ASK = 0
|
const val TAKE_PHOTO_VIDEO_MODE_ALWAYS_ASK = 0
|
||||||
@ -522,18 +521,6 @@ class VectorPreferences @Inject constructor(
|
|||||||
return defaultPrefs.getBoolean(SETTINGS_PLAY_SHUTTER_SOUND_KEY, true)
|
return defaultPrefs.getBoolean(SETTINGS_PLAY_SHUTTER_SOUND_KEY, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun storeUnknownDeviceDismissedList(deviceIds: List<String>) {
|
|
||||||
defaultPrefs.edit(true) {
|
|
||||||
putStringSet(SETTINGS_UNKNOWN_DEVICE_DISMISSED_LIST, deviceIds.toSet())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getUnknownDeviceDismissedList(): List<String> {
|
|
||||||
return tryOrNull {
|
|
||||||
defaultPrefs.getStringSet(SETTINGS_UNKNOWN_DEVICE_DISMISSED_LIST, null)?.toList()
|
|
||||||
}.orEmpty()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the notification ringtone.
|
* Update the notification ringtone.
|
||||||
*
|
*
|
||||||
@ -1244,13 +1231,23 @@ class VectorPreferences @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getUnverifiedSessionsAlertLastShownMillis(): Long {
|
fun getUnverifiedSessionsAlertLastShownMillis(deviceId: String): Long {
|
||||||
return defaultPrefs.getLong(SETTINGS_UNVERIFIED_SESSIONS_ALERT_LAST_SHOWN_MILLIS, 0)
|
return defaultPrefs.getLong(SETTINGS_UNVERIFIED_SESSIONS_ALERT_LAST_SHOWN_MILLIS + deviceId, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setUnverifiedSessionsAlertLastShownMillis(lastShownMillis: Long) {
|
fun setUnverifiedSessionsAlertLastShownMillis(deviceId: String, lastShownMillis: Long) {
|
||||||
defaultPrefs.edit {
|
defaultPrefs.edit {
|
||||||
putLong(SETTINGS_UNVERIFIED_SESSIONS_ALERT_LAST_SHOWN_MILLIS, lastShownMillis)
|
putLong(SETTINGS_UNVERIFIED_SESSIONS_ALERT_LAST_SHOWN_MILLIS + deviceId, lastShownMillis)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun isNewLoginAlertShownForDevice(deviceId: String): Boolean {
|
||||||
|
return defaultPrefs.getBoolean(SETTINGS_NEW_LOGIN_ALERT_SHOWN_FOR_DEVICE + deviceId, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setNewLoginAlertShownForDevice(deviceId: String) {
|
||||||
|
defaultPrefs.edit {
|
||||||
|
putBoolean(SETTINGS_NEW_LOGIN_ALERT_SHOWN_FOR_DEVICE + deviceId, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,8 @@ import im.vector.app.test.fakes.FakeVectorPreferences
|
|||||||
import org.amshove.kluent.shouldBe
|
import org.amshove.kluent.shouldBe
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
private val AN_EPOCH = Config.SHOW_UNVERIFIED_SESSIONS_ALERT_AFTER_MILLIS
|
private val AN_EPOCH = Config.SHOW_UNVERIFIED_SESSIONS_ALERT_AFTER_MILLIS.toLong()
|
||||||
|
private const val A_DEVICE_ID = "A_DEVICE_ID"
|
||||||
|
|
||||||
class ShouldShowUnverifiedSessionsAlertUseCaseTest {
|
class ShouldShowUnverifiedSessionsAlertUseCaseTest {
|
||||||
|
|
||||||
@ -42,7 +43,7 @@ class ShouldShowUnverifiedSessionsAlertUseCaseTest {
|
|||||||
fakeVectorFeatures.givenUnverifiedSessionsAlertEnabled(false)
|
fakeVectorFeatures.givenUnverifiedSessionsAlertEnabled(false)
|
||||||
fakeVectorPreferences.givenUnverifiedSessionsAlertLastShownMillis(0L)
|
fakeVectorPreferences.givenUnverifiedSessionsAlertLastShownMillis(0L)
|
||||||
|
|
||||||
shouldShowUnverifiedSessionsAlertUseCase.execute() shouldBe false
|
shouldShowUnverifiedSessionsAlertUseCase.execute(A_DEVICE_ID) shouldBe false
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -51,7 +52,7 @@ class ShouldShowUnverifiedSessionsAlertUseCaseTest {
|
|||||||
fakeVectorPreferences.givenUnverifiedSessionsAlertLastShownMillis(0L)
|
fakeVectorPreferences.givenUnverifiedSessionsAlertLastShownMillis(0L)
|
||||||
fakeClock.givenEpoch(AN_EPOCH + 1)
|
fakeClock.givenEpoch(AN_EPOCH + 1)
|
||||||
|
|
||||||
shouldShowUnverifiedSessionsAlertUseCase.execute() shouldBe true
|
shouldShowUnverifiedSessionsAlertUseCase.execute(A_DEVICE_ID) shouldBe true
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -60,7 +61,7 @@ class ShouldShowUnverifiedSessionsAlertUseCaseTest {
|
|||||||
fakeVectorPreferences.givenUnverifiedSessionsAlertLastShownMillis(AN_EPOCH)
|
fakeVectorPreferences.givenUnverifiedSessionsAlertLastShownMillis(AN_EPOCH)
|
||||||
fakeClock.givenEpoch(AN_EPOCH * 2 + 1)
|
fakeClock.givenEpoch(AN_EPOCH * 2 + 1)
|
||||||
|
|
||||||
shouldShowUnverifiedSessionsAlertUseCase.execute() shouldBe true
|
shouldShowUnverifiedSessionsAlertUseCase.execute(A_DEVICE_ID) shouldBe true
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -69,6 +70,6 @@ class ShouldShowUnverifiedSessionsAlertUseCaseTest {
|
|||||||
fakeVectorPreferences.givenUnverifiedSessionsAlertLastShownMillis(AN_EPOCH)
|
fakeVectorPreferences.givenUnverifiedSessionsAlertLastShownMillis(AN_EPOCH)
|
||||||
fakeClock.givenEpoch(AN_EPOCH + 1)
|
fakeClock.givenEpoch(AN_EPOCH + 1)
|
||||||
|
|
||||||
shouldShowUnverifiedSessionsAlertUseCase.execute() shouldBe false
|
shouldShowUnverifiedSessionsAlertUseCase.execute(A_DEVICE_ID) shouldBe false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,6 +58,6 @@ class FakeVectorPreferences {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun givenUnverifiedSessionsAlertLastShownMillis(lastShownMillis: Long) {
|
fun givenUnverifiedSessionsAlertLastShownMillis(lastShownMillis: Long) {
|
||||||
every { instance.getUnverifiedSessionsAlertLastShownMillis() } returns lastShownMillis
|
every { instance.getUnverifiedSessionsAlertLastShownMillis(any()) } returns lastShownMillis
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user