From 10ec51088595f34581827bab1e5270b9ea917920 Mon Sep 17 00:00:00 2001 From: Suhas Dissanayake Date: Fri, 14 Jul 2023 20:46:51 +0530 Subject: [PATCH] Code cleanup, use dynamic colors for amoled theme --- .../com/bnyro/recorder/enums/ThemeMode.kt | 4 +- .../java/com/bnyro/recorder/ui/Destination.kt | 7 ++ .../com/bnyro/recorder/ui/Destinations.kt | 17 ----- .../com/bnyro/recorder/ui/MainActivity.kt | 17 ++--- .../java/com/bnyro/recorder/ui/NavHost.kt | 18 +++-- .../bnyro/recorder/ui/common/BlobIconBox.kt | 10 ++- .../bnyro/recorder/ui/models/ThemeModel.kt | 2 +- .../bnyro/recorder/ui/screens/HomeScreen.kt | 68 +++++++++---------- .../bnyro/recorder/ui/screens/PlayerScreen.kt | 6 +- .../recorder/ui/screens/RecorderScreen.kt | 20 +++--- .../recorder/ui/screens/SettingsScreen.kt | 65 ++++++++++-------- .../java/com/bnyro/recorder/ui/theme/Theme.kt | 27 ++++++-- app/src/main/res/values/strings.xml | 1 + 13 files changed, 140 insertions(+), 122 deletions(-) create mode 100755 app/src/main/java/com/bnyro/recorder/ui/Destination.kt delete mode 100755 app/src/main/java/com/bnyro/recorder/ui/Destinations.kt diff --git a/app/src/main/java/com/bnyro/recorder/enums/ThemeMode.kt b/app/src/main/java/com/bnyro/recorder/enums/ThemeMode.kt index 124679d2..89cb0238 100644 --- a/app/src/main/java/com/bnyro/recorder/enums/ThemeMode.kt +++ b/app/src/main/java/com/bnyro/recorder/enums/ThemeMode.kt @@ -5,7 +5,9 @@ import com.bnyro.recorder.util.Preferences enum class ThemeMode { SYSTEM, LIGHT, - DARK; + DARK, + AMOLED, + ; companion object { fun getCurrent() = valueOf(Preferences.getString(Preferences.themeModeKey, SYSTEM.name)) diff --git a/app/src/main/java/com/bnyro/recorder/ui/Destination.kt b/app/src/main/java/com/bnyro/recorder/ui/Destination.kt new file mode 100755 index 00000000..d4408063 --- /dev/null +++ b/app/src/main/java/com/bnyro/recorder/ui/Destination.kt @@ -0,0 +1,7 @@ +package com.bnyro.recorder.ui + +sealed class Destination(val route: String) { + object Home : Destination("home") + object Settings : Destination("settings") + object RecordingPlayer : Destination("player") +} diff --git a/app/src/main/java/com/bnyro/recorder/ui/Destinations.kt b/app/src/main/java/com/bnyro/recorder/ui/Destinations.kt deleted file mode 100755 index 9bb8a308..00000000 --- a/app/src/main/java/com/bnyro/recorder/ui/Destinations.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.bnyro.recorder.ui - -interface Destination { - val route: String -} - -object Home : Destination { - override val route = "home" -} - -object Settings : Destination { - override val route = "settings" -} - -object RecordingPlayer : Destination { - override val route = "player" -} \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/recorder/ui/MainActivity.kt b/app/src/main/java/com/bnyro/recorder/ui/MainActivity.kt index 3fd10127..7b641ed5 100644 --- a/app/src/main/java/com/bnyro/recorder/ui/MainActivity.kt +++ b/app/src/main/java/com/bnyro/recorder/ui/MainActivity.kt @@ -3,13 +3,12 @@ package com.bnyro.recorder.ui import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.activity.viewModels import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.ui.Modifier -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.get import androidx.navigation.compose.rememberNavController import com.bnyro.recorder.enums.RecorderType import com.bnyro.recorder.enums.ThemeMode @@ -20,7 +19,7 @@ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val themeModel: ThemeModel = ViewModelProvider(this).get() + val themeModel: ThemeModel by viewModels() val initialRecorder = when (intent?.getStringExtra("action")) { "audio" -> RecorderType.AUDIO @@ -30,21 +29,23 @@ class MainActivity : ComponentActivity() { setContent { RecordYouTheme( - when (val mode = themeModel.themeMode) { + when (themeModel.themeMode) { ThemeMode.SYSTEM -> isSystemInDarkTheme() - else -> mode == ThemeMode.DARK - } + ThemeMode.DARK -> true + else -> false + }, + amoledDark = themeModel.themeMode == ThemeMode.AMOLED, ) { val navController = rememberNavController() Surface( modifier = Modifier .fillMaxSize(), - color = MaterialTheme.colorScheme.background + color = MaterialTheme.colorScheme.background, ) { AppNavHost( navController = navController, modifier = Modifier, - initialRecorder = initialRecorder + initialRecorder = initialRecorder, ) } } diff --git a/app/src/main/java/com/bnyro/recorder/ui/NavHost.kt b/app/src/main/java/com/bnyro/recorder/ui/NavHost.kt index 2d5b5684..d64328f2 100755 --- a/app/src/main/java/com/bnyro/recorder/ui/NavHost.kt +++ b/app/src/main/java/com/bnyro/recorder/ui/NavHost.kt @@ -5,29 +5,33 @@ import androidx.compose.ui.Modifier import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable -import com.bnyro.recorder.enums.Recorder +import com.bnyro.recorder.enums.RecorderType import com.bnyro.recorder.ui.screens.HomeScreen import com.bnyro.recorder.ui.screens.PlayerScreen import com.bnyro.recorder.ui.screens.SettingsScreen @Composable fun AppNavHost( - navController: NavHostController, modifier: Modifier = Modifier, initialRecorder: Recorder + navController: NavHostController, + modifier: Modifier = Modifier, + initialRecorder: RecorderType, ) { NavHost( - navController = navController, startDestination = Home.route, modifier = modifier + navController = navController, + startDestination = Destination.Home.route, + modifier = modifier, ) { - composable(route = Home.route) { + composable(route = Destination.Home.route) { HomeScreen(initialRecorder, onNavigate = { destination -> navController.navigateTo(destination.route) }) } - composable(route = Settings.route) { + composable(route = Destination.Settings.route) { SettingsScreen() } - composable(route = RecordingPlayer.route) { + composable(route = Destination.RecordingPlayer.route) { PlayerScreen(showVideoModeInitially = false) } } @@ -36,4 +40,4 @@ fun AppNavHost( fun NavHostController.navigateTo(route: String) = this.navigate(route) { launchSingleTop = true restoreState = true -} \ No newline at end of file +} diff --git a/app/src/main/java/com/bnyro/recorder/ui/common/BlobIconBox.kt b/app/src/main/java/com/bnyro/recorder/ui/common/BlobIconBox.kt index f7c04226..4c08d548 100644 --- a/app/src/main/java/com/bnyro/recorder/ui/common/BlobIconBox.kt +++ b/app/src/main/java/com/bnyro/recorder/ui/common/BlobIconBox.kt @@ -3,8 +3,7 @@ package com.bnyro.recorder.ui.common import androidx.annotation.DrawableRes import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.size import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable @@ -21,21 +20,20 @@ fun BlobIconBox(@DrawableRes icon: Int) { Box( contentAlignment = Alignment.Center, modifier = Modifier - .fillMaxWidth() - .height(350.dp) + .fillMaxSize() .alpha(0.3f) ) { Image( modifier = Modifier.size(350.dp), painter = painterResource(id = R.drawable.blob), contentDescription = null, - colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.tertiaryContainer) + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.secondaryContainer) ) Image( modifier = Modifier.size(250.dp), painter = painterResource(id = icon), contentDescription = null, - colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onTertiaryContainer) + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onSecondaryContainer) ) } } \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/recorder/ui/models/ThemeModel.kt b/app/src/main/java/com/bnyro/recorder/ui/models/ThemeModel.kt index 2974ee43..ba222103 100644 --- a/app/src/main/java/com/bnyro/recorder/ui/models/ThemeModel.kt +++ b/app/src/main/java/com/bnyro/recorder/ui/models/ThemeModel.kt @@ -8,6 +8,6 @@ import com.bnyro.recorder.enums.ThemeMode class ThemeModel : ViewModel() { var themeMode by mutableStateOf( - ThemeMode.getCurrent() + ThemeMode.getCurrent(), ) } diff --git a/app/src/main/java/com/bnyro/recorder/ui/screens/HomeScreen.kt b/app/src/main/java/com/bnyro/recorder/ui/screens/HomeScreen.kt index c8fed4ed..c675b566 100644 --- a/app/src/main/java/com/bnyro/recorder/ui/screens/HomeScreen.kt +++ b/app/src/main/java/com/bnyro/recorder/ui/screens/HomeScreen.kt @@ -25,11 +25,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.lifecycle.viewmodel.compose.viewModel import com.bnyro.recorder.R -import com.bnyro.recorder.enums.Recorder import com.bnyro.recorder.enums.RecorderState +import com.bnyro.recorder.enums.RecorderType import com.bnyro.recorder.ui.Destination -import com.bnyro.recorder.ui.RecordingPlayer -import com.bnyro.recorder.ui.Settings import com.bnyro.recorder.ui.common.ClickableIcon import com.bnyro.recorder.ui.models.RecorderModel import kotlinx.coroutines.launch @@ -37,9 +35,9 @@ import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) @Composable fun HomeScreen( - initialRecorder: Recorder, + initialRecorder: RecorderType, onNavigate: (Destination) -> Unit, - recorderModel: RecorderModel = viewModel() + recorderModel: RecorderModel = viewModel(), ) { val pagerState = rememberPagerState { 2 } val scope = rememberCoroutineScope() @@ -47,56 +45,55 @@ fun HomeScreen( TopAppBar(title = { Text(stringResource(R.string.app_name)) }, actions = { ClickableIcon( imageVector = Icons.Default.Settings, - contentDescription = stringResource(R.string.settings) + contentDescription = stringResource(R.string.settings), ) { - onNavigate(Settings) + onNavigate(Destination.Settings) } ClickableIcon( imageVector = Icons.Default.VideoLibrary, - contentDescription = stringResource(R.string.recordings) + contentDescription = stringResource(R.string.recordings), ) { - onNavigate(RecordingPlayer) + onNavigate(Destination.RecordingPlayer) } }) }, bottomBar = { Column { AnimatedVisibility(recorderModel.recorderState == RecorderState.IDLE) { NavigationBar { - NavigationBarItem(icon = { - Icon( - imageVector = Icons.Default.Mic, - contentDescription = stringResource( - id = R.string.record_sound + NavigationBarItem( + icon = { + Icon( + imageVector = Icons.Default.Mic, + contentDescription = stringResource( + id = R.string.record_sound, + ), ) - ) - }, + }, label = { Text(stringResource(R.string.record_sound)) }, selected = (pagerState.currentPage == 0), onClick = { scope.launch { - pagerState.animateScrollToPage( - 0 - ) + pagerState.animateScrollToPage(0) } - }) - NavigationBarItem(icon = { - Icon( - imageVector = Icons.Default.Videocam, - contentDescription = stringResource( - id = R.string.record_screen + }, + ) + NavigationBarItem( + icon = { + Icon( + imageVector = Icons.Default.Videocam, + contentDescription = stringResource( + id = R.string.record_screen, + ), ) - ) - }, + }, label = { Text(stringResource(R.string.record_screen)) }, selected = (pagerState.currentPage == 1), onClick = { scope.launch { - pagerState.animateScrollToPage( - 1 - ) + pagerState.animateScrollToPage(1) } - }) - + }, + ) } } } @@ -104,13 +101,14 @@ fun HomeScreen( Column( Modifier .fillMaxSize() - .padding(paddingValues) + .padding(paddingValues), ) { HorizontalPager( - state = pagerState, modifier = Modifier.fillMaxSize() + state = pagerState, + modifier = Modifier.fillMaxSize(), ) { index -> RecorderView(initialRecorder = initialRecorder, recordScreenMode = (index == 1)) } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/bnyro/recorder/ui/screens/PlayerScreen.kt b/app/src/main/java/com/bnyro/recorder/ui/screens/PlayerScreen.kt index 8d8a15de..f537ba97 100644 --- a/app/src/main/java/com/bnyro/recorder/ui/screens/PlayerScreen.kt +++ b/app/src/main/java/com/bnyro/recorder/ui/screens/PlayerScreen.kt @@ -14,18 +14,20 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.LargeTopAppBar import androidx.compose.material3.Scaffold import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.viewmodel.compose.viewModel import com.bnyro.recorder.R import com.bnyro.recorder.enums.SortOrder +import com.bnyro.recorder.obj.RecordingItemData import com.bnyro.recorder.ui.common.ClickableIcon -import com.bnyro.recorder.ui.common.FullscreenDialog import com.bnyro.recorder.ui.components.PlayerView import com.bnyro.recorder.ui.models.PlayerModel diff --git a/app/src/main/java/com/bnyro/recorder/ui/screens/RecorderScreen.kt b/app/src/main/java/com/bnyro/recorder/ui/screens/RecorderScreen.kt index 34ca23f5..0f4a221f 100644 --- a/app/src/main/java/com/bnyro/recorder/ui/screens/RecorderScreen.kt +++ b/app/src/main/java/com/bnyro/recorder/ui/screens/RecorderScreen.kt @@ -8,7 +8,6 @@ import android.os.Build import android.text.format.DateUtils import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.Crossfade import androidx.compose.foundation.background import androidx.compose.foundation.isSystemInDarkTheme @@ -24,12 +23,8 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ExpandLess -import androidx.compose.material.icons.filled.ExpandMore -import androidx.compose.material.icons.filled.Mic import androidx.compose.material.icons.filled.Pause import androidx.compose.material.icons.filled.PlayArrow -import androidx.compose.material.icons.filled.Settings import androidx.compose.material.icons.filled.Stop import androidx.compose.material3.CardDefaults import androidx.compose.material3.ElevatedCard @@ -52,12 +47,11 @@ import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import com.bnyro.recorder.R -import com.bnyro.recorder.enums.RecorderType import com.bnyro.recorder.enums.RecorderState +import com.bnyro.recorder.enums.RecorderType import com.bnyro.recorder.ui.common.BlobIconBox import com.bnyro.recorder.ui.common.ClickableIcon import com.bnyro.recorder.ui.components.AudioVisualizer -import com.bnyro.recorder.ui.components.SettingsBottomSheet import com.bnyro.recorder.ui.models.RecorderModel @Composable @@ -147,7 +141,7 @@ fun RecorderView( ElevatedCard( colors = CardDefaults.elevatedCardColors( - containerColor = if (isSystemInDarkTheme()) Color(0xffee665b) else Color( + containerColor = if (isSystemInDarkTheme()) Color(0xA8EE665B) else Color( 0xffdd6f62 ), contentColor = Color.White @@ -184,9 +178,15 @@ fun RecorderView( else -> { Box( Modifier - .size(36.dp) + .size(40.dp) + .clip(CircleShape) + .background(Color(0x9FFFFFFF)) + ) + Box( + Modifier + .size(26.dp) .clip(CircleShape) - .background(Color.White) + .background(Color(0x9FFFFFFF)) ) } } diff --git a/app/src/main/java/com/bnyro/recorder/ui/screens/SettingsScreen.kt b/app/src/main/java/com/bnyro/recorder/ui/screens/SettingsScreen.kt index faca46ba..7e27cb79 100644 --- a/app/src/main/java/com/bnyro/recorder/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/com/bnyro/recorder/ui/screens/SettingsScreen.kt @@ -2,6 +2,7 @@ package com.bnyro.recorder.ui.screens import android.net.Uri import android.os.Build +import androidx.activity.ComponentActivity import androidx.activity.compose.rememberLauncherForActivityResult import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -24,6 +25,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @@ -50,16 +52,15 @@ import com.bnyro.recorder.util.Preferences @OptIn(ExperimentalMaterial3Api::class) @Composable fun SettingsScreen() { - val themeModel: ThemeModel = viewModel() - + val themeModel: ThemeModel = viewModel(LocalContext.current as ComponentActivity) var audioFormat by remember { mutableStateOf(AudioFormat.getCurrent()) } var audioChannels by remember { mutableStateOf( AudioChannels.fromInt( - Preferences.prefs.getInt(Preferences.audioChannelsKey, AudioChannels.MONO.value) - ) + Preferences.prefs.getInt(Preferences.audioChannelsKey, AudioChannels.MONO.value), + ), ) } var audioDeviceSource by remember { @@ -67,14 +68,14 @@ fun SettingsScreen() { AudioDeviceSource.fromInt( Preferences.prefs.getInt( Preferences.audioDeviceSourceKey, - AudioDeviceSource.DEFAULT.value - ) - ) + AudioDeviceSource.DEFAULT.value, + ), + ), ) } var screenAudioSource by remember { mutableStateOf( - AudioSource.fromInt(Preferences.prefs.getInt(Preferences.audioSourceKey, 0)) + AudioSource.fromInt(Preferences.prefs.getInt(Preferences.audioSourceKey, 0)), ) } var videoEncoder by remember { @@ -98,27 +99,28 @@ fun SettingsScreen() { actions = { ClickableIcon( imageVector = Icons.Default.DarkMode, - contentDescription = stringResource(R.string.theme) + contentDescription = stringResource(R.string.theme), ) { showThemePref = true } ClickableIcon( imageVector = Icons.Default.Info, - contentDescription = stringResource(R.string.about) + contentDescription = stringResource(R.string.about), ) { showAbout = true } - }) + }, + ) }) { paddingValues -> Column( modifier = Modifier .padding(paddingValues) - .padding(horizontal = 16.dp) + .padding(horizontal = 16.dp), ) { Text( text = stringResource(R.string.directory), fontWeight = FontWeight.Bold, - fontSize = 18.sp + fontSize = 18.sp, ) Spacer(modifier = Modifier.height(5.dp)) Button( @@ -126,7 +128,7 @@ fun SettingsScreen() { val lastDir = Preferences.prefs.getString(Preferences.targetFolderKey, "") .takeIf { !it.isNullOrBlank() } directoryPicker.launch(lastDir?.let { Uri.parse(it) }) - } + }, ) { Text(stringResource(R.string.choose_dir)) } @@ -135,7 +137,7 @@ fun SettingsScreen() { title = stringResource(R.string.audio_format), entries = AudioFormat.formats.map { it.name }, values = AudioFormat.formats.map { it.format }, - selections = listOf(audioFormat.format) + selections = listOf(audioFormat.format), ) { index, newValue -> if (newValue) { audioFormat = AudioFormat.formats[index] @@ -146,13 +148,13 @@ fun SettingsScreen() { CustomNumInputPref( key = Preferences.audioSampleRateKey, title = stringResource(R.string.sample_rate), - defValue = 44_100 + defValue = 44_100, ) Spacer(modifier = Modifier.width(10.dp)) CustomNumInputPref( key = Preferences.audioBitrateKey, title = stringResource(R.string.bitrate), - defValue = 192_000 + defValue = 192_000, ) } val audioDeviceSourceValues = AudioDeviceSource.values().map { it.value } @@ -161,16 +163,16 @@ fun SettingsScreen() { R.string.default_audio, R.string.microphone, R.string.camcorder, - R.string.unprocessed + R.string.unprocessed, ).map { stringResource(it) }, values = audioDeviceSourceValues, - selections = listOf(audioDeviceSource.value) + selections = listOf(audioDeviceSource.value), ) { index, newValue -> if (newValue) { audioDeviceSource = AudioDeviceSource.fromInt( - audioDeviceSourceValues[index] + audioDeviceSourceValues[index], ) Preferences.edit { putInt(Preferences.audioDeviceSourceKey, audioDeviceSourceValues[index]) @@ -183,7 +185,7 @@ fun SettingsScreen() { stringResource(it) }, values = audioChannelsValues, - selections = listOf(audioChannels.value) + selections = listOf(audioChannels.value), ) { index, newValue -> if (newValue) { audioChannels = AudioChannels.fromInt(audioChannelsValues[index]) @@ -200,7 +202,7 @@ fun SettingsScreen() { stringResource(it) }, values = audioValues, - selections = listOf(screenAudioSource.value) + selections = listOf(screenAudioSource.value), ) { index, newValue -> if (newValue) { screenAudioSource = AudioSource.fromInt(audioValues[index]) @@ -210,7 +212,7 @@ fun SettingsScreen() { ChipSelector( entries = VideoFormat.codecs.map { it.name }, values = VideoFormat.codecs.map { it.codec }, - selections = listOf(videoEncoder.codec) + selections = listOf(videoEncoder.codec), ) { index, newValue -> if (newValue) { videoEncoder = VideoFormat.codecs[index] @@ -221,14 +223,14 @@ fun SettingsScreen() { CustomNumInputPref( key = Preferences.videoBitrateKey, title = stringResource(R.string.bitrate), - defValue = 1_200_000 + defValue = 1_200_000, ) Spacer(modifier = Modifier.height(10.dp)) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { CheckboxPref( prefKey = Preferences.losslessRecorderKey, title = stringResource(R.string.lossless_audio), - summary = stringResource(R.string.lossless_audio_desc) + summary = stringResource(R.string.lossless_audio_desc), ) } Spacer(modifier = Modifier.height(10.dp)) @@ -236,7 +238,7 @@ fun SettingsScreen() { CheckboxPref( prefKey = Preferences.showOverlayAnnotationToolKey, title = stringResource(R.string.screen_recorder_annotation), - summary = stringResource(R.string.screen_recorder_annotation_desc) + summary = stringResource(R.string.screen_recorder_annotation_desc), ) } Spacer(modifier = Modifier.height(10.dp)) @@ -248,12 +250,17 @@ fun SettingsScreen() { SelectionDialog( onDismissRequest = { showThemePref = false }, title = stringResource(R.string.theme), - entries = listOf(R.string.system, R.string.light, R.string.dark).map { + entries = listOf( + R.string.system, + R.string.light, + R.string.dark, + R.string.amoled_dark, + ).map { stringResource(it) - } + }, ) { themeModel.themeMode = ThemeMode.values()[it] - Preferences.edit { putString(Preferences.themeModeKey, themeModel.themeMode.name) } + Preferences.edit { putString(Preferences.themeModeKey, ThemeMode.values()[it].name) } } } diff --git a/app/src/main/java/com/bnyro/recorder/ui/theme/Theme.kt b/app/src/main/java/com/bnyro/recorder/ui/theme/Theme.kt index 77649fd5..a67899e5 100644 --- a/app/src/main/java/com/bnyro/recorder/ui/theme/Theme.kt +++ b/app/src/main/java/com/bnyro/recorder/ui/theme/Theme.kt @@ -10,6 +10,7 @@ import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView @@ -18,13 +19,13 @@ import androidx.core.view.WindowCompat private val DarkColorScheme = darkColorScheme( primary = Purple80, secondary = PurpleGrey80, - tertiary = Pink80 + tertiary = Pink80, ) private val LightColorScheme = lightColorScheme( primary = Purple40, secondary = PurpleGrey40, - tertiary = Pink40 + tertiary = Pink40, /* Other default colors to override background = Color(0xFFFFFBFE), @@ -37,18 +38,32 @@ private val LightColorScheme = lightColorScheme( */ ) +private val AmoledDarkColorScheme = darkColorScheme( + primary = Color(0xFFEE665B), + background = Color(0xFF000000), + onPrimary = Color(0xFFFFFFFF), +) + @Composable fun RecordYouTheme( darkTheme: Boolean = isSystemInDarkTheme(), // Dynamic color is available on Android 12+ dynamicColor: Boolean = true, - content: @Composable () -> Unit + amoledDark: Boolean = false, + content: @Composable () -> Unit, ) { val colorScheme = when { + amoledDark && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + dynamicDarkColorScheme(context).copy(background = Color.Black) + } + + amoledDark -> AmoledDarkColorScheme dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { val context = LocalContext.current if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) } + darkTheme -> DarkColorScheme else -> LightColorScheme } @@ -61,11 +76,11 @@ fun RecordYouTheme( activity.window.statusBarColor = colorScheme.background.toArgb() WindowCompat.getInsetsController( activity.window, - view + view, ).isAppearanceLightStatusBars = !darkTheme WindowCompat.getInsetsController( activity.window, - view + view, ).isAppearanceLightNavigationBars = !darkTheme } } @@ -74,6 +89,6 @@ fun RecordYouTheme( MaterialTheme( colorScheme = colorScheme, typography = Typography, - content = content + content = content, ) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5675c40d..24d6cdd2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -66,4 +66,5 @@ Light Screen Record Annotation Show annotation tool during screen recording + Amoled Dark \ No newline at end of file