refactor(ContactListView): move selection logic to ContactItem

This commit is contained in:
andrekir
2024-07-13 07:50:01 -03:00
parent 6e84d88299
commit b1bbafcc41
2 changed files with 29 additions and 17 deletions

View File

@@ -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,
)
}
}

View File

@@ -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<Contact>,
@@ -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)
},
)
}
}