mirror of
https://github.com/IllusionMan1212/lyrics-grabbr.git
synced 2026-10-24 02:12:27 +00:00
feat: setting to keep screen on
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
*.iml
|
||||
.gradle
|
||||
/local.properties
|
||||
/.idea/caches
|
||||
@@ -7,7 +6,6 @@
|
||||
/.idea/workspace.xml
|
||||
/.idea/navEditor.xml
|
||||
/.idea/assetWizardSettings.xml
|
||||
.DS_Store
|
||||
/build
|
||||
/captures
|
||||
.externalNativeBuild
|
||||
|
||||
@@ -5,7 +5,6 @@ import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
import android.os.Bundle
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.activity.compose.setContent
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
@@ -127,6 +126,7 @@ class MainActivity : AppCompatActivity() {
|
||||
navController.popBackStack()
|
||||
},
|
||||
lyricsViewModel = lyricsViewModel,
|
||||
settingsViewModel = settingsViewModel
|
||||
)
|
||||
}
|
||||
composable(Routes.Settings.route) {
|
||||
|
||||
+10
@@ -2,6 +2,7 @@ package com.illusionman1212.lyricsgrabbr.data
|
||||
|
||||
import androidx.datastore.core.DataStore
|
||||
import androidx.datastore.preferences.core.Preferences
|
||||
import androidx.datastore.preferences.core.booleanPreferencesKey
|
||||
import androidx.datastore.preferences.core.edit
|
||||
import androidx.datastore.preferences.core.intPreferencesKey
|
||||
import androidx.datastore.preferences.core.stringSetPreferencesKey
|
||||
@@ -16,6 +17,7 @@ enum class Theme {
|
||||
data class SettingsPreferences(
|
||||
val appTheme: Int = Theme.SYSTEM.ordinal,
|
||||
val whitelist: Set<String> = emptySet(),
|
||||
val keepScreenOn: Boolean = false,
|
||||
)
|
||||
|
||||
class SettingsPreferencesRepository(
|
||||
@@ -24,6 +26,7 @@ class SettingsPreferencesRepository(
|
||||
companion object {
|
||||
private val APP_THEME = intPreferencesKey("app_theme")
|
||||
private val WHITELIST = stringSetPreferencesKey("apps_whitelist")
|
||||
private val KEEP_SCREEN_ON = booleanPreferencesKey("keep_screen_on")
|
||||
}
|
||||
|
||||
val preferences = dataStore.data.map { mapSettingsPreferences(it) }
|
||||
@@ -40,6 +43,12 @@ class SettingsPreferencesRepository(
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun toggleKeepScreenOn() {
|
||||
dataStore.edit { prefs ->
|
||||
prefs[KEEP_SCREEN_ON] = !(prefs[KEEP_SCREEN_ON] ?: false)
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun removeFromWhitelist(packageName: String) {
|
||||
dataStore.edit { prefs ->
|
||||
prefs[WHITELIST] = (prefs[WHITELIST]?.toMutableSet() ?: emptySet()) - packageName
|
||||
@@ -50,6 +59,7 @@ class SettingsPreferencesRepository(
|
||||
return SettingsPreferences(
|
||||
prefs[APP_THEME] ?: Theme.SYSTEM.ordinal,
|
||||
prefs[WHITELIST] ?: emptySet(),
|
||||
prefs[KEEP_SCREEN_ON] ?: false,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.wrapContentHeight
|
||||
import androidx.compose.foundation.layout.wrapContentWidth
|
||||
import androidx.compose.material3.AlertDialog
|
||||
import androidx.compose.material3.AlertDialogDefaults
|
||||
import androidx.compose.material3.BasicAlertDialog
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Surface
|
||||
@@ -29,11 +30,11 @@ fun LGAlertDialog(
|
||||
buttons: @Composable () -> Unit,
|
||||
content: @Composable () -> Unit
|
||||
) {
|
||||
AlertDialog(
|
||||
BasicAlertDialog(
|
||||
onDismissRequest = onDismiss,
|
||||
properties = properties,
|
||||
properties = properties
|
||||
) {
|
||||
Surface (
|
||||
Surface(
|
||||
modifier = Modifier.wrapContentHeight().wrapContentWidth(),
|
||||
shape = MaterialTheme.shapes.large,
|
||||
tonalElevation = AlertDialogDefaults.TonalElevation
|
||||
|
||||
@@ -13,7 +13,6 @@ import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.WindowInsets
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
@@ -58,7 +57,6 @@ import androidx.compose.ui.layout.ContentScale
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalDensity
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.platform.LocalLifecycleOwner
|
||||
import androidx.compose.ui.platform.LocalUriHandler
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.SpanStyle
|
||||
@@ -74,6 +72,7 @@ import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.window.DialogProperties
|
||||
import androidx.core.app.ActivityCompat
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.compose.LocalLifecycleOwner
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import androidx.lifecycle.compose.currentStateAsState
|
||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
|
||||
@@ -1,8 +1,14 @@
|
||||
package com.illusionman1212.lyricsgrabbr.ui.screens
|
||||
|
||||
import android.app.Activity
|
||||
import android.view.WindowManager.LayoutParams
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
@@ -10,7 +16,7 @@ import androidx.compose.foundation.text.KeyboardOptions
|
||||
import androidx.compose.foundation.text.selection.SelectionContainer
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.ArrowBack
|
||||
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
||||
import androidx.compose.material.icons.filled.MusicNote
|
||||
import androidx.compose.material3.CircularProgressIndicator
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
@@ -23,10 +29,12 @@ import androidx.compose.material3.TextFieldDefaults
|
||||
import androidx.compose.material3.TopAppBar
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.CompositionLocalProvider
|
||||
import androidx.compose.runtime.DisposableEffect
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalLayoutDirection
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.font.FontStyle
|
||||
@@ -36,12 +44,13 @@ import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.LayoutDirection
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
import com.illusionman1212.lyricsgrabbr.R
|
||||
import com.illusionman1212.lyricsgrabbr.ui.components.LGIconButton
|
||||
import com.illusionman1212.lyricsgrabbr.utils.mirror
|
||||
import com.illusionman1212.lyricsgrabbr.viewmodels.LyricsViewModel
|
||||
import com.illusionman1212.lyricsgrabbr.viewmodels.SettingsViewModel
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
@@ -50,13 +59,27 @@ fun LyricsPage(
|
||||
lyricsViewModel: LyricsViewModel = viewModel(
|
||||
factory = LyricsViewModel.Factory
|
||||
),
|
||||
settingsViewModel: SettingsViewModel,
|
||||
) {
|
||||
val uiState = lyricsViewModel.uiState.collectAsStateWithLifecycle().value
|
||||
val settingsState = settingsViewModel.uiState.collectAsStateWithLifecycle().value
|
||||
val context = LocalContext.current
|
||||
|
||||
LaunchedEffect(uiState.song, uiState.artist, uiState.url) {
|
||||
lyricsViewModel.fetchLyricsFromGenius()
|
||||
}
|
||||
|
||||
DisposableEffect(Unit) {
|
||||
val window = (context as Activity).window
|
||||
if (settingsState.keepScreenOn) {
|
||||
window.addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON)
|
||||
}
|
||||
|
||||
onDispose {
|
||||
window.clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON)
|
||||
}
|
||||
}
|
||||
|
||||
Scaffold(
|
||||
topBar = {
|
||||
TopAppBar(
|
||||
@@ -82,8 +105,7 @@ fun LyricsPage(
|
||||
onClick = goBack
|
||||
) {
|
||||
Icon(
|
||||
modifier = Modifier.mirror(),
|
||||
imageVector = Icons.Filled.ArrowBack,
|
||||
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
|
||||
contentDescription = stringResource(
|
||||
id = R.string.go_back
|
||||
)
|
||||
@@ -93,53 +115,63 @@ fun LyricsPage(
|
||||
)
|
||||
},
|
||||
) { padding ->
|
||||
Column(
|
||||
Modifier
|
||||
.padding(padding)
|
||||
.fillMaxSize()
|
||||
.then(
|
||||
if (!uiState.isLoading && uiState.lyrics.isNotEmpty()) Modifier.verticalScroll(
|
||||
rememberScrollState()
|
||||
) else Modifier
|
||||
),
|
||||
verticalArrangement = Arrangement.Center,
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
) {
|
||||
if (uiState.isLoading) {
|
||||
CircularProgressIndicator()
|
||||
} else {
|
||||
if (uiState.error != null) {
|
||||
Text(
|
||||
uiState.error,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
modifier = Modifier.padding(bottom = 32.dp)
|
||||
)
|
||||
} else if (uiState.lyrics.isEmpty()) {
|
||||
Instrumental()
|
||||
Column(Modifier.padding(padding)) {
|
||||
if (settingsState.keepScreenOn) {
|
||||
Row(
|
||||
Modifier
|
||||
.background(MaterialTheme.colorScheme.secondaryContainer)
|
||||
.fillMaxWidth(),
|
||||
horizontalArrangement = Arrangement.Center,
|
||||
) {
|
||||
Text(stringResource(id = R.string.screen_will_stay_on).uppercase(), fontSize = 12.sp, color = MaterialTheme.colorScheme.onSecondaryContainer)
|
||||
}
|
||||
}
|
||||
Column(
|
||||
Modifier
|
||||
.fillMaxSize()
|
||||
.then(
|
||||
if (!uiState.isLoading && uiState.lyrics.isNotEmpty()) Modifier.verticalScroll(
|
||||
rememberScrollState()
|
||||
) else Modifier
|
||||
),
|
||||
verticalArrangement = Arrangement.Center,
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
) {
|
||||
if (uiState.isLoading) {
|
||||
CircularProgressIndicator()
|
||||
} else {
|
||||
|
||||
CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Ltr) {
|
||||
Column(
|
||||
Modifier.padding(
|
||||
top = 12.dp,
|
||||
start = 12.dp,
|
||||
end = 12.dp,
|
||||
bottom = 32.dp
|
||||
)
|
||||
) {
|
||||
SelectionContainer {
|
||||
TextField(
|
||||
value = uiState.lyrics,
|
||||
onValueChange = {},
|
||||
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
|
||||
readOnly = true,
|
||||
colors = TextFieldDefaults.colors(
|
||||
focusedContainerColor = Color.Transparent,
|
||||
unfocusedContainerColor = Color.Transparent,
|
||||
focusedIndicatorColor = Color.Transparent,
|
||||
unfocusedIndicatorColor = Color.Transparent,
|
||||
),
|
||||
if (uiState.error != null) {
|
||||
Text(
|
||||
uiState.error,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
modifier = Modifier.padding(bottom = 32.dp)
|
||||
)
|
||||
} else if (uiState.lyrics.isEmpty()) {
|
||||
Instrumental()
|
||||
} else {
|
||||
CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Ltr) {
|
||||
Column(
|
||||
Modifier.padding(
|
||||
top = 12.dp,
|
||||
start = 12.dp,
|
||||
end = 12.dp,
|
||||
bottom = 32.dp
|
||||
)
|
||||
) {
|
||||
SelectionContainer {
|
||||
TextField(
|
||||
value = uiState.lyrics,
|
||||
onValueChange = {},
|
||||
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
|
||||
readOnly = true,
|
||||
colors = TextFieldDefaults.colors(
|
||||
focusedContainerColor = Color.Transparent,
|
||||
unfocusedContainerColor = Color.Transparent,
|
||||
focusedIndicatorColor = Color.Transparent,
|
||||
unfocusedIndicatorColor = Color.Transparent,
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
||||
import androidx.compose.material.icons.filled.Apps
|
||||
import androidx.compose.material.icons.filled.Check
|
||||
import androidx.compose.material.icons.filled.ScreenLockPortrait
|
||||
import androidx.compose.material.icons.outlined.Palette
|
||||
import androidx.compose.material.icons.outlined.Translate
|
||||
import androidx.compose.material3.Icon
|
||||
@@ -34,7 +35,6 @@ import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.alpha
|
||||
import androidx.compose.ui.graphics.painter.Painter
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
@@ -97,12 +97,13 @@ fun SettingsPage(
|
||||
) {
|
||||
Appearance(viewModel, uiState)
|
||||
Listening(navigateToWhitelist)
|
||||
PowerManagement(viewModel, uiState)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun Appearance(viewModel: SettingsViewModel, uiState: SettingsState) {
|
||||
private fun Appearance(viewModel: SettingsViewModel, uiState: SettingsState) {
|
||||
var themeOpenDialog by remember { mutableStateOf(false) }
|
||||
var languageOpenDialog by remember { mutableStateOf(false) }
|
||||
|
||||
@@ -170,6 +171,20 @@ private fun Listening(navigateToWhitelist: () -> Unit) {
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun PowerManagement(viewModel: SettingsViewModel, uiState: SettingsState) {
|
||||
SettingGroup(title = stringResource(id = R.string.power_management)) {
|
||||
ToggleSetting(
|
||||
title = stringResource(id = R.string.keep_device_awake_title),
|
||||
description = stringResource(id = R.string.keep_device_awake_desc),
|
||||
icon = Icons.Default.ScreenLockPortrait,
|
||||
checked = uiState.keepScreenOn
|
||||
) {
|
||||
viewModel.toggleKeepScreenOn()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun ThemeDialog(
|
||||
uiState: SettingsState,
|
||||
@@ -311,7 +326,8 @@ fun DialogSetting(
|
||||
@Composable
|
||||
fun ToggleSetting(
|
||||
title: String,
|
||||
icon: Painter? = null,
|
||||
description: String? = null,
|
||||
icon: ImageVector? = null,
|
||||
checked: Boolean,
|
||||
onClick: (Boolean) -> Unit)
|
||||
{
|
||||
@@ -326,11 +342,20 @@ fun ToggleSetting(
|
||||
modifier = Modifier.padding(top = 8.dp, end = 24.dp, bottom = 8.dp),
|
||||
) {
|
||||
if (icon != null) {
|
||||
Icon(painter = icon, contentDescription = null, Modifier.width(56.dp))
|
||||
Icon(imageVector = icon, contentDescription = null, Modifier.width(56.dp))
|
||||
} else {
|
||||
Box(modifier = Modifier.width(56.dp))
|
||||
}
|
||||
Text(text = title, color = MaterialTheme.colorScheme.onBackground, modifier = Modifier.weight(1.0f))
|
||||
Column(Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(4.dp)) {
|
||||
Text(text = title, color = MaterialTheme.colorScheme.onBackground)
|
||||
if (description != null) {
|
||||
Text(
|
||||
text = description,
|
||||
color = ColorSecondaryLight,
|
||||
fontSize = 14.sp,
|
||||
)
|
||||
}
|
||||
}
|
||||
Switch(
|
||||
checked = checked,
|
||||
onCheckedChange = null,
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
package com.illusionman1212.lyricsgrabbr.utils
|
||||
|
||||
import android.util.LayoutDirection
|
||||
import androidx.compose.runtime.Stable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.scale
|
||||
import androidx.core.text.layoutDirection
|
||||
import java.util.Locale
|
||||
|
||||
@Stable
|
||||
fun Modifier.mirror(): Modifier {
|
||||
return if (Locale.getDefault().layoutDirection == LayoutDirection.RTL)
|
||||
this.scale(scaleX = -1f, scaleY = 1f)
|
||||
else
|
||||
this
|
||||
}
|
||||
@@ -25,7 +25,7 @@ fun annotatedStringResource(
|
||||
val spannedString = SpannedString(resources.getText(id))
|
||||
val resultBuilder = AnnotatedString.Builder()
|
||||
resultBuilder.append(spannedString.toString())
|
||||
spannedString.getSpans<Annotation>(0, spannedString.length, Annotation::class.java).forEach { annotation ->
|
||||
spannedString.getSpans(0, spannedString.length, Annotation::class.java).forEach { annotation ->
|
||||
val spanStart = spannedString.getSpanStart(annotation)
|
||||
val spanEnd = spannedString.getSpanEnd(annotation)
|
||||
resultBuilder.addStringAnnotation(
|
||||
|
||||
@@ -96,7 +96,9 @@ class HomeViewModel(private val homeRepository: HomeRepository): ViewModel() {
|
||||
}
|
||||
|
||||
fun setSong(song: NotificationEvent) {
|
||||
_uiState.value = _uiState.value.copy(isLoading = true, notification = song, error = null)
|
||||
_uiState.update { state ->
|
||||
state.copy(isLoading = true, notification = song, error = null)
|
||||
}
|
||||
}
|
||||
|
||||
fun makeRequestToGenius(song: String, artist: String) {
|
||||
|
||||
@@ -41,12 +41,16 @@ class LyricsViewModel(private val lyricsRepository: LyricsRepository): ViewModel
|
||||
}
|
||||
|
||||
fun fetchLyricsFromGenius() {
|
||||
_uiState.value = _uiState.value.copy(isLoading = true, lyrics = "")
|
||||
_uiState.update { state ->
|
||||
state.copy(isLoading = true, lyrics = "")
|
||||
}
|
||||
|
||||
viewModelScope.launch {
|
||||
withContext(Dispatchers.IO) {
|
||||
val lyrics = lyricsRepository.fetchLyricsFromGenius(uiState.value.url)
|
||||
_uiState.value = _uiState.value.copy(isLoading = false, lyrics = lyrics)
|
||||
_uiState.update { state ->
|
||||
state.copy(isLoading = false, lyrics = lyrics)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@ data class SettingsState(
|
||||
val appTheme: Int = Theme.SYSTEM.ordinal,
|
||||
val applications: Map<String, AppInfo> = emptyMap(),
|
||||
val whitelistSearchQuery: String = "",
|
||||
val keepScreenOn: Boolean = false,
|
||||
)
|
||||
|
||||
class SettingsViewModel(private val settingsPrefsRepo: SettingsPreferencesRepository, context: Context): ViewModel() {
|
||||
@@ -47,6 +48,12 @@ class SettingsViewModel(private val settingsPrefsRepo: SettingsPreferencesReposi
|
||||
}
|
||||
}
|
||||
|
||||
fun toggleKeepScreenOn() {
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
settingsPrefsRepo.toggleKeepScreenOn()
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun getWhitelistedApps(): Set<String> {
|
||||
return settingsPrefsRepo.preferences.first().whitelist
|
||||
}
|
||||
@@ -73,10 +80,9 @@ class SettingsViewModel(private val settingsPrefsRepo: SettingsPreferencesReposi
|
||||
)
|
||||
}
|
||||
immutablePackages = apps
|
||||
_uiState.update {
|
||||
SettingsState(
|
||||
appTheme = uiState.value.appTheme,
|
||||
applications = apps,
|
||||
_uiState.update { state ->
|
||||
state.copy(
|
||||
applications = apps
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -147,9 +153,12 @@ class SettingsViewModel(private val settingsPrefsRepo: SettingsPreferencesReposi
|
||||
getPackages(context)
|
||||
viewModelScope.launch {
|
||||
settingsPrefsRepo.preferences.collectLatest {
|
||||
_uiState.value = _uiState.value.copy(
|
||||
appTheme = it.appTheme,
|
||||
)
|
||||
_uiState.update { state ->
|
||||
state.copy(
|
||||
appTheme = it.appTheme,
|
||||
keepScreenOn = it.keepScreenOn,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M12,2C6.5,2 2,6.5 2,12s4.5,10 10,10s10,-4.5 10,-10S17.5,2 12,2zM16.057,16.406c-0.188,0 -0.282,-0.094 -0.47,-0.188c-1.411,-0.847 -3.198,-1.317 -5.079,-1.317c-1.035,0 -2.163,0.188 -3.104,0.376c-0.188,0 -0.376,0.094 -0.47,0.094c-0.376,0 -0.658,-0.282 -0.658,-0.658c0,-0.376 0.188,-0.658 0.564,-0.658c1.223,-0.282 2.446,-0.47 3.763,-0.47c2.163,0 4.139,0.564 5.832,1.505c0.188,0.188 0.376,0.282 0.376,0.658C16.621,16.218 16.339,16.406 16.057,16.406zM17.091,13.773c-0.188,0 -0.376,-0.094 -0.564,-0.188c-1.599,-1.035 -3.857,-1.599 -6.302,-1.599c-1.223,0 -2.352,0.188 -3.198,0.376c-0.188,0.094 -0.282,0.094 -0.47,0.094c-0.47,0 -0.753,-0.376 -0.753,-0.753c0,-0.47 0.188,-0.658 0.658,-0.847c1.129,-0.282 2.258,-0.564 3.857,-0.564c2.634,0 5.079,0.658 7.149,1.881c0.282,0.188 0.47,0.47 0.47,0.753C17.844,13.396 17.562,13.773 17.091,13.773zM18.314,10.762c-0.188,0 -0.282,-0.094 -0.564,-0.188c-1.881,-1.035 -4.609,-1.693 -7.243,-1.693c-1.317,0 -2.728,0.188 -3.951,0.47c-0.188,0 -0.282,0.094 -0.564,0.094C5.428,9.54 5.051,9.069 5.051,8.505c0,-0.564 0.282,-0.847 0.658,-0.941C7.215,7.188 8.814,7 10.507,7c2.916,0 5.926,0.658 8.278,1.881c0.282,0.188 0.564,0.47 0.564,0.941C19.255,10.386 18.878,10.762 18.314,10.762z"/>
|
||||
</vector>
|
||||
@@ -5,7 +5,6 @@
|
||||
<!-- General -->
|
||||
<string name="go_back">رجوع</string>
|
||||
<string name="cancel">إلغاء</string>
|
||||
<string name="confirm">تأكيد</string>
|
||||
<string name="timeout">لقد انتهت مهلة الطلب، حاول مرة أخرى لاحقًا</string>
|
||||
<string name="generic_error">لقد حدث خطأ، حاول مرة أخرى لاحقاً</string>
|
||||
<string name="retry">أعد المحاولة</string>
|
||||
@@ -33,16 +32,18 @@
|
||||
<string name="theme_dark">ليلي</string>
|
||||
<string name="theme_system">استخدم مظهر النظام</string>
|
||||
<string name="language">اللغة</string>
|
||||
<string name="_default">الإفتراضي</string>
|
||||
<string name="_default">استخدم لغة النظام</string>
|
||||
<string name="listening">الإستماع</string>
|
||||
<string name="whitelist">القائمة البيضاء</string>
|
||||
<string name="whitelist_apps">تطبيقات القائمة البيضاء</string>
|
||||
<string name="whitelist_desc">اختر التطبيقات التي سيستمع التطبيق إلى إشعاراتها</string>
|
||||
<string name="search">بحث</string>
|
||||
<string name="clear">مسح</string>
|
||||
<string name="power_management">إدارة إستخدام الطافة</string>
|
||||
<string name="keep_device_awake_title">أبق الجهاز مستيقظا</string>
|
||||
<string name="keep_device_awake_desc">أبق الجهاز مستيقظا على صفحة كلمات الأغاني (يزيد من استخدام البطارية)</string>
|
||||
<string name="screen_will_stay_on">ستبقى الشاشة على قيد التشغيل</string>
|
||||
|
||||
<!-- Lyrics -->
|
||||
<string name="lyrics">كلمات الأغنية</string>
|
||||
<string name="instrumental">هذه الأغنية موسيقية</string>
|
||||
|
||||
<!-- Notification -->
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
<!-- General -->
|
||||
<string name="go_back">Go Back</string>
|
||||
<string name="cancel">Cancel</string>
|
||||
<string name="confirm">Confirm</string>
|
||||
<string name="timeout">Request has timed out, try again later</string>
|
||||
<string name="generic_error">An error has occurred, try again later</string>
|
||||
<string name="retry">Retry</string>
|
||||
@@ -32,16 +31,18 @@
|
||||
<string name="theme_dark">Dark</string>
|
||||
<string name="theme_system">Use System Theme</string>
|
||||
<string name="language">Language</string>
|
||||
<string name="_default">Default</string>
|
||||
<string name="_default">Use System Language</string>
|
||||
<string name="listening">Listening</string>
|
||||
<string name="whitelist">Whitelist</string>
|
||||
<string name="whitelist_apps">Whitelist Apps</string>
|
||||
<string name="whitelist_desc">Choose which apps Lyrics Grabbr will listen to</string>
|
||||
<string name="search">Search</string>
|
||||
<string name="clear">Clear</string>
|
||||
<string name="power_management">Power Management</string>
|
||||
<string name="keep_device_awake_title">Keep device awake</string>
|
||||
<string name="keep_device_awake_desc">Keep device awake on lyrics page (Increases battery usage)</string>
|
||||
<string name="screen_will_stay_on">Screen Will Stay On</string>
|
||||
|
||||
<!-- Lyrics -->
|
||||
<string name="lyrics">Lyrics</string>
|
||||
<string name="instrumental">This song is an instrumental</string>
|
||||
|
||||
<!-- Notification -->
|
||||
|
||||
Reference in New Issue
Block a user