Remove default value for lambda.
We enforce a value to be provided and it's better for code coverage.
This commit is contained in:
parent
542de5a487
commit
4ae0790cc1
49 changed files with 424 additions and 225 deletions
|
|
@ -134,8 +134,8 @@ class RootFlowNode @AssistedInject constructor(
|
||||||
|
|
||||||
private suspend fun restoreSessionIfNeeded(
|
private suspend fun restoreSessionIfNeeded(
|
||||||
sessionId: SessionId,
|
sessionId: SessionId,
|
||||||
onFailure: () -> Unit = {},
|
onFailure: () -> Unit,
|
||||||
onSuccess: (SessionId) -> Unit = {},
|
onSuccess: (SessionId) -> Unit,
|
||||||
) {
|
) {
|
||||||
matrixClientsHolder.getOrRestore(sessionId)
|
matrixClientsHolder.getOrRestore(sessionId)
|
||||||
.onSuccess {
|
.onSuccess {
|
||||||
|
|
@ -149,8 +149,8 @@ class RootFlowNode @AssistedInject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun tryToRestoreLatestSession(
|
private suspend fun tryToRestoreLatestSession(
|
||||||
onSuccess: (SessionId) -> Unit = {},
|
onSuccess: (SessionId) -> Unit,
|
||||||
onFailure: () -> Unit = {}
|
onFailure: () -> Unit
|
||||||
) {
|
) {
|
||||||
val latestSessionId = authenticationService.getLatestSessionId()
|
val latestSessionId = authenticationService.getLatestSessionId()
|
||||||
if (latestSessionId == null) {
|
if (latestSessionId == null) {
|
||||||
|
|
|
||||||
|
|
@ -35,8 +35,8 @@ import io.element.android.services.apperror.impl.AppErrorView
|
||||||
@Composable
|
@Composable
|
||||||
fun RootView(
|
fun RootView(
|
||||||
state: RootState,
|
state: RootState,
|
||||||
|
onOpenBugReport: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onOpenBugReport: () -> Unit = {},
|
|
||||||
children: @Composable BoxScope.() -> Unit,
|
children: @Composable BoxScope.() -> Unit,
|
||||||
) {
|
) {
|
||||||
Box(
|
Box(
|
||||||
|
|
@ -69,7 +69,10 @@ fun RootView(
|
||||||
@PreviewsDayNight
|
@PreviewsDayNight
|
||||||
@Composable
|
@Composable
|
||||||
internal fun RootPreview(@PreviewParameter(RootStateProvider::class) rootState: RootState) = ElementPreview {
|
internal fun RootPreview(@PreviewParameter(RootStateProvider::class) rootState: RootState) = ElementPreview {
|
||||||
RootView(rootState) {
|
RootView(
|
||||||
|
state = rootState,
|
||||||
|
onOpenBugReport = {},
|
||||||
|
) {
|
||||||
Text("Children")
|
Text("Children")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,8 +32,8 @@ import io.element.android.features.createroom.impl.components.UserListView
|
||||||
import io.element.android.features.createroom.impl.userlist.UserListEvents
|
import io.element.android.features.createroom.impl.userlist.UserListEvents
|
||||||
import io.element.android.features.createroom.impl.userlist.UserListState
|
import io.element.android.features.createroom.impl.userlist.UserListState
|
||||||
import io.element.android.libraries.designsystem.components.button.BackButton
|
import io.element.android.libraries.designsystem.components.button.BackButton
|
||||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||||
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||||
import io.element.android.libraries.designsystem.theme.aliasScreenTitle
|
import io.element.android.libraries.designsystem.theme.aliasScreenTitle
|
||||||
import io.element.android.libraries.designsystem.theme.components.Scaffold
|
import io.element.android.libraries.designsystem.theme.components.Scaffold
|
||||||
import io.element.android.libraries.designsystem.theme.components.Text
|
import io.element.android.libraries.designsystem.theme.components.Text
|
||||||
|
|
@ -46,9 +46,9 @@ import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
@Composable
|
@Composable
|
||||||
fun AddPeopleView(
|
fun AddPeopleView(
|
||||||
state: UserListState,
|
state: UserListState,
|
||||||
|
onBackPressed: () -> Unit,
|
||||||
|
onNextPressed: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onBackPressed: () -> Unit = {},
|
|
||||||
onNextPressed: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Scaffold(
|
Scaffold(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -77,6 +77,8 @@ fun AddPeopleView(
|
||||||
.fillMaxWidth(),
|
.fillMaxWidth(),
|
||||||
state = state,
|
state = state,
|
||||||
showBackButton = false,
|
showBackButton = false,
|
||||||
|
onUserSelected = { },
|
||||||
|
onUserDeselected = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -86,9 +88,9 @@ fun AddPeopleView(
|
||||||
@Composable
|
@Composable
|
||||||
private fun AddPeopleViewTopBar(
|
private fun AddPeopleViewTopBar(
|
||||||
hasSelectedUsers: Boolean,
|
hasSelectedUsers: Boolean,
|
||||||
|
onBackPressed: () -> Unit,
|
||||||
|
onNextPressed: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onBackPressed: () -> Unit = {},
|
|
||||||
onNextPressed: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
TopAppBar(
|
TopAppBar(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -112,5 +114,9 @@ private fun AddPeopleViewTopBar(
|
||||||
@PreviewsDayNight
|
@PreviewsDayNight
|
||||||
@Composable
|
@Composable
|
||||||
internal fun AddPeopleViewPreview(@PreviewParameter(AddPeopleUserListStateProvider::class) state: UserListState) = ElementPreview {
|
internal fun AddPeopleViewPreview(@PreviewParameter(AddPeopleUserListStateProvider::class) state: UserListState) = ElementPreview {
|
||||||
AddPeopleView(state = state)
|
AddPeopleView(
|
||||||
|
state = state,
|
||||||
|
onBackPressed = {},
|
||||||
|
onNextPressed = {},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,9 +41,9 @@ import io.element.android.libraries.theme.ElementTheme
|
||||||
@Composable
|
@Composable
|
||||||
fun RoomPrivacyOption(
|
fun RoomPrivacyOption(
|
||||||
roomPrivacyItem: RoomPrivacyItem,
|
roomPrivacyItem: RoomPrivacyItem,
|
||||||
|
onOptionSelected: (RoomPrivacyItem) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
isSelected: Boolean = false,
|
isSelected: Boolean = false,
|
||||||
onOptionSelected: (RoomPrivacyItem) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
modifier
|
modifier
|
||||||
|
|
@ -97,10 +97,12 @@ internal fun RoomPrivacyOptionPreview() = ElementPreview {
|
||||||
Column {
|
Column {
|
||||||
RoomPrivacyOption(
|
RoomPrivacyOption(
|
||||||
roomPrivacyItem = aRoomPrivacyItem,
|
roomPrivacyItem = aRoomPrivacyItem,
|
||||||
|
onOptionSelected = {},
|
||||||
isSelected = true,
|
isSelected = true,
|
||||||
)
|
)
|
||||||
RoomPrivacyOption(
|
RoomPrivacyOption(
|
||||||
roomPrivacyItem = aRoomPrivacyItem,
|
roomPrivacyItem = aRoomPrivacyItem,
|
||||||
|
onOptionSelected = {},
|
||||||
isSelected = false,
|
isSelected = false,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,8 @@ import io.element.android.libraries.usersearch.api.UserSearchResult
|
||||||
fun SearchMultipleUsersResultItem(
|
fun SearchMultipleUsersResultItem(
|
||||||
searchResult: UserSearchResult,
|
searchResult: UserSearchResult,
|
||||||
isUserSelected: Boolean,
|
isUserSelected: Boolean,
|
||||||
|
onCheckedChange: (Boolean) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onCheckedChange: (Boolean) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
if (searchResult.isUnresolved) {
|
if (searchResult.isUnresolved) {
|
||||||
CheckableUnresolvedUserRow(
|
CheckableUnresolvedUserRow(
|
||||||
|
|
@ -62,12 +62,40 @@ internal fun SearchMultipleUsersResultItemPreview() = ElementThemedPreview { Con
|
||||||
@Composable
|
@Composable
|
||||||
private fun ContentToPreview() {
|
private fun ContentToPreview() {
|
||||||
Column {
|
Column {
|
||||||
SearchMultipleUsersResultItem(searchResult = UserSearchResult(aMatrixUser(), isUnresolved = false), isUserSelected = false)
|
SearchMultipleUsersResultItem(
|
||||||
|
searchResult = UserSearchResult(
|
||||||
|
aMatrixUser(),
|
||||||
|
isUnresolved = false
|
||||||
|
),
|
||||||
|
isUserSelected = false,
|
||||||
|
onCheckedChange = {}
|
||||||
|
)
|
||||||
HorizontalDivider()
|
HorizontalDivider()
|
||||||
SearchMultipleUsersResultItem(searchResult = UserSearchResult(aMatrixUser(), isUnresolved = false), isUserSelected = true)
|
SearchMultipleUsersResultItem(
|
||||||
|
searchResult = UserSearchResult(
|
||||||
|
aMatrixUser(),
|
||||||
|
isUnresolved = false
|
||||||
|
),
|
||||||
|
isUserSelected = true,
|
||||||
|
onCheckedChange = {}
|
||||||
|
)
|
||||||
HorizontalDivider()
|
HorizontalDivider()
|
||||||
SearchMultipleUsersResultItem(searchResult = UserSearchResult(aMatrixUser(), isUnresolved = true), isUserSelected = false)
|
SearchMultipleUsersResultItem(
|
||||||
|
searchResult = UserSearchResult(
|
||||||
|
aMatrixUser(),
|
||||||
|
isUnresolved = true
|
||||||
|
),
|
||||||
|
isUserSelected = false,
|
||||||
|
onCheckedChange = {}
|
||||||
|
)
|
||||||
HorizontalDivider()
|
HorizontalDivider()
|
||||||
SearchMultipleUsersResultItem(searchResult = UserSearchResult(aMatrixUser(), isUnresolved = true), isUserSelected = true)
|
SearchMultipleUsersResultItem(
|
||||||
|
searchResult = UserSearchResult(
|
||||||
|
aMatrixUser(),
|
||||||
|
isUnresolved = true
|
||||||
|
),
|
||||||
|
isUserSelected = true,
|
||||||
|
onCheckedChange = {}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,8 @@ import io.element.android.libraries.usersearch.api.UserSearchResult
|
||||||
@Composable
|
@Composable
|
||||||
fun SearchSingleUserResultItem(
|
fun SearchSingleUserResultItem(
|
||||||
searchResult: UserSearchResult,
|
searchResult: UserSearchResult,
|
||||||
|
onClick: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onClick: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
if (searchResult.isUnresolved) {
|
if (searchResult.isUnresolved) {
|
||||||
UnresolvedUserRow(
|
UnresolvedUserRow(
|
||||||
|
|
@ -58,8 +58,14 @@ internal fun SearchSingleUserResultItemPreview() = ElementThemedPreview { Conten
|
||||||
@Composable
|
@Composable
|
||||||
private fun ContentToPreview() {
|
private fun ContentToPreview() {
|
||||||
Column {
|
Column {
|
||||||
SearchSingleUserResultItem(searchResult = UserSearchResult(aMatrixUser(), isUnresolved = false))
|
SearchSingleUserResultItem(
|
||||||
|
searchResult = UserSearchResult(aMatrixUser(), isUnresolved = false),
|
||||||
|
onClick = {},
|
||||||
|
)
|
||||||
HorizontalDivider()
|
HorizontalDivider()
|
||||||
SearchSingleUserResultItem(searchResult = UserSearchResult(aMatrixUser(), isUnresolved = true))
|
SearchSingleUserResultItem(
|
||||||
|
searchResult = UserSearchResult(aMatrixUser(), isUnresolved = true),
|
||||||
|
onClick = {},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,13 +52,13 @@ fun SearchUserBar(
|
||||||
selectedUsers: ImmutableList<MatrixUser>,
|
selectedUsers: ImmutableList<MatrixUser>,
|
||||||
active: Boolean,
|
active: Boolean,
|
||||||
isMultiSelectionEnabled: Boolean,
|
isMultiSelectionEnabled: Boolean,
|
||||||
|
onActiveChanged: (Boolean) -> Unit,
|
||||||
|
onTextChanged: (String) -> Unit,
|
||||||
|
onUserSelected: (MatrixUser) -> Unit,
|
||||||
|
onUserDeselected: (MatrixUser) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
showBackButton: Boolean = true,
|
showBackButton: Boolean = true,
|
||||||
placeHolderTitle: String = stringResource(CommonStrings.common_search_for_someone),
|
placeHolderTitle: String = stringResource(CommonStrings.common_search_for_someone),
|
||||||
onActiveChanged: (Boolean) -> Unit = {},
|
|
||||||
onTextChanged: (String) -> Unit = {},
|
|
||||||
onUserSelected: (MatrixUser) -> Unit = {},
|
|
||||||
onUserDeselected: (MatrixUser) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
val columnState = rememberLazyListState()
|
val columnState = rememberLazyListState()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,18 +26,18 @@ import androidx.compose.ui.unit.dp
|
||||||
import io.element.android.features.createroom.impl.userlist.UserListEvents
|
import io.element.android.features.createroom.impl.userlist.UserListEvents
|
||||||
import io.element.android.features.createroom.impl.userlist.UserListState
|
import io.element.android.features.createroom.impl.userlist.UserListState
|
||||||
import io.element.android.features.createroom.impl.userlist.UserListStateProvider
|
import io.element.android.features.createroom.impl.userlist.UserListStateProvider
|
||||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||||
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||||
import io.element.android.libraries.matrix.api.user.MatrixUser
|
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||||
import io.element.android.libraries.matrix.ui.components.SelectedUsersList
|
import io.element.android.libraries.matrix.ui.components.SelectedUsersList
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun UserListView(
|
fun UserListView(
|
||||||
state: UserListState,
|
state: UserListState,
|
||||||
|
onUserSelected: (MatrixUser) -> Unit,
|
||||||
|
onUserDeselected: (MatrixUser) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
showBackButton: Boolean = true,
|
showBackButton: Boolean = true,
|
||||||
onUserSelected: (MatrixUser) -> Unit = {},
|
|
||||||
onUserDeselected: (MatrixUser) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Column(
|
Column(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -79,5 +79,9 @@ fun UserListView(
|
||||||
@PreviewsDayNight
|
@PreviewsDayNight
|
||||||
@Composable
|
@Composable
|
||||||
internal fun UserListViewPreview(@PreviewParameter(UserListStateProvider::class) state: UserListState) = ElementPreview {
|
internal fun UserListViewPreview(@PreviewParameter(UserListStateProvider::class) state: UserListState) = ElementPreview {
|
||||||
UserListView(state = state)
|
UserListView(
|
||||||
|
state = state,
|
||||||
|
onUserSelected = {},
|
||||||
|
onUserDeselected = {},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -167,9 +167,9 @@ fun ConfigureRoomView(
|
||||||
@Composable
|
@Composable
|
||||||
private fun ConfigureRoomToolbar(
|
private fun ConfigureRoomToolbar(
|
||||||
isNextActionEnabled: Boolean,
|
isNextActionEnabled: Boolean,
|
||||||
|
onBackPressed: () -> Unit,
|
||||||
|
onNextPressed: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onBackPressed: () -> Unit = {},
|
|
||||||
onNextPressed: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
TopAppBar(
|
TopAppBar(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -194,9 +194,9 @@ private fun ConfigureRoomToolbar(
|
||||||
private fun RoomNameWithAvatar(
|
private fun RoomNameWithAvatar(
|
||||||
avatarUri: Uri?,
|
avatarUri: Uri?,
|
||||||
roomName: String,
|
roomName: String,
|
||||||
|
onAvatarClick: () -> Unit,
|
||||||
|
onRoomNameChanged: (String) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onAvatarClick: () -> Unit = {},
|
|
||||||
onRoomNameChanged: (String) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -221,8 +221,8 @@ private fun RoomNameWithAvatar(
|
||||||
@Composable
|
@Composable
|
||||||
private fun RoomTopic(
|
private fun RoomTopic(
|
||||||
topic: String,
|
topic: String,
|
||||||
|
onTopicChanged: (String) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTopicChanged: (String) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
LabelledTextField(
|
LabelledTextField(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -240,8 +240,8 @@ private fun RoomTopic(
|
||||||
@Composable
|
@Composable
|
||||||
private fun RoomPrivacyOptions(
|
private fun RoomPrivacyOptions(
|
||||||
selected: RoomPrivacy?,
|
selected: RoomPrivacy?,
|
||||||
|
onOptionSelected: (RoomPrivacyItem) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onOptionSelected: (RoomPrivacyItem) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
val items = roomPrivacyItems()
|
val items = roomPrivacyItems()
|
||||||
Column(modifier = modifier.selectableGroup()) {
|
Column(modifier = modifier.selectableGroup()) {
|
||||||
|
|
|
||||||
|
|
@ -55,11 +55,11 @@ import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
@Composable
|
@Composable
|
||||||
fun CreateRoomRootView(
|
fun CreateRoomRootView(
|
||||||
state: CreateRoomRootState,
|
state: CreateRoomRootState,
|
||||||
|
onClosePressed: () -> Unit,
|
||||||
|
onNewRoomClicked: () -> Unit,
|
||||||
|
onOpenDM: (RoomId) -> Unit,
|
||||||
|
onInviteFriendsClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onClosePressed: () -> Unit = {},
|
|
||||||
onNewRoomClicked: () -> Unit = {},
|
|
||||||
onOpenDM: (RoomId) -> Unit = {},
|
|
||||||
onInviteFriendsClicked: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Scaffold(
|
Scaffold(
|
||||||
modifier = modifier.fillMaxWidth(),
|
modifier = modifier.fillMaxWidth(),
|
||||||
|
|
@ -81,6 +81,7 @@ fun CreateRoomRootView(
|
||||||
onUserSelected = {
|
onUserSelected = {
|
||||||
state.eventSink(CreateRoomRootEvents.StartDM(it))
|
state.eventSink(CreateRoomRootEvents.StartDM(it))
|
||||||
},
|
},
|
||||||
|
onUserDeselected = { },
|
||||||
)
|
)
|
||||||
|
|
||||||
if (!state.userListState.isSearchActive) {
|
if (!state.userListState.isSearchActive) {
|
||||||
|
|
@ -111,8 +112,8 @@ fun CreateRoomRootView(
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
private fun CreateRoomRootViewTopBar(
|
private fun CreateRoomRootViewTopBar(
|
||||||
|
onClosePressed: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onClosePressed: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
TopAppBar(
|
TopAppBar(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -134,9 +135,9 @@ private fun CreateRoomRootViewTopBar(
|
||||||
@Composable
|
@Composable
|
||||||
private fun CreateRoomActionButtonsList(
|
private fun CreateRoomActionButtonsList(
|
||||||
state: CreateRoomRootState,
|
state: CreateRoomRootState,
|
||||||
|
onNewRoomClicked: () -> Unit,
|
||||||
|
onInvitePeopleClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onNewRoomClicked: () -> Unit = {},
|
|
||||||
onInvitePeopleClicked: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Column(modifier = modifier) {
|
Column(modifier = modifier) {
|
||||||
CreateRoomActionButton(
|
CreateRoomActionButton(
|
||||||
|
|
@ -156,8 +157,8 @@ private fun CreateRoomActionButtonsList(
|
||||||
private fun CreateRoomActionButton(
|
private fun CreateRoomActionButton(
|
||||||
@DrawableRes iconRes: Int,
|
@DrawableRes iconRes: Int,
|
||||||
text: String,
|
text: String,
|
||||||
|
onClick: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onClick: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
|
|
@ -187,5 +188,9 @@ internal fun CreateRoomRootViewPreview(@PreviewParameter(CreateRoomRootStateProv
|
||||||
ElementPreview {
|
ElementPreview {
|
||||||
CreateRoomRootView(
|
CreateRoomRootView(
|
||||||
state = state,
|
state = state,
|
||||||
|
onClosePressed = {},
|
||||||
|
onNewRoomClicked = {},
|
||||||
|
onOpenDM = {},
|
||||||
|
onInviteFriendsClicked = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -53,9 +53,9 @@ import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
@Composable
|
@Composable
|
||||||
fun InviteListView(
|
fun InviteListView(
|
||||||
state: InviteListState,
|
state: InviteListState,
|
||||||
|
onBackClicked: () -> Unit,
|
||||||
|
onInviteAccepted: (RoomId) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onBackClicked: () -> Unit = {},
|
|
||||||
onInviteAccepted: (RoomId) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
if (state.acceptedAction is Async.Success) {
|
if (state.acceptedAction is Async.Success) {
|
||||||
LaunchedEffect(state.acceptedAction) {
|
LaunchedEffect(state.acceptedAction) {
|
||||||
|
|
@ -113,8 +113,8 @@ fun InviteListView(
|
||||||
@Composable
|
@Composable
|
||||||
private fun InviteListContent(
|
private fun InviteListContent(
|
||||||
state: InviteListState,
|
state: InviteListState,
|
||||||
|
onBackClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onBackClicked: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Scaffold(
|
Scaffold(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -173,5 +173,9 @@ private fun InviteListContent(
|
||||||
@PreviewsDayNight
|
@PreviewsDayNight
|
||||||
@Composable
|
@Composable
|
||||||
internal fun InviteListViewPreview(@PreviewParameter(InviteListStateProvider::class) state: InviteListState) = ElementPreview {
|
internal fun InviteListViewPreview(@PreviewParameter(InviteListStateProvider::class) state: InviteListState) = ElementPreview {
|
||||||
InviteListView(state)
|
InviteListView(
|
||||||
|
state = state,
|
||||||
|
onBackClicked = {},
|
||||||
|
onInviteAccepted = {},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -45,8 +45,8 @@ import io.element.android.features.invitelist.impl.model.InviteListInviteSummary
|
||||||
import io.element.android.features.invitelist.impl.model.InviteSender
|
import io.element.android.features.invitelist.impl.model.InviteSender
|
||||||
import io.element.android.libraries.designsystem.atomic.atoms.UnreadIndicatorAtom
|
import io.element.android.libraries.designsystem.atomic.atoms.UnreadIndicatorAtom
|
||||||
import io.element.android.libraries.designsystem.components.avatar.Avatar
|
import io.element.android.libraries.designsystem.components.avatar.Avatar
|
||||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||||
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||||
import io.element.android.libraries.designsystem.theme.components.Button
|
import io.element.android.libraries.designsystem.theme.components.Button
|
||||||
import io.element.android.libraries.designsystem.theme.components.ButtonSize
|
import io.element.android.libraries.designsystem.theme.components.ButtonSize
|
||||||
import io.element.android.libraries.designsystem.theme.components.OutlinedButton
|
import io.element.android.libraries.designsystem.theme.components.OutlinedButton
|
||||||
|
|
@ -59,9 +59,9 @@ private val minHeight = 72.dp
|
||||||
@Composable
|
@Composable
|
||||||
internal fun InviteSummaryRow(
|
internal fun InviteSummaryRow(
|
||||||
invite: InviteListInviteSummary,
|
invite: InviteListInviteSummary,
|
||||||
|
onAcceptClicked: () -> Unit,
|
||||||
|
onDeclineClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onAcceptClicked: () -> Unit = {},
|
|
||||||
onDeclineClicked: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Box(
|
Box(
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
|
|
@ -79,8 +79,8 @@ internal fun InviteSummaryRow(
|
||||||
@Composable
|
@Composable
|
||||||
private fun DefaultInviteSummaryRow(
|
private fun DefaultInviteSummaryRow(
|
||||||
invite: InviteListInviteSummary,
|
invite: InviteListInviteSummary,
|
||||||
onAcceptClicked: () -> Unit = {},
|
onAcceptClicked: () -> Unit,
|
||||||
onDeclineClicked: () -> Unit = {},
|
onDeclineClicked: () -> Unit,
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
|
|
@ -187,5 +187,9 @@ private fun SenderRow(sender: InviteSender) {
|
||||||
@PreviewsDayNight
|
@PreviewsDayNight
|
||||||
@Composable
|
@Composable
|
||||||
internal fun InviteSummaryRowPreview(@PreviewParameter(InviteListInviteSummaryProvider::class) data: InviteListInviteSummary) = ElementPreview {
|
internal fun InviteSummaryRowPreview(@PreviewParameter(InviteListInviteSummaryProvider::class) data: InviteListInviteSummary) = ElementPreview {
|
||||||
InviteSummaryRow(data)
|
InviteSummaryRow(
|
||||||
|
invite = data,
|
||||||
|
onAcceptClicked = {},
|
||||||
|
onDeclineClicked = {},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -68,8 +68,8 @@ import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
@Composable
|
@Composable
|
||||||
fun SendLocationView(
|
fun SendLocationView(
|
||||||
state: SendLocationState,
|
state: SendLocationState,
|
||||||
|
navigateUp: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
navigateUp: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
state.eventSink(SendLocationEvents.RequestPermissions)
|
state.eventSink(SendLocationEvents.RequestPermissions)
|
||||||
|
|
|
||||||
|
|
@ -67,8 +67,8 @@ import kotlinx.collections.immutable.toImmutableMap
|
||||||
@Composable
|
@Composable
|
||||||
fun ShowLocationView(
|
fun ShowLocationView(
|
||||||
state: ShowLocationState,
|
state: ShowLocationState,
|
||||||
|
onBackPressed: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onBackPressed: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
when (state.permissionDialog) {
|
when (state.permissionDialog) {
|
||||||
ShowLocationState.Dialog.None -> Unit
|
ShowLocationState.Dialog.None -> Unit
|
||||||
|
|
|
||||||
|
|
@ -450,10 +450,10 @@ private fun MessagesViewTopBar(
|
||||||
roomAvatar: AvatarData?,
|
roomAvatar: AvatarData?,
|
||||||
inRoomCallsEnabled: Boolean,
|
inRoomCallsEnabled: Boolean,
|
||||||
isCallOngoing: Boolean,
|
isCallOngoing: Boolean,
|
||||||
|
onRoomDetailsClicked: () -> Unit,
|
||||||
|
onJoinCallClicked: () -> Unit,
|
||||||
|
onBackPressed: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onRoomDetailsClicked: () -> Unit = {},
|
|
||||||
onJoinCallClicked: () -> Unit = {},
|
|
||||||
onBackPressed: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
TopAppBar(
|
TopAppBar(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
|
||||||
|
|
@ -58,9 +58,9 @@ private const val BUBBLE_WIDTH_RATIO = 0.85f
|
||||||
fun MessageEventBubble(
|
fun MessageEventBubble(
|
||||||
state: BubbleState,
|
state: BubbleState,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
|
onClick: () -> Unit,
|
||||||
|
onLongClick: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onClick: () -> Unit = {},
|
|
||||||
onLongClick: () -> Unit = {},
|
|
||||||
content: @Composable () -> Unit = {},
|
content: @Composable () -> Unit = {},
|
||||||
) {
|
) {
|
||||||
fun bubbleShape(): Shape {
|
fun bubbleShape(): Shape {
|
||||||
|
|
@ -144,6 +144,8 @@ internal fun MessageEventBubblePreview(@PreviewParameter(BubbleStateProvider::cl
|
||||||
MessageEventBubble(
|
MessageEventBubble(
|
||||||
state = state,
|
state = state,
|
||||||
interactionSource = remember { MutableInteractionSource() },
|
interactionSource = remember { MutableInteractionSource() },
|
||||||
|
onClick = {},
|
||||||
|
onLongClick = {},
|
||||||
) {
|
) {
|
||||||
// Render the state as a text to better understand the previews
|
// Render the state as a text to better understand the previews
|
||||||
Box(
|
Box(
|
||||||
|
|
|
||||||
|
|
@ -31,8 +31,8 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||||
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||||
import io.element.android.libraries.designsystem.theme.components.Surface
|
import io.element.android.libraries.designsystem.theme.components.Surface
|
||||||
|
|
||||||
private val CORNER_RADIUS = 8.dp
|
private val CORNER_RADIUS = 8.dp
|
||||||
|
|
@ -42,9 +42,9 @@ private val CORNER_RADIUS = 8.dp
|
||||||
fun MessageStateEventContainer(
|
fun MessageStateEventContainer(
|
||||||
@Suppress("UNUSED_PARAMETER") isHighlighted: Boolean,
|
@Suppress("UNUSED_PARAMETER") isHighlighted: Boolean,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
|
onClick: () -> Unit,
|
||||||
|
onLongClick: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onClick: () -> Unit = {},
|
|
||||||
onLongClick: () -> Unit = {},
|
|
||||||
content: @Composable () -> Unit = {},
|
content: @Composable () -> Unit = {},
|
||||||
) {
|
) {
|
||||||
// Ignore isHighlighted for now, we need a design decision on it.
|
// Ignore isHighlighted for now, we need a design decision on it.
|
||||||
|
|
@ -73,12 +73,16 @@ internal fun MessageStateEventContainerPreview() = ElementPreview {
|
||||||
MessageStateEventContainer(
|
MessageStateEventContainer(
|
||||||
isHighlighted = false,
|
isHighlighted = false,
|
||||||
interactionSource = remember { MutableInteractionSource() },
|
interactionSource = remember { MutableInteractionSource() },
|
||||||
|
onClick = {},
|
||||||
|
onLongClick = {},
|
||||||
) {
|
) {
|
||||||
Spacer(modifier = Modifier.size(width = 120.dp, height = 32.dp))
|
Spacer(modifier = Modifier.size(width = 120.dp, height = 32.dp))
|
||||||
}
|
}
|
||||||
MessageStateEventContainer(
|
MessageStateEventContainer(
|
||||||
isHighlighted = true,
|
isHighlighted = true,
|
||||||
interactionSource = remember { MutableInteractionSource() },
|
interactionSource = remember { MutableInteractionSource() },
|
||||||
|
onClick = {},
|
||||||
|
onLongClick = {},
|
||||||
) {
|
) {
|
||||||
Spacer(modifier = Modifier.size(width = 120.dp, height = 32.dp))
|
Spacer(modifier = Modifier.size(width = 120.dp, height = 32.dp))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,9 +39,9 @@ fun TimelineItemTextView(
|
||||||
content: TimelineItemTextBasedContent,
|
content: TimelineItemTextBasedContent,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
extraPadding: ExtraPadding,
|
extraPadding: ExtraPadding,
|
||||||
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit = {},
|
|
||||||
onTextLongClicked: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
CompositionLocalProvider(LocalContentColor provides ElementTheme.colors.textPrimary) {
|
CompositionLocalProvider(LocalContentColor provides ElementTheme.colors.textPrimary) {
|
||||||
val htmlDocument = content.htmlDocument
|
val htmlDocument = content.htmlDocument
|
||||||
|
|
@ -79,5 +79,7 @@ internal fun TimelineItemTextViewPreview(
|
||||||
content = content,
|
content = content,
|
||||||
interactionSource = remember { MutableInteractionSource() },
|
interactionSource = remember { MutableInteractionSource() },
|
||||||
extraPadding = ExtraPadding(nbChars = 8),
|
extraPadding = ExtraPadding(nbChars = 8),
|
||||||
|
onTextClicked = {},
|
||||||
|
onTextLongClicked = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -58,8 +58,8 @@ import io.element.android.features.messages.impl.timeline.components.event.Extra
|
||||||
import io.element.android.features.messages.impl.timeline.components.event.getDpSize
|
import io.element.android.features.messages.impl.timeline.components.event.getDpSize
|
||||||
import io.element.android.features.messages.impl.timeline.components.event.noExtraPadding
|
import io.element.android.features.messages.impl.timeline.components.event.noExtraPadding
|
||||||
import io.element.android.libraries.designsystem.components.ClickableLinkText
|
import io.element.android.libraries.designsystem.components.ClickableLinkText
|
||||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||||
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||||
import io.element.android.libraries.designsystem.text.toDp
|
import io.element.android.libraries.designsystem.text.toDp
|
||||||
import io.element.android.libraries.designsystem.theme.components.Surface
|
import io.element.android.libraries.designsystem.theme.components.Surface
|
||||||
import io.element.android.libraries.designsystem.theme.components.Text
|
import io.element.android.libraries.designsystem.theme.components.Text
|
||||||
|
|
@ -80,9 +80,9 @@ fun HtmlDocument(
|
||||||
document: Document,
|
document: Document,
|
||||||
extraPadding: ExtraPadding,
|
extraPadding: ExtraPadding,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit = {},
|
|
||||||
onTextLongClicked: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
FlowRow(
|
FlowRow(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -106,16 +106,16 @@ fun HtmlDocument(
|
||||||
private fun HtmlBody(
|
private fun HtmlBody(
|
||||||
body: Element,
|
body: Element,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit = {},
|
|
||||||
onTextLongClicked: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
@Composable
|
@Composable
|
||||||
fun NodesFlowRode(
|
fun NodesFlowRode(
|
||||||
nodes: Iterator<Node>,
|
nodes: Iterator<Node>,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
onTextClicked: () -> Unit = {},
|
onTextClicked: () -> Unit,
|
||||||
onTextLongClicked: () -> Unit = {},
|
onTextLongClicked: () -> Unit,
|
||||||
) = FlowRow(
|
) = FlowRow(
|
||||||
horizontalArrangement = Arrangement.spacedBy(2.dp, Alignment.Start),
|
horizontalArrangement = Arrangement.spacedBy(2.dp, Alignment.Start),
|
||||||
verticalArrangement = Arrangement.spacedBy(8.dp, Alignment.Top),
|
verticalArrangement = Arrangement.spacedBy(8.dp, Alignment.Top),
|
||||||
|
|
@ -181,9 +181,9 @@ private fun Element.isInline(): Boolean {
|
||||||
private fun HtmlBlock(
|
private fun HtmlBlock(
|
||||||
element: Element,
|
element: Element,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit = {},
|
|
||||||
onTextLongClicked: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
val blockModifier = modifier
|
val blockModifier = modifier
|
||||||
.padding(top = 4.dp)
|
.padding(top = 4.dp)
|
||||||
|
|
@ -239,9 +239,9 @@ private fun HtmlBlock(
|
||||||
private fun HtmlInline(
|
private fun HtmlInline(
|
||||||
element: Element,
|
element: Element,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit = {},
|
|
||||||
onTextLongClicked: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Box(modifier) {
|
Box(modifier) {
|
||||||
val styledText = buildAnnotatedString {
|
val styledText = buildAnnotatedString {
|
||||||
|
|
@ -281,9 +281,9 @@ private fun HtmlPreformatted(
|
||||||
private fun HtmlParagraph(
|
private fun HtmlParagraph(
|
||||||
paragraph: Element,
|
paragraph: Element,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit = {},
|
|
||||||
onTextLongClicked: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Box(modifier) {
|
Box(modifier) {
|
||||||
val styledText = buildAnnotatedString {
|
val styledText = buildAnnotatedString {
|
||||||
|
|
@ -300,9 +300,9 @@ private fun HtmlParagraph(
|
||||||
private fun HtmlBlockquote(
|
private fun HtmlBlockquote(
|
||||||
blockquote: Element,
|
blockquote: Element,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit = {},
|
|
||||||
onTextLongClicked: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
val color = MaterialTheme.colorScheme.onBackground
|
val color = MaterialTheme.colorScheme.onBackground
|
||||||
Box(
|
Box(
|
||||||
|
|
@ -333,9 +333,9 @@ private fun HtmlBlockquote(
|
||||||
private fun HtmlHeading(
|
private fun HtmlHeading(
|
||||||
heading: Element,
|
heading: Element,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit = {},
|
|
||||||
onTextLongClicked: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
val style = when (heading.tagName().lowercase()) {
|
val style = when (heading.tagName().lowercase()) {
|
||||||
"h1" -> MaterialTheme.typography.headlineLarge.copy(fontSize = 30.sp)
|
"h1" -> MaterialTheme.typography.headlineLarge.copy(fontSize = 30.sp)
|
||||||
|
|
@ -366,9 +366,9 @@ private fun HtmlHeading(
|
||||||
private fun HtmlMxReply(
|
private fun HtmlMxReply(
|
||||||
mxReply: Element,
|
mxReply: Element,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit = {},
|
|
||||||
onTextLongClicked: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
val blockquote = mxReply.childNodes().firstOrNull() ?: return
|
val blockquote = mxReply.childNodes().firstOrNull() ?: return
|
||||||
val shape = RoundedCornerShape(12.dp)
|
val shape = RoundedCornerShape(12.dp)
|
||||||
|
|
@ -419,16 +419,17 @@ private fun HtmlMxReply(
|
||||||
private fun HtmlOrderedList(
|
private fun HtmlOrderedList(
|
||||||
orderedList: Element,
|
orderedList: Element,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit = {},
|
|
||||||
onTextLongClicked: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
val delimiter = "."
|
val delimiter = "."
|
||||||
HtmlListItems(
|
HtmlListItems(
|
||||||
list = orderedList,
|
list = orderedList,
|
||||||
marker = { index -> "$index$delimiter" },
|
marker = { index -> "$index$delimiter" },
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
onTextClicked = onTextClicked, onTextLongClicked = onTextLongClicked,
|
onTextClicked = onTextClicked,
|
||||||
|
onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -437,16 +438,17 @@ private fun HtmlOrderedList(
|
||||||
private fun HtmlUnorderedList(
|
private fun HtmlUnorderedList(
|
||||||
unorderedList: Element,
|
unorderedList: Element,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit = {},
|
|
||||||
onTextLongClicked: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
val marker = "・"
|
val marker = "・"
|
||||||
HtmlListItems(
|
HtmlListItems(
|
||||||
list = unorderedList,
|
list = unorderedList,
|
||||||
marker = { marker },
|
marker = { marker },
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
onTextClicked = onTextClicked, onTextLongClicked = onTextLongClicked,
|
onTextClicked = onTextClicked,
|
||||||
|
onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -456,9 +458,9 @@ private fun HtmlListItems(
|
||||||
list: Element,
|
list: Element,
|
||||||
marker: (Int) -> String,
|
marker: (Int) -> String,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
|
onTextClicked: () -> Unit,
|
||||||
|
onTextLongClicked: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onTextClicked: () -> Unit = {},
|
|
||||||
onTextLongClicked: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Column(modifier = modifier) {
|
Column(modifier = modifier) {
|
||||||
for ((index, node) in list.children().withIndex()) {
|
for ((index, node) in list.children().withIndex()) {
|
||||||
|
|
@ -468,7 +470,12 @@ private fun HtmlListItems(
|
||||||
append("${marker(index + 1)} ")
|
append("${marker(index + 1)} ")
|
||||||
appendInlineChildrenElements(node.childNodes(), MaterialTheme.colorScheme)
|
appendInlineChildrenElements(node.childNodes(), MaterialTheme.colorScheme)
|
||||||
}
|
}
|
||||||
HtmlText(text = text, interactionSource = remember { MutableInteractionSource() })
|
HtmlText(
|
||||||
|
text = text,
|
||||||
|
interactionSource = remember { MutableInteractionSource() },
|
||||||
|
onClick = onTextClicked,
|
||||||
|
onLongClick = onTextLongClicked,
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
for (innerNode in node.childNodes()) {
|
for (innerNode in node.childNodes()) {
|
||||||
when (innerNode) {
|
when (innerNode) {
|
||||||
|
|
@ -478,15 +485,18 @@ private fun HtmlListItems(
|
||||||
append("${marker(index + 1)} ")
|
append("${marker(index + 1)} ")
|
||||||
}
|
}
|
||||||
HtmlText(
|
HtmlText(
|
||||||
text = text, onClick = onTextClicked,
|
text = text,
|
||||||
onLongClick = onTextLongClicked, interactionSource = interactionSource
|
onClick = onTextClicked,
|
||||||
|
onLongClick = onTextLongClicked,
|
||||||
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is Element -> HtmlBlock(
|
is Element -> HtmlBlock(
|
||||||
element = innerNode,
|
element = innerNode,
|
||||||
modifier = Modifier.padding(start = 4.dp),
|
modifier = Modifier.padding(start = 4.dp),
|
||||||
onTextClicked = onTextClicked, onTextLongClicked = onTextLongClicked,
|
onTextClicked = onTextClicked,
|
||||||
|
onTextLongClicked = onTextLongClicked,
|
||||||
interactionSource = interactionSource
|
interactionSource = interactionSource
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -595,10 +605,10 @@ fun AnnotatedString.Builder.safeAppendInlineContent(chipId: String, ownText: Str
|
||||||
private fun HtmlText(
|
private fun HtmlText(
|
||||||
text: AnnotatedString,
|
text: AnnotatedString,
|
||||||
interactionSource: MutableInteractionSource,
|
interactionSource: MutableInteractionSource,
|
||||||
|
onClick: () -> Unit,
|
||||||
|
onLongClick: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
style: TextStyle = LocalTextStyle.current,
|
style: TextStyle = LocalTextStyle.current,
|
||||||
onClick: () -> Unit = {},
|
|
||||||
onLongClick: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
val inlineContentMap = persistentMapOf<String, InlineTextContent>()
|
val inlineContentMap = persistentMapOf<String, InlineTextContent>()
|
||||||
ClickableLinkText(
|
ClickableLinkText(
|
||||||
|
|
@ -618,6 +628,8 @@ internal fun HtmlDocumentPreview(@PreviewParameter(DocumentProvider::class) docu
|
||||||
HtmlDocument(
|
HtmlDocument(
|
||||||
document = document,
|
document = document,
|
||||||
extraPadding = noExtraPadding,
|
extraPadding = noExtraPadding,
|
||||||
interactionSource = remember { MutableInteractionSource() }
|
interactionSource = remember { MutableInteractionSource() },
|
||||||
|
onTextClicked = {},
|
||||||
|
onTextLongClicked = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -38,9 +38,9 @@ import io.element.android.libraries.theme.ElementTheme
|
||||||
@Composable
|
@Composable
|
||||||
fun DefaultNotificationSettingOption(
|
fun DefaultNotificationSettingOption(
|
||||||
mode: RoomNotificationMode,
|
mode: RoomNotificationMode,
|
||||||
|
onOptionSelected: (RoomNotificationMode) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
isSelected: Boolean = false,
|
isSelected: Boolean = false,
|
||||||
onOptionSelected: (RoomNotificationMode) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
val subtitle = when(mode) {
|
val subtitle = when(mode) {
|
||||||
RoomNotificationMode.ALL_MESSAGES -> stringResource(id = R.string.screen_notification_settings_edit_mode_all_messages)
|
RoomNotificationMode.ALL_MESSAGES -> stringResource(id = R.string.screen_notification_settings_edit_mode_all_messages)
|
||||||
|
|
@ -86,10 +86,12 @@ internal fun DefaultNotificationSettingOptionPreview() = ElementPreview {
|
||||||
DefaultNotificationSettingOption(
|
DefaultNotificationSettingOption(
|
||||||
mode = RoomNotificationMode.ALL_MESSAGES,
|
mode = RoomNotificationMode.ALL_MESSAGES,
|
||||||
isSelected = true,
|
isSelected = true,
|
||||||
|
onOptionSelected = {},
|
||||||
)
|
)
|
||||||
DefaultNotificationSettingOption(
|
DefaultNotificationSettingOption(
|
||||||
mode = RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY,
|
mode = RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY,
|
||||||
isSelected = false,
|
isSelected = false,
|
||||||
|
onOptionSelected = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,7 @@ fun RageshakeDetectionView(
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun TakeScreenshot(
|
private fun TakeScreenshot(
|
||||||
onScreenshotTaken: (ImageResult) -> Unit = {}
|
onScreenshotTaken: (ImageResult) -> Unit
|
||||||
) {
|
) {
|
||||||
val view = LocalView.current
|
val view = LocalView.current
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
|
|
|
||||||
|
|
@ -34,8 +34,8 @@ import androidx.compose.ui.unit.dp
|
||||||
import io.element.android.features.roomdetails.impl.R
|
import io.element.android.features.roomdetails.impl.R
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
||||||
import io.element.android.libraries.designsystem.components.button.BackButton
|
import io.element.android.libraries.designsystem.components.button.BackButton
|
||||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||||
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||||
import io.element.android.libraries.designsystem.theme.aliasScreenTitle
|
import io.element.android.libraries.designsystem.theme.aliasScreenTitle
|
||||||
import io.element.android.libraries.designsystem.theme.components.HorizontalDivider
|
import io.element.android.libraries.designsystem.theme.components.HorizontalDivider
|
||||||
import io.element.android.libraries.designsystem.theme.components.Scaffold
|
import io.element.android.libraries.designsystem.theme.components.Scaffold
|
||||||
|
|
@ -58,9 +58,9 @@ import kotlinx.collections.immutable.ImmutableList
|
||||||
@Composable
|
@Composable
|
||||||
fun RoomInviteMembersView(
|
fun RoomInviteMembersView(
|
||||||
state: RoomInviteMembersState,
|
state: RoomInviteMembersState,
|
||||||
|
onBackPressed: () -> Unit,
|
||||||
|
onSendPressed: (List<MatrixUser>) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onBackPressed: () -> Unit = {},
|
|
||||||
onSendPressed: (List<MatrixUser>) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Scaffold(
|
Scaffold(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -113,9 +113,9 @@ fun RoomInviteMembersView(
|
||||||
@Composable
|
@Composable
|
||||||
private fun RoomInviteMembersTopBar(
|
private fun RoomInviteMembersTopBar(
|
||||||
canSend: Boolean,
|
canSend: Boolean,
|
||||||
|
onBackPressed: () -> Unit,
|
||||||
|
onSendPressed: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onBackPressed: () -> Unit = {},
|
|
||||||
onSendPressed: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
TopAppBar(
|
TopAppBar(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -143,11 +143,11 @@ private fun RoomInviteMembersSearchBar(
|
||||||
state: SearchBarResultState<ImmutableList<InvitableUser>>,
|
state: SearchBarResultState<ImmutableList<InvitableUser>>,
|
||||||
selectedUsers: ImmutableList<MatrixUser>,
|
selectedUsers: ImmutableList<MatrixUser>,
|
||||||
active: Boolean,
|
active: Boolean,
|
||||||
|
onActiveChanged: (Boolean) -> Unit,
|
||||||
|
onTextChanged: (String) -> Unit,
|
||||||
|
onUserToggled: (MatrixUser) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
placeHolderTitle: String = stringResource(CommonStrings.common_search_for_someone),
|
placeHolderTitle: String = stringResource(CommonStrings.common_search_for_someone),
|
||||||
onActiveChanged: (Boolean) -> Unit = {},
|
|
||||||
onTextChanged: (String) -> Unit = {},
|
|
||||||
onUserToggled: (MatrixUser) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
SearchBar(
|
SearchBar(
|
||||||
query = query,
|
query = query,
|
||||||
|
|
@ -219,5 +219,9 @@ private fun RoomInviteMembersSearchBar(
|
||||||
@PreviewsDayNight
|
@PreviewsDayNight
|
||||||
@Composable
|
@Composable
|
||||||
internal fun RoomInviteMembersPreview(@PreviewParameter(RoomInviteMembersStateProvider::class) state: RoomInviteMembersState) = ElementPreview {
|
internal fun RoomInviteMembersPreview(@PreviewParameter(RoomInviteMembersStateProvider::class) state: RoomInviteMembersState) = ElementPreview {
|
||||||
RoomInviteMembersView(state)
|
RoomInviteMembersView(
|
||||||
|
state = state,
|
||||||
|
onBackPressed = {},
|
||||||
|
onSendPressed = {},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -177,8 +177,8 @@ private fun LazyListScope.roomMemberListSection(
|
||||||
@Composable
|
@Composable
|
||||||
private fun RoomMemberListItem(
|
private fun RoomMemberListItem(
|
||||||
roomMember: RoomMember,
|
roomMember: RoomMember,
|
||||||
|
onClick: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onClick: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
MatrixUserRow(
|
MatrixUserRow(
|
||||||
modifier = modifier.clickable(onClick = onClick),
|
modifier = modifier.clickable(onClick = onClick),
|
||||||
|
|
@ -195,9 +195,9 @@ private fun RoomMemberListItem(
|
||||||
@Composable
|
@Composable
|
||||||
private fun RoomMemberListTopBar(
|
private fun RoomMemberListTopBar(
|
||||||
canInvite: Boolean,
|
canInvite: Boolean,
|
||||||
|
onBackPressed: () -> Unit,
|
||||||
|
onInvitePressed: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onBackPressed: () -> Unit = {},
|
|
||||||
onInvitePressed: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
TopAppBar(
|
TopAppBar(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
|
||||||
|
|
@ -37,10 +37,10 @@ import io.element.android.libraries.theme.ElementTheme
|
||||||
@Composable
|
@Composable
|
||||||
fun RoomNotificationSettingsOption(
|
fun RoomNotificationSettingsOption(
|
||||||
roomNotificationSettingsItem: RoomNotificationSettingsItem,
|
roomNotificationSettingsItem: RoomNotificationSettingsItem,
|
||||||
|
onOptionSelected: (RoomNotificationSettingsItem) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
enabled: Boolean = true,
|
enabled: Boolean = true,
|
||||||
isSelected: Boolean = false,
|
isSelected: Boolean = false,
|
||||||
onOptionSelected: (RoomNotificationSettingsItem) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
modifier
|
modifier
|
||||||
|
|
@ -83,10 +83,12 @@ internal fun RoomPrivacyOptionPreview() = ElementPreview {
|
||||||
Column {
|
Column {
|
||||||
RoomNotificationSettingsOption(
|
RoomNotificationSettingsOption(
|
||||||
roomNotificationSettingsItem = roomNotificationSettingsItems().first(),
|
roomNotificationSettingsItem = roomNotificationSettingsItems().first(),
|
||||||
|
onOptionSelected = {},
|
||||||
isSelected = true,
|
isSelected = true,
|
||||||
)
|
)
|
||||||
RoomNotificationSettingsOption(
|
RoomNotificationSettingsOption(
|
||||||
roomNotificationSettingsItem = roomNotificationSettingsItems().last(),
|
roomNotificationSettingsItem = roomNotificationSettingsItems().last(),
|
||||||
|
onOptionSelected = {},
|
||||||
isSelected = false,
|
isSelected = false,
|
||||||
enabled = false,
|
enabled = false,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -26,8 +26,8 @@ import io.element.android.libraries.matrix.api.room.RoomNotificationMode
|
||||||
fun RoomNotificationSettingsOptions(
|
fun RoomNotificationSettingsOptions(
|
||||||
selected: RoomNotificationMode?,
|
selected: RoomNotificationMode?,
|
||||||
enabled: Boolean,
|
enabled: Boolean,
|
||||||
|
onOptionSelected: (RoomNotificationSettingsItem) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onOptionSelected: (RoomNotificationSettingsItem) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
val items = roomNotificationSettingsItems()
|
val items = roomNotificationSettingsItems()
|
||||||
Column(modifier = modifier.selectableGroup()) {
|
Column(modifier = modifier.selectableGroup()) {
|
||||||
|
|
|
||||||
|
|
@ -74,9 +74,9 @@ fun RoomNotificationSettingsView(
|
||||||
@Composable
|
@Composable
|
||||||
private fun RoomSpecificNotificationSettingsView(
|
private fun RoomSpecificNotificationSettingsView(
|
||||||
state: RoomNotificationSettingsState,
|
state: RoomNotificationSettingsState,
|
||||||
|
onShowGlobalNotifications: () -> Unit,
|
||||||
|
onBackPressed: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onShowGlobalNotifications: () -> Unit = {},
|
|
||||||
onBackPressed: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Scaffold(
|
Scaffold(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -173,8 +173,8 @@ private fun RoomSpecificNotificationSettingsView(
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
private fun RoomNotificationSettingsTopBar(
|
private fun RoomNotificationSettingsTopBar(
|
||||||
|
onBackPressed: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onBackPressed: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
TopAppBar(
|
TopAppBar(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
|
||||||
|
|
@ -101,8 +101,8 @@ fun UserDefinedRoomNotificationSettingsView(
|
||||||
@Composable
|
@Composable
|
||||||
private fun UserDefinedRoomNotificationSettingsTopBar(
|
private fun UserDefinedRoomNotificationSettingsTopBar(
|
||||||
roomName: String,
|
roomName: String,
|
||||||
|
onBackPressed: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onBackPressed: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
TopAppBar(
|
TopAppBar(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
|
||||||
|
|
@ -32,8 +32,8 @@ import io.element.android.libraries.designsystem.theme.components.Text
|
||||||
fun LabelledCheckbox(
|
fun LabelledCheckbox(
|
||||||
checked: Boolean,
|
checked: Boolean,
|
||||||
text: String,
|
text: String,
|
||||||
|
onCheckedChange: (Boolean) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onCheckedChange: (Boolean) -> Unit = {},
|
|
||||||
enabled: Boolean = true,
|
enabled: Boolean = true,
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
|
|
@ -60,6 +60,7 @@ internal fun LabelledCheckboxPreview() = ElementThemedPreview { ContentToPreview
|
||||||
private fun ContentToPreview() {
|
private fun ContentToPreview() {
|
||||||
LabelledCheckbox(
|
LabelledCheckbox(
|
||||||
checked = true,
|
checked = true,
|
||||||
|
onCheckedChange = {},
|
||||||
text = "Some text",
|
text = "Some text",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,12 +35,12 @@ import io.element.android.libraries.theme.ElementTheme
|
||||||
fun LabelledOutlinedTextField(
|
fun LabelledOutlinedTextField(
|
||||||
label: String,
|
label: String,
|
||||||
value: String,
|
value: String,
|
||||||
|
onValueChange: (String) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
placeholder: String? = null,
|
placeholder: String? = null,
|
||||||
singleLine: Boolean = false,
|
singleLine: Boolean = false,
|
||||||
maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE,
|
maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE,
|
||||||
keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
|
keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
|
||||||
onValueChange: (String) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Column(
|
Column(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -72,11 +72,13 @@ internal fun LabelledOutlinedTextFieldPreview() = ElementPreview {
|
||||||
LabelledOutlinedTextField(
|
LabelledOutlinedTextField(
|
||||||
label = "Room name",
|
label = "Room name",
|
||||||
value = "",
|
value = "",
|
||||||
|
onValueChange = {},
|
||||||
placeholder = "e.g. Product Sprint",
|
placeholder = "e.g. Product Sprint",
|
||||||
)
|
)
|
||||||
LabelledOutlinedTextField(
|
LabelledOutlinedTextField(
|
||||||
label = "Room name",
|
label = "Room name",
|
||||||
value = "a room name",
|
value = "a room name",
|
||||||
|
onValueChange = {},
|
||||||
placeholder = "e.g. Product Sprint",
|
placeholder = "e.g. Product Sprint",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,12 +35,12 @@ import io.element.android.libraries.theme.ElementTheme
|
||||||
fun LabelledTextField(
|
fun LabelledTextField(
|
||||||
label: String,
|
label: String,
|
||||||
value: String,
|
value: String,
|
||||||
|
onValueChange: (String) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
placeholder: String? = null,
|
placeholder: String? = null,
|
||||||
singleLine: Boolean = false,
|
singleLine: Boolean = false,
|
||||||
maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE,
|
maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE,
|
||||||
keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
|
keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
|
||||||
onValueChange: (String) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Column(
|
Column(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -72,11 +72,13 @@ internal fun LabelledTextFieldPreview() = ElementPreview {
|
||||||
LabelledTextField(
|
LabelledTextField(
|
||||||
label = "Room name",
|
label = "Room name",
|
||||||
value = "",
|
value = "",
|
||||||
|
onValueChange = {},
|
||||||
placeholder = "e.g. Product Sprint",
|
placeholder = "e.g. Product Sprint",
|
||||||
)
|
)
|
||||||
LabelledTextField(
|
LabelledTextField(
|
||||||
label = "Room name",
|
label = "Room name",
|
||||||
value = "a room name",
|
value = "a room name",
|
||||||
|
onValueChange = {},
|
||||||
placeholder = "e.g. Product Sprint",
|
placeholder = "e.g. Product Sprint",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,12 +32,12 @@ import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
@Composable
|
@Composable
|
||||||
fun RetryDialog(
|
fun RetryDialog(
|
||||||
content: String,
|
content: String,
|
||||||
|
onRetry: () -> Unit,
|
||||||
|
onDismiss: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
title: String = RetryDialogDefaults.title,
|
title: String = RetryDialogDefaults.title,
|
||||||
retryText: String = RetryDialogDefaults.retryText,
|
retryText: String = RetryDialogDefaults.retryText,
|
||||||
dismissText: String = RetryDialogDefaults.dismissText,
|
dismissText: String = RetryDialogDefaults.dismissText,
|
||||||
onRetry: () -> Unit = {},
|
|
||||||
onDismiss: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
BasicAlertDialog(modifier = modifier, onDismissRequest = onDismiss) {
|
BasicAlertDialog(modifier = modifier, onDismissRequest = onDismiss) {
|
||||||
RetryDialogContent(
|
RetryDialogContent(
|
||||||
|
|
@ -54,12 +54,12 @@ fun RetryDialog(
|
||||||
@Composable
|
@Composable
|
||||||
private fun RetryDialogContent(
|
private fun RetryDialogContent(
|
||||||
content: String,
|
content: String,
|
||||||
|
onRetry: () -> Unit,
|
||||||
|
onDismiss: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
title: String = RetryDialogDefaults.title,
|
title: String = RetryDialogDefaults.title,
|
||||||
retryText: String = RetryDialogDefaults.retryText,
|
retryText: String = RetryDialogDefaults.retryText,
|
||||||
dismissText: String = RetryDialogDefaults.dismissText,
|
dismissText: String = RetryDialogDefaults.dismissText,
|
||||||
onRetry: () -> Unit = {},
|
|
||||||
onDismiss: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
SimpleAlertDialogContent(
|
SimpleAlertDialogContent(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -85,6 +85,8 @@ internal fun RetryDialogPreview() {
|
||||||
DialogPreview {
|
DialogPreview {
|
||||||
RetryDialogContent(
|
RetryDialogContent(
|
||||||
content = "Content",
|
content = "Content",
|
||||||
|
onRetry = {},
|
||||||
|
onDismiss = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -59,9 +59,9 @@ private const val DEFAULT_GRAPHICS_LAYER_ALPHA: Float = 0.99F
|
||||||
* @param playbackProgress The current playback progress, between 0 and 1.
|
* @param playbackProgress The current playback progress, between 0 and 1.
|
||||||
* @param showCursor Whether to show the cursor or not.
|
* @param showCursor Whether to show the cursor or not.
|
||||||
* @param waveform The waveform to display. Use [FakeWaveformFactory] to generate a fake waveform.
|
* @param waveform The waveform to display. Use [FakeWaveformFactory] to generate a fake waveform.
|
||||||
|
* @param onSeek Callback when the user seeks the waveform. Called with a value between 0 and 1.
|
||||||
* @param modifier The modifier to be applied to the view.
|
* @param modifier The modifier to be applied to the view.
|
||||||
* @param seekEnabled Whether the user can seek the waveform or not.
|
* @param seekEnabled Whether the user can seek the waveform or not.
|
||||||
* @param onSeek Callback when the user seeks the waveform. Called with a value between 0 and 1.
|
|
||||||
* @param brush The brush to use to draw the waveform.
|
* @param brush The brush to use to draw the waveform.
|
||||||
* @param progressBrush The brush to use to draw the progress.
|
* @param progressBrush The brush to use to draw the progress.
|
||||||
* @param cursorBrush The brush to use to draw the cursor.
|
* @param cursorBrush The brush to use to draw the cursor.
|
||||||
|
|
@ -74,9 +74,9 @@ fun WaveformPlaybackView(
|
||||||
playbackProgress: Float,
|
playbackProgress: Float,
|
||||||
showCursor: Boolean,
|
showCursor: Boolean,
|
||||||
waveform: ImmutableList<Float>,
|
waveform: ImmutableList<Float>,
|
||||||
|
onSeek: (progress: Float) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
seekEnabled: Boolean = true,
|
seekEnabled: Boolean = true,
|
||||||
onSeek: (progress: Float) -> Unit = {},
|
|
||||||
brush: Brush = SolidColor(ElementTheme.colors.iconQuaternary),
|
brush: Brush = SolidColor(ElementTheme.colors.iconQuaternary),
|
||||||
progressBrush: Brush = SolidColor(ElementTheme.colors.iconSecondary),
|
progressBrush: Brush = SolidColor(ElementTheme.colors.iconSecondary),
|
||||||
cursorBrush: Brush = SolidColor(ElementTheme.colors.iconAccentTertiary),
|
cursorBrush: Brush = SolidColor(ElementTheme.colors.iconAccentTertiary),
|
||||||
|
|
@ -183,18 +183,21 @@ internal fun WaveformPlaybackViewPreview() = ElementPreview {
|
||||||
modifier = Modifier.height(34.dp),
|
modifier = Modifier.height(34.dp),
|
||||||
showCursor = false,
|
showCursor = false,
|
||||||
playbackProgress = 0.5f,
|
playbackProgress = 0.5f,
|
||||||
|
onSeek = {},
|
||||||
waveform = persistentListOf(),
|
waveform = persistentListOf(),
|
||||||
)
|
)
|
||||||
WaveformPlaybackView(
|
WaveformPlaybackView(
|
||||||
modifier = Modifier.height(34.dp),
|
modifier = Modifier.height(34.dp),
|
||||||
showCursor = false,
|
showCursor = false,
|
||||||
playbackProgress = 0.5f,
|
playbackProgress = 0.5f,
|
||||||
|
onSeek = {},
|
||||||
waveform = persistentListOf(0f, 1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f, 9f, 8f, 7f, 6f, 5f, 4f, 3f, 2f, 1f, 0f),
|
waveform = persistentListOf(0f, 1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f, 9f, 8f, 7f, 6f, 5f, 4f, 3f, 2f, 1f, 0f),
|
||||||
)
|
)
|
||||||
WaveformPlaybackView(
|
WaveformPlaybackView(
|
||||||
modifier = Modifier.height(34.dp),
|
modifier = Modifier.height(34.dp),
|
||||||
showCursor = true,
|
showCursor = true,
|
||||||
playbackProgress = 0.5f,
|
playbackProgress = 0.5f,
|
||||||
|
onSeek = {},
|
||||||
waveform = List(1024) { it / 1024f }.toPersistentList(),
|
waveform = List(1024) { it / 1024f }.toPersistentList(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -82,13 +82,15 @@ private fun ContentToPreview() {
|
||||||
PreferenceSwitch(
|
PreferenceSwitch(
|
||||||
title = "Switch",
|
title = "Switch",
|
||||||
iconResourceId = CommonDrawables.ic_compound_threads,
|
iconResourceId = CommonDrawables.ic_compound_threads,
|
||||||
isChecked = true
|
isChecked = true,
|
||||||
|
onCheckedChange = {},
|
||||||
)
|
)
|
||||||
PreferenceSlide(
|
PreferenceSlide(
|
||||||
title = "Slide",
|
title = "Slide",
|
||||||
summary = "Summary",
|
summary = "Summary",
|
||||||
value = 0.75F,
|
value = 0.75F,
|
||||||
showIconAreaIfNoIcon = true,
|
showIconAreaIfNoIcon = true,
|
||||||
|
onValueChange = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -44,13 +44,13 @@ import io.element.android.libraries.theme.ElementTheme
|
||||||
fun PreferenceCheckbox(
|
fun PreferenceCheckbox(
|
||||||
title: String,
|
title: String,
|
||||||
isChecked: Boolean,
|
isChecked: Boolean,
|
||||||
|
onCheckedChange: (Boolean) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
supportingText: String? = null,
|
supportingText: String? = null,
|
||||||
enabled: Boolean = true,
|
enabled: Boolean = true,
|
||||||
icon: ImageVector? = null,
|
icon: ImageVector? = null,
|
||||||
@DrawableRes iconResourceId: Int? = null,
|
@DrawableRes iconResourceId: Int? = null,
|
||||||
showIconAreaIfNoIcon: Boolean = false,
|
showIconAreaIfNoIcon: Boolean = false,
|
||||||
onCheckedChange: (Boolean) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
|
|
@ -104,14 +104,16 @@ private fun ContentToPreview() {
|
||||||
title = "Checkbox",
|
title = "Checkbox",
|
||||||
iconResourceId = CommonDrawables.ic_compound_threads,
|
iconResourceId = CommonDrawables.ic_compound_threads,
|
||||||
enabled = true,
|
enabled = true,
|
||||||
isChecked = true
|
isChecked = true,
|
||||||
|
onCheckedChange = {},
|
||||||
)
|
)
|
||||||
PreferenceCheckbox(
|
PreferenceCheckbox(
|
||||||
title = "Checkbox with supporting text",
|
title = "Checkbox with supporting text",
|
||||||
supportingText = "Supporting text",
|
supportingText = "Supporting text",
|
||||||
iconResourceId = CommonDrawables.ic_compound_threads,
|
iconResourceId = CommonDrawables.ic_compound_threads,
|
||||||
enabled = true,
|
enabled = true,
|
||||||
isChecked = true
|
isChecked = true,
|
||||||
|
onCheckedChange = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,8 +46,8 @@ import io.element.android.libraries.theme.ElementTheme
|
||||||
@Composable
|
@Composable
|
||||||
fun PreferencePage(
|
fun PreferencePage(
|
||||||
title: String,
|
title: String,
|
||||||
|
onBackPressed: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onBackPressed: () -> Unit = {},
|
|
||||||
snackbarHost: @Composable () -> Unit = {},
|
snackbarHost: @Composable () -> Unit = {},
|
||||||
content: @Composable ColumnScope.() -> Unit,
|
content: @Composable ColumnScope.() -> Unit,
|
||||||
) {
|
) {
|
||||||
|
|
@ -81,8 +81,8 @@ fun PreferencePage(
|
||||||
@Composable
|
@Composable
|
||||||
private fun PreferenceTopAppBar(
|
private fun PreferenceTopAppBar(
|
||||||
title: String,
|
title: String,
|
||||||
|
onBackPressed: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onBackPressed: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
TopAppBar(
|
TopAppBar(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
|
|
@ -105,7 +105,8 @@ private fun PreferenceTopAppBar(
|
||||||
@Composable
|
@Composable
|
||||||
internal fun PreferenceViewPreview() = ElementPreview {
|
internal fun PreferenceViewPreview() = ElementPreview {
|
||||||
PreferencePage(
|
PreferencePage(
|
||||||
title = "Preference screen"
|
title = "Preference screen",
|
||||||
|
onBackPressed = {},
|
||||||
) {
|
) {
|
||||||
PreferenceCategory(
|
PreferenceCategory(
|
||||||
title = "Category title",
|
title = "Category title",
|
||||||
|
|
@ -120,12 +121,14 @@ internal fun PreferenceViewPreview() = ElementPreview {
|
||||||
title = "Switch",
|
title = "Switch",
|
||||||
iconResourceId = CommonDrawables.ic_compound_threads,
|
iconResourceId = CommonDrawables.ic_compound_threads,
|
||||||
isChecked = true,
|
isChecked = true,
|
||||||
|
onCheckedChange = {},
|
||||||
)
|
)
|
||||||
PreferenceDivider()
|
PreferenceDivider()
|
||||||
PreferenceCheckbox(
|
PreferenceCheckbox(
|
||||||
title = "Checkbox",
|
title = "Checkbox",
|
||||||
iconResourceId = CommonDrawables.ic_compound_notifications,
|
iconResourceId = CommonDrawables.ic_compound_notifications,
|
||||||
isChecked = true,
|
isChecked = true,
|
||||||
|
onCheckedChange = {},
|
||||||
)
|
)
|
||||||
PreferenceDivider()
|
PreferenceDivider()
|
||||||
PreferenceSlide(
|
PreferenceSlide(
|
||||||
|
|
@ -133,6 +136,7 @@ internal fun PreferenceViewPreview() = ElementPreview {
|
||||||
summary = "Summary",
|
summary = "Summary",
|
||||||
value = 0.75F,
|
value = 0.75F,
|
||||||
showIconAreaIfNoIcon = true,
|
showIconAreaIfNoIcon = true,
|
||||||
|
onValueChange = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@ fun PreferenceSlide(
|
||||||
title: String,
|
title: String,
|
||||||
@FloatRange(0.0, 1.0)
|
@FloatRange(0.0, 1.0)
|
||||||
value: Float,
|
value: Float,
|
||||||
|
onValueChange: (Float) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
icon: ImageVector? = null,
|
icon: ImageVector? = null,
|
||||||
@DrawableRes iconResourceId: Int? = null,
|
@DrawableRes iconResourceId: Int? = null,
|
||||||
|
|
@ -49,7 +50,6 @@ fun PreferenceSlide(
|
||||||
enabled: Boolean = true,
|
enabled: Boolean = true,
|
||||||
summary: String? = null,
|
summary: String? = null,
|
||||||
steps: Int = 0,
|
steps: Int = 0,
|
||||||
onValueChange: (Float) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
|
|
@ -98,6 +98,7 @@ private fun ContentToPreview() {
|
||||||
iconResourceId = CommonDrawables.ic_compound_user_profile,
|
iconResourceId = CommonDrawables.ic_compound_user_profile,
|
||||||
title = "Slide",
|
title = "Slide",
|
||||||
summary = "Summary",
|
summary = "Summary",
|
||||||
value = 0.75F
|
value = 0.75F,
|
||||||
|
onValueChange = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,13 +46,13 @@ import io.element.android.libraries.theme.ElementTheme
|
||||||
fun PreferenceSwitch(
|
fun PreferenceSwitch(
|
||||||
title: String,
|
title: String,
|
||||||
isChecked: Boolean,
|
isChecked: Boolean,
|
||||||
|
onCheckedChange: (Boolean) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
subtitle: String? = null,
|
subtitle: String? = null,
|
||||||
enabled: Boolean = true,
|
enabled: Boolean = true,
|
||||||
icon: ImageVector? = null,
|
icon: ImageVector? = null,
|
||||||
@DrawableRes iconResourceId: Int? = null,
|
@DrawableRes iconResourceId: Int? = null,
|
||||||
showIconAreaIfNoIcon: Boolean = false,
|
showIconAreaIfNoIcon: Boolean = false,
|
||||||
onCheckedChange: (Boolean) -> Unit = {},
|
|
||||||
switchAlignment: Alignment.Vertical = Alignment.CenterVertically
|
switchAlignment: Alignment.Vertical = Alignment.CenterVertically
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
|
|
@ -111,6 +111,7 @@ private fun ContentToPreview() {
|
||||||
subtitle = "Subtitle Switch",
|
subtitle = "Subtitle Switch",
|
||||||
iconResourceId = CommonDrawables.ic_compound_threads,
|
iconResourceId = CommonDrawables.ic_compound_threads,
|
||||||
enabled = true,
|
enabled = true,
|
||||||
isChecked = true
|
isChecked = true,
|
||||||
|
onCheckedChange = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,8 +52,8 @@ import kotlinx.coroutines.launch
|
||||||
fun AvatarActionBottomSheet(
|
fun AvatarActionBottomSheet(
|
||||||
actions: ImmutableList<AvatarAction>,
|
actions: ImmutableList<AvatarAction>,
|
||||||
modalBottomSheetState: ModalBottomSheetState,
|
modalBottomSheetState: ModalBottomSheetState,
|
||||||
|
onActionSelected: (action: AvatarAction) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onActionSelected: (action: AvatarAction) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
val coroutineScope = rememberCoroutineScope()
|
val coroutineScope = rememberCoroutineScope()
|
||||||
fun onItemActionClicked(itemAction: AvatarAction) {
|
fun onItemActionClicked(itemAction: AvatarAction) {
|
||||||
|
|
@ -119,5 +119,6 @@ internal fun AvatarActionBottomSheetPreview() = ElementPreview {
|
||||||
initialValue = ModalBottomSheetValue.Expanded,
|
initialValue = ModalBottomSheetValue.Expanded,
|
||||||
density = LocalDensity.current,
|
density = LocalDensity.current,
|
||||||
),
|
),
|
||||||
|
onActionSelected = { },
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,8 +21,8 @@ import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
||||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||||
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||||
import io.element.android.libraries.matrix.api.user.MatrixUser
|
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||||
import io.element.android.libraries.matrix.ui.model.getAvatarData
|
import io.element.android.libraries.matrix.ui.model.getAvatarData
|
||||||
import io.element.android.libraries.matrix.ui.model.getBestName
|
import io.element.android.libraries.matrix.ui.model.getBestName
|
||||||
|
|
@ -31,9 +31,9 @@ import io.element.android.libraries.matrix.ui.model.getBestName
|
||||||
fun CheckableMatrixUserRow(
|
fun CheckableMatrixUserRow(
|
||||||
checked: Boolean,
|
checked: Boolean,
|
||||||
matrixUser: MatrixUser,
|
matrixUser: MatrixUser,
|
||||||
|
onCheckedChange: (Boolean) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
avatarSize: AvatarSize = AvatarSize.UserListItem,
|
avatarSize: AvatarSize = AvatarSize.UserListItem,
|
||||||
onCheckedChange: (Boolean) -> Unit = {},
|
|
||||||
enabled: Boolean = true,
|
enabled: Boolean = true,
|
||||||
) = CheckableUserRow(
|
) = CheckableUserRow(
|
||||||
checked = checked,
|
checked = checked,
|
||||||
|
|
@ -49,9 +49,27 @@ fun CheckableMatrixUserRow(
|
||||||
@Composable
|
@Composable
|
||||||
internal fun CheckableMatrixUserRowPreview(@PreviewParameter(MatrixUserProvider::class) matrixUser: MatrixUser) = ElementPreview {
|
internal fun CheckableMatrixUserRowPreview(@PreviewParameter(MatrixUserProvider::class) matrixUser: MatrixUser) = ElementPreview {
|
||||||
Column {
|
Column {
|
||||||
CheckableMatrixUserRow(checked = true, matrixUser)
|
CheckableMatrixUserRow(
|
||||||
CheckableMatrixUserRow(checked = false, matrixUser)
|
checked = true,
|
||||||
CheckableMatrixUserRow(checked = true, matrixUser, enabled = false)
|
onCheckedChange = { },
|
||||||
CheckableMatrixUserRow(checked = false, matrixUser, enabled = false)
|
matrixUser = matrixUser,
|
||||||
|
)
|
||||||
|
CheckableMatrixUserRow(
|
||||||
|
checked = false,
|
||||||
|
onCheckedChange = { },
|
||||||
|
matrixUser = matrixUser,
|
||||||
|
)
|
||||||
|
CheckableMatrixUserRow(
|
||||||
|
checked = true,
|
||||||
|
onCheckedChange = { },
|
||||||
|
matrixUser = matrixUser,
|
||||||
|
enabled = false,
|
||||||
|
)
|
||||||
|
CheckableMatrixUserRow(
|
||||||
|
checked = false,
|
||||||
|
onCheckedChange = { },
|
||||||
|
matrixUser = matrixUser,
|
||||||
|
enabled = false,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,10 +37,10 @@ import io.element.android.libraries.matrix.ui.model.getAvatarData
|
||||||
@Composable
|
@Composable
|
||||||
fun CheckableUnresolvedUserRow(
|
fun CheckableUnresolvedUserRow(
|
||||||
checked: Boolean,
|
checked: Boolean,
|
||||||
|
onCheckedChange: (Boolean) -> Unit,
|
||||||
avatarData: AvatarData,
|
avatarData: AvatarData,
|
||||||
id: String,
|
id: String,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onCheckedChange: (Boolean) -> Unit = {},
|
|
||||||
enabled: Boolean = true,
|
enabled: Boolean = true,
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
|
|
@ -71,12 +71,34 @@ fun CheckableUnresolvedUserRow(
|
||||||
internal fun CheckableUnresolvedUserRowPreview() = ElementThemedPreview {
|
internal fun CheckableUnresolvedUserRowPreview() = ElementThemedPreview {
|
||||||
val matrixUser = aMatrixUser()
|
val matrixUser = aMatrixUser()
|
||||||
Column {
|
Column {
|
||||||
CheckableUnresolvedUserRow(false, matrixUser.getAvatarData(AvatarSize.UserListItem), matrixUser.userId.value)
|
CheckableUnresolvedUserRow(
|
||||||
|
checked = false,
|
||||||
|
onCheckedChange = { },
|
||||||
|
avatarData = matrixUser.getAvatarData(AvatarSize.UserListItem),
|
||||||
|
id = matrixUser.userId.value,
|
||||||
|
)
|
||||||
HorizontalDivider()
|
HorizontalDivider()
|
||||||
CheckableUnresolvedUserRow(true, matrixUser.getAvatarData(AvatarSize.UserListItem), matrixUser.userId.value)
|
CheckableUnresolvedUserRow(
|
||||||
|
checked = true,
|
||||||
|
onCheckedChange = { },
|
||||||
|
avatarData = matrixUser.getAvatarData(AvatarSize.UserListItem),
|
||||||
|
id = matrixUser.userId.value,
|
||||||
|
)
|
||||||
HorizontalDivider()
|
HorizontalDivider()
|
||||||
CheckableUnresolvedUserRow(false, matrixUser.getAvatarData(AvatarSize.UserListItem), matrixUser.userId.value, enabled = false)
|
CheckableUnresolvedUserRow(
|
||||||
|
checked = false,
|
||||||
|
onCheckedChange = { },
|
||||||
|
avatarData = matrixUser.getAvatarData(AvatarSize.UserListItem),
|
||||||
|
id = matrixUser.userId.value,
|
||||||
|
enabled = false,
|
||||||
|
)
|
||||||
HorizontalDivider()
|
HorizontalDivider()
|
||||||
CheckableUnresolvedUserRow(true, matrixUser.getAvatarData(AvatarSize.UserListItem), matrixUser.userId.value, enabled = false)
|
CheckableUnresolvedUserRow(
|
||||||
|
checked = true,
|
||||||
|
onCheckedChange = { },
|
||||||
|
avatarData = matrixUser.getAvatarData(AvatarSize.UserListItem),
|
||||||
|
id = matrixUser.userId.value,
|
||||||
|
enabled = false,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,11 +31,11 @@ import io.element.android.libraries.designsystem.theme.components.Checkbox
|
||||||
@Composable
|
@Composable
|
||||||
fun CheckableUserRow(
|
fun CheckableUserRow(
|
||||||
checked: Boolean,
|
checked: Boolean,
|
||||||
|
onCheckedChange: (Boolean) -> Unit,
|
||||||
avatarData: AvatarData,
|
avatarData: AvatarData,
|
||||||
name: String,
|
name: String,
|
||||||
subtext: String?,
|
subtext: String?,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onCheckedChange: (Boolean) -> Unit = {},
|
|
||||||
enabled: Boolean = true,
|
enabled: Boolean = true,
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ fun MatrixUserHeader(
|
||||||
matrixUser: MatrixUser?,
|
matrixUser: MatrixUser?,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
// TODO handle click on this item, to let the user be able to update their profile.
|
// TODO handle click on this item, to let the user be able to update their profile.
|
||||||
// onClick: () -> Unit = {},
|
// onClick: () -> Unit,
|
||||||
) {
|
) {
|
||||||
if (matrixUser == null) {
|
if (matrixUser == null) {
|
||||||
MatrixUserHeaderPlaceholder(modifier = modifier)
|
MatrixUserHeaderPlaceholder(modifier = modifier)
|
||||||
|
|
@ -60,7 +60,7 @@ fun MatrixUserHeader(
|
||||||
private fun MatrixUserHeaderContent(
|
private fun MatrixUserHeaderContent(
|
||||||
matrixUser: MatrixUser,
|
matrixUser: MatrixUser,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
// onClick: () -> Unit = {},
|
// onClick: () -> Unit,
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
|
|
|
||||||
|
|
@ -50,8 +50,8 @@ import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
@Composable
|
@Composable
|
||||||
fun SelectedRoom(
|
fun SelectedRoom(
|
||||||
roomSummary: RoomSummaryDetails,
|
roomSummary: RoomSummaryDetails,
|
||||||
|
onRoomRemoved: (RoomSummaryDetails) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onRoomRemoved: (RoomSummaryDetails) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Box(
|
Box(
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
|
|
@ -104,6 +104,7 @@ internal fun SelectedRoomPreview() = ElementPreview {
|
||||||
lastMessageTimestamp = null,
|
lastMessageTimestamp = null,
|
||||||
unreadNotificationCount = 0,
|
unreadNotificationCount = 0,
|
||||||
inviter = null,
|
inviter = null,
|
||||||
)
|
),
|
||||||
|
onRoomRemoved = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,8 +36,8 @@ import androidx.compose.ui.text.style.TextOverflow
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import io.element.android.libraries.designsystem.components.avatar.Avatar
|
import io.element.android.libraries.designsystem.components.avatar.Avatar
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
||||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||||
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||||
import io.element.android.libraries.designsystem.theme.components.Icon
|
import io.element.android.libraries.designsystem.theme.components.Icon
|
||||||
import io.element.android.libraries.designsystem.theme.components.Surface
|
import io.element.android.libraries.designsystem.theme.components.Surface
|
||||||
import io.element.android.libraries.designsystem.theme.components.Text
|
import io.element.android.libraries.designsystem.theme.components.Text
|
||||||
|
|
@ -50,8 +50,8 @@ import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
@Composable
|
@Composable
|
||||||
fun SelectedUser(
|
fun SelectedUser(
|
||||||
matrixUser: MatrixUser,
|
matrixUser: MatrixUser,
|
||||||
|
onUserRemoved: (MatrixUser) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onUserRemoved: (MatrixUser) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Box(
|
Box(
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
|
|
@ -93,5 +93,8 @@ fun SelectedUser(
|
||||||
@PreviewsDayNight
|
@PreviewsDayNight
|
||||||
@Composable
|
@Composable
|
||||||
internal fun SelectedUserPreview() = ElementPreview {
|
internal fun SelectedUserPreview() = ElementPreview {
|
||||||
SelectedUser(aMatrixUser())
|
SelectedUser(
|
||||||
|
aMatrixUser(),
|
||||||
|
onUserRemoved = {},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,8 +37,8 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.layout.Layout
|
import androidx.compose.ui.layout.Layout
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||||
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||||
import io.element.android.libraries.designsystem.text.toPx
|
import io.element.android.libraries.designsystem.text.toPx
|
||||||
import io.element.android.libraries.matrix.api.user.MatrixUser
|
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
|
|
@ -48,10 +48,10 @@ import kotlin.math.floor
|
||||||
@Composable
|
@Composable
|
||||||
fun SelectedUsersList(
|
fun SelectedUsersList(
|
||||||
selectedUsers: ImmutableList<MatrixUser>,
|
selectedUsers: ImmutableList<MatrixUser>,
|
||||||
|
onUserRemoved: (MatrixUser) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
autoScroll: Boolean = false,
|
autoScroll: Boolean = false,
|
||||||
contentPadding: PaddingValues = PaddingValues(0.dp),
|
contentPadding: PaddingValues = PaddingValues(0.dp),
|
||||||
onUserRemoved: (MatrixUser) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
val lazyListState = rememberLazyListState()
|
val lazyListState = rememberLazyListState()
|
||||||
if (autoScroll) {
|
if (autoScroll) {
|
||||||
|
|
@ -135,6 +135,7 @@ internal fun SelectedUsersListPreview() = ElementPreview {
|
||||||
// Two users that will be visible with no scrolling
|
// Two users that will be visible with no scrolling
|
||||||
SelectedUsersList(
|
SelectedUsersList(
|
||||||
selectedUsers = aMatrixUserList().take(2).toImmutableList(),
|
selectedUsers = aMatrixUserList().take(2).toImmutableList(),
|
||||||
|
onUserRemoved = {},
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.width(200.dp)
|
.width(200.dp)
|
||||||
.border(1.dp, Color.Red)
|
.border(1.dp, Color.Red)
|
||||||
|
|
@ -144,6 +145,7 @@ internal fun SelectedUsersListPreview() = ElementPreview {
|
||||||
for (i in 0..5) {
|
for (i in 0..5) {
|
||||||
SelectedUsersList(
|
SelectedUsersList(
|
||||||
selectedUsers = aMatrixUserList().take(6).toImmutableList(),
|
selectedUsers = aMatrixUserList().take(6).toImmutableList(),
|
||||||
|
onUserRemoved = {},
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.width((200 + i * 20).dp)
|
.width((200 + i * 20).dp)
|
||||||
.border(1.dp, Color.Red)
|
.border(1.dp, Color.Red)
|
||||||
|
|
|
||||||
|
|
@ -68,19 +68,19 @@ import io.element.android.libraries.testtags.TestTags
|
||||||
import io.element.android.libraries.testtags.testTag
|
import io.element.android.libraries.testtags.testTag
|
||||||
import io.element.android.libraries.textcomposer.components.ComposerOptionsButton
|
import io.element.android.libraries.textcomposer.components.ComposerOptionsButton
|
||||||
import io.element.android.libraries.textcomposer.components.DismissTextFormattingButton
|
import io.element.android.libraries.textcomposer.components.DismissTextFormattingButton
|
||||||
import io.element.android.libraries.textcomposer.components.VoiceMessageRecorderButton
|
|
||||||
import io.element.android.libraries.textcomposer.components.SendButton
|
import io.element.android.libraries.textcomposer.components.SendButton
|
||||||
import io.element.android.libraries.textcomposer.components.TextFormatting
|
import io.element.android.libraries.textcomposer.components.TextFormatting
|
||||||
import io.element.android.libraries.textcomposer.components.VoiceMessageDeleteButton
|
import io.element.android.libraries.textcomposer.components.VoiceMessageDeleteButton
|
||||||
import io.element.android.libraries.textcomposer.components.VoiceMessagePreview
|
import io.element.android.libraries.textcomposer.components.VoiceMessagePreview
|
||||||
|
import io.element.android.libraries.textcomposer.components.VoiceMessageRecorderButton
|
||||||
import io.element.android.libraries.textcomposer.components.VoiceMessageRecording
|
import io.element.android.libraries.textcomposer.components.VoiceMessageRecording
|
||||||
import io.element.android.libraries.textcomposer.components.textInputRoundedCornerShape
|
import io.element.android.libraries.textcomposer.components.textInputRoundedCornerShape
|
||||||
import io.element.android.libraries.textcomposer.mentions.rememberMentionSpanProvider
|
import io.element.android.libraries.textcomposer.mentions.rememberMentionSpanProvider
|
||||||
import io.element.android.libraries.textcomposer.model.Message
|
import io.element.android.libraries.textcomposer.model.Message
|
||||||
import io.element.android.libraries.textcomposer.model.MessageComposerMode
|
import io.element.android.libraries.textcomposer.model.MessageComposerMode
|
||||||
import io.element.android.libraries.textcomposer.model.VoiceMessageRecorderEvent
|
|
||||||
import io.element.android.libraries.textcomposer.model.Suggestion
|
import io.element.android.libraries.textcomposer.model.Suggestion
|
||||||
import io.element.android.libraries.textcomposer.model.VoiceMessagePlayerEvent
|
import io.element.android.libraries.textcomposer.model.VoiceMessagePlayerEvent
|
||||||
|
import io.element.android.libraries.textcomposer.model.VoiceMessageRecorderEvent
|
||||||
import io.element.android.libraries.textcomposer.model.VoiceMessageState
|
import io.element.android.libraries.textcomposer.model.VoiceMessageState
|
||||||
import io.element.android.libraries.theme.ElementTheme
|
import io.element.android.libraries.theme.ElementTheme
|
||||||
import io.element.android.libraries.ui.strings.CommonStrings
|
import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
|
|
@ -101,20 +101,20 @@ fun TextComposer(
|
||||||
enableTextFormatting: Boolean,
|
enableTextFormatting: Boolean,
|
||||||
enableVoiceMessages: Boolean,
|
enableVoiceMessages: Boolean,
|
||||||
currentUserId: UserId,
|
currentUserId: UserId,
|
||||||
|
onRequestFocus: () -> Unit,
|
||||||
|
onSendMessage: (Message) -> Unit,
|
||||||
|
onResetComposerMode: () -> Unit,
|
||||||
|
onAddAttachment: () -> Unit,
|
||||||
|
onDismissTextFormatting: () -> Unit,
|
||||||
|
onVoiceRecorderEvent: (VoiceMessageRecorderEvent) -> Unit,
|
||||||
|
onVoicePlayerEvent: (VoiceMessagePlayerEvent) -> Unit,
|
||||||
|
onSendVoiceMessage: () -> Unit,
|
||||||
|
onDeleteVoiceMessage: () -> Unit,
|
||||||
|
onError: (Throwable) -> Unit,
|
||||||
|
onSuggestionReceived: (Suggestion?) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
showTextFormatting: Boolean = false,
|
showTextFormatting: Boolean = false,
|
||||||
subcomposing: Boolean = false,
|
subcomposing: Boolean = false,
|
||||||
onRequestFocus: () -> Unit = {},
|
|
||||||
onSendMessage: (Message) -> Unit = {},
|
|
||||||
onResetComposerMode: () -> Unit = {},
|
|
||||||
onAddAttachment: () -> Unit = {},
|
|
||||||
onDismissTextFormatting: () -> Unit = {},
|
|
||||||
onVoiceRecorderEvent: (VoiceMessageRecorderEvent) -> Unit = {},
|
|
||||||
onVoicePlayerEvent: (VoiceMessagePlayerEvent) -> Unit = {},
|
|
||||||
onSendVoiceMessage: () -> Unit = {},
|
|
||||||
onDeleteVoiceMessage: () -> Unit = {},
|
|
||||||
onError: (Throwable) -> Unit = {},
|
|
||||||
onSuggestionReceived: (Suggestion?) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
val onSendClicked = {
|
val onSendClicked = {
|
||||||
val html = if (enableTextFormatting) state.messageHtml else null
|
val html = if (enableTextFormatting) state.messageHtml else null
|
||||||
|
|
@ -591,48 +591,40 @@ private fun ReplyToModeView(
|
||||||
internal fun TextComposerSimplePreview() = ElementPreview {
|
internal fun TextComposerSimplePreview() = ElementPreview {
|
||||||
PreviewColumn(items = persistentListOf(
|
PreviewColumn(items = persistentListOf(
|
||||||
{
|
{
|
||||||
TextComposer(
|
ATextComposer(
|
||||||
RichTextEditorState("", initialFocus = true),
|
RichTextEditorState("", initialFocus = true),
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
onSendMessage = {},
|
|
||||||
composerMode = MessageComposerMode.Normal,
|
composerMode = MessageComposerMode.Normal,
|
||||||
onResetComposerMode = {},
|
|
||||||
enableTextFormatting = true,
|
enableTextFormatting = true,
|
||||||
enableVoiceMessages = true,
|
enableVoiceMessages = true,
|
||||||
currentUserId = UserId("@alice:localhost"),
|
currentUserId = UserId("@alice:localhost"),
|
||||||
)
|
)
|
||||||
}, {
|
}, {
|
||||||
TextComposer(
|
ATextComposer(
|
||||||
RichTextEditorState("A message", initialFocus = true),
|
RichTextEditorState("A message", initialFocus = true),
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
onSendMessage = {},
|
|
||||||
composerMode = MessageComposerMode.Normal,
|
composerMode = MessageComposerMode.Normal,
|
||||||
onResetComposerMode = {},
|
|
||||||
enableTextFormatting = true,
|
enableTextFormatting = true,
|
||||||
enableVoiceMessages = true,
|
enableVoiceMessages = true,
|
||||||
currentUserId = UserId("@alice:localhost")
|
currentUserId = UserId("@alice:localhost")
|
||||||
)
|
)
|
||||||
}, {
|
}, {
|
||||||
TextComposer(
|
ATextComposer(
|
||||||
RichTextEditorState(
|
RichTextEditorState(
|
||||||
"A message\nWith several lines\nTo preview larger textfields and long lines with overflow",
|
"A message\nWith several lines\nTo preview larger textfields and long lines with overflow",
|
||||||
initialFocus = true
|
initialFocus = true
|
||||||
),
|
),
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
onSendMessage = {},
|
|
||||||
composerMode = MessageComposerMode.Normal,
|
composerMode = MessageComposerMode.Normal,
|
||||||
onResetComposerMode = {},
|
|
||||||
enableTextFormatting = true,
|
enableTextFormatting = true,
|
||||||
enableVoiceMessages = true,
|
enableVoiceMessages = true,
|
||||||
currentUserId = UserId("@alice:localhost")
|
currentUserId = UserId("@alice:localhost")
|
||||||
)
|
)
|
||||||
}, {
|
}, {
|
||||||
TextComposer(
|
ATextComposer(
|
||||||
RichTextEditorState("A message without focus", initialFocus = false),
|
RichTextEditorState("A message without focus", initialFocus = false),
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
onSendMessage = {},
|
|
||||||
composerMode = MessageComposerMode.Normal,
|
composerMode = MessageComposerMode.Normal,
|
||||||
onResetComposerMode = {},
|
|
||||||
enableTextFormatting = true,
|
enableTextFormatting = true,
|
||||||
enableVoiceMessages = true,
|
enableVoiceMessages = true,
|
||||||
currentUserId = UserId("@alice:localhost")
|
currentUserId = UserId("@alice:localhost")
|
||||||
|
|
@ -645,7 +637,7 @@ internal fun TextComposerSimplePreview() = ElementPreview {
|
||||||
@Composable
|
@Composable
|
||||||
internal fun TextComposerFormattingPreview() = ElementPreview {
|
internal fun TextComposerFormattingPreview() = ElementPreview {
|
||||||
PreviewColumn(items = persistentListOf({
|
PreviewColumn(items = persistentListOf({
|
||||||
TextComposer(
|
ATextComposer(
|
||||||
RichTextEditorState("", initialFocus = false),
|
RichTextEditorState("", initialFocus = false),
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
showTextFormatting = true,
|
showTextFormatting = true,
|
||||||
|
|
@ -655,7 +647,7 @@ internal fun TextComposerFormattingPreview() = ElementPreview {
|
||||||
currentUserId = UserId("@alice:localhost")
|
currentUserId = UserId("@alice:localhost")
|
||||||
)
|
)
|
||||||
}, {
|
}, {
|
||||||
TextComposer(
|
ATextComposer(
|
||||||
RichTextEditorState("A message", initialFocus = false),
|
RichTextEditorState("A message", initialFocus = false),
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
showTextFormatting = true,
|
showTextFormatting = true,
|
||||||
|
|
@ -665,7 +657,7 @@ internal fun TextComposerFormattingPreview() = ElementPreview {
|
||||||
currentUserId = UserId("@alice:localhost")
|
currentUserId = UserId("@alice:localhost")
|
||||||
)
|
)
|
||||||
}, {
|
}, {
|
||||||
TextComposer(
|
ATextComposer(
|
||||||
RichTextEditorState("A message\nWith several lines\nTo preview larger textfields and long lines with overflow", initialFocus = false),
|
RichTextEditorState("A message\nWith several lines\nTo preview larger textfields and long lines with overflow", initialFocus = false),
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
showTextFormatting = true,
|
showTextFormatting = true,
|
||||||
|
|
@ -681,12 +673,10 @@ internal fun TextComposerFormattingPreview() = ElementPreview {
|
||||||
@Composable
|
@Composable
|
||||||
internal fun TextComposerEditPreview() = ElementPreview {
|
internal fun TextComposerEditPreview() = ElementPreview {
|
||||||
PreviewColumn(items = persistentListOf({
|
PreviewColumn(items = persistentListOf({
|
||||||
TextComposer(
|
ATextComposer(
|
||||||
RichTextEditorState("A message", initialFocus = true),
|
RichTextEditorState("A message", initialFocus = true),
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
onSendMessage = {},
|
|
||||||
composerMode = MessageComposerMode.Edit(EventId("$1234"), "Some text", TransactionId("1234")),
|
composerMode = MessageComposerMode.Edit(EventId("$1234"), "Some text", TransactionId("1234")),
|
||||||
onResetComposerMode = {},
|
|
||||||
enableTextFormatting = true,
|
enableTextFormatting = true,
|
||||||
enableVoiceMessages = true,
|
enableVoiceMessages = true,
|
||||||
currentUserId = UserId("@alice:localhost")
|
currentUserId = UserId("@alice:localhost")
|
||||||
|
|
@ -698,10 +688,9 @@ internal fun TextComposerEditPreview() = ElementPreview {
|
||||||
@Composable
|
@Composable
|
||||||
internal fun TextComposerReplyPreview() = ElementPreview {
|
internal fun TextComposerReplyPreview() = ElementPreview {
|
||||||
PreviewColumn(items = persistentListOf({
|
PreviewColumn(items = persistentListOf({
|
||||||
TextComposer(
|
ATextComposer(
|
||||||
RichTextEditorState(""),
|
RichTextEditorState(""),
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
onSendMessage = {},
|
|
||||||
composerMode = MessageComposerMode.Reply(
|
composerMode = MessageComposerMode.Reply(
|
||||||
isThreaded = false,
|
isThreaded = false,
|
||||||
senderName = "Alice",
|
senderName = "Alice",
|
||||||
|
|
@ -711,17 +700,15 @@ internal fun TextComposerReplyPreview() = ElementPreview {
|
||||||
"With several lines\n" +
|
"With several lines\n" +
|
||||||
"To preview larger textfields and long lines with overflow"
|
"To preview larger textfields and long lines with overflow"
|
||||||
),
|
),
|
||||||
onResetComposerMode = {},
|
|
||||||
enableTextFormatting = true,
|
enableTextFormatting = true,
|
||||||
enableVoiceMessages = true,
|
enableVoiceMessages = true,
|
||||||
currentUserId = UserId("@alice:localhost")
|
currentUserId = UserId("@alice:localhost")
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
TextComposer(
|
ATextComposer(
|
||||||
RichTextEditorState(""),
|
RichTextEditorState(""),
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
onSendMessage = {},
|
|
||||||
composerMode = MessageComposerMode.Reply(
|
composerMode = MessageComposerMode.Reply(
|
||||||
isThreaded = true,
|
isThreaded = true,
|
||||||
senderName = "Alice",
|
senderName = "Alice",
|
||||||
|
|
@ -731,16 +718,14 @@ internal fun TextComposerReplyPreview() = ElementPreview {
|
||||||
"With several lines\n" +
|
"With several lines\n" +
|
||||||
"To preview larger textfields and long lines with overflow"
|
"To preview larger textfields and long lines with overflow"
|
||||||
),
|
),
|
||||||
onResetComposerMode = {},
|
|
||||||
enableTextFormatting = true,
|
enableTextFormatting = true,
|
||||||
enableVoiceMessages = true,
|
enableVoiceMessages = true,
|
||||||
currentUserId = UserId("@alice:localhost")
|
currentUserId = UserId("@alice:localhost")
|
||||||
)
|
)
|
||||||
}, {
|
}, {
|
||||||
TextComposer(
|
ATextComposer(
|
||||||
RichTextEditorState("A message"),
|
RichTextEditorState("A message"),
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
onSendMessage = {},
|
|
||||||
composerMode = MessageComposerMode.Reply(
|
composerMode = MessageComposerMode.Reply(
|
||||||
isThreaded = true,
|
isThreaded = true,
|
||||||
senderName = "Alice",
|
senderName = "Alice",
|
||||||
|
|
@ -753,16 +738,14 @@ internal fun TextComposerReplyPreview() = ElementPreview {
|
||||||
),
|
),
|
||||||
defaultContent = "image.jpg"
|
defaultContent = "image.jpg"
|
||||||
),
|
),
|
||||||
onResetComposerMode = {},
|
|
||||||
enableTextFormatting = true,
|
enableTextFormatting = true,
|
||||||
enableVoiceMessages = true,
|
enableVoiceMessages = true,
|
||||||
currentUserId = UserId("@alice:localhost")
|
currentUserId = UserId("@alice:localhost")
|
||||||
)
|
)
|
||||||
}, {
|
}, {
|
||||||
TextComposer(
|
ATextComposer(
|
||||||
RichTextEditorState("A message"),
|
RichTextEditorState("A message"),
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
onSendMessage = {},
|
|
||||||
composerMode = MessageComposerMode.Reply(
|
composerMode = MessageComposerMode.Reply(
|
||||||
isThreaded = false,
|
isThreaded = false,
|
||||||
senderName = "Alice",
|
senderName = "Alice",
|
||||||
|
|
@ -775,16 +758,14 @@ internal fun TextComposerReplyPreview() = ElementPreview {
|
||||||
),
|
),
|
||||||
defaultContent = "video.mp4"
|
defaultContent = "video.mp4"
|
||||||
),
|
),
|
||||||
onResetComposerMode = {},
|
|
||||||
enableTextFormatting = true,
|
enableTextFormatting = true,
|
||||||
enableVoiceMessages = true,
|
enableVoiceMessages = true,
|
||||||
currentUserId = UserId("@alice:localhost")
|
currentUserId = UserId("@alice:localhost")
|
||||||
)
|
)
|
||||||
}, {
|
}, {
|
||||||
TextComposer(
|
ATextComposer(
|
||||||
RichTextEditorState("A message"),
|
RichTextEditorState("A message"),
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
onSendMessage = {},
|
|
||||||
composerMode = MessageComposerMode.Reply(
|
composerMode = MessageComposerMode.Reply(
|
||||||
isThreaded = false,
|
isThreaded = false,
|
||||||
senderName = "Alice",
|
senderName = "Alice",
|
||||||
|
|
@ -797,16 +778,14 @@ internal fun TextComposerReplyPreview() = ElementPreview {
|
||||||
),
|
),
|
||||||
defaultContent = "logs.txt"
|
defaultContent = "logs.txt"
|
||||||
),
|
),
|
||||||
onResetComposerMode = {},
|
|
||||||
enableTextFormatting = true,
|
enableTextFormatting = true,
|
||||||
enableVoiceMessages = true,
|
enableVoiceMessages = true,
|
||||||
currentUserId = UserId("@alice:localhost")
|
currentUserId = UserId("@alice:localhost")
|
||||||
)
|
)
|
||||||
}, {
|
}, {
|
||||||
TextComposer(
|
ATextComposer(
|
||||||
RichTextEditorState("A message", initialFocus = true),
|
RichTextEditorState("A message", initialFocus = true),
|
||||||
voiceMessageState = VoiceMessageState.Idle,
|
voiceMessageState = VoiceMessageState.Idle,
|
||||||
onSendMessage = {},
|
|
||||||
composerMode = MessageComposerMode.Reply(
|
composerMode = MessageComposerMode.Reply(
|
||||||
isThreaded = false,
|
isThreaded = false,
|
||||||
senderName = "Alice",
|
senderName = "Alice",
|
||||||
|
|
@ -819,7 +798,6 @@ internal fun TextComposerReplyPreview() = ElementPreview {
|
||||||
),
|
),
|
||||||
defaultContent = "Shared location"
|
defaultContent = "Shared location"
|
||||||
),
|
),
|
||||||
onResetComposerMode = {},
|
|
||||||
enableTextFormatting = true,
|
enableTextFormatting = true,
|
||||||
enableVoiceMessages = true,
|
enableVoiceMessages = true,
|
||||||
currentUserId = UserId("@alice:localhost")
|
currentUserId = UserId("@alice:localhost")
|
||||||
|
|
@ -834,12 +812,10 @@ internal fun TextComposerVoicePreview() = ElementPreview {
|
||||||
@Composable
|
@Composable
|
||||||
fun VoicePreview(
|
fun VoicePreview(
|
||||||
voiceMessageState: VoiceMessageState
|
voiceMessageState: VoiceMessageState
|
||||||
) = TextComposer(
|
) = ATextComposer(
|
||||||
RichTextEditorState("", initialFocus = true),
|
RichTextEditorState("", initialFocus = true),
|
||||||
voiceMessageState = voiceMessageState,
|
voiceMessageState = voiceMessageState,
|
||||||
onSendMessage = {},
|
|
||||||
composerMode = MessageComposerMode.Normal,
|
composerMode = MessageComposerMode.Normal,
|
||||||
onResetComposerMode = {},
|
|
||||||
enableTextFormatting = true,
|
enableTextFormatting = true,
|
||||||
enableVoiceMessages = true,
|
enableVoiceMessages = true,
|
||||||
currentUserId = UserId("@alice:localhost")
|
currentUserId = UserId("@alice:localhost")
|
||||||
|
|
@ -899,3 +875,35 @@ private fun PreviewColumn(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun ATextComposer(
|
||||||
|
richTextEditorState: RichTextEditorState,
|
||||||
|
voiceMessageState: VoiceMessageState,
|
||||||
|
composerMode: MessageComposerMode,
|
||||||
|
enableTextFormatting: Boolean,
|
||||||
|
enableVoiceMessages: Boolean,
|
||||||
|
currentUserId: UserId,
|
||||||
|
showTextFormatting: Boolean = false,
|
||||||
|
) {
|
||||||
|
TextComposer(
|
||||||
|
state = richTextEditorState,
|
||||||
|
showTextFormatting = showTextFormatting,
|
||||||
|
voiceMessageState = voiceMessageState,
|
||||||
|
composerMode = composerMode,
|
||||||
|
enableTextFormatting = enableTextFormatting,
|
||||||
|
enableVoiceMessages = enableVoiceMessages,
|
||||||
|
currentUserId = currentUserId,
|
||||||
|
onRequestFocus = {},
|
||||||
|
onSendMessage = {},
|
||||||
|
onResetComposerMode = {},
|
||||||
|
onAddAttachment = {},
|
||||||
|
onDismissTextFormatting = {},
|
||||||
|
onVoiceRecorderEvent = {},
|
||||||
|
onVoicePlayerEvent = {},
|
||||||
|
onSendVoiceMessage = {},
|
||||||
|
onDeleteVoiceMessage = {},
|
||||||
|
onError = {},
|
||||||
|
onSuggestionReceived = {},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,8 @@ import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
@Composable
|
@Composable
|
||||||
fun VoiceMessageDeleteButton(
|
fun VoiceMessageDeleteButton(
|
||||||
enabled: Boolean,
|
enabled: Boolean,
|
||||||
|
onClick: () -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onClick: () -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
IconButton(
|
IconButton(
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
|
|
@ -59,7 +59,13 @@ fun VoiceMessageDeleteButton(
|
||||||
@Composable
|
@Composable
|
||||||
internal fun VoiceMessageDeleteButtonPreview() = ElementPreview {
|
internal fun VoiceMessageDeleteButtonPreview() = ElementPreview {
|
||||||
Row {
|
Row {
|
||||||
VoiceMessageDeleteButton(enabled = true)
|
VoiceMessageDeleteButton(
|
||||||
VoiceMessageDeleteButton(enabled = false)
|
enabled = true,
|
||||||
|
onClick = {},
|
||||||
|
)
|
||||||
|
VoiceMessageDeleteButton(
|
||||||
|
enabled = false,
|
||||||
|
onClick = {},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -58,11 +58,11 @@ internal fun VoiceMessagePreview(
|
||||||
showCursor: Boolean,
|
showCursor: Boolean,
|
||||||
waveform: ImmutableList<Float>,
|
waveform: ImmutableList<Float>,
|
||||||
time: Duration,
|
time: Duration,
|
||||||
|
onPlayClick: () -> Unit,
|
||||||
|
onPauseClick: () -> Unit,
|
||||||
|
onSeek: (Float) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
playbackProgress: Float = 0f,
|
playbackProgress: Float = 0f,
|
||||||
onPlayClick: () -> Unit = {},
|
|
||||||
onPauseClick: () -> Unit = {},
|
|
||||||
onSeek: (Float) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
|
|
@ -163,7 +163,7 @@ internal fun VoiceMessagePreviewPreview() = ElementPreview {
|
||||||
Column(
|
Column(
|
||||||
verticalArrangement = Arrangement.spacedBy(8.dp)
|
verticalArrangement = Arrangement.spacedBy(8.dp)
|
||||||
) {
|
) {
|
||||||
VoiceMessagePreview(
|
AVoiceMessagePreview(
|
||||||
isInteractive = true,
|
isInteractive = true,
|
||||||
isPlaying = true,
|
isPlaying = true,
|
||||||
time = 2.seconds,
|
time = 2.seconds,
|
||||||
|
|
@ -171,7 +171,7 @@ internal fun VoiceMessagePreviewPreview() = ElementPreview {
|
||||||
showCursor = true,
|
showCursor = true,
|
||||||
waveform = createFakeWaveform()
|
waveform = createFakeWaveform()
|
||||||
)
|
)
|
||||||
VoiceMessagePreview(
|
AVoiceMessagePreview(
|
||||||
isInteractive = true,
|
isInteractive = true,
|
||||||
isPlaying = false,
|
isPlaying = false,
|
||||||
time = 0.seconds,
|
time = 0.seconds,
|
||||||
|
|
@ -179,7 +179,7 @@ internal fun VoiceMessagePreviewPreview() = ElementPreview {
|
||||||
showCursor = true,
|
showCursor = true,
|
||||||
waveform = createFakeWaveform()
|
waveform = createFakeWaveform()
|
||||||
)
|
)
|
||||||
VoiceMessagePreview(
|
AVoiceMessagePreview(
|
||||||
isInteractive = false,
|
isInteractive = false,
|
||||||
isPlaying = false,
|
isPlaying = false,
|
||||||
time = 789.seconds,
|
time = 789.seconds,
|
||||||
|
|
@ -189,3 +189,25 @@ internal fun VoiceMessagePreviewPreview() = ElementPreview {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun AVoiceMessagePreview(
|
||||||
|
isInteractive: Boolean,
|
||||||
|
isPlaying: Boolean,
|
||||||
|
time: Duration,
|
||||||
|
playbackProgress: Float,
|
||||||
|
showCursor: Boolean,
|
||||||
|
waveform: ImmutableList<Float>,
|
||||||
|
) {
|
||||||
|
VoiceMessagePreview(
|
||||||
|
isInteractive = isInteractive,
|
||||||
|
isPlaying = isPlaying,
|
||||||
|
time = time,
|
||||||
|
playbackProgress = playbackProgress,
|
||||||
|
showCursor = showCursor,
|
||||||
|
waveform = waveform,
|
||||||
|
onPlayClick = {},
|
||||||
|
onPauseClick = {},
|
||||||
|
onSeek = {},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,8 +40,8 @@ import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
@Composable
|
@Composable
|
||||||
internal fun VoiceMessageRecorderButton(
|
internal fun VoiceMessageRecorderButton(
|
||||||
isRecording: Boolean,
|
isRecording: Boolean,
|
||||||
|
onEvent: (VoiceMessageRecorderEvent) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onEvent: (VoiceMessageRecorderEvent) -> Unit = {},
|
|
||||||
) {
|
) {
|
||||||
val hapticFeedback = LocalHapticFeedback.current
|
val hapticFeedback = LocalHapticFeedback.current
|
||||||
|
|
||||||
|
|
@ -113,7 +113,13 @@ private fun StopButton(
|
||||||
@Composable
|
@Composable
|
||||||
internal fun VoiceMessageRecorderButtonPreview() = ElementPreview {
|
internal fun VoiceMessageRecorderButtonPreview() = ElementPreview {
|
||||||
Row {
|
Row {
|
||||||
VoiceMessageRecorderButton(isRecording = false)
|
VoiceMessageRecorderButton(
|
||||||
VoiceMessageRecorderButton(isRecording = true)
|
isRecording = false,
|
||||||
|
onEvent = {},
|
||||||
|
)
|
||||||
|
VoiceMessageRecorderButton(
|
||||||
|
isRecording = true,
|
||||||
|
onEvent = {},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue