Code review fixes.

This commit is contained in:
Onuray Sahin 2022-11-21 18:44:45 +03:00
parent c788deacf5
commit 6c45490dd1
11 changed files with 65 additions and 46 deletions

View File

@ -51,6 +51,7 @@
<bool name="settings_labs_rich_text_editor_default">false</bool>
<bool name="settings_labs_enable_voice_broadcast_visible">true</bool>
<bool name="settings_labs_enable_voice_broadcast_default">false</bool>
<bool name="settings_device_manager_show_ip_address">false</bool>
<!-- Level 1: Advanced settings -->
<!-- Level 1: Help and about -->

View File

@ -1231,4 +1231,14 @@ class VectorPreferences @Inject constructor(
return vectorFeatures.isVoiceBroadcastEnabled() &&
defaultPrefs.getBoolean(SETTINGS_LABS_VOICE_BROADCAST_KEY, getDefault(R.bool.settings_labs_enable_voice_broadcast_default))
}
fun showIpAddressInDeviceManagerScreens(): Boolean {
return defaultPrefs.getBoolean(SETTINGS_SESSION_MANAGER_SHOW_IP_ADDRESS, getDefault(R.bool.settings_device_manager_show_ip_address))
}
fun setIpAddressVisibilityInDeviceManagerScreens(isVisible: Boolean) {
defaultPrefs.edit {
putBoolean(VectorPreferences.SETTINGS_SESSION_MANAGER_SHOW_IP_ADDRESS, isVisible)
}
}
}

View File

@ -16,15 +16,12 @@
package im.vector.app.features.settings.devices.v2
import android.content.SharedPreferences
import androidx.core.content.edit
import com.airbnb.mvrx.MavericksViewModelFactory
import com.airbnb.mvrx.Success
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.di.DefaultPreferences
import im.vector.app.core.di.MavericksAssistedViewModelFactory
import im.vector.app.core.di.hiltMavericksViewModelFactory
import im.vector.app.features.auth.PendingAuthHandler
@ -53,8 +50,7 @@ class DevicesViewModel @AssistedInject constructor(
private val interceptSignoutFlowResponseUseCase: InterceptSignoutFlowResponseUseCase,
private val pendingAuthHandler: PendingAuthHandler,
refreshDevicesUseCase: RefreshDevicesUseCase,
@DefaultPreferences
private val sharedPreferences: SharedPreferences,
private val vectorPreferences: VectorPreferences,
) : VectorSessionsListViewModel<DevicesViewState, DevicesAction, DevicesViewEvent>(initialState, activeSessionHolder, refreshDevicesUseCase) {
@AssistedFactory
@ -73,7 +69,7 @@ class DevicesViewModel @AssistedInject constructor(
}
private fun refreshIpAddressVisibility() {
val shouldShowIpAddress = sharedPreferences.getBoolean(VectorPreferences.SETTINGS_SESSION_MANAGER_SHOW_IP_ADDRESS, false)
val shouldShowIpAddress = vectorPreferences.showIpAddressInDeviceManagerScreens()
setState {
copy(isShowingIpAddress = shouldShowIpAddress)
}
@ -135,9 +131,7 @@ class DevicesViewModel @AssistedInject constructor(
setState {
copy(isShowingIpAddress = !isShowingIpAddress)
}
sharedPreferences.edit {
putBoolean(VectorPreferences.SETTINGS_SESSION_MANAGER_SHOW_IP_ADDRESS, !isShowingIpAddress)
}
vectorPreferences.setIpAddressVisibilityInDeviceManagerScreens(!isShowingIpAddress)
}
private fun handleVerifyCurrentSessionAction() {

View File

@ -16,15 +16,12 @@
package im.vector.app.features.settings.devices.v2.othersessions
import android.content.SharedPreferences
import androidx.core.content.edit
import com.airbnb.mvrx.MavericksViewModelFactory
import com.airbnb.mvrx.Success
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.di.DefaultPreferences
import im.vector.app.core.di.MavericksAssistedViewModelFactory
import im.vector.app.core.di.hiltMavericksViewModelFactory
import im.vector.app.features.auth.PendingAuthHandler
@ -47,8 +44,7 @@ class OtherSessionsViewModel @AssistedInject constructor(
private val signoutSessionsUseCase: SignoutSessionsUseCase,
private val pendingAuthHandler: PendingAuthHandler,
refreshDevicesUseCase: RefreshDevicesUseCase,
@DefaultPreferences
private val sharedPreferences: SharedPreferences,
private val vectorPreferences: VectorPreferences,
) : VectorSessionsListViewModel<OtherSessionsViewState, OtherSessionsAction, OtherSessionsViewEvents>(
initialState, activeSessionHolder, refreshDevicesUseCase
) {
@ -68,7 +64,7 @@ class OtherSessionsViewModel @AssistedInject constructor(
}
private fun refreshIpAddressVisibility() {
val shouldShowIpAddress = sharedPreferences.getBoolean(VectorPreferences.SETTINGS_SESSION_MANAGER_SHOW_IP_ADDRESS, false)
val shouldShowIpAddress = vectorPreferences.showIpAddressInDeviceManagerScreens()
setState {
copy(isShowingIpAddress = shouldShowIpAddress)
}
@ -108,9 +104,7 @@ class OtherSessionsViewModel @AssistedInject constructor(
setState {
copy(isShowingIpAddress = !isShowingIpAddress)
}
sharedPreferences.edit {
putBoolean(VectorPreferences.SETTINGS_SESSION_MANAGER_SHOW_IP_ADDRESS, !isShowingIpAddress)
}
vectorPreferences.setIpAddressVisibilityInDeviceManagerScreens(!isShowingIpAddress)
}
private fun handleFilterDevices(action: OtherSessionsAction.FilterDevices) {

View File

@ -16,15 +16,12 @@
package im.vector.app.features.settings.devices.v2.overview
import android.content.SharedPreferences
import androidx.core.content.edit
import com.airbnb.mvrx.MavericksViewModelFactory
import com.airbnb.mvrx.Success
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.di.DefaultPreferences
import im.vector.app.core.di.MavericksAssistedViewModelFactory
import im.vector.app.core.di.hiltMavericksViewModelFactory
import im.vector.app.features.auth.PendingAuthHandler
@ -58,8 +55,7 @@ class SessionOverviewViewModel @AssistedInject constructor(
private val togglePushNotificationUseCase: TogglePushNotificationUseCase,
private val getNotificationsStatusUseCase: GetNotificationsStatusUseCase,
refreshDevicesUseCase: RefreshDevicesUseCase,
@DefaultPreferences
private val sharedPreferences: SharedPreferences,
private val vectorPreferences: VectorPreferences,
) : VectorSessionsListViewModel<SessionOverviewViewState, SessionOverviewAction, SessionOverviewViewEvent>(
initialState, activeSessionHolder, refreshDevicesUseCase
) {
@ -80,7 +76,7 @@ class SessionOverviewViewModel @AssistedInject constructor(
}
private fun refreshIpAddressVisibility() {
val shouldShowIpAddress = sharedPreferences.getBoolean(VectorPreferences.SETTINGS_SESSION_MANAGER_SHOW_IP_ADDRESS, false)
val shouldShowIpAddress = vectorPreferences.showIpAddressInDeviceManagerScreens()
setState {
copy(isShowingIpAddress = shouldShowIpAddress)
}
@ -134,9 +130,7 @@ class SessionOverviewViewModel @AssistedInject constructor(
setState {
copy(isShowingIpAddress = !isShowingIpAddress)
}
sharedPreferences.edit {
putBoolean(VectorPreferences.SETTINGS_SESSION_MANAGER_SHOW_IP_ADDRESS, !isShowingIpAddress)
}
vectorPreferences.setIpAddressVisibilityInDeviceManagerScreens(!isShowingIpAddress)
}
private fun handleVerifySessionAction() = withState { viewState ->

View File

@ -13,7 +13,7 @@
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@drawable/bg_other_session"
app:layout_constraintBottom_toBottomOf="@id/otherSessionVerificationStatusImageView"
app:layout_constraintBottom_toBottomOf="@id/otherSessionSeparator"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@ -53,11 +53,12 @@
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp"
android:ellipsize="end"
android:lines="1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/otherSessionDeviceTypeImageView"
app:layout_constraintTop_toTopOf="@id/otherSessionDeviceTypeImageView"
app:layout_constraintTop_toTopOf="@id/otherSessionItemBackground"
tools:text="Element Mobile: Android" />
<TextView
@ -85,6 +86,7 @@
tools:text="0.0.0.0" />
<View
android:id="@+id/otherSessionSeparator"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="8dp"

View File

@ -28,17 +28,19 @@ import im.vector.app.features.settings.devices.v2.verification.CurrentSessionCro
import im.vector.app.features.settings.devices.v2.verification.GetCurrentSessionCrossSigningInfoUseCase
import im.vector.app.test.fakes.FakeActiveSessionHolder
import im.vector.app.test.fakes.FakePendingAuthHandler
import im.vector.app.test.fakes.FakeSharedPreferences
import im.vector.app.test.fakes.FakeSignoutSessionsUseCase
import im.vector.app.test.fakes.FakeVectorPreferences
import im.vector.app.test.fakes.FakeVerificationService
import im.vector.app.test.test
import im.vector.app.test.testDispatcher
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
import io.mockk.just
import io.mockk.justRun
import io.mockk.mockk
import io.mockk.mockkStatic
import io.mockk.runs
import io.mockk.unmockkAll
import io.mockk.verify
import io.mockk.verifyAll
@ -73,7 +75,7 @@ class DevicesViewModelTest {
private val fakeInterceptSignoutFlowResponseUseCase = mockk<InterceptSignoutFlowResponseUseCase>()
private val fakePendingAuthHandler = FakePendingAuthHandler()
private val fakeRefreshDevicesUseCase = mockk<RefreshDevicesUseCase>(relaxUnitFun = true)
private val fakeSharedPreferences = FakeSharedPreferences()
private val fakeVectorPreferences = FakeVectorPreferences()
private fun createViewModel(): DevicesViewModel {
return DevicesViewModel(
@ -87,7 +89,7 @@ class DevicesViewModelTest {
interceptSignoutFlowResponseUseCase = fakeInterceptSignoutFlowResponseUseCase,
pendingAuthHandler = fakePendingAuthHandler.instance,
refreshDevicesUseCase = fakeRefreshDevicesUseCase,
sharedPreferences = fakeSharedPreferences,
vectorPreferences = fakeVectorPreferences.instance,
)
}
@ -100,7 +102,7 @@ class DevicesViewModelTest {
givenVerificationService()
givenCurrentSessionCrossSigningInfo()
givenDeviceFullInfoList(deviceId1 = A_DEVICE_ID_1, deviceId2 = A_DEVICE_ID_2)
fakeSharedPreferences.givenSessionManagerShowIpAddress(false)
fakeVectorPreferences.givenSessionManagerShowIpAddress(false)
}
private fun givenVerificationService(): FakeVerificationService {
@ -347,6 +349,29 @@ class DevicesViewModelTest {
}
}
@Test
fun `given the viewModel when initializing it then view state of ip address visibility is false`() {
// When
val viewModelTest = createViewModel().test()
// Then
viewModelTest.assertLatestState { it.isShowingIpAddress == false }
viewModelTest.finish()
}
@Test
fun `given the viewModel when toggleIpAddressVisibility action is triggered then view state and preference change accordingly`() {
// When
val viewModel = createViewModel()
val viewModelTest = viewModel.test()
viewModel.handle(DevicesAction.ToggleIpAddressVisibility)
// Then
viewModelTest.assertLatestState { it.isShowingIpAddress == true }
every { fakeVectorPreferences.instance.setIpAddressVisibilityInDeviceManagerScreens(true) } just runs
viewModelTest.finish()
}
private fun givenCurrentSessionCrossSigningInfo(): CurrentSessionCrossSigningInfo {
val currentSessionCrossSigningInfo = mockk<CurrentSessionCrossSigningInfo>()
every { currentSessionCrossSigningInfo.deviceId } returns A_CURRENT_DEVICE_ID

View File

@ -25,8 +25,8 @@ import im.vector.app.features.settings.devices.v2.RefreshDevicesUseCase
import im.vector.app.features.settings.devices.v2.filter.DeviceManagerFilterType
import im.vector.app.test.fakes.FakeActiveSessionHolder
import im.vector.app.test.fakes.FakePendingAuthHandler
import im.vector.app.test.fakes.FakeSharedPreferences
import im.vector.app.test.fakes.FakeSignoutSessionsUseCase
import im.vector.app.test.fakes.FakeVectorPreferences
import im.vector.app.test.fakes.FakeVerificationService
import im.vector.app.test.fixtures.aDeviceFullInfo
import im.vector.app.test.test
@ -67,7 +67,7 @@ class OtherSessionsViewModelTest {
private val fakeRefreshDevicesUseCase = mockk<RefreshDevicesUseCase>(relaxed = true)
private val fakeSignoutSessionsUseCase = FakeSignoutSessionsUseCase()
private val fakePendingAuthHandler = FakePendingAuthHandler()
private val fakeSharedPreferences = FakeSharedPreferences()
private val fakeVectorPreferences = FakeVectorPreferences()
private fun createViewModel(viewState: OtherSessionsViewState = OtherSessionsViewState(defaultArgs)) =
OtherSessionsViewModel(
@ -77,7 +77,7 @@ class OtherSessionsViewModelTest {
signoutSessionsUseCase = fakeSignoutSessionsUseCase.instance,
pendingAuthHandler = fakePendingAuthHandler.instance,
refreshDevicesUseCase = fakeRefreshDevicesUseCase,
sharedPreferences = fakeSharedPreferences,
vectorPreferences = fakeVectorPreferences.instance,
)
@Before
@ -87,7 +87,7 @@ class OtherSessionsViewModelTest {
every { SystemClock.elapsedRealtime() } returns 1234
givenVerificationService()
fakeSharedPreferences.givenSessionManagerShowIpAddress(false)
fakeVectorPreferences.givenSessionManagerShowIpAddress(false)
}
private fun givenVerificationService(): FakeVerificationService {

View File

@ -28,9 +28,9 @@ import im.vector.app.features.settings.devices.v2.verification.CheckIfCurrentSes
import im.vector.app.test.fakes.FakeActiveSessionHolder
import im.vector.app.test.fakes.FakeGetNotificationsStatusUseCase
import im.vector.app.test.fakes.FakePendingAuthHandler
import im.vector.app.test.fakes.FakeSharedPreferences
import im.vector.app.test.fakes.FakeSignoutSessionsUseCase
import im.vector.app.test.fakes.FakeTogglePushNotificationUseCase
import im.vector.app.test.fakes.FakeVectorPreferences
import im.vector.app.test.fakes.FakeVerificationService
import im.vector.app.test.test
import im.vector.app.test.testDispatcher
@ -78,7 +78,7 @@ class SessionOverviewViewModelTest {
private val togglePushNotificationUseCase = FakeTogglePushNotificationUseCase()
private val fakeGetNotificationsStatusUseCase = FakeGetNotificationsStatusUseCase()
private val notificationsStatus = NotificationsStatus.ENABLED
private val fakeSharedPreferences = FakeSharedPreferences()
private val fakeVectorPreferences = FakeVectorPreferences()
private fun createViewModel() = SessionOverviewViewModel(
initialState = SessionOverviewViewState(args),
@ -91,7 +91,7 @@ class SessionOverviewViewModelTest {
refreshDevicesUseCase = refreshDevicesUseCase,
togglePushNotificationUseCase = togglePushNotificationUseCase.instance,
getNotificationsStatusUseCase = fakeGetNotificationsStatusUseCase.instance,
sharedPreferences = fakeSharedPreferences,
vectorPreferences = fakeVectorPreferences.instance,
)
@Before
@ -106,7 +106,7 @@ class SessionOverviewViewModelTest {
A_SESSION_ID_1,
notificationsStatus
)
fakeSharedPreferences.givenSessionManagerShowIpAddress(false)
fakeVectorPreferences.givenSessionManagerShowIpAddress(false)
}
private fun givenVerificationService(): FakeVerificationService {

View File

@ -18,7 +18,6 @@ package im.vector.app.test.fakes
import android.content.SharedPreferences
import im.vector.app.features.settings.FontScaleValue
import im.vector.app.features.settings.VectorPreferences.Companion.SETTINGS_SESSION_MANAGER_SHOW_IP_ADDRESS
import io.mockk.every
import io.mockk.mockk
@ -33,8 +32,4 @@ class FakeSharedPreferences : SharedPreferences by mockk() {
every { contains("APPLICATION_USE_SYSTEM_FONT_SCALE_KEY") } returns true
every { getBoolean("APPLICATION_USE_SYSTEM_FONT_SCALE_KEY", any()) } returns useSystemScale
}
fun givenSessionManagerShowIpAddress(showIpAddress: Boolean) {
every { getBoolean(SETTINGS_SESSION_MANAGER_SHOW_IP_ADDRESS, any()) } returns showIpAddress
}
}

View File

@ -52,4 +52,8 @@ class FakeVectorPreferences {
fun verifySetNotificationEnabledForDevice(enabled: Boolean, inverse: Boolean = false) {
verify(inverse = inverse) { instance.setNotificationEnabledForDevice(enabled) }
}
fun givenSessionManagerShowIpAddress(showIpAddress: Boolean) {
every { instance.showIpAddressInDeviceManagerScreens() } returns showIpAddress
}
}