Fix various bugs for chat folders.

This commit is contained in:
Michelle Tang
2024-10-21 11:02:40 -07:00
committed by Greyson Parrelli
parent b519bf6772
commit dd4fcffec4
18 changed files with 228 additions and 144 deletions

View File

@@ -18,25 +18,27 @@ object ChatFolderContextMenu {
anchorView: View,
rootView: ViewGroup = anchorView.rootView as ViewGroup,
folderType: ChatFolderRecord.FolderType,
unreadCount: Int,
isMuted: Boolean,
onEdit: () -> Unit = {},
onAdd: () -> Unit = {},
onMuteAll: () -> Unit = {},
onUnmuteAll: () -> Unit = {},
onReadAll: () -> Unit = {},
onDelete: () -> Unit = {},
onReorder: () -> Unit = {}
onFolderSettings: () -> Unit = {}
) {
show(
context = context,
anchorView = anchorView,
rootView = rootView,
folderType = folderType,
unreadCount = unreadCount,
isMuted = isMuted,
callbacks = object : Callbacks {
override fun onEdit() = onEdit()
override fun onAdd() = onAdd()
override fun onMuteAll() = onMuteAll()
override fun onUnmuteAll() = onUnmuteAll()
override fun onReadAll() = onReadAll()
override fun onDelete() = onDelete()
override fun onReorder() = onReorder()
override fun onFolderSettings() = onFolderSettings()
}
)
}
@@ -45,29 +47,38 @@ object ChatFolderContextMenu {
context: Context,
anchorView: View,
rootView: ViewGroup,
unreadCount: Int,
isMuted: Boolean,
folderType: ChatFolderRecord.FolderType,
callbacks: Callbacks
) {
val actions = mutableListOf<ActionItem>().apply {
if (folderType == ChatFolderRecord.FolderType.ALL) {
add(
ActionItem(R.drawable.symbol_plus_24, context.getString(R.string.ChatFoldersFragment__add_new_folder)) {
callbacks.onAdd()
}
)
add(
ActionItem(R.drawable.symbol_bell_slash_24, context.getString(R.string.ChatFoldersFragment__mute_all)) {
callbacks.onMuteAll()
}
)
if (unreadCount > 0) {
add(
ActionItem(R.drawable.symbol_chat_check, context.getString(R.string.ChatFoldersFragment__mark_all_read)) {
callbacks.onReadAll()
}
)
}
if (isMuted) {
add(
ActionItem(R.drawable.symbol_exchange_24, context.getString(R.string.ChatFoldersFragment__reorder_folder)) {
callbacks.onReorder()
ActionItem(R.drawable.symbol_bell_24, context.getString(R.string.ChatFoldersFragment__unmute_all)) {
callbacks.onUnmuteAll()
}
)
} else {
add(
ActionItem(R.drawable.symbol_bell_slash_24, context.getString(R.string.ChatFoldersFragment__mute_all)) {
callbacks.onMuteAll()
}
)
}
if (folderType == ChatFolderRecord.FolderType.ALL) {
add(
ActionItem(R.drawable.symbol_folder_settings, context.getString(R.string.conversation_list_fragment__folder_settings)) {
callbacks.onFolderSettings()
}
)
} else {
@@ -76,31 +87,6 @@ object ChatFolderContextMenu {
callbacks.onEdit()
}
)
add(
ActionItem(R.drawable.symbol_plus_24, context.getString(R.string.ChatFoldersFragment__add_new_folder)) {
callbacks.onAdd()
}
)
add(
ActionItem(R.drawable.symbol_bell_slash_24, context.getString(R.string.ChatFoldersFragment__mute_all)) {
callbacks.onMuteAll()
}
)
add(
ActionItem(R.drawable.symbol_chat_check, context.getString(R.string.ChatFoldersFragment__mark_all_read)) {
callbacks.onReadAll()
}
)
add(
ActionItem(R.drawable.symbol_trash_24, context.getString(R.string.ChatFoldersFragment__delete_folder)) {
callbacks.onDelete()
}
)
add(
ActionItem(R.drawable.symbol_exchange_24, context.getString(R.string.ChatFoldersFragment__reorder_folder)) {
callbacks.onReorder()
}
)
}
}
@@ -113,10 +99,9 @@ object ChatFolderContextMenu {
private interface Callbacks {
fun onEdit()
fun onAdd()
fun onMuteAll()
fun onUnmuteAll()
fun onReadAll()
fun onDelete()
fun onReorder()
fun onFolderSettings()
}
}

View File

@@ -104,24 +104,22 @@ fun FoldersScreen(
}
Column(modifier = modifier.verticalScroll(rememberScrollState())) {
Column(modifier = Modifier.padding(start = 24.dp)) {
Text(
text = stringResource(id = R.string.ChatFoldersFragment__organize_your_chats),
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(top = 12.dp, bottom = 12.dp, end = 12.dp)
)
Text(
text = stringResource(id = R.string.ChatFoldersFragment__folders),
style = MaterialTheme.typography.titleMedium,
modifier = Modifier.padding(top = 16.dp, bottom = 12.dp)
)
FolderRow(
icon = R.drawable.symbol_plus_compact_16,
title = stringResource(R.string.ChatFoldersFragment__create_a_folder),
onClick = { onFolderClicked(ChatFolderRecord()) }
)
}
Text(
text = stringResource(id = R.string.ChatFoldersFragment__organize_your_chats),
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(top = 12.dp, bottom = 12.dp, end = 12.dp, start = 24.dp)
)
Text(
text = stringResource(id = R.string.ChatFoldersFragment__folders),
style = MaterialTheme.typography.titleMedium,
modifier = Modifier.padding(top = 16.dp, bottom = 12.dp, start = 24.dp)
)
FolderRow(
icon = R.drawable.symbol_plus_compact_16,
title = stringResource(R.string.ChatFoldersFragment__create_a_folder),
onClick = { onFolderClicked(ChatFolderRecord()) }
)
val columnHeight = dimensionResource(id = R.dimen.chat_folder_row_height).value * state.folders.size
LazyColumn(
@@ -142,8 +140,7 @@ fun FoldersScreen(
{ onFolderClicked(folder) }
} else null,
elevation = elevation,
showDragHandle = true,
modifier = Modifier.padding(start = 12.dp)
showDragHandle = true
)
}
}
@@ -167,8 +164,7 @@ fun FoldersScreen(
icon = R.drawable.symbol_chat_badge_24,
title = title,
subtitle = stringResource(R.string.ChatFoldersFragment__unread_messages),
onAdd = { onAdd(chatFolder) },
modifier = Modifier.padding(start = 12.dp)
onAdd = { onAdd(chatFolder) }
)
}
ChatFolderRecord.FolderType.INDIVIDUAL -> {
@@ -177,8 +173,7 @@ fun FoldersScreen(
icon = R.drawable.symbol_person_light_24,
title = title,
subtitle = stringResource(R.string.ChatFoldersFragment__only_direct_messages),
onAdd = { onAdd(chatFolder) },
modifier = Modifier.padding(start = 12.dp)
onAdd = { onAdd(chatFolder) }
)
}
ChatFolderRecord.FolderType.GROUP -> {
@@ -187,8 +182,7 @@ fun FoldersScreen(
icon = R.drawable.symbol_group_light_20,
title = title,
subtitle = stringResource(R.string.ChatFoldersFragment__only_group_messages),
onAdd = { onAdd(chatFolder) },
modifier = Modifier.padding(start = 12.dp)
onAdd = { onAdd(chatFolder) }
)
}
ChatFolderRecord.FolderType.ALL -> {
@@ -239,17 +233,19 @@ fun FolderRow(
verticalAlignment = Alignment.CenterVertically,
modifier = if (onClick != null) {
modifier
.padding(end = 12.dp)
.clickable(onClick = onClick)
.fillMaxWidth()
.defaultMinSize(minHeight = dimensionResource(id = R.dimen.chat_folder_row_height))
.shadow(elevation = elevation)
.background(MaterialTheme.colorScheme.background)
.padding(start = 24.dp, end = 12.dp)
} else {
modifier
.padding(end = 12.dp)
.fillMaxWidth()
.defaultMinSize(minHeight = dimensionResource(id = R.dimen.chat_folder_row_height))
.shadow(elevation = elevation)
.background(MaterialTheme.colorScheme.background)
.padding(start = 24.dp, end = 12.dp)
}
) {
Image(

View File

@@ -7,8 +7,8 @@ import org.thoughtcrime.securesms.database.SignalDatabase
*/
object ChatFoldersRepository {
fun getCurrentFolders(includeUnreadCount: Boolean = false): List<ChatFolderRecord> {
return SignalDatabase.chatFolders.getChatFolders(includeUnreadCount)
fun getCurrentFolders(includeUnreadAndMutedCounts: Boolean = false): List<ChatFolderRecord> {
return SignalDatabase.chatFolders.getChatFolders(includeUnreadAndMutedCounts)
}
fun createFolder(folder: ChatFolderRecord) {

View File

@@ -24,7 +24,7 @@ class ChatFoldersViewModel : ViewModel() {
fun loadCurrentFolders(context: Context) {
viewModelScope.launch(Dispatchers.IO) {
val folders = ChatFoldersRepository.getCurrentFolders(includeUnreadCount = false)
val folders = ChatFoldersRepository.getCurrentFolders(includeUnreadAndMutedCounts = false)
val suggestedFolders = getSuggestedFolders(context, folders)
internalState.update {

View File

@@ -21,6 +21,7 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Person
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Switch
@@ -229,16 +230,14 @@ fun CreateFolderScreen(
FolderRow(
icon = R.drawable.symbol_plus_compact_16,
title = stringResource(R.string.CreateFoldersFragment__add_chats),
onClick = onAddChat,
modifier = Modifier.padding(start = 12.dp)
onClick = onAddChat
)
if (state.currentFolder.showIndividualChats) {
FolderRow(
icon = R.drawable.symbol_person_light_24,
title = stringResource(R.string.ChatFoldersFragment__one_on_one_chats),
onClick = onAddChat,
modifier = Modifier.padding(start = 12.dp)
onClick = onAddChat
)
}
@@ -246,8 +245,7 @@ fun CreateFolderScreen(
FolderRow(
icon = R.drawable.symbol_group_light_20,
title = stringResource(R.string.ChatFoldersFragment__groups),
onClick = onAddChat,
modifier = Modifier.padding(start = 12.dp)
onClick = onAddChat
)
}
}
@@ -277,8 +275,7 @@ fun CreateFolderScreen(
FolderRow(
icon = R.drawable.symbol_plus_compact_16,
title = stringResource(R.string.CreateFoldersFragment__exclude_chats),
onClick = onRemoveChat,
modifier = Modifier.padding(start = 12.dp)
onClick = onRemoveChat
)
}
@@ -334,6 +331,9 @@ fun CreateFolderScreen(
}
} else if (!isNewFolder) {
Buttons.MediumTonal(
colors = ButtonDefaults.filledTonalButtonColors(
disabledContainerColor = MaterialTheme.colorScheme.surfaceVariant
),
enabled = hasChanges,
onClick = { onCreateConfirmed(true) },
modifier = modifier
@@ -451,10 +451,11 @@ fun ChatRow(
recipient = recipient,
modifier = Modifier
.padding(start = 24.dp, end = 16.dp)
.size(40.dp)
.size(40.dp),
useProfile = false
)
}
Text(text = recipient.getShortDisplayName(LocalContext.current))
Text(text = if (recipient.isSelf) stringResource(id = R.string.note_to_self) else recipient.getShortDisplayName(LocalContext.current))
}
}