diff --git a/app/src/main/java/com/junkfood/seal/ui/page/command/TaskListPage.kt b/app/src/main/java/com/junkfood/seal/ui/page/command/TaskListPage.kt index 3155f51749..3124c017ce 100644 --- a/app/src/main/java/com/junkfood/seal/ui/page/command/TaskListPage.kt +++ b/app/src/main/java/com/junkfood/seal/ui/page/command/TaskListPage.kt @@ -49,6 +49,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.clearAndSetSemantics import androidx.compose.ui.text.font.FontFamily @@ -60,6 +61,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.junkfood.seal.Downloader import com.junkfood.seal.R import com.junkfood.seal.database.objects.CommandTemplate +import com.junkfood.seal.ui.common.HapticFeedback.slightHapticFeedback import com.junkfood.seal.ui.common.SVGImage import com.junkfood.seal.ui.common.intState import com.junkfood.seal.ui.component.BackButton @@ -87,6 +89,7 @@ import kotlinx.coroutines.launch @Composable fun TaskListPage(onNavigateBack: () -> Unit, onNavigateToDetail: (Int) -> Unit) { val scope = rememberCoroutineScope() + val view = LocalView.current val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() var showBottomSheet by remember { mutableStateOf(false) } @@ -225,6 +228,7 @@ fun TaskListPage(onNavigateBack: () -> Unit, onNavigateToDetail: (Int) -> Unit) item { FilledButtonWithIcon( onClick = { + view.slightHapticFeedback() Downloader.executeCommandWithUrl(url) onDismissRequest() }, @@ -292,7 +296,7 @@ fun ColumnScope.TaskCreatorDialogContent( textAlign = TextAlign.Center, modifier = Modifier .align(Alignment.CenterHorizontally) - .padding(bottom = 16.dp) + .padding(bottom = 24.dp) ) OutlinedTextField( @@ -318,16 +322,16 @@ fun ColumnScope.TaskCreatorDialogContent( } item { OutlinedButtonChip( - icon = Icons.Outlined.NewLabel, - label = stringResource(id = R.string.new_template), - onClick = onNewTemplateClicked + icon = Icons.Outlined.Edit, + label = stringResource(id = R.string.edit_template, template.name), + onClick = onEditClicked ) } item { OutlinedButtonChip( - icon = Icons.Outlined.Edit, - label = stringResource(id = R.string.edit_template, template.name), - onClick = onEditClicked + icon = Icons.Outlined.NewLabel, + label = stringResource(id = R.string.new_template), + onClick = onNewTemplateClicked ) } } diff --git a/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadPage.kt b/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadPage.kt index 6aea6ddb4f..2664fddcbd 100644 --- a/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadPage.kt +++ b/app/src/main/java/com/junkfood/seal/ui/page/download/DownloadPage.kt @@ -155,6 +155,7 @@ fun DownloadPage( val clipboardManager = LocalClipboardManager.current val keyboardController = LocalSoftwareKeyboardController.current val useDialog = LocalWindowWidthState.current != WindowWidthSizeClass.Compact + val view = LocalView.current var showDownloadDialog by rememberSaveable { mutableStateOf(false) } var showMeteredNetworkDialog by remember { mutableStateOf(false) } @@ -188,6 +189,7 @@ fun DownloadPage( val downloadCallback: () -> Unit = { + view.slightHapticFeedback() keyboardController?.hide() if (NOTIFICATION.getBoolean() && notificationPermission?.status?.isGranted == false) { showNotificationDialog = true diff --git a/app/src/main/java/com/junkfood/seal/ui/page/settings/command/TemplateListPage.kt b/app/src/main/java/com/junkfood/seal/ui/page/settings/command/TemplateListPage.kt index 05759f25c5..e0403d97f6 100644 --- a/app/src/main/java/com/junkfood/seal/ui/page/settings/command/TemplateListPage.kt +++ b/app/src/main/java/com/junkfood/seal/ui/page/settings/command/TemplateListPage.kt @@ -64,6 +64,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.junkfood.seal.R +import com.junkfood.seal.database.backup.BackupUtil import com.junkfood.seal.database.objects.CommandTemplate import com.junkfood.seal.ui.common.HapticFeedback.slightHapticFeedback import com.junkfood.seal.ui.common.intState @@ -76,7 +77,6 @@ import com.junkfood.seal.ui.component.PreferenceItemVariant import com.junkfood.seal.ui.component.PreferenceSwitchWithContainer import com.junkfood.seal.ui.component.TemplateItem import com.junkfood.seal.ui.page.settings.about.ytdlpUrl -import com.junkfood.seal.database.backup.BackupUtil import com.junkfood.seal.util.CUSTOM_COMMAND import com.junkfood.seal.util.DatabaseUtil import com.junkfood.seal.util.PreferenceUtil @@ -243,6 +243,7 @@ fun TemplateListPage(onNavigateBack: () -> Unit, onNavigateToEditPage: (Int) -> modifier = Modifier.fillMaxWidth() ) { TriStateCheckbox(state = checkBoxState, onClick = { + view.slightHapticFeedback() when (checkBoxState) { ToggleableState.On -> selectedTemplates.clear() else -> selectedTemplates.run { @@ -262,6 +263,7 @@ fun TemplateListPage(onNavigateBack: () -> Unit, onNavigateToEditPage: (Int) -> IconButton( onClick = { + view.slightHapticFeedback() scope.launch { snackbarHostState.showSnackbar( context.getString(R.string.template_exported) @@ -288,7 +290,10 @@ fun TemplateListPage(onNavigateBack: () -> Unit, onNavigateToEditPage: (Int) -> ) } IconButton( - onClick = { showDeleteDialog = true }, + onClick = { + view.slightHapticFeedback() + showDeleteDialog = true + }, enabled = selectedTemplates.isNotEmpty() ) { Icon( diff --git a/app/src/main/java/com/junkfood/seal/ui/page/videolist/VideoDetailDrawer.kt b/app/src/main/java/com/junkfood/seal/ui/page/videolist/VideoDetailDrawer.kt index b7bdca519c..03242ffd14 100644 --- a/app/src/main/java/com/junkfood/seal/ui/page/videolist/VideoDetailDrawer.kt +++ b/app/src/main/java/com/junkfood/seal/ui/page/videolist/VideoDetailDrawer.kt @@ -36,6 +36,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.style.TextOverflow @@ -43,6 +44,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.junkfood.seal.R import com.junkfood.seal.database.objects.DownloadedVideoInfo +import com.junkfood.seal.ui.common.HapticFeedback.slightHapticFeedback import com.junkfood.seal.ui.component.FilledTonalButtonWithIcon import com.junkfood.seal.ui.component.LongTapTextButton import com.junkfood.seal.ui.component.OutlinedButtonWithIcon @@ -51,7 +53,6 @@ import com.junkfood.seal.ui.theme.SealTheme import com.junkfood.seal.util.FileUtil import com.junkfood.seal.util.ToastUtil -@OptIn(ExperimentalMaterial3Api::class) @Composable fun VideoDetailDrawer( sheetState: ModalBottomSheetState, @@ -61,6 +62,7 @@ fun VideoDetailDrawer( onDelete: () -> Unit = {}, ) { val uriHandler = LocalUriHandler.current + val view = LocalView.current val context = LocalContext.current val hapticFeedback = LocalHapticFeedback.current BackHandler(sheetState.targetValue == ModalBottomSheetValue.Expanded) { @@ -91,6 +93,7 @@ fun VideoDetailDrawer( onReDownload = onReDownload, onDismissRequest = onDismissRequest, onDelete = { + view.slightHapticFeedback() onDismissRequest() onDelete() }, onOpenLink = { @@ -98,6 +101,7 @@ fun VideoDetailDrawer( onDismissRequest() uriHandler.openUri(videoUrl) }, onShareFile = { + view.slightHapticFeedback() FileUtil.createIntentForSharingFile(videoPath)?.runCatching { context.startActivity( Intent.createChooser(this, shareTitle) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3b6dd00379..2f4dbe4d0d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -36,7 +36,7 @@ Link copied to clipboard Open link Remove - Delete + Delete file About Version, feedback, auto update Back