mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-25 19:29:54 +01:00
Fix various bugs for chat folders.
This commit is contained in:
committed by
Greyson Parrelli
parent
b519bf6772
commit
dd4fcffec4
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user