@@ -2,7 +2,8 @@ package com.bintianqi.owndroid.feature.work_profile
22
33import androidx.activity.compose.rememberLauncherForActivityResult
44import androidx.activity.result.contract.ActivityResultContracts
5- import androidx.compose.foundation.clickable
5+ import androidx.compose.foundation.background
6+ import androidx.compose.foundation.combinedClickable
67import androidx.compose.foundation.layout.Arrangement
78import androidx.compose.foundation.layout.Box
89import androidx.compose.foundation.layout.Column
@@ -29,25 +30,31 @@ import androidx.compose.material3.ExposedDropdownMenuAnchorType
2930import androidx.compose.material3.ExposedDropdownMenuBox
3031import androidx.compose.material3.ExposedDropdownMenuDefaults
3132import androidx.compose.material3.FilledIconButton
33+ import androidx.compose.material3.FilledTonalButton
3234import androidx.compose.material3.HorizontalDivider
3335import androidx.compose.material3.Icon
3436import androidx.compose.material3.IconButton
3537import androidx.compose.material3.MaterialTheme
3638import androidx.compose.material3.OutlinedTextField
39+ import androidx.compose.material3.Switch
3740import androidx.compose.material3.Text
3841import androidx.compose.material3.TextButton
3942import androidx.compose.runtime.Composable
4043import androidx.compose.runtime.LaunchedEffect
4144import androidx.compose.runtime.collectAsState
4245import androidx.compose.runtime.getValue
4346import androidx.compose.runtime.mutableIntStateOf
47+ import androidx.compose.runtime.mutableStateListOf
4448import androidx.compose.runtime.mutableStateOf
4549import androidx.compose.runtime.remember
4650import androidx.compose.runtime.saveable.rememberSaveable
4751import androidx.compose.runtime.setValue
4852import androidx.compose.ui.Alignment
4953import androidx.compose.ui.Modifier
5054import androidx.compose.ui.draw.alpha
55+ import androidx.compose.ui.graphics.Color
56+ import androidx.compose.ui.hapticfeedback.HapticFeedbackType
57+ import androidx.compose.ui.platform.LocalHapticFeedback
5158import androidx.compose.ui.res.painterResource
5259import androidx.compose.ui.res.stringResource
5360import androidx.compose.ui.text.input.ImeAction
@@ -77,24 +84,37 @@ fun CrossProfileIntentFilterScreen(
7784 ) {
7885 if (it != null ) vm.exportFilters(it)
7986 }
87+ val selectedItems = remember { mutableStateListOf<Int >() }
8088 var confirmDeleteDialog by remember { mutableStateOf(false ) }
89+ val hf = LocalHapticFeedback .current
8190 MyLazyScaffold (R .string.intent_filter, onNavigateUp, {
82- IconButton ({
83- navigate(Destination .AddCrossProfileIntentFilter (- 1 ))
84- }) {
85- Icon (Icons .Default .Add , null )
86- }
87- IconButton ({
88- navigate(Destination .CrossProfileIntentFilterPresets )
89- }) {
90- Icon (Icons .AutoMirrored .Default .List , null )
91- }
92- if (filtersChanged) FilledIconButton (vm::applyFilters) {
93- Icon (Icons .Default .Check , null )
91+ if (selectedItems.isEmpty()) {
92+ IconButton ({
93+ navigate(Destination .AddCrossProfileIntentFilter (- 1 ))
94+ }) {
95+ Icon (Icons .Default .Add , null )
96+ }
97+ IconButton ({
98+ navigate(Destination .CrossProfileIntentFilterPresets )
99+ }) {
100+ Icon (Icons .AutoMirrored .Default .List , null )
101+ }
102+ if (filtersChanged) FilledIconButton (vm::applyFilters) {
103+ Icon (Icons .Default .Check , null )
104+ }
105+ } else {
106+ IconButton ({
107+ selectedItems.forEach {
108+ vm.deleteEntry(it)
109+ }
110+ selectedItems.clear()
111+ }) {
112+ Icon (Icons .Outlined .Delete , null )
113+ }
94114 }
95115 var menu by remember { mutableStateOf(false ) }
96116 Box {
97- IconButton ({ menu = ! menu }) {
117+ if (selectedItems.isEmpty()) IconButton ({ menu = ! menu }) {
98118 Icon (Icons .Default .MoreVert , null )
99119 }
100120 DropdownMenu (menu, { menu = false }) {
@@ -136,13 +156,29 @@ fun CrossProfileIntentFilterScreen(
136156 }
137157 }
138158 items(filterList, { it.id }) {
159+ val mod = Modifier
160+ .background(
161+ if (it.id in selectedItems) MaterialTheme .colorScheme.primaryContainer
162+ else Color .Transparent
163+ )
164+ .combinedClickable(onLongClick = {
165+ if (it.id !in selectedItems) selectedItems + = it.id
166+ hf.performHapticFeedback(HapticFeedbackType .LongPress )
167+ }) {
168+ if (selectedItems.isEmpty()) {
169+ navigate(Destination .AddCrossProfileIntentFilter (it.id))
170+ } else {
171+ if (it.id in selectedItems) {
172+ selectedItems - = it.id
173+ } else {
174+ selectedItems + = it.id
175+ }
176+ }
177+ }
178+ .padding(16 .dp, 4 .dp, 8 .dp, 4 .dp)
139179 Column (Modifier .animateItem()) {
140180 Row (
141- Modifier
142- .clickable {
143- navigate(Destination .AddCrossProfileIntentFilter (it.id))
144- }
145- .padding(16 .dp, 4 .dp, 8 .dp, 4 .dp),
181+ mod,
146182 Arrangement .SpaceBetween , Alignment .CenterVertically
147183 ) {
148184 Column (Modifier .weight(1F )) {
@@ -168,11 +204,9 @@ fun CrossProfileIntentFilterScreen(
168204 Modifier .alpha(0.6F ), style = MaterialTheme .typography.bodyMedium
169205 )
170206 }
171- IconButton ({
172- vm.deleteEntry(it.id)
173- }) {
174- Icon (Icons .Outlined .Delete , null )
175- }
207+ Switch (it.enabled, { enabled ->
208+ vm.setEnabled(it.id, enabled)
209+ })
176210 }
177211 HorizontalDivider ()
178212 }
@@ -289,6 +323,13 @@ fun AddCrossProfileIntentFilterScreen(
289323 ) {
290324 Text (stringResource(if (params.editingId == - 1 ) R .string.add else R .string.update))
291325 }
326+ Spacer (Modifier .height(4 .dp))
327+ if (params.editingId != - 1 ) FilledTonalButton ({
328+ vm.deleteEntry(params.editingId)
329+ navigateUp()
330+ }, Modifier .fillMaxWidth()) {
331+ Text (stringResource(R .string.delete))
332+ }
292333 }
293334}
294335
0 commit comments