From b1bbafcc4117bcbda17923f9b99dca1be11b1c84 Mon Sep 17 00:00:00 2001 From: andrekir Date: Sat, 13 Jul 2024 07:50:01 -0300 Subject: [PATCH] refactor(ContactListView): move selection logic to `ContactItem` --- .../com/geeksville/mesh/ui/ContactItem.kt | 20 +++++++++++--- .../geeksville/mesh/ui/ContactsFragment.kt | 26 +++++++++---------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/ui/ContactItem.kt b/app/src/main/java/com/geeksville/mesh/ui/ContactItem.kt index 1fe69b396..30c3176af 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/ContactItem.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/ContactItem.kt @@ -1,7 +1,9 @@ package com.geeksville.mesh.ui import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background +import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -20,6 +22,7 @@ import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource @@ -32,20 +35,30 @@ import com.geeksville.mesh.R import com.geeksville.mesh.model.Contact import com.geeksville.mesh.ui.theme.AppTheme -@OptIn(ExperimentalMaterialApi::class) +@Suppress("LongMethod") +@OptIn(ExperimentalMaterialApi::class, ExperimentalFoundationApi::class) @Composable fun ContactItem( contact: Contact, + selected: Boolean, modifier: Modifier = Modifier, + onClick: () -> Unit = {}, + onLongClick: () -> Unit = {}, ) = with(contact) { Card( - modifier = modifier + modifier = Modifier + .background(color = if (selected) Color.Gray else MaterialTheme.colors.background) .fillMaxWidth() .padding(horizontal = 8.dp, vertical = 6.dp), elevation = 4.dp, shape = RoundedCornerShape(12.dp), ) { - Surface { + Surface( + modifier = modifier.combinedClickable( + onClick = onClick, + onLongClick = onLongClick, + ), + ) { Row( modifier = Modifier .fillMaxWidth() @@ -136,6 +149,7 @@ private fun ContactItemPreview() { messageCount = 10, isMuted = true, ), + selected = false, ) } } diff --git a/app/src/main/java/com/geeksville/mesh/ui/ContactsFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/ContactsFragment.kt index 3dd0628fc..33d26f1ba 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/ContactsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/ContactsFragment.kt @@ -8,20 +8,19 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ActionMode -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.background -import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.material.MaterialTheme import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.runtime.toMutableStateList import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color +import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.compose.ui.unit.dp import androidx.fragment.app.viewModels @@ -200,7 +199,6 @@ class ContactsFragment : ScreenFragment("Messages"), Logging { } } -@OptIn(ExperimentalFoundationApi::class) @Composable fun ContactListView( contacts: List, @@ -208,23 +206,23 @@ fun ContactListView( onClick: (Contact) -> Unit, onLongClick: (Contact) -> Unit, ) { + val haptics = LocalHapticFeedback.current LazyColumn( modifier = Modifier .fillMaxSize() .padding(6.dp), ) { items(contacts, key = { it.contactKey }) { contact -> - val selected = selectedList.contains(contact.contactKey) - val selectedColor = if (selected) Color.Gray else MaterialTheme.colors.background + val selected by remember { derivedStateOf { selectedList.contains(contact.contactKey) } } ContactItem( contact = contact, - modifier = Modifier - .background(color = selectedColor) - .combinedClickable( - onClick = { onClick(contact) }, - onLongClick = { onLongClick(contact) }, - ) + selected = selected, + onClick = { onClick(contact) }, + onLongClick = { + onLongClick(contact) + haptics.performHapticFeedback(HapticFeedbackType.LongPress) + }, ) } }