diff --git a/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt b/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt index b9d8d75b7..a4277e0da 100644 --- a/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt +++ b/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt @@ -410,6 +410,7 @@ class SettingsRepository( const val KEY_TRANSLATION_MODE_DO_NOT_SHOW_WARNING = "translation_mode_do_not_show_warning" const val KEY_LOCKDOWN_MODE = "lockdown_mode" + const val KEY_DISABLE_LINK_PREVIEW = "disable_link_preview" const val KEY_BUBBLE_WEB_FULLSCREEN = "bubble_web_fullscreen" const val KEY_SIM_NAMES_APPLY_ON_BOOT = "sim_names_apply_on_boot" const val KEY_POWER_SAVING_APPLY_ON_BOOT = "power_saving_apply_on_boot" diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/FeatureSettingsActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/FeatureSettingsActivity.kt index 151ee9161..ec71a7408 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/FeatureSettingsActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/FeatureSettingsActivity.kt @@ -63,6 +63,7 @@ import com.sameerasw.essentials.ui.components.linkActions.LinkPickerScreen import com.sameerasw.essentials.ui.core.cards.FeatureCard import com.sameerasw.essentials.ui.core.containers.RoundedCardContainer import com.sameerasw.essentials.ui.core.sheets.PermissionsBottomSheet +import com.sameerasw.essentials.ui.features.apps.LinkActionsSettingsUI import com.sameerasw.essentials.ui.features.battery.BatteriesSettingsUI import com.sameerasw.essentials.ui.features.security.AppLockSettingsUI import com.sameerasw.essentials.ui.features.system.AlwaysOnDisplaySettingsUI @@ -146,8 +147,7 @@ class FeatureSettingsActivity : AppCompatActivity() { val featureObj = FeatureRegistry.ALL_FEATURES.find { it.id == featureId } val highlightSetting = intent.getStringExtra("highlight_setting") - if (featureId == "Link actions" || featureId == "URL Shortener") { - val isShortenerDirect = featureId == "URL Shortener" + if (featureId == "URL Shortener") { setContent { val viewModel: MainViewModel = viewModel() val context = LocalContext.current @@ -161,8 +161,8 @@ class FeatureSettingsActivity : AppCompatActivity() { onFinish = { finish() }, modifier = Modifier.fillMaxSize(), demo = false, - initialTab = if (isShortenerDirect) 2 else 0, - initialOpenShorten = isShortenerDirect, + initialTab = 2, + initialOpenShorten = true, ) } } @@ -346,6 +346,7 @@ class FeatureSettingsActivity : AppCompatActivity() { "Dynamic night light" -> (if (viewModel.isUseUsageAccess.value) !viewModel.isUsageStatsPermissionGranted.value else !isAccessibilityEnabled) || !isWriteSecureSettingsEnabled + "Smart pixels" -> !isAccessibilityEnabled "Snooze system notifications" -> !isNotificationListenerEnabled "Screen locked security" -> !isAccessibilityEnabled || @@ -758,6 +759,7 @@ class FeatureSettingsActivity : AppCompatActivity() { "Dynamic night light" -> (if (viewModel.isUseUsageAccess.value) !viewModel.isUsageStatsPermissionGranted.value else !isAccessibilityEnabled) || !isWriteSecureSettingsEnabled + "Smart pixels" -> !isAccessibilityEnabled "Snooze system notifications" -> !isNotificationListenerEnabled "Screen locked security" -> !isAccessibilityEnabled || @@ -1239,6 +1241,12 @@ class FeatureSettingsActivity : AppCompatActivity() { onShowMoveSheetChange = { isStandbyMoveSheetVisible = it }, ) } + + "Link actions" -> { + LinkActionsSettingsUI( + viewModel = viewModel + ) + } } } // Bottom padding for toolbar diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/LinkPickerActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/LinkPickerActivity.kt index 6e769b478..3a7e7920c 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/LinkPickerActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/LinkPickerActivity.kt @@ -17,10 +17,13 @@ import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import com.sameerasw.essentials.data.repository.SettingsRepository import com.sameerasw.essentials.ui.components.linkActions.LinkPickerScreen import com.sameerasw.essentials.ui.theme.EssentialsTheme +import com.sameerasw.essentials.viewmodels.LocationReachedViewModel class LinkPickerActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -33,9 +36,7 @@ class LinkPickerActivity : AppCompatActivity() { } window.setBackgroundDrawableResource(android.R.color.transparent) - val locationViewModel = - com.sameerasw.essentials.viewmodels - .LocationReachedViewModel(application) + val locationViewModel = LocationReachedViewModel(application) if (locationViewModel.handleIntent(intent)) { val settingsIntent = Intent(this, FeatureSettingsActivity::class.java).apply { @@ -64,17 +65,16 @@ class LinkPickerActivity : AppCompatActivity() { enableEdgeToEdge() setContent { - val viewModel: com.sameerasw.essentials.viewmodels.MainViewModel = - androidx.lifecycle.viewmodel.compose - .viewModel() - val context = androidx.compose.ui.platform.LocalContext.current - androidx.compose.runtime.LaunchedEffect(Unit) { - viewModel.check(context) - } - val isPitchBlackThemeEnabled by viewModel.isPitchBlackThemeEnabled + val context = LocalContext.current + val settingsRepository = remember(context) { SettingsRepository(context) } + val isPitchBlackThemeEnabled = + settingsRepository.getBoolean(SettingsRepository.KEY_PITCH_BLACK_THEME_ENABLED) + val disableLinkPreview = + settingsRepository.getBoolean(SettingsRepository.KEY_DISABLE_LINK_PREVIEW) EssentialsTheme(pitchBlackTheme = isPitchBlackThemeEnabled) { LinkPickerScreen( uri = uri, + disableLinkPreview = disableLinkPreview, onFinish = { finish() }, modifier = Modifier.fillMaxSize(), ) diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/SettingsActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/SettingsActivity.kt index cde55c3de..6dea45193 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/SettingsActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/SettingsActivity.kt @@ -94,6 +94,7 @@ import com.sameerasw.essentials.domain.registry.FeatureRegistry import com.sameerasw.essentials.domain.registry.PermissionRegistry import com.sameerasw.essentials.translation.TranslationManager import com.sameerasw.essentials.translation.ui.TranslationSessionSheet +import com.sameerasw.essentials.ui.components.CategoryExpandableSection import com.sameerasw.essentials.ui.components.EssentialsFloatingToolbar import com.sameerasw.essentials.ui.components.MadebySameeraswCard import com.sameerasw.essentials.ui.components.dialogs.AboutSection diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/CategoryExpandableSection.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/CategoryExpandableSection.kt index 34c8c5c42..e22af7c1d 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/CategoryExpandableSection.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/CategoryExpandableSection.kt @@ -26,6 +26,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -45,11 +46,12 @@ import com.sameerasw.essentials.utils.HapticUtil @Composable fun CategoryExpandableSection( + modifier: Modifier = Modifier, title: String, - itemCount: Int, + isSettingsSection: Boolean = false, + itemCount: Int? = null, isExpanded: Boolean, onToggleExpand: () -> Unit, - modifier: Modifier = Modifier, content: @Composable ColumnScope.() -> Unit, ) { val view = LocalView.current @@ -60,7 +62,6 @@ fun CategoryExpandableSection( Column( modifier = modifier.fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(8.dp), ) { Row( modifier = @@ -70,7 +71,8 @@ fun CategoryExpandableSection( .clickable { HapticUtil.performUIHaptic(view) onToggleExpand() - }.padding(horizontal = 12.dp, vertical = 8.dp), + } + .padding(if (isSettingsSection) 16.dp else 12.dp, 8.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, ) { @@ -81,22 +83,25 @@ fun CategoryExpandableSection( Text( text = title, style = MaterialTheme.typography.titleMedium, - fontWeight = FontWeight.Bold, - color = MaterialTheme.colorScheme.onSurface, + fontWeight = if (!isSettingsSection) FontWeight.Bold else null, + color = if (isSettingsSection) MaterialTheme.colorScheme.onSurfaceVariant else MaterialTheme.colorScheme.onSurface, ) - Box( - modifier = - Modifier - .clip(CircleShape) - .background(MaterialTheme.colorScheme.surfaceContainerHighest) - .padding(horizontal = 8.dp, vertical = 2.dp), - ) { - Text( - text = itemCount.toString(), - style = MaterialTheme.typography.labelSmall, - fontWeight = FontWeight.Bold, - color = MaterialTheme.colorScheme.onSurfaceVariant, - ) + + if (itemCount != null) { + Box( + modifier = + Modifier + .clip(CircleShape) + .background(MaterialTheme.colorScheme.surfaceContainerHighest) + .padding(horizontal = 8.dp, vertical = 2.dp), + ) { + Text( + text = itemCount.toString(), + style = MaterialTheme.typography.labelSmall, + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } } } @@ -115,8 +120,9 @@ fun CategoryExpandableSection( visible = isExpanded, enter = expandVertically() + fadeIn(), exit = shrinkVertically() + fadeOut(), + modifier = Modifier.clip(RoundedCornerShape(24.dp)) ) { - RoundedCardContainer(spacing = 2.dp) { + RoundedCardContainer(modifier = Modifier.padding(top = 8.dp)) { content() } } diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/linkActions/LinkPickerAdapter.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/linkActions/LinkPickerAdapter.kt index 6f126c3bc..6a7f0f567 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/linkActions/LinkPickerAdapter.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/linkActions/LinkPickerAdapter.kt @@ -20,7 +20,6 @@ import android.net.Uri import android.text.Html import android.util.Log import android.widget.Toast -import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.combinedClickable @@ -32,20 +31,14 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.asPaddingValues -import androidx.compose.foundation.layout.IntrinsicSize -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.aspectRatio -import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.ime import androidx.compose.foundation.layout.imePadding -import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBars -import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape @@ -58,15 +51,12 @@ import androidx.compose.material3.CardDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.FilledIconButton -import androidx.compose.material3.FilledTonalButton -import androidx.compose.material3.FilledTonalIconButton import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.LoadingIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.OutlinedTextFieldDefaults import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.ToggleButton @@ -87,12 +77,10 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource @@ -102,14 +90,9 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.core.content.edit -import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.Crossfade import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween -import androidx.compose.animation.expandHorizontally -import androidx.compose.animation.fadeIn -import androidx.compose.animation.fadeOut -import androidx.compose.animation.shrinkHorizontally import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color @@ -130,7 +113,6 @@ import com.sameerasw.essentials.utils.WindowingUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.delay -import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.BufferedReader import java.io.InputStreamReader @@ -202,6 +184,7 @@ private fun cleanTrackingParams(uri: Uri): Uri { @Composable fun LinkPickerScreen( uri: Uri, + disableLinkPreview: Boolean = false, onFinish: () -> Unit, modifier: Modifier = Modifier, demo: Boolean = false, @@ -224,7 +207,7 @@ fun LinkPickerScreen( // Preview data state var linkPreviewData by remember { mutableStateOf(null) } - var isLoadingPreview by remember { mutableStateOf(true) } + var isLoadingPreview by remember { mutableStateOf(!disableLinkPreview) } // App lists var baseOpenWithApps by remember { mutableStateOf>(emptyList()) } @@ -235,7 +218,7 @@ fun LinkPickerScreen( LaunchedEffect(currentUri) { isLoadingApps = true - isLoadingPreview = true + isLoadingPreview = !disableLinkPreview linkPreviewData = null withContext(Dispatchers.IO) { @@ -253,7 +236,7 @@ fun LinkPickerScreen( } // Fetch preview data asynchronously and smoothly update when ready - val preview = fetchLinkPreviewData(currentUri) + val preview = if (!disableLinkPreview) fetchLinkPreviewData(currentUri) else null withContext(Dispatchers.Main) { linkPreviewData = preview isLoadingPreview = false @@ -645,10 +628,14 @@ fun LinkPickerScreen( }, shape = RoundedCornerShape(16.dp), color = MaterialTheme.colorScheme.surfaceBright, - modifier = Modifier.fillMaxSize().maskClip(RoundedCornerShape(16.dp)), + modifier = Modifier + .fillMaxSize() + .maskClip(RoundedCornerShape(16.dp)), ) { Row( - modifier = Modifier.fillMaxSize().padding(horizontal = 10.dp), + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 10.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center, ) { @@ -837,7 +824,8 @@ fun LinkPickerScreen( height = topBlurHeightPx, direction = BlurDirection.TOP, showGradientOverlay = false, - ).progressiveBlur( + ) + .progressiveBlur( blurRadius = 40f, height = bottomBlurHeightPx, direction = BlurDirection.BOTTOM, diff --git a/app/src/main/java/com/sameerasw/essentials/ui/features/apps/LinkActionsSettingsUI.kt b/app/src/main/java/com/sameerasw/essentials/ui/features/apps/LinkActionsSettingsUI.kt new file mode 100644 index 000000000..23279037c --- /dev/null +++ b/app/src/main/java/com/sameerasw/essentials/ui/features/apps/LinkActionsSettingsUI.kt @@ -0,0 +1,93 @@ +package com.sameerasw.essentials.ui.features.apps + +/* + * Copyright (c) 2026 sameerasw.com + * License: MIT License + * + * Feature Module: Link Action Features + * File: LinkActionsSettingsUI.kt + * Description: Composable screen for Link actions settings. + */ + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.core.net.toUri +import com.sameerasw.essentials.R +import com.sameerasw.essentials.ui.components.linkActions.LinkPickerScreen +import com.sameerasw.essentials.ui.core.cards.FeatureCard +import com.sameerasw.essentials.ui.core.cards.IconToggleItem +import com.sameerasw.essentials.ui.core.containers.RoundedCardContainer +import com.sameerasw.essentials.ui.modifiers.highlight +import com.sameerasw.essentials.viewmodels.MainViewModel + +@Composable +fun LinkActionsSettingsUI( + viewModel: MainViewModel, + modifier: Modifier = Modifier, + highlightSetting: String? = null, +) { + var linkActionVisible by remember { mutableStateOf(false) } + + if (linkActionVisible) { + LinkPickerScreen( + uri = "https://sameerasw.com".toUri(), + disableLinkPreview = viewModel.disableLinkPreview.value, + onFinish = { linkActionVisible = !linkActionVisible }, + modifier = Modifier.fillMaxSize(), + ) + } + + Column( + modifier = + modifier + .fillMaxWidth() + .padding(16.dp), + verticalArrangement = Arrangement.spacedBy(4.dp), + ) { + Text( + text = "Link action options", + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(start = 16.dp, top = 8.dp, bottom = 8.dp), + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + + RoundedCardContainer(spacing = 2.dp) { + FeatureCard( + modifier = Modifier.highlight(highlightSetting == "Link action"), + title = R.string.link_action_title_open, + description = R.string.link_action_desc_open, + iconRes = R.drawable.rounded_link_24, + isEnabled = true, + isToggleEnabled = false, + showToggle = false, + onDisabledToggleClick = null, + hasMoreSettings = false, + isBeta = false, + onToggle = {}, + onClick = { linkActionVisible = !linkActionVisible }, + ) + + IconToggleItem( + iconRes = R.drawable.rounded_window_open_24, + title = stringResource(R.string.disable_link_preview_title), + description = stringResource(R.string.disable_link_preview_desc), + isChecked = viewModel.disableLinkPreview.value, + onCheckedChange = { viewModel.toggleDisableLinkPreview() }, + modifier = Modifier.highlight(highlightSetting == "disable_link_preview"), + ) + } + } +} diff --git a/app/src/main/java/com/sameerasw/essentials/ui/features/display/SmartPixelsSettingsUI.kt b/app/src/main/java/com/sameerasw/essentials/ui/features/display/SmartPixelsSettingsUI.kt index 2bb2fbbfe..66a597e2f 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/features/display/SmartPixelsSettingsUI.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/features/display/SmartPixelsSettingsUI.kt @@ -54,6 +54,7 @@ fun SmartPixelsSettingsUI( HapticUtil.performUIHaptic(view) viewModel.setSmartPixelsEnabled(context, checked) }, + enabled = viewModel.isAccessibilityEnabled.value, modifier = Modifier.highlight(highlightSetting == "smart_pixels_enable_toggle"), ) } diff --git a/app/src/main/java/com/sameerasw/essentials/ui/features/system/NavigationSettingsUI.kt b/app/src/main/java/com/sameerasw/essentials/ui/features/system/NavigationSettingsUI.kt index 2af69d71a..2ed886b24 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/features/system/NavigationSettingsUI.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/features/system/NavigationSettingsUI.kt @@ -231,7 +231,7 @@ fun NavigationSettingsUI( IconToggleItem( title = stringResource(R.string.feat_circle_to_search_gesture_title), description = stringResource(R.string.feat_circle_to_search_gesture_desc), - isChecked = viewModel.isCircleToSearchGestureEnabled.value, + isChecked = (isAccessibilityEnabled && viewModel.isCircleToSearchGestureEnabled.value), onCheckedChange = { enabled -> if (isShellGranted && isAccessibilityEnabled) { viewModel.setCircleToSearchGestureEnabled(enabled, context) @@ -271,7 +271,7 @@ fun NavigationSettingsUI( ) AnimatedVisibility( - visible = viewModel.isCircleToSearchGestureEnabled.value, + visible = isAccessibilityEnabled && viewModel.isCircleToSearchGestureEnabled.value, enter = expandVertically(), exit = shrinkVertically(), ) { @@ -279,7 +279,7 @@ fun NavigationSettingsUI( title = stringResource(R.string.feat_circle_to_search_gesture_height_title), value = viewModel.circleToSearchGestureHeight.floatValue, onValueChange = { viewModel.setCircleToSearchGestureHeight(it) }, - valueRange = 24f..120f, + valueRange = 14f..120f, increment = 4f, iconRes = R.drawable.rounded_border_bottom_24, description = stringResource(R.string.feat_circle_to_search_gesture_height_desc), @@ -288,7 +288,7 @@ fun NavigationSettingsUI( } AnimatedVisibility( - visible = viewModel.isCircleToSearchGestureEnabled.value, + visible = isAccessibilityEnabled && viewModel.isCircleToSearchGestureEnabled.value, enter = expandVertically(), exit = shrinkVertically(), ) { diff --git a/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt b/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt index 3984261e9..ef94238bb 100644 --- a/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt +++ b/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt @@ -399,6 +399,8 @@ class MainViewModel : ViewModel() { private var workflowPollingJob: kotlinx.coroutines.Job? = null val gitHubUser = mutableStateOf(null) + val disableLinkPreview = mutableStateOf(false) + private val contentObserver = object : ContentObserver(Handler(Looper.getMainLooper())) { override fun onChange( @@ -1179,6 +1181,15 @@ class MainViewModel : ViewModel() { } } + fun toggleDisableLinkPreview() { + val status = !disableLinkPreview.value + settingsRepository.putBoolean( + SettingsRepository.KEY_DISABLE_LINK_PREVIEW, + status + ) + disableLinkPreview.value = status + } + /** * Executes the check operation. * @@ -1190,6 +1201,8 @@ class MainViewModel : ViewModel() { updateRepository = UpdateRepository() gitHubUser.value = settingsRepository.getGitHubUser() + disableLinkPreview.value = settingsRepository.getBoolean(SettingsRepository.KEY_DISABLE_LINK_PREVIEW) + // Sync with system per-app language settings val currentLocales = AppCompatDelegate.getApplicationLocales() if (!currentLocales.isEmpty) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1652b8526..9acb5392f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -627,8 +627,6 @@ Tap action for Pixel searchbar replacement New Automation Edit Automation - Link actions - Handle links with multiple apps Flashlight Improve flashlight behavior Restore mode @@ -724,6 +722,13 @@ No local calendars found Calendar sync started + Link actions + Handle links with multiple apps + Link action + Open link actions sheet + Disable link previews + URL data will not be loaded (Website info). + Widget Haptic feedback Pick haptic feedback for widget taps