-
Notifications
You must be signed in to change notification settings - Fork 175
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feature : room settings - security and privacy #4212
Changes from 1 commit
002325c
d354144
a781cc0
b549400
c391b5b
129eb45
9faa305
f8cd8b3
b7831f4
65e5447
0e6c86f
392299d
7eda945
19d49a3
edee18a
75fef6b
88fce64
ba0a857
c07a7d9
fdc4f1b
c0c7d5b
876d06f
d992f38
58918b1
d586bdc
706b298
82f5926
8880eed
15f2d0b
c10da01
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,47 +8,129 @@ | |
package io.element.android.features.roomdetails.impl.securityandprivacy | ||
|
||
import androidx.compose.runtime.Composable | ||
import androidx.compose.runtime.collectAsState | ||
import androidx.compose.runtime.derivedStateOf | ||
import androidx.compose.runtime.getValue | ||
import androidx.compose.runtime.mutableStateOf | ||
import androidx.compose.runtime.remember | ||
import androidx.compose.runtime.setValue | ||
import io.element.android.libraries.architecture.AsyncData | ||
import io.element.android.libraries.architecture.Presenter | ||
import io.element.android.libraries.matrix.api.MatrixClient | ||
import io.element.android.libraries.matrix.api.room.MatrixRoom | ||
import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility | ||
import io.element.android.libraries.matrix.api.room.join.JoinRule | ||
import java.util.Optional | ||
import javax.inject.Inject | ||
|
||
class SecurityAndPrivacyPresenter @Inject constructor() : Presenter<SecurityAndPrivacyState> { | ||
private val matrixClient: MatrixClient, | ||
private val room: MatrixRoom, | ||
) : Presenter<SecurityAndPrivacyState> { | ||
|
||
@Composable | ||
override fun present(): SecurityAndPrivacyState { | ||
val homeserverName = remember { matrixClient.userIdServerName() } | ||
val roomInfo by room.roomInfoFlow.collectAsState(initial = null) | ||
|
||
val isVisibleInRoomDirectory = remember { | ||
mutableStateOf<AsyncData<Boolean>>(AsyncData.Uninitialized) | ||
} | ||
|
||
val savedSettings by remember { | ||
mutableStateOf( | ||
derivedStateOf { | ||
SecurityAndPrivacySettings( | ||
roomAccess = SecurityAndPrivacyRoomAccess.InviteOnly, | ||
isEncrypted = true, | ||
isVisibleInRoomDirectory = Optional.empty(), | ||
historyVisibility = Optional.empty(), | ||
formattedAddress = Optional.empty(), | ||
roomAccess = roomInfo?.joinRule.map(), | ||
isEncrypted = room.isEncrypted, | ||
isVisibleInRoomDirectory = Optional.ofNullable(isVisibleInRoomDirectory.value), | ||
historyVisibility = Optional.ofNullable(roomInfo?.historyVisibility?.map()), | ||
formattedAddress = Optional.ofNullable(roomInfo?.canonicalAlias?.value), | ||
) | ||
) | ||
} | ||
} | ||
|
||
var currentRoomAccess by remember(savedSettings.roomAccess) { | ||
mutableStateOf(savedSettings.roomAccess) | ||
} | ||
var currentHistoryVisibility by remember(savedSettings.historyVisibility) { | ||
mutableStateOf(savedSettings.historyVisibility) | ||
} | ||
var currentVisibleInRoomDirectory by remember(savedSettings.isVisibleInRoomDirectory) { | ||
mutableStateOf(savedSettings.isVisibleInRoomDirectory) | ||
} | ||
var currentIsEncrypted by remember(savedSettings.isEncrypted) { | ||
mutableStateOf(savedSettings.isEncrypted) | ||
} | ||
val currentSettings = SecurityAndPrivacySettings( | ||
roomAccess = currentRoomAccess, | ||
isEncrypted = currentIsEncrypted, | ||
isVisibleInRoomDirectory = currentVisibleInRoomDirectory, | ||
historyVisibility = currentHistoryVisibility, | ||
formattedAddress = savedSettings.formattedAddress, | ||
) | ||
|
||
fun handleEvents(event: SecurityAndPrivacyEvents) { | ||
when (event) { | ||
SecurityAndPrivacyEvents.Save -> {} | ||
is SecurityAndPrivacyEvents.ChangeRoomAccess -> {} | ||
is SecurityAndPrivacyEvents.EnableEncryption -> {} | ||
is SecurityAndPrivacyEvents.ChangeHistoryVisibility -> {} | ||
is SecurityAndPrivacyEvents.ChangeVisibleInRoomDirectory -> {} | ||
SecurityAndPrivacyEvents.Save -> { | ||
} | ||
is SecurityAndPrivacyEvents.ChangeRoomAccess -> { | ||
currentRoomAccess = event.roomAccess | ||
} | ||
is SecurityAndPrivacyEvents.EnableEncryption -> { | ||
currentIsEncrypted = true | ||
} | ||
is SecurityAndPrivacyEvents.ChangeHistoryVisibility -> { | ||
currentHistoryVisibility = Optional.of(event.historyVisibility) | ||
} | ||
is SecurityAndPrivacyEvents.ChangeRoomVisibility -> { | ||
currentVisibleInRoomDirectory = Optional.of(AsyncData.Success(event.isVisibleInRoomDirectory)) | ||
} | ||
} | ||
} | ||
|
||
return SecurityAndPrivacyState( | ||
savedSettings = savedSettings, | ||
currentSettings = savedSettings, | ||
homeserverName = "", | ||
canBeSaved = true, | ||
currentSettings = currentSettings, | ||
homeserverName = homeserverName, | ||
eventSink = ::handleEvents | ||
) | ||
} | ||
} | ||
|
||
private fun JoinRule?.map(): SecurityAndPrivacyRoomAccess { | ||
return when (this) { | ||
JoinRule.Public -> SecurityAndPrivacyRoomAccess.Anyone | ||
JoinRule.Knock, is JoinRule.KnockRestricted -> SecurityAndPrivacyRoomAccess.AskToJoin | ||
is JoinRule.Restricted -> SecurityAndPrivacyRoomAccess.SpaceMember | ||
is JoinRule.Custom, | ||
JoinRule.Invite, | ||
JoinRule.Private, | ||
null -> SecurityAndPrivacyRoomAccess.InviteOnly | ||
} | ||
} | ||
|
||
private fun SecurityAndPrivacyRoomAccess.map(): JoinRule { | ||
return when (this) { | ||
SecurityAndPrivacyRoomAccess.Anyone -> JoinRule.Public | ||
SecurityAndPrivacyRoomAccess.AskToJoin -> JoinRule.Knock | ||
SecurityAndPrivacyRoomAccess.InviteOnly -> JoinRule.Private | ||
SecurityAndPrivacyRoomAccess.SpaceMember -> error("Unsupported") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this is used in a safe context at the moment (a Also, documenting why this is not supported would be nice. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Changed to nullable |
||
} | ||
} | ||
|
||
private fun RoomHistoryVisibility.map(): SecurityAndPrivacyHistoryVisibility { | ||
return when (this) { | ||
RoomHistoryVisibility.Joined, | ||
RoomHistoryVisibility.Invited -> SecurityAndPrivacyHistoryVisibility.SinceInvite | ||
RoomHistoryVisibility.Shared, | ||
is RoomHistoryVisibility.Custom -> SecurityAndPrivacyHistoryVisibility.SinceSelection | ||
RoomHistoryVisibility.WorldReadable -> SecurityAndPrivacyHistoryVisibility.Anyone | ||
} | ||
} | ||
|
||
private fun SecurityAndPrivacyHistoryVisibility.map(): RoomHistoryVisibility { | ||
return when (this) { | ||
SecurityAndPrivacyHistoryVisibility.SinceSelection -> RoomHistoryVisibility.Shared | ||
SecurityAndPrivacyHistoryVisibility.SinceInvite -> RoomHistoryVisibility.Invited | ||
SecurityAndPrivacyHistoryVisibility.Anyone -> RoomHistoryVisibility.WorldReadable | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe explain why all these are mapped to
InviteOnly
?