diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt index 43b8aaf725..acf9fd71c8 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -164,6 +164,7 @@ import com.nextcloud.talk.ui.dialog.GetPinnedOptionsDialog import com.nextcloud.talk.ui.dialog.MessageActionsDialog import com.nextcloud.talk.ui.dialog.SaveToStorageDialogFragment import com.nextcloud.talk.chat.ui.ShowReactionsModalBottomSheet +import com.nextcloud.talk.ui.bottom.sheet.ProfileBottomSheet import com.nextcloud.talk.ui.dialog.TempMessageActionsDialog import com.nextcloud.talk.ui.theme.LocalMessageUtils import com.nextcloud.talk.ui.theme.LocalOpenGraphFetcher @@ -640,7 +641,8 @@ class ChatActivity : onOpenThreadClick = { messageId -> openThread(messageId.toLong()) }, onSystemMessageExpandClick = { messageId -> chatViewModel.toggleSystemMessageCollapse(messageId) - } + }, + onAvatarClick = { messageId -> onAvatarClickCompose(messageId) } ) ), listState = listState @@ -723,6 +725,13 @@ class ChatActivity : } } + private fun onAvatarClickCompose(messageId: Int) { + lifecycleScope.launch { + val message = chatViewModel.getMessageById(messageId.toLong()).first() + ProfileBottomSheet(ncApi, conversationUser, viewThemeUtils).showFor(message, this@ChatActivity) + } + } + private fun onVoiceSpeedClickCompose(messageId: Int) { val currentSpeed = chatViewModel.uiState.value.items .mapNotNull { (it as? ChatViewModel.ChatItem.MessageItem)?.uiMessage } diff --git a/app/src/main/java/com/nextcloud/talk/ui/bottom/sheet/ProfileBottomSheet.kt b/app/src/main/java/com/nextcloud/talk/ui/bottom/sheet/ProfileBottomSheet.kt index 814692f328..d923fdf4d5 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/bottom/sheet/ProfileBottomSheet.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/bottom/sheet/ProfileBottomSheet.kt @@ -12,7 +12,11 @@ import android.content.Intent import android.net.Uri import android.os.Bundle import android.util.Log +import android.view.View import androidx.core.net.toUri +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updatePadding import com.afollestad.materialdialogs.LayoutMode import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.bottomsheets.BottomSheet @@ -83,7 +87,7 @@ class ProfileBottomSheet(val ncApi: NcApi, val userModel: User, val viewThemeUti val filteredActions = actions.filter { allowedAppIds.contains(it.appId) } val items = filteredActions.map { configureActionListItem(it) } - MaterialDialog(context, BottomSheet(LayoutMode.WRAP_CONTENT)).show { + val dialog = MaterialDialog(context, BottomSheet(LayoutMode.WRAP_CONTENT)).show { cornerRadius(res = R.dimen.corner_radius) viewThemeUtils.material.colorBottomSheetBackground(this.view) @@ -99,6 +103,23 @@ class ProfileBottomSheet(val ncApi: NcApi, val userModel: User, val viewThemeUti } } } + val sheetView = dialog.view.parent as? View ?: dialog.view + + val initialBottomPadding = sheetView.paddingBottom + + ViewCompat.setOnApplyWindowInsetsListener(sheetView) { view, insets -> + val bottomInset = insets.getInsets( + WindowInsetsCompat.Type.navigationBars() + ).bottom + + view.updatePadding( + bottom = initialBottomPadding + bottomInset + ) + + insets + } + + ViewCompat.requestApplyInsets(sheetView) } private fun configureActionListItem(action: HoverCardAction): BasicListItemWithImage { diff --git a/app/src/main/java/com/nextcloud/talk/ui/chat/ChatMessageScaffold.kt b/app/src/main/java/com/nextcloud/talk/ui/chat/ChatMessageScaffold.kt index 9a5e85c020..dfa0507bbe 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/chat/ChatMessageScaffold.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/chat/ChatMessageScaffold.kt @@ -98,6 +98,7 @@ internal val LocalOpenThreadHandler = compositionLocalOf<(Int) -> Unit> { {} } internal val LocalQuotedMessageClickHandler = compositionLocalOf<(Int) -> Unit> { {} } internal val LocalMessageLongClickHandler = compositionLocalOf<(Int) -> Unit> { {} } internal val LocalShowThreadButton = compositionLocalOf { true } +internal val LocalAvatarClickHandler = compositionLocalOf<(Int) -> Unit> { {} } private enum class MetadataLayoutMode { CAPTION, @@ -245,6 +246,7 @@ fun MessageScaffold( @Composable private fun RowScope.MessageLeadingDecoration(uiMessage: ChatMessageUi, isOneToOneConversation: Boolean) { + val onAvatarClick = LocalAvatarClickHandler.current if (uiMessage.incoming && isOneToOneConversation && !uiMessage.isGrouped) { val errorPlaceholderImage: Int = R.drawable.account_circle_96dp val avatarContext = LocalContext.current @@ -258,6 +260,9 @@ private fun RowScope.MessageLeadingDecoration(uiMessage: ChatMessageUi, isOneToO .size(48.dp) .align(Alignment.Top) .padding(end = 8.dp) + .combinedClickable( + onClick = { onAvatarClick(uiMessage.id) } + ) ) } else if (uiMessage.incoming && isOneToOneConversation) { Spacer(Modifier.width(48.dp)) diff --git a/app/src/main/java/com/nextcloud/talk/ui/chat/ChatMessageView.kt b/app/src/main/java/com/nextcloud/talk/ui/chat/ChatMessageView.kt index 04b89a95c5..b4f39b1d3e 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/chat/ChatMessageView.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/chat/ChatMessageView.kt @@ -67,7 +67,8 @@ class ChatMessageCallbacks( val onReactionLongClick: (Int) -> Unit = {}, val onOpenThreadClick: (Int) -> Unit = {}, val onQuotedMessageClick: (Int) -> Unit = {}, - val onSystemMessageExpandClick: (Int) -> Unit = {} + val onSystemMessageExpandClick: (Int) -> Unit = {}, + val onAvatarClick: (Int) -> Unit = {} ) @Suppress("Detekt.LongMethod", "Detekt.CyclomaticComplexMethod") @@ -99,7 +100,8 @@ fun ChatMessageView( LocalReactionClickHandler provides callbacks.onReactionClick, LocalReactionLongClickHandler provides callbacks.onReactionLongClick, LocalOpenThreadHandler provides callbacks.onOpenThreadClick, - LocalQuotedMessageClickHandler provides callbacks.onQuotedMessageClick + LocalQuotedMessageClickHandler provides callbacks.onQuotedMessageClick, + LocalAvatarClickHandler provides callbacks.onAvatarClick ) { SwipeToReplyContainer( replyable = message.replyable && context.hasChatPermission, diff --git a/app/src/main/java/com/nextcloud/talk/ui/chat/ChatView.kt b/app/src/main/java/com/nextcloud/talk/ui/chat/ChatView.kt index 125579bf8b..1e8a7391bb 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/chat/ChatView.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/chat/ChatView.kt @@ -323,7 +323,8 @@ fun ChatView( onReactionLongClick = callbacks.messageCallbacks.onReactionLongClick, onOpenThreadClick = callbacks.messageCallbacks.onOpenThreadClick, onQuotedMessageClick = handleQuotedMessageClick, - onSystemMessageExpandClick = callbacks.messageCallbacks.onSystemMessageExpandClick + onSystemMessageExpandClick = callbacks.messageCallbacks.onSystemMessageExpandClick, + onAvatarClick = callbacks.messageCallbacks.onAvatarClick ) ) }