Skip to content

Commit c580090

Browse files
authored
Merge pull request #7707 from vector-im/feature/mna/rename-and-signout-action-current-session
[Session manager] Add actions to rename and signout current session (PSG-885)
2 parents 01533db + a44c8df commit c580090

File tree

8 files changed

+115
-40
lines changed

8 files changed

+115
-40
lines changed

changelog.d/7697.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[Session manager] Add actions to rename and signout current session

vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import im.vector.app.features.settings.devices.v2.list.SecurityRecommendationVie
5252
import im.vector.app.features.settings.devices.v2.list.SecurityRecommendationViewState
5353
import im.vector.app.features.settings.devices.v2.list.SessionInfoViewState
5454
import im.vector.app.features.settings.devices.v2.signout.BuildConfirmSignoutDialogUseCase
55+
import im.vector.app.features.workers.signout.SignOutUiWorker
5556
import org.matrix.android.sdk.api.auth.data.LoginFlowTypes
5657
import org.matrix.android.sdk.api.extensions.orFalse
5758
import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel
@@ -101,6 +102,7 @@ class VectorSettingsDevicesFragment :
101102

102103
initWaitingView()
103104
initCurrentSessionHeaderView()
105+
initCurrentSessionView()
104106
initOtherSessionsHeaderView()
105107
initOtherSessionsView()
106108
initSecurityRecommendationsView()
@@ -144,6 +146,14 @@ class VectorSettingsDevicesFragment :
144146
private fun initCurrentSessionHeaderView() {
145147
views.deviceListHeaderCurrentSession.setOnMenuItemClickListener { menuItem ->
146148
when (menuItem.itemId) {
149+
R.id.currentSessionHeaderRename -> {
150+
navigateToRenameCurrentSession()
151+
true
152+
}
153+
R.id.currentSessionHeaderSignout -> {
154+
confirmSignoutCurrentSession()
155+
true
156+
}
147157
R.id.currentSessionHeaderSignoutOtherSessions -> {
148158
confirmMultiSignoutOtherSessions()
149159
true
@@ -153,6 +163,26 @@ class VectorSettingsDevicesFragment :
153163
}
154164
}
155165

166+
private fun navigateToRenameCurrentSession() = withState(viewModel) { state ->
167+
val currentDeviceId = state.currentSessionCrossSigningInfo.deviceId
168+
if (currentDeviceId.isNotEmpty()) {
169+
viewNavigator.navigateToRenameSession(
170+
context = requireActivity(),
171+
deviceId = currentDeviceId,
172+
)
173+
}
174+
}
175+
176+
private fun confirmSignoutCurrentSession() {
177+
activity?.let { SignOutUiWorker(it).perform() }
178+
}
179+
180+
private fun initCurrentSessionView() {
181+
views.deviceListCurrentSession.viewVerifyButton.debouncedClicks {
182+
viewModel.handle(DevicesAction.VerifyCurrentSession)
183+
}
184+
}
185+
156186
private fun initOtherSessionsHeaderView() {
157187
views.deviceListHeaderOtherSessions.setOnMenuItemClickListener { menuItem ->
158188
when (menuItem.itemId) {
@@ -351,31 +381,38 @@ class VectorSettingsDevicesFragment :
351381

352382
private fun renderCurrentSessionView(currentDeviceInfo: DeviceFullInfo?, hasOtherDevices: Boolean) {
353383
currentDeviceInfo?.let {
354-
views.deviceListHeaderCurrentSession.isVisible = true
355-
val colorDestructive = colorProvider.getColorFromAttribute(R.attr.colorError)
356-
val signoutOtherSessionsItem = views.deviceListHeaderCurrentSession.menu.findItem(R.id.currentSessionHeaderSignoutOtherSessions)
357-
signoutOtherSessionsItem.setTextColor(colorDestructive)
358-
signoutOtherSessionsItem.isVisible = hasOtherDevices
359-
views.deviceListCurrentSession.isVisible = true
360-
val viewState = SessionInfoViewState(
361-
isCurrentSession = true,
362-
deviceFullInfo = it
363-
)
364-
views.deviceListCurrentSession.render(viewState, dateFormatter, drawableProvider, colorProvider, stringProvider)
365-
views.deviceListCurrentSession.debouncedClicks {
366-
currentDeviceInfo.deviceInfo.deviceId?.let { deviceId -> navigateToSessionOverview(deviceId) }
367-
}
368-
views.deviceListCurrentSession.viewDetailsButton.debouncedClicks {
369-
currentDeviceInfo.deviceInfo.deviceId?.let { deviceId -> navigateToSessionOverview(deviceId) }
370-
}
371-
views.deviceListCurrentSession.viewVerifyButton.debouncedClicks {
372-
viewModel.handle(DevicesAction.VerifyCurrentSession)
373-
}
384+
renderCurrentSessionHeaderView(hasOtherDevices)
385+
renderCurrentSessionListView(it)
374386
} ?: run {
375387
hideCurrentSessionView()
376388
}
377389
}
378390

391+
private fun renderCurrentSessionHeaderView(hasOtherDevices: Boolean) {
392+
views.deviceListHeaderCurrentSession.isVisible = true
393+
val colorDestructive = colorProvider.getColorFromAttribute(R.attr.colorError)
394+
val signoutSessionItem = views.deviceListHeaderCurrentSession.menu.findItem(R.id.currentSessionHeaderSignout)
395+
signoutSessionItem.setTextColor(colorDestructive)
396+
val signoutOtherSessionsItem = views.deviceListHeaderCurrentSession.menu.findItem(R.id.currentSessionHeaderSignoutOtherSessions)
397+
signoutOtherSessionsItem.setTextColor(colorDestructive)
398+
signoutOtherSessionsItem.isVisible = hasOtherDevices
399+
}
400+
401+
private fun renderCurrentSessionListView(currentDeviceInfo: DeviceFullInfo) {
402+
views.deviceListCurrentSession.isVisible = true
403+
val viewState = SessionInfoViewState(
404+
isCurrentSession = true,
405+
deviceFullInfo = currentDeviceInfo
406+
)
407+
views.deviceListCurrentSession.render(viewState, dateFormatter, drawableProvider, colorProvider, stringProvider)
408+
views.deviceListCurrentSession.debouncedClicks {
409+
currentDeviceInfo.deviceInfo.deviceId?.let { deviceId -> navigateToSessionOverview(deviceId) }
410+
}
411+
views.deviceListCurrentSession.viewDetailsButton.debouncedClicks {
412+
currentDeviceInfo.deviceInfo.deviceId?.let { deviceId -> navigateToSessionOverview(deviceId) }
413+
}
414+
}
415+
379416
private fun navigateToSessionOverview(deviceId: String) {
380417
viewNavigator.navigateToSessionOverview(
381418
context = requireActivity(),

vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesViewNavigator.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import android.content.Context
2020
import im.vector.app.features.settings.devices.v2.filter.DeviceManagerFilterType
2121
import im.vector.app.features.settings.devices.v2.othersessions.OtherSessionsActivity
2222
import im.vector.app.features.settings.devices.v2.overview.SessionOverviewActivity
23+
import im.vector.app.features.settings.devices.v2.rename.RenameSessionActivity
2324
import javax.inject.Inject
2425

2526
class VectorSettingsDevicesViewNavigator @Inject constructor() {
@@ -38,4 +39,8 @@ class VectorSettingsDevicesViewNavigator @Inject constructor() {
3839
OtherSessionsActivity.newIntent(context, titleResourceId, defaultFilter, excludeCurrentDevice)
3940
)
4041
}
42+
43+
fun navigateToRenameSession(context: Context, deviceId: String) {
44+
context.startActivity(RenameSessionActivity.newIntent(context, deviceId))
45+
}
4146
}

vector/src/main/res/menu/menu_current_session_header.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,16 @@
44
xmlns:tools="http://schemas.android.com/tools"
55
tools:ignore="AlwaysShowAction">
66

7+
<item
8+
android:id="@+id/currentSessionHeaderRename"
9+
android:title="@string/device_manager_session_rename"
10+
app:showAsAction="withText|never" />
11+
12+
<item
13+
android:id="@+id/currentSessionHeaderSignout"
14+
android:title="@string/logout"
15+
app:showAsAction="withText|never" />
16+
717
<item
818
android:id="@+id/currentSessionHeaderSignoutOtherSessions"
919
android:title="@string/device_manager_signout_all_other_sessions"

vector/src/test/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesViewNavigatorTest.kt

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ import android.content.Intent
2020
import im.vector.app.features.settings.devices.v2.filter.DeviceManagerFilterType
2121
import im.vector.app.features.settings.devices.v2.othersessions.OtherSessionsActivity
2222
import im.vector.app.features.settings.devices.v2.overview.SessionOverviewActivity
23+
import im.vector.app.features.settings.devices.v2.rename.RenameSessionActivity
2324
import im.vector.app.test.fakes.FakeContext
2425
import io.mockk.every
2526
import io.mockk.mockk
2627
import io.mockk.mockkObject
2728
import io.mockk.unmockkAll
28-
import io.mockk.verify
2929
import org.junit.After
3030
import org.junit.Before
3131
import org.junit.Test
@@ -43,6 +43,7 @@ class VectorSettingsDevicesViewNavigatorTest {
4343
fun setUp() {
4444
mockkObject(SessionOverviewActivity.Companion)
4545
mockkObject(OtherSessionsActivity.Companion)
46+
mockkObject(RenameSessionActivity.Companion)
4647
}
4748

4849
@After
@@ -52,26 +53,41 @@ class VectorSettingsDevicesViewNavigatorTest {
5253

5354
@Test
5455
fun `given a session id when navigating to overview then it starts the correct activity`() {
56+
// Given
5557
val intent = givenIntentForSessionOverview(A_SESSION_ID)
5658
context.givenStartActivity(intent)
5759

60+
// When
5861
vectorSettingsDevicesViewNavigator.navigateToSessionOverview(context.instance, A_SESSION_ID)
5962

60-
verify {
61-
context.instance.startActivity(intent)
62-
}
63+
// Then
64+
context.verifyStartActivity(intent)
6365
}
6466

6567
@Test
6668
fun `given an intent when navigating to other sessions list then it starts the correct activity`() {
69+
// Given
6770
val intent = givenIntentForOtherSessions(A_TITLE_RESOURCE_ID, A_DEFAULT_FILTER, true)
6871
context.givenStartActivity(intent)
6972

73+
// When
7074
vectorSettingsDevicesViewNavigator.navigateToOtherSessions(context.instance, A_TITLE_RESOURCE_ID, A_DEFAULT_FILTER, true)
7175

72-
verify {
73-
context.instance.startActivity(intent)
74-
}
76+
// Then
77+
context.verifyStartActivity(intent)
78+
}
79+
80+
@Test
81+
fun `given an intent when navigating to rename session screen then it starts the correct activity`() {
82+
// Given
83+
val intent = givenIntentForRenameSession(A_SESSION_ID)
84+
context.givenStartActivity(intent)
85+
86+
// When
87+
vectorSettingsDevicesViewNavigator.navigateToRenameSession(context.instance, A_SESSION_ID)
88+
89+
// Then
90+
context.verifyStartActivity(intent)
7591
}
7692

7793
private fun givenIntentForSessionOverview(sessionId: String): Intent {
@@ -85,4 +101,10 @@ class VectorSettingsDevicesViewNavigatorTest {
85101
every { OtherSessionsActivity.newIntent(context.instance, titleResourceId, defaultFilter, excludeCurrentDevice) } returns intent
86102
return intent
87103
}
104+
105+
private fun givenIntentForRenameSession(sessionId: String): Intent {
106+
val intent = mockk<Intent>()
107+
every { RenameSessionActivity.newIntent(context.instance, sessionId) } returns intent
108+
return intent
109+
}
88110
}

vector/src/test/java/im/vector/app/features/settings/devices/v2/othersessions/OtherSessionsViewNavigatorTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import io.mockk.every
2323
import io.mockk.mockk
2424
import io.mockk.mockkObject
2525
import io.mockk.unmockkAll
26-
import io.mockk.verify
2726
import org.junit.After
2827
import org.junit.Before
2928
import org.junit.Test
@@ -47,14 +46,15 @@ class OtherSessionsViewNavigatorTest {
4746

4847
@Test
4948
fun `given a device id when navigating to overview then it starts the correct activity`() {
49+
// Given
5050
val intent = givenIntentForDeviceOverview(A_DEVICE_ID)
5151
context.givenStartActivity(intent)
5252

53+
// When
5354
otherSessionsViewNavigator.navigateToSessionOverview(context.instance, A_DEVICE_ID)
5455

55-
verify {
56-
context.instance.startActivity(intent)
57-
}
56+
// Then
57+
context.verifyStartActivity(intent)
5858
}
5959

6060
private fun givenIntentForDeviceOverview(deviceId: String): Intent {

vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewNavigatorTest.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,7 @@ class SessionOverviewViewNavigatorTest {
6060
sessionOverviewViewNavigator.goToSessionDetails(context.instance, A_SESSION_ID)
6161

6262
// Then
63-
verify {
64-
context.instance.startActivity(intent)
65-
}
63+
context.verifyStartActivity(intent)
6664
}
6765

6866
@Test
@@ -75,9 +73,7 @@ class SessionOverviewViewNavigatorTest {
7573
sessionOverviewViewNavigator.goToRenameSession(context.instance, A_SESSION_ID)
7674

7775
// Then
78-
verify {
79-
context.instance.startActivity(intent)
80-
}
76+
context.verifyStartActivity(intent)
8177
}
8278

8379
@Test

vector/src/test/java/im/vector/app/test/fakes/FakeContext.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ import android.net.ConnectivityManager
2424
import android.net.Uri
2525
import android.os.ParcelFileDescriptor
2626
import io.mockk.every
27-
import io.mockk.just
27+
import io.mockk.justRun
2828
import io.mockk.mockk
29-
import io.mockk.runs
29+
import io.mockk.verify
3030
import java.io.OutputStream
3131

3232
class FakeContext(
@@ -73,7 +73,11 @@ class FakeContext(
7373
}
7474

7575
fun givenStartActivity(intent: Intent) {
76-
every { instance.startActivity(intent) } just runs
76+
justRun { instance.startActivity(intent) }
77+
}
78+
79+
fun verifyStartActivity(intent: Intent) {
80+
verify { instance.startActivity(intent) }
7781
}
7882

7983
fun givenClipboardManager(): FakeClipboardManager {

0 commit comments

Comments
 (0)