diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 01d89927b..fff3f3096 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,6 +50,7 @@ android:localeConfig="@xml/locales_config" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" + android:enableOnBackInvokedCallback="true" android:theme="@style/Theme.Essentials"> + + + + + 0) { progress -> + try { + progress.collect { backEvent -> + backProgress.snapTo(backEvent.progress) + } + currentPage = 0 + scope.launch { + backProgress.animateTo( + targetValue = 0f, + animationSpec = tween(durationMillis = 400) + ) + } + } catch (e: java.util.concurrent.CancellationException) { + scope.launch { + backProgress.animateTo( + targetValue = 0f, + animationSpec = tween(durationMillis = 300) + ) + } + } + } + // Gracefully handle tab removal (e.g. disabling Developer Mode) LaunchedEffect(tabs) { - if (pagerState.currentPage >= tabs.size) { - pagerState.scrollToPage(0) + if (currentPage >= tabs.size) { + currentPage = 0 } } val exitAlwaysScrollBehavior = @@ -381,8 +417,8 @@ class MainActivity : FragmentActivity() { .nestedScroll(exitAlwaysScrollBehavior), containerColor = MaterialTheme.colorScheme.surfaceContainer, topBar = { - val currentTab = remember(tabs, pagerState.currentPage) { - tabs.getOrNull(pagerState.currentPage) ?: tabs.firstOrNull() + val currentTab = remember(tabs, currentPage) { + tabs.getOrNull(currentPage) ?: tabs.firstOrNull() ?: DIYTabs.ESSENTIALS } ReusableTopAppBar( @@ -420,25 +456,25 @@ class MainActivity : FragmentActivity() { if (currentTab == DIYTabs.APPS) { IconButton( onClick = { - HapticUtil.performMediumHaptic(view) + HapticUtil.performVirtualKeyHaptic(view) updatesViewModel.checkForUpdates(context) }, enabled = refreshingRepoIds.isEmpty(), colors = IconButtonDefaults.iconButtonColors( containerColor = MaterialTheme.colorScheme.surfaceBright ), - modifier = Modifier.size(48.dp) + modifier = Modifier.size(40.dp) ) { if (refreshingRepoIds.isNotEmpty()) { CircularWavyProgressIndicator( progress = { animatedProgress }, - modifier = Modifier.size(32.dp) + modifier = Modifier.size(24.dp) ) } else { Icon( painter = painterResource(id = R.drawable.rounded_refresh_24), contentDescription = stringResource(R.string.action_refresh), - modifier = Modifier.size(32.dp) + modifier = Modifier.size(24.dp) ) } } @@ -455,38 +491,51 @@ class MainActivity : FragmentActivity() { DIYFloatingToolbar( modifier = Modifier .align(Alignment.BottomCenter) - .offset(y = -ScreenOffset - 12.dp) + .offset(y = -ScreenOffset) .zIndex(1f), - currentPage = pagerState.currentPage, + currentPage = currentPage, tabs = tabs, onTabSelected = { index -> HapticUtil.performUIHaptic(view) - scope.launch { - pagerState.animateScrollToPage(index) - } + currentPage = index }, scrollBehavior = exitAlwaysScrollBehavior, badges = mapOf(DIYTabs.APPS to viewModel.hasPendingUpdates.value) ) - HorizontalPager( - state = pagerState, - modifier = Modifier.fillMaxSize(), - verticalAlignment = Alignment.Top, - beyondViewportPageCount = 1 - ) { page -> - when (tabs[page]) { - DIYTabs.ESSENTIALS -> { - SetupFeatures( - viewModel = viewModel, - modifier = Modifier.padding(innerPadding), - searchRequested = searchRequested, - onSearchHandled = { searchRequested = false }, - onHelpClick = { showInstructionsSheet = true } + AnimatedContent( + targetState = currentPage, + transitionSpec = { + val animationSpec = tween(durationMillis = 400) + val slideOffset = 150 + + (fadeIn(animationSpec = animationSpec) + slideInVertically( + animationSpec = tween(durationMillis = 400), + initialOffsetY = { slideOffset } + )).togetherWith( + fadeOut(animationSpec = animationSpec) + slideOutVertically( + animationSpec = tween(durationMillis = 400), + targetOffsetY = { slideOffset } ) - } + ) + }, + modifier = Modifier + .scale(1f - (backProgress.value * 0.05f)) + .alpha(1f - (backProgress.value * 0.3f)), + label = "Tab Transition" + ) { targetPage -> + when (tabs[targetPage]) { + DIYTabs.ESSENTIALS -> { + SetupFeatures( + viewModel = viewModel, + modifier = Modifier.padding(innerPadding), + searchRequested = searchRequested, + onSearchHandled = { searchRequested = false }, + onHelpClick = { showInstructionsSheet = true } + ) + } - DIYTabs.FREEZE -> { + DIYTabs.FREEZE -> { FreezeGridUI( viewModel = viewModel, modifier = Modifier.padding(innerPadding), @@ -557,7 +606,7 @@ class MainActivity : FragmentActivity() { modifier = Modifier.fillMaxSize(), contentPadding = androidx.compose.foundation.layout.PaddingValues( top = innerPadding.calculateTopPadding() + 16.dp, - bottom = innerPadding.calculateBottomPadding() + 88.dp, // Extra padding for FAB + bottom = 150.dp, start = 16.dp, end = 16.dp ), @@ -776,7 +825,7 @@ class MainActivity : FragmentActivity() { modifier = Modifier .align(Alignment.BottomEnd) .padding( - bottom = innerPadding.calculateBottomPadding() + 32.dp, + bottom = 150.dp, end = 32.dp ), containerColor = MaterialTheme.colorScheme.primaryContainer, @@ -794,7 +843,6 @@ class MainActivity : FragmentActivity() { } } - // Mark app as ready after composing (happens very quickly) LaunchedEffect(Unit) { isAppReady = true @@ -803,7 +851,7 @@ class MainActivity : FragmentActivity() { } } } - + override fun onResume() { super.onResume() viewModel.check(this) diff --git a/app/src/main/java/com/sameerasw/essentials/SettingsActivity.kt b/app/src/main/java/com/sameerasw/essentials/SettingsActivity.kt index 2b70802f5..6100d7dfb 100644 --- a/app/src/main/java/com/sameerasw/essentials/SettingsActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/SettingsActivity.kt @@ -102,6 +102,7 @@ class SettingsActivity : ComponentActivity() { val isPitchBlackThemeEnabled by viewModel.isPitchBlackThemeEnabled EssentialsTheme(pitchBlackTheme = isPitchBlackThemeEnabled) { val context = LocalContext.current + val view = LocalView.current val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState()) @@ -136,16 +137,19 @@ class SettingsActivity : ComponentActivity() { scrollBehavior = scrollBehavior, actions = { androidx.compose.material3.IconButton( - onClick = { showBugReportSheet = true }, + onClick = { + HapticUtil.performVirtualKeyHaptic(view) + showBugReportSheet = true + }, colors = androidx.compose.material3.IconButtonDefaults.iconButtonColors( containerColor = MaterialTheme.colorScheme.surfaceBright ), - modifier = Modifier.size(48.dp) + modifier = Modifier.size(40.dp) ) { Icon( painter = painterResource(id = R.drawable.rounded_bug_report_24), contentDescription = "Report Bug", - modifier = Modifier.size(32.dp) + modifier = Modifier.size(24.dp) ) } } diff --git a/app/src/main/java/com/sameerasw/essentials/domain/registry/PermissionRegistry.kt b/app/src/main/java/com/sameerasw/essentials/domain/registry/PermissionRegistry.kt index 5f5a98f32..f687dacba 100644 --- a/app/src/main/java/com/sameerasw/essentials/domain/registry/PermissionRegistry.kt +++ b/app/src/main/java/com/sameerasw/essentials/domain/registry/PermissionRegistry.kt @@ -52,12 +52,15 @@ fun initPermissionRegistry() { // Bluetooth permissions PermissionRegistry.register("BLUETOOTH_CONNECT", R.string.feat_batteries_title) PermissionRegistry.register("BLUETOOTH_SCAN", R.string.feat_batteries_title) + PermissionRegistry.register("BLUETOOTH_CONNECT", R.string.feat_battery_notification_title) + PermissionRegistry.register("BLUETOOTH_SCAN", R.string.feat_battery_notification_title) // Draw over other apps permission PermissionRegistry.register("DRAW_OVER_OTHER_APPS", R.string.feat_notification_lighting_title) // Post notifications permission PermissionRegistry.register("POST_NOTIFICATIONS", R.string.feat_caffeinate_title) + PermissionRegistry.register("POST_NOTIFICATIONS", R.string.feat_battery_notification_title) // Read phone state permission PermissionRegistry.register("READ_PHONE_STATE", R.string.search_smart_data_title) diff --git a/app/src/main/java/com/sameerasw/essentials/services/BatteryNotificationService.kt b/app/src/main/java/com/sameerasw/essentials/services/BatteryNotificationService.kt index 0b1d0bbfe..24b2ca6a0 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/BatteryNotificationService.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/BatteryNotificationService.kt @@ -161,12 +161,19 @@ class BatteryNotificationService : Service() { private fun createCompositeBitmap(items: List): Bitmap { val itemSize = 256 val spacing = 48 - val totalWidth = items.size * itemSize + (items.size - 1) * spacing + + val actualContentWidth = items.size * itemSize + (items.size - 1).coerceAtLeast(0) * spacing + + val minWideItems = 3 + val minWideWidth = minWideItems * itemSize + (minWideItems - 1) * spacing + val totalWidth = actualContentWidth.coerceAtLeast(minWideWidth) val totalHeight = itemSize val composite = Bitmap.createBitmap(totalWidth, totalHeight, Bitmap.Config.ARGB_8888) val canvas = Canvas(composite) + val startX = (totalWidth - actualContentWidth) / 2f + val accentColor = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { getColor(android.R.color.system_accent1_100) } else { @@ -189,7 +196,7 @@ class BatteryNotificationService : Service() { item.statusIconRes?.let { ContextCompat.getDrawable(this, it) }, itemSize, itemSize ) - canvas.drawBitmap(itemBitmap, (index * (itemSize + spacing)).toFloat(), 0f, null) + canvas.drawBitmap(itemBitmap, startX + (index * (itemSize + spacing)).toFloat(), 0f, null) } return composite diff --git a/app/src/main/java/com/sameerasw/essentials/services/tiles/ColorPickerTileService.kt b/app/src/main/java/com/sameerasw/essentials/services/tiles/ColorPickerTileService.kt new file mode 100644 index 000000000..468817d66 --- /dev/null +++ b/app/src/main/java/com/sameerasw/essentials/services/tiles/ColorPickerTileService.kt @@ -0,0 +1,60 @@ +package com.sameerasw.essentials.services.tiles + +import android.app.PendingIntent +import android.content.ActivityNotFoundException +import android.content.ComponentName +import android.content.Intent +import android.graphics.drawable.Icon +import android.os.Build +import android.os.Handler +import android.os.Looper +import android.service.quicksettings.Tile +import android.widget.Toast +import androidx.annotation.RequiresApi +import com.sameerasw.essentials.R + +@RequiresApi(Build.VERSION_CODES.N) +class ColorPickerTileService : BaseTileService() { + + override fun getTileLabel(): String = getString(R.string.tile_color_picker) + + override fun getTileSubtitle(): String = getString(R.string.subtitle_eye_dropper) + + override fun hasFeaturePermission(): Boolean = true + + override fun getTileIcon(): Icon { + return Icon.createWithResource(this, R.drawable.rounded_colorize_24) + } + + override fun getTileState(): Int = Tile.STATE_INACTIVE + + override fun onTileClick() { + val intent = Intent(Intent.ACTION_MAIN).apply { + component = ComponentName("com.android.eyedropper", "com.android.eyedropper.MainActivity") + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP + } + + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + val pendingIntent = PendingIntent.getActivity( + this, + 0, + intent, + PendingIntent.FLAG_IMMUTABLE + ) + startActivityAndCollapse(pendingIntent) + } else { + @Suppress("DEPRECATION") + startActivityAndCollapse(intent) + } + } catch (e: Exception) { + Handler(Looper.getMainLooper()).post { + Toast.makeText( + applicationContext, + getString(R.string.toast_eyedropper_failed), + Toast.LENGTH_SHORT + ).show() + } + } + } +} diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/AppFreezingActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/AppFreezingActivity.kt index 859c034d0..58ac2a406 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/AppFreezingActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/AppFreezingActivity.kt @@ -195,14 +195,14 @@ class AppFreezingActivity : ComponentActivity() { Column( modifier = Modifier .fillMaxSize() - .padding(32.dp), + .padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Icon( painter = painterResource(id = R.drawable.rounded_mode_cool_24), contentDescription = null, - modifier = Modifier.size(64.dp), + modifier = Modifier.size(24.dp), tint = MaterialTheme.colorScheme.primary.copy(alpha = 0.5f) ) Spacer(modifier = Modifier.height(16.dp)) @@ -216,7 +216,7 @@ class AppFreezingActivity : ComponentActivity() { } else { RoundedCardContainer( modifier = Modifier - .padding(24.dp) + .padding(16.dp) ) { LazyVerticalGrid( columns = GridCells.Adaptive(minSize = 88.dp), @@ -334,7 +334,6 @@ fun AppGridItem( Text( text = app.appName, style = MaterialTheme.typography.labelSmall, - fontSize = 11.sp, textAlign = TextAlign.Center, maxLines = 1, overflow = TextOverflow.Ellipsis, diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/FlashlightIntensityActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/FlashlightIntensityActivity.kt index a460b45ee..21c4e652e 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/FlashlightIntensityActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/FlashlightIntensityActivity.kt @@ -139,7 +139,7 @@ fun FlashlightIntensityOverlay(onDismiss: () -> Unit) { ) { Card( modifier = Modifier - .padding(24.dp) + .padding(16.dp) .fillMaxWidth() .clickable( interactionSource = remember { MutableInteractionSource() }, @@ -152,7 +152,7 @@ fun FlashlightIntensityOverlay(onDismiss: () -> Unit) { ) ) { Column( - modifier = Modifier.padding(24.dp), + modifier = Modifier.padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(16.dp) ) { @@ -160,7 +160,7 @@ fun FlashlightIntensityOverlay(onDismiss: () -> Unit) { painter = painterResource(id = R.drawable.rounded_flashlight_on_24), contentDescription = null, tint = MaterialTheme.colorScheme.primary, - modifier = Modifier.size(48.dp) + modifier = Modifier.size(24.dp) ) Text( diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/PrivateDnsSettingsActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/PrivateDnsSettingsActivity.kt index 5c6494f96..8f2a00957 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/PrivateDnsSettingsActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/PrivateDnsSettingsActivity.kt @@ -116,7 +116,7 @@ fun PrivateDnsSettingsOverlay(onDismiss: () -> Unit) { painter = painterResource(id = R.drawable.router_24px), contentDescription = null, tint = MaterialTheme.colorScheme.primary, - modifier = Modifier.size(32.dp) + modifier = Modifier.size(24.dp) ) Text( text = stringResource(R.string.tile_private_dns), @@ -212,14 +212,14 @@ fun PrivateDnsSettingsOverlay(onDismiss: () -> Unit) { Row( modifier = Modifier .fillMaxWidth() - .padding(bottom = 24.dp, top = 12.dp), + .padding(bottom = 16.dp, top = 8.dp), horizontalArrangement = Arrangement.spacedBy(12.dp) ) { OutlinedButton( onClick = onDismiss, modifier = Modifier .weight(1f) - .height(56.dp), + .height(48.dp), shape = RoundedCornerShape(24.dp) ) { Text(stringResource(R.string.action_cancel)) @@ -248,7 +248,7 @@ fun PrivateDnsSettingsOverlay(onDismiss: () -> Unit) { }, modifier = Modifier .weight(1f) - .height(56.dp), + .height(48.dp), shape = RoundedCornerShape(24.dp) ) { Text(stringResource(R.string.action_save)) diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/DIYFloatingToolbar.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/DIYFloatingToolbar.kt index 20ab819af..419cc3f4a 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/DIYFloatingToolbar.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/DIYFloatingToolbar.kt @@ -2,14 +2,18 @@ package com.sameerasw.essentials.ui.components import androidx.compose.animation.core.Spring import androidx.compose.animation.core.animateDpAsState -import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.spring import androidx.compose.animation.core.tween +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.FloatingToolbarDefaults @@ -19,22 +23,19 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.IconButtonDefaults import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.sameerasw.essentials.domain.DIYTabs -import kotlinx.coroutines.delay @OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class) @Composable @@ -46,50 +47,14 @@ fun DIYFloatingToolbar( scrollBehavior: FloatingToolbarScrollBehavior, badges: Map = emptyMap() ) { + // Persistent visibility var expanded by remember { mutableStateOf(true) } - var interactionCount by remember { mutableStateOf(0) } - - // Track which tab was just selected for bump animation - var bumpingTab by remember { mutableIntStateOf(-1) } - var bumpKey by remember { mutableIntStateOf(0) } - - // Auto-collapse after 5 seconds - LaunchedEffect(expanded, interactionCount, currentPage) { - if (expanded) { - delay(5000) - expanded = false - } - } - - // Reset bump animation after delay - LaunchedEffect(bumpKey) { - if (bumpingTab >= 0) { - delay(200) - bumpingTab = -1 - } - } - - // Expand when the page changes (e.g., via swipe) - LaunchedEffect(currentPage) { - if (!expanded) expanded = true - } - - // Animated values for bouncy feel - val toolbarScale by animateFloatAsState( - targetValue = if (expanded) 1f else 0.9f, - animationSpec = spring( - dampingRatio = Spring.DampingRatioMediumBouncy, - stiffness = Spring.StiffnessMediumLow - ), - label = "toolbar_scale" - ) HorizontalFloatingToolbar( modifier = modifier - .graphicsLayer { - scaleX = toolbarScale - scaleY = toolbarScale - }, + .windowInsetsPadding( + androidx.compose.foundation.layout.WindowInsets.navigationBars + ), expanded = expanded, scrollBehavior = scrollBehavior, colors = FloatingToolbarDefaults.vibrantFloatingToolbarColors( @@ -100,71 +65,46 @@ fun DIYFloatingToolbar( // FIXED ORDER LOOP to prevent shifting tabs.forEachIndexed { index, tab -> val isSelected = currentPage == index - val isBumping = bumpingTab == index - - // Animate scale for non-selected tabs when collapsing/expanding - val itemScale by animateFloatAsState( - targetValue = when { - isBumping -> 1.28f // Subtle bump animation when selected - isSelected -> 1.2f - expanded -> 1.2f - else -> 0f // Scale down to 0 when collapsed - }, - animationSpec = spring( - dampingRatio = if (isBumping) Spring.DampingRatioMediumBouncy else Spring.DampingRatioLowBouncy, - stiffness = if (isBumping) Spring.StiffnessHigh else Spring.StiffnessLow - ), - label = "item_scale_$index" - ) - - // Animate alpha for smooth fade - val itemAlpha by animateFloatAsState( - targetValue = if (expanded || isSelected) 1f else 0f, - animationSpec = tween(durationMillis = 200), - label = "item_alpha_$index" - ) // Animate width for spacing val itemWidth by animateDpAsState( targetValue = if (expanded || isSelected) 48.dp else 0.dp, animationSpec = spring( - dampingRatio = Spring.DampingRatioLowBouncy, + dampingRatio = Spring.DampingRatioMediumBouncy, stiffness = Spring.StiffnessLow ), label = "item_width_$index" ) + // Animate label width for active tab + val labelWidth by animateDpAsState( + targetValue = if (isSelected) 80.dp else 0.dp, + animationSpec = spring( + dampingRatio = Spring.DampingRatioMediumBouncy, + stiffness = Spring.StiffnessLow + ), + label = "label_width_$index" + ) + // Animate spacer width val spacerWidth by animateDpAsState( - targetValue = if (expanded && index < tabs.size - 1) 16.dp else 0.dp, + targetValue = if (index < tabs.size - 1) 8.dp else 0.dp, animationSpec = spring( - dampingRatio = Spring.DampingRatioNoBouncy, - stiffness = Spring.StiffnessMediumLow + dampingRatio = Spring.DampingRatioMediumBouncy, + stiffness = Spring.StiffnessLow ), label = "spacer_width_$index" ) - + // Always render the button, but animate its visibility if (itemWidth > 0.dp || isSelected) { IconButton( onClick = { - interactionCount++ - if (!expanded) { - expanded = true - } else { - bumpingTab = index - bumpKey++ - onTabSelected(index) - } + onTabSelected(index) }, modifier = Modifier - .width(itemWidth) - .height(48.dp) - .graphicsLayer { - scaleX = itemScale - scaleY = itemScale - alpha = itemAlpha - }, + .width(itemWidth + labelWidth) + .height(48.dp), colors = if (isSelected) { IconButtonDefaults.filledIconButtonColors( contentColor = MaterialTheme.colorScheme.primary, @@ -177,28 +117,43 @@ fun DIYFloatingToolbar( ) } ) { - Box { - Icon( - painter = painterResource(id = tab.iconRes), - contentDescription = stringResource(id = tab.title), - tint = if (isSelected) { - MaterialTheme.colorScheme.primary - } else { - MaterialTheme.colorScheme.background - }, - modifier = Modifier.size(24.dp) - ) - if (badges[tab] == true) { - androidx.compose.foundation.Canvas( - modifier = Modifier - .size(8.dp) - .align(Alignment.TopEnd) - ) { - drawCircle( - color = if (isSelected) Color.Red else Color.Red, // Always red for now - ) + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, + modifier = Modifier.padding(horizontal = 8.dp) + ) { + Box { + Icon( + painter = painterResource(id = tab.iconRes), + contentDescription = stringResource(id = tab.title), + tint = if (isSelected) { + MaterialTheme.colorScheme.primary + } else { + MaterialTheme.colorScheme.background + }, + modifier = Modifier.size(24.dp) + ) + if (badges[tab] == true) { + androidx.compose.foundation.Canvas( + modifier = Modifier + .size(8.dp) + .align(Alignment.TopEnd) + ) { + drawCircle( + color = Color.Red, + ) + } } } + if (isSelected) { + Spacer(modifier = Modifier.width(8.dp)) + Text( + text = stringResource(id = tab.title), + style = MaterialTheme.typography.labelLarge, + maxLines = 1, + color = MaterialTheme.colorScheme.primary + ) + } } } diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/FavoriteCarousel.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/FavoriteCarousel.kt index bdff55bed..d939e015c 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/FavoriteCarousel.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/FavoriteCarousel.kt @@ -159,7 +159,7 @@ fun FavoriteCarousel( ) { Box( modifier = Modifier - .size(48.dp) + .size(40.dp) .background( color = ColorUtil.getPastelColorFor(resolvedTitle), shape = CircleShape @@ -169,7 +169,7 @@ fun FavoriteCarousel( Icon( painter = painterResource(id = feature.iconRes), contentDescription = resolvedTitle, - modifier = Modifier.size(28.dp), + modifier = Modifier.size(24.dp), tint = ColorUtil.getVibrantColorFor(resolvedTitle) ) } diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/ReusableTopAppBar.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/ReusableTopAppBar.kt index c153b4bb6..ea357a01b 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/ReusableTopAppBar.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/ReusableTopAppBar.kt @@ -166,13 +166,12 @@ fun ReusableTopAppBar( }, colors = IconButtonDefaults.iconButtonColors( containerColor = MaterialTheme.colorScheme.surfaceBright - ), - modifier = Modifier.size(48.dp) + ) ) { Icon( painter = painterResource(id = backIconRes), contentDescription = stringResource(R.string.action_back), - modifier = Modifier.size(32.dp) + modifier = Modifier.size(24.dp) ) } } @@ -190,14 +189,13 @@ fun ReusableTopAppBar( }, colors = IconButtonDefaults.iconButtonColors( containerColor = MaterialTheme.colorScheme.surfaceBright - ), - modifier = Modifier.size(48.dp) + ) ) { Box { Icon( painter = painterResource(id = helpIconRes), contentDescription = stringResource(helpContentDescription), - modifier = Modifier.size(32.dp) + modifier = Modifier.size(24.dp) ) if (hasHelpBadge) { Box( @@ -224,14 +222,13 @@ fun ReusableTopAppBar( }, colors = IconButtonDefaults.iconButtonColors( containerColor = MaterialTheme.colorScheme.surfaceBright - ), - modifier = Modifier.size(48.dp) + ) ) { Box { Icon( painter = painterResource(id = R.drawable.rounded_mobile_arrow_down_24), contentDescription = stringResource(R.string.update_available_title), - modifier = Modifier.size(32.dp) + modifier = Modifier.size(24.dp) ) // Red dot Box( @@ -269,7 +266,7 @@ fun ReusableTopAppBar( colors = IconButtonDefaults.iconButtonColors( containerColor = MaterialTheme.colorScheme.surfaceBright ), - modifier = Modifier.size(48.dp) + modifier = Modifier.size(40.dp) ) { if (gitHubUser != null) { AsyncImage( @@ -277,14 +274,14 @@ fun ReusableTopAppBar( contentDescription = stringResource(R.string.action_profile), contentScale = ContentScale.Crop, modifier = Modifier - .size(32.dp) + .size(24.dp) .clip(CircleShape) ) } else { Icon( painter = painterResource(id = R.drawable.brand_github), contentDescription = stringResource(R.string.action_sign_in_github), - modifier = Modifier.size(32.dp) + modifier = Modifier.size(24.dp) ) } } @@ -325,13 +322,12 @@ fun ReusableTopAppBar( }, colors = IconButtonDefaults.iconButtonColors( containerColor = MaterialTheme.colorScheme.surfaceBright - ), - modifier = Modifier.size(48.dp) + ) ) { Icon( painter = painterResource(id = R.drawable.rounded_settings_heart_24), contentDescription = stringResource(R.string.content_desc_settings), - modifier = Modifier.size(32.dp) + modifier = Modifier.size(24.dp) ) } } @@ -354,8 +350,8 @@ fun ReusableTopAppBar( containerColor = containerColor ), modifier = Modifier.padding(horizontal = 8.dp), - expandedHeight = if (subtitle != null) 200.dp else 160.dp, - collapsedHeight = 64.dp, + expandedHeight = if (subtitle != null) 152.dp else 120.dp, + collapsedHeight = TopAppBarDefaults.LargeAppBarCollapsedHeight, title = titleContent, navigationIcon = navigationIconContent, actions = actionsContent, diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/cards/TrackedRepoCard.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/cards/TrackedRepoCard.kt index d76e6a984..2b21ec5fa 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/cards/TrackedRepoCard.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/cards/TrackedRepoCard.kt @@ -210,7 +210,7 @@ fun TrackedRepoCard( ) { CircularWavyProgressIndicator( progress = { downloadProgress }, - modifier = Modifier.size(32.dp) + modifier = Modifier.size(24.dp) ) } } else if (repo.isUpdateAvailable || repo.mappedPackageName == null) { diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/pickers/EdgeLightingStylePicker.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/pickers/EdgeLightingStylePicker.kt index a38df35b4..53c446791 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/pickers/EdgeLightingStylePicker.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/pickers/EdgeLightingStylePicker.kt @@ -74,7 +74,7 @@ fun NotificationLightingStylePicker( Icon( painter = painterResource(id = icons[index]), contentDescription = style.name, - modifier = Modifier.size(48.dp) + modifier = Modifier.size(24.dp) ) } } diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/AddRepoBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/AddRepoBottomSheet.kt index b9379703b..ced2c4211 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/AddRepoBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/AddRepoBottomSheet.kt @@ -289,7 +289,7 @@ fun AddRepoBottomSheet( Icon( painter = painterResource(id = R.drawable.round_star_24), contentDescription = null, - modifier = Modifier.size(16.dp) + modifier = Modifier.size(24.dp) ) Text( text = stringResource( @@ -312,7 +312,7 @@ fun AddRepoBottomSheet( Icon( painterResource(id = R.drawable.rounded_mobile_text_2_24), null, - Modifier.size(18.dp) + Modifier.size(24.dp) ) Spacer(Modifier.width(8.dp)) Text(stringResource(R.string.action_view_readme)) @@ -498,7 +498,7 @@ fun AddRepoBottomSheet( bitmap = selectedApp!!.icon, contentDescription = null, modifier = Modifier - .size(32.dp) + .size(24.dp) .clip(CircleShape) ) Column { diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/BugReportBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/BugReportBottomSheet.kt index 6fb6e2d04..629fef0d6 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/BugReportBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/BugReportBottomSheet.kt @@ -113,8 +113,8 @@ fun BugReportBottomSheet( ) { Column( modifier = Modifier - .padding(horizontal = 24.dp) - .padding(bottom = 32.dp) + .padding(horizontal = 16.dp) + .padding(bottom = 24.dp) .verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(16.dp), horizontalAlignment = Alignment.CenterHorizontally @@ -129,7 +129,7 @@ fun BugReportBottomSheet( Column( modifier = Modifier .background(MaterialTheme.colorScheme.surfaceBright) - .padding(24.dp) + .padding(16.dp) .fillMaxWidth() ) { Text( @@ -160,7 +160,7 @@ fun BugReportBottomSheet( modifier = Modifier .fillMaxWidth() .clickable { isRawReportExpanded = !isRawReportExpanded } - .padding(vertical = 16.dp, horizontal = 24.dp), + .padding(16.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { @@ -236,7 +236,7 @@ fun BugReportBottomSheet( Icon( painter = painterResource(R.drawable.brand_github), contentDescription = null, - modifier = Modifier.size(18.dp) + modifier = Modifier.size(24.dp) ) Spacer(modifier = Modifier.width(8.dp)) Text(stringResource(R.string.action_report_github)) @@ -269,7 +269,7 @@ fun BugReportBottomSheet( Icon( painter = painterResource(R.drawable.rounded_mail_24), contentDescription = null, - modifier = Modifier.size(18.dp) + modifier = Modifier.size(24.dp) ) Spacer(modifier = Modifier.width(8.dp)) Text(stringResource(R.string.action_report_email)) @@ -293,7 +293,7 @@ fun BugReportBottomSheet( Icon( painter = painterResource(R.drawable.rounded_content_copy_24), contentDescription = null, - modifier = Modifier.size(18.dp) + modifier = Modifier.size(24.dp) ) Spacer(modifier = Modifier.width(8.dp)) Text(stringResource(R.string.action_copy_clipboard)) diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/DeviceEffectsSettingsSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/DeviceEffectsSettingsSheet.kt index 7903f4379..deaea3e76 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/DeviceEffectsSettingsSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/DeviceEffectsSettingsSheet.kt @@ -66,9 +66,9 @@ fun DeviceEffectsSettingsSheet( ) { Column( modifier = Modifier - .padding(24.dp) + .padding(16.dp) .fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(24.dp) + verticalArrangement = Arrangement.spacedBy(16.dp) ) { Text( text = stringResource(R.string.diy_action_device_effects), diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/DimWallpaperSettingsSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/DimWallpaperSettingsSheet.kt index 21ac95a85..3c5e9accd 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/DimWallpaperSettingsSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/DimWallpaperSettingsSheet.kt @@ -59,9 +59,9 @@ fun DimWallpaperSettingsSheet( ) { Column( modifier = Modifier - .padding(24.dp) + .padding(16.dp) .fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(24.dp) + verticalArrangement = Arrangement.spacedBy(16.dp) ) { Text( text = stringResource(R.string.diy_action_dim_wallpaper), diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/FeatureHelpBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/FeatureHelpBottomSheet.kt index 11ed870f0..24b044ecf 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/FeatureHelpBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/FeatureHelpBottomSheet.kt @@ -62,7 +62,7 @@ fun FeatureHelpBottomSheet( ) { Box( modifier = Modifier - .size(48.dp) + .size(40.dp) .background( color = ColorUtil.getPastelColorFor(stringResource(feature.title)), shape = CircleShape @@ -72,7 +72,7 @@ fun FeatureHelpBottomSheet( Icon( painter = painterResource(id = feature.iconRes), contentDescription = null, - modifier = Modifier.size(32.dp), + modifier = Modifier.size(24.dp), tint = ColorUtil.getVibrantColorFor(stringResource(feature.title)) ) } diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/NewAutomationSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/NewAutomationSheet.kt index c285b7fbd..ea754ab10 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/NewAutomationSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/NewAutomationSheet.kt @@ -129,7 +129,7 @@ private fun AutomationTypeOption( Icon( painter = painterResource(id = iconRes), contentDescription = null, - modifier = Modifier.size(32.dp), + modifier = Modifier.size(24.dp), tint = MaterialTheme.colorScheme.primary ) Spacer(modifier = Modifier.width(16.dp)) diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/SoundModeSettingsSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/SoundModeSettingsSheet.kt index 015dae4e3..a66329882 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/SoundModeSettingsSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/SoundModeSettingsSheet.kt @@ -41,9 +41,9 @@ fun SoundModeSettingsSheet( ) { Column( modifier = Modifier - .padding(24.dp) + .padding(16.dp) .fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(24.dp) + verticalArrangement = Arrangement.spacedBy(16.dp) ) { Text( text = stringResource(R.string.diy_action_sound_mode), diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/UpdateBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/UpdateBottomSheet.kt index 7e6647d61..d7ab8a7c1 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/UpdateBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/UpdateBottomSheet.kt @@ -80,7 +80,7 @@ fun UpdateBottomSheet( Icon( painter = painterResource(id = if (updateInfo.isUpdateAvailable) R.drawable.rounded_mobile_arrow_down_24 else R.drawable.rounded_mobile_check_24), contentDescription = null, - modifier = Modifier.size(64.dp), + modifier = Modifier.size(24.dp), tint = if (updateInfo.isUpdateAvailable) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.secondary ) @@ -113,7 +113,7 @@ fun UpdateBottomSheet( painter = painterResource(id = R.drawable.rounded_mobile_code_24), contentDescription = null, tint = MaterialTheme.colorScheme.error, - modifier = Modifier.size(20.dp) + modifier = Modifier.size(24.dp) ) Text( text = stringResource(R.string.warning_pre_release), @@ -167,7 +167,7 @@ fun UpdateBottomSheet( Icon( painter = painterResource(id = R.drawable.brand_github), contentDescription = null, - modifier = Modifier.size(18.dp) + modifier = Modifier.size(24.dp) ) Spacer(modifier = Modifier.width(8.dp)) Text(stringResource(R.string.action_view_on_github)) @@ -187,7 +187,7 @@ fun UpdateBottomSheet( } } - Spacer(modifier = Modifier.height(32.dp)) + Spacer(modifier = Modifier.height(16.dp)) } } } diff --git a/app/src/main/java/com/sameerasw/essentials/ui/composables/DIYScreen.kt b/app/src/main/java/com/sameerasw/essentials/ui/composables/DIYScreen.kt index 6f3c2b45e..3a8ab2cbd 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/composables/DIYScreen.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/composables/DIYScreen.kt @@ -75,7 +75,7 @@ fun DIYScreen( LazyColumn( modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.spacedBy(16.dp), - contentPadding = PaddingValues(bottom = 80.dp) + contentPadding = PaddingValues(bottom = 150.dp) ) { if (enabledAutomations.isNotEmpty()) { item { diff --git a/app/src/main/java/com/sameerasw/essentials/ui/composables/FreezeGridUI.kt b/app/src/main/java/com/sameerasw/essentials/ui/composables/FreezeGridUI.kt index 5dcd47370..d60ff16e9 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/composables/FreezeGridUI.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/composables/FreezeGridUI.kt @@ -123,14 +123,14 @@ fun FreezeGridUI( Column( modifier = Modifier .fillMaxSize() - .padding(18.dp), + .padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Icon( painter = painterResource(id = R.drawable.rounded_mode_cool_24), contentDescription = null, - modifier = Modifier.size(64.dp), + modifier = Modifier.size(24.dp), tint = MaterialTheme.colorScheme.primary.copy(alpha = 0.5f) ) Spacer(modifier = Modifier.height(16.dp)) @@ -145,14 +145,14 @@ fun FreezeGridUI( RoundedCardContainer( modifier = Modifier .padding(horizontal = 16.dp) - .padding(top = 24.dp), + .padding(top = 16.dp), ) { LazyVerticalGrid( columns = GridCells.Adaptive(minSize = 88.dp), state = gridState, modifier = Modifier.fillMaxSize(), contentPadding = PaddingValues( - bottom = contentPadding.calculateBottomPadding() + 88.dp, + bottom = 150.dp, top = 0.dp ), horizontalArrangement = Arrangement.spacedBy(2.dp), @@ -184,7 +184,7 @@ fun FreezeGridUI( Box( modifier = Modifier .align(Alignment.BottomEnd) - .padding(bottom = contentPadding.calculateBottomPadding() + 16.dp, end = 16.dp) + .padding(bottom = 150.dp, end = 16.dp) ) { ExpandableFreezeFab( onUnfreezeAll = { viewModel.unfreezeAllApps(context) }, @@ -274,7 +274,6 @@ fun AppGridItem( Text( text = app.appName, style = MaterialTheme.typography.labelSmall, - fontSize = 11.sp, textAlign = TextAlign.Center, maxLines = 1, overflow = TextOverflow.Ellipsis, diff --git a/app/src/main/java/com/sameerasw/essentials/ui/composables/SetupFeatures.kt b/app/src/main/java/com/sameerasw/essentials/ui/composables/SetupFeatures.kt index 9fda8dabf..d88bfb4e0 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/composables/SetupFeatures.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/composables/SetupFeatures.kt @@ -780,7 +780,7 @@ fun SetupFeatures( .pointerInput(Unit) { detectTapGestures(onTap = { focusManager.clearFocus() }) } - .padding(vertical = 24.dp), + .padding(top = 16.dp, bottom = 150.dp), verticalArrangement = Arrangement.Top, horizontalAlignment = Alignment.Start ) { @@ -791,7 +791,7 @@ fun SetupFeatures( }, modifier = Modifier .fillMaxWidth() - .padding(24.dp) + .padding(16.dp) .focusRequester(focusRequester) .onFocusChanged { isFocused = it.isFocused }, leadingIcon = { diff --git a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/LocationReachedSettingsUI.kt b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/LocationReachedSettingsUI.kt index 6b9698750..26a3549f4 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/LocationReachedSettingsUI.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/LocationReachedSettingsUI.kt @@ -70,7 +70,7 @@ fun LocationReachedSettingsUI( Column( modifier = Modifier .fillMaxWidth() - .padding(24.dp), + .padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally ) { LoadingIndicator() @@ -85,16 +85,16 @@ fun LocationReachedSettingsUI( // Destination Set State RoundedCardContainer( modifier = Modifier, - cornerRadius = 24.dp + cornerRadius = 28.dp ) { Column( modifier = Modifier .fillMaxWidth() .background( color = MaterialTheme.colorScheme.surfaceBright, - shape = androidx.compose.foundation.shape.RoundedCornerShape(24.dp) + shape = androidx.compose.foundation.shape.RoundedCornerShape(28.dp) ) - .padding(20.dp), + .padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally ) { @@ -164,7 +164,7 @@ fun LocationReachedSettingsUI( Icon( painter = painterResource(id = R.drawable.rounded_my_location_24), contentDescription = null, - modifier = Modifier.size(48.dp), + modifier = Modifier.size(24.dp), tint = MaterialTheme.colorScheme.primary ) Spacer(modifier = Modifier.height(16.dp)) @@ -224,7 +224,7 @@ fun LocationReachedSettingsUI( Icon( painterResource(R.drawable.rounded_map_24), contentDescription = null, - modifier = Modifier.size(18.dp) + modifier = Modifier.size(24.dp) ) Spacer(modifier = Modifier.width(8.dp)) Text(stringResource(R.string.location_reached_view_map)) @@ -239,7 +239,7 @@ fun LocationReachedSettingsUI( Icon( painterResource(R.drawable.rounded_delete_24), contentDescription = null, - modifier = Modifier.size(18.dp) + modifier = Modifier.size(24.dp) ) Spacer(modifier = Modifier.width(8.dp)) Text(stringResource(R.string.location_reached_clear)) @@ -251,18 +251,18 @@ fun LocationReachedSettingsUI( // Empty State RoundedCardContainer( modifier = Modifier.fillMaxWidth(), - cornerRadius = 24.dp + cornerRadius = 28.dp ) { Column( modifier = Modifier - .padding(32.dp) + .padding(16.dp) .fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally ) { Icon( painter = painterResource(id = R.drawable.rounded_add_location_alt_24), contentDescription = null, - modifier = Modifier.size(64.dp), + modifier = Modifier.size(24.dp), tint = MaterialTheme.colorScheme.surfaceVariant ) Spacer(modifier = Modifier.height(16.dp)) @@ -308,7 +308,7 @@ fun LocationReachedSettingsUI( RoundedCardContainer( modifier = Modifier, - cornerRadius = 24.dp + cornerRadius = 28.dp ) { Column( modifier = Modifier @@ -333,9 +333,9 @@ fun LocationReachedSettingsUI( RoundedCardContainer( modifier = Modifier.background( color = MaterialTheme.colorScheme.errorContainer, - shape = androidx.compose.foundation.shape.RoundedCornerShape(24.dp) + shape = androidx.compose.foundation.shape.RoundedCornerShape(28.dp) ), - cornerRadius = 24.dp + cornerRadius = 28.dp ) { IconToggleItem( title = stringResource(R.string.location_reached_fsi_title), diff --git a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/QuickSettingsTilesSettingsUI.kt b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/QuickSettingsTilesSettingsUI.kt index 142d599db..1857e14a5 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/QuickSettingsTilesSettingsUI.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/QuickSettingsTilesSettingsUI.kt @@ -249,6 +249,13 @@ fun QuickSettingsTilesSettingsUI( listOf("WRITE_SECURE_SETTINGS"), R.string.about_desc_usb_debugging ), + QSTileInfo( + R.string.tile_color_picker, + R.drawable.rounded_colorize_24, + com.sameerasw.essentials.services.tiles.ColorPickerTileService::class.java, + emptyList(), + R.string.about_desc_color_picker + ), QSTileInfo( R.string.tile_developer_options, R.drawable.rounded_mobile_code_24, diff --git a/app/src/main/java/com/sameerasw/essentials/ui/ime/EmojiPicker.kt b/app/src/main/java/com/sameerasw/essentials/ui/ime/EmojiPicker.kt index bbd620c23..df4b0026c 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/ime/EmojiPicker.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/ime/EmojiPicker.kt @@ -208,7 +208,7 @@ fun EmojiPicker( contentDescription = category.name, tint = if (isSelected) MaterialTheme.colorScheme.onPrimaryContainer else MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.size(20.dp) + modifier = Modifier.size(24.dp) ) } } diff --git a/app/src/main/java/com/sameerasw/essentials/ui/theme/Type.kt b/app/src/main/java/com/sameerasw/essentials/ui/theme/Type.kt index 54629fdb3..a4102e65d 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/theme/Type.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/theme/Type.kt @@ -15,14 +15,48 @@ val GoogleSansFlex = FontFamily( // Set of Material typography styles to start with, using GoogleSansFlex throughout val Typography = Typography( - bodyLarge = TextStyle( + displayLarge = TextStyle( fontFamily = GoogleSansFlex, fontWeight = FontWeight.Normal, - fontSize = 16.sp, - lineHeight = 24.sp, - letterSpacing = 0.5.sp - ) - /* Other default text styles to override can also use GoogleSansFlex, for example: + fontSize = 57.sp, + lineHeight = 64.sp, + letterSpacing = (-0.25).sp + ), + displayMedium = TextStyle( + fontFamily = GoogleSansFlex, + fontWeight = FontWeight.Normal, + fontSize = 45.sp, + lineHeight = 52.sp, + letterSpacing = 0.sp + ), + displaySmall = TextStyle( + fontFamily = GoogleSansFlex, + fontWeight = FontWeight.Normal, + fontSize = 36.sp, + lineHeight = 44.sp, + letterSpacing = 0.sp + ), + headlineLarge = TextStyle( + fontFamily = GoogleSansFlex, + fontWeight = FontWeight.Normal, + fontSize = 32.sp, + lineHeight = 40.sp, + letterSpacing = 0.sp + ), + headlineMedium = TextStyle( + fontFamily = GoogleSansFlex, + fontWeight = FontWeight.Normal, + fontSize = 28.sp, + lineHeight = 36.sp, + letterSpacing = 0.sp + ), + headlineSmall = TextStyle( + fontFamily = GoogleSansFlex, + fontWeight = FontWeight.Normal, + fontSize = 24.sp, + lineHeight = 32.sp, + letterSpacing = 0.sp + ), titleLarge = TextStyle( fontFamily = GoogleSansFlex, fontWeight = FontWeight.Normal, @@ -30,6 +64,55 @@ val Typography = Typography( lineHeight = 28.sp, letterSpacing = 0.sp ), + titleMedium = TextStyle( + fontFamily = GoogleSansFlex, + fontWeight = FontWeight.Medium, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.15.sp + ), + titleSmall = TextStyle( + fontFamily = GoogleSansFlex, + fontWeight = FontWeight.Medium, + fontSize = 14.sp, + lineHeight = 20.sp, + letterSpacing = 0.1.sp + ), + bodyLarge = TextStyle( + fontFamily = GoogleSansFlex, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ), + bodyMedium = TextStyle( + fontFamily = GoogleSansFlex, + fontWeight = FontWeight.Normal, + fontSize = 14.sp, + lineHeight = 20.sp, + letterSpacing = 0.25.sp + ), + bodySmall = TextStyle( + fontFamily = GoogleSansFlex, + fontWeight = FontWeight.Normal, + fontSize = 12.sp, + lineHeight = 16.sp, + letterSpacing = 0.4.sp + ), + labelLarge = TextStyle( + fontFamily = GoogleSansFlex, + fontWeight = FontWeight.Medium, + fontSize = 14.sp, + lineHeight = 20.sp, + letterSpacing = 0.1.sp + ), + labelMedium = TextStyle( + fontFamily = GoogleSansFlex, + fontWeight = FontWeight.Medium, + fontSize = 12.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ), labelSmall = TextStyle( fontFamily = GoogleSansFlex, fontWeight = FontWeight.Medium, @@ -37,5 +120,4 @@ val Typography = Typography( lineHeight = 16.sp, letterSpacing = 0.5.sp ) - */ ) \ No newline at end of file diff --git a/app/src/main/java/com/sameerasw/essentials/utils/PermissionUIHelper.kt b/app/src/main/java/com/sameerasw/essentials/utils/PermissionUIHelper.kt index 4ad711e15..4a42e5c94 100644 --- a/app/src/main/java/com/sameerasw/essentials/utils/PermissionUIHelper.kt +++ b/app/src/main/java/com/sameerasw/essentials/utils/PermissionUIHelper.kt @@ -252,6 +252,31 @@ object PermissionUIHelper { isGranted = viewModel.isDefaultBrowserSet.value ) + "BLUETOOTH_CONNECT", "BLUETOOTH_SCAN" -> PermissionItem( + iconRes = R.drawable.rounded_bluetooth_24, + title = R.string.perm_nearby_devices_title, + description = R.string.perm_nearby_devices_desc, + dependentFeatures = PermissionRegistry.getFeatures(key), + actionLabel = R.string.perm_action_grant, + action = { + if (activity != null) { + val permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + arrayOf( + android.Manifest.permission.BLUETOOTH_CONNECT, + android.Manifest.permission.BLUETOOTH_SCAN + ) + } else { + arrayOf( + android.Manifest.permission.BLUETOOTH, + android.Manifest.permission.BLUETOOTH_ADMIN + ) + } + ActivityCompat.requestPermissions(activity, permissions, 105) + } + }, + isGranted = viewModel.isBluetoothPermissionGranted.value + ) + else -> null } } diff --git a/app/src/main/res/drawable/rounded_colorize_24.xml b/app/src/main/res/drawable/rounded_colorize_24.xml new file mode 100644 index 000000000..1a75f5a03 --- /dev/null +++ b/app/src/main/res/drawable/rounded_colorize_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 97b6fe024..94708047e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -198,6 +198,9 @@ Auto Off USB Debugging + Color Picker + Are you sure you\'re on Androdi 17? (╯°_°)╯ + Eye Dropper On Off Custom Private DNS @@ -622,6 +625,7 @@ Toggle adaptive brightness.\n\nEnable or disable automatic screen brightness adjustment based on ambient light. Toggle Private DNS.\n\nCycle through Off, Automatic, and Private DNS provider modes. Toggle USB Debugging.\n\nEnable or disable ADB debugging access directly from the quick settings. + Launch the eye dropper tool to pick colors introduced in Android 17 BETA 2 Download