You've already forked KernelSU-Next
mirror of
https://github.com/KernelSU-Next/KernelSU-Next.git
synced 2025-08-27 23:46:34 +00:00
manager: add amoled mode
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
package com.rifsxd.ksunext.ui
|
package com.rifsxd.ksunext.ui
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
@@ -70,7 +71,13 @@ class MainActivity : ComponentActivity() {
|
|||||||
if (isManager) install()
|
if (isManager) install()
|
||||||
|
|
||||||
setContent {
|
setContent {
|
||||||
KernelSUTheme {
|
// Read AMOLED mode preference
|
||||||
|
val prefs = getSharedPreferences("settings", Context.MODE_PRIVATE)
|
||||||
|
val amoledMode = prefs.getBoolean("enable_amoled", false)
|
||||||
|
|
||||||
|
KernelSUTheme (
|
||||||
|
amoledMode = amoledMode
|
||||||
|
) {
|
||||||
val navController = rememberNavController()
|
val navController = rememberNavController()
|
||||||
val snackBarHostState = remember { SnackbarHostState() }
|
val snackBarHostState = remember { SnackbarHostState() }
|
||||||
val currentDestination = navController.currentBackStackEntryAsState()?.value?.destination
|
val currentDestination = navController.currentBackStackEntryAsState()?.value?.destination
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import android.widget.Toast
|
|||||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
|
import androidx.compose.foundation.isSystemInDarkTheme
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
@@ -359,6 +360,50 @@ fun SettingScreen(navigator: DestinationsNavigator) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var enableAmoled by rememberSaveable {
|
||||||
|
mutableStateOf(
|
||||||
|
prefs.getBoolean("enable_amoled", false)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
var showRestartDialog by remember { mutableStateOf(false) }
|
||||||
|
if (isSystemInDarkTheme()) {
|
||||||
|
SwitchItem(
|
||||||
|
icon = Icons.Filled.Contrast,
|
||||||
|
title = stringResource(id = R.string.settings_amoled_mode),
|
||||||
|
summary = stringResource(id = R.string.settings_amoled_mode_summary),
|
||||||
|
checked = enableAmoled
|
||||||
|
) { checked ->
|
||||||
|
prefs.edit().putBoolean("enable_amoled", checked).apply()
|
||||||
|
enableAmoled = checked
|
||||||
|
showRestartDialog = true
|
||||||
|
}
|
||||||
|
if (showRestartDialog) {
|
||||||
|
AlertDialog(
|
||||||
|
onDismissRequest = { showRestartDialog = false },
|
||||||
|
title = { Text(stringResource(R.string.restart_required)) },
|
||||||
|
text = { Text(stringResource(R.string.restart_app_message)) },
|
||||||
|
confirmButton = {
|
||||||
|
TextButton(onClick = {
|
||||||
|
showRestartDialog = false
|
||||||
|
// Restart the app
|
||||||
|
val packageManager = context.packageManager
|
||||||
|
val intent = packageManager.getLaunchIntentForPackage(context.packageName)
|
||||||
|
intent?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
|
context.startActivity(intent)
|
||||||
|
Runtime.getRuntime().exit(0)
|
||||||
|
}) {
|
||||||
|
Text(stringResource(R.string.restart_app))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dismissButton = {
|
||||||
|
TextButton(onClick = { showRestartDialog = false }) {
|
||||||
|
Text(stringResource(R.string.later))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (isOverlayAvailable && useOverlayFs) {
|
if (isOverlayAvailable && useOverlayFs) {
|
||||||
val shrink = stringResource(id = R.string.shrink_sparse_image)
|
val shrink = stringResource(id = R.string.shrink_sparse_image)
|
||||||
val shrinkMessage = stringResource(id = R.string.shrink_sparse_image_message)
|
val shrinkMessage = stringResource(id = R.string.shrink_sparse_image_message)
|
||||||
|
|||||||
@@ -2,9 +2,11 @@ package com.rifsxd.ksunext.ui.theme
|
|||||||
|
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
|
|
||||||
val YELLOW = Color(0xFFeed502)
|
val PRIMARY = Color(0xFF8AADF4) // Catppuccin Blue
|
||||||
val YELLOW_LIGHT = Color(0xFFffff52)
|
val PRIMARY_LIGHT = Color(0xFFB7BDF8) // Catppuccin Lavender
|
||||||
val SECONDARY_LIGHT = Color(0xffa9817f)
|
val SECONDARY_LIGHT = Color(0xFFA6DA95) // Catppuccin Green
|
||||||
|
|
||||||
val YELLOW_DARK = Color(0xFFb7a400)
|
val PRIMARY_DARK = Color(0xFF7DC4E4) // Catppuccin Sky
|
||||||
val SECONDARY_DARK = Color(0xFF4c2b2b)
|
val SECONDARY_DARK = Color(0xFFF5BDE6) // Catppuccin Pink
|
||||||
|
|
||||||
|
val AMOLED_BLACK = Color(0xFF000000) // Pure black for AMOLED
|
||||||
@@ -17,14 +17,14 @@ import androidx.compose.ui.graphics.toArgb
|
|||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
|
||||||
private val DarkColorScheme = darkColorScheme(
|
private val DarkColorScheme = darkColorScheme(
|
||||||
primary = YELLOW,
|
primary = PRIMARY,
|
||||||
secondary = YELLOW_DARK,
|
secondary = PRIMARY_DARK,
|
||||||
tertiary = SECONDARY_DARK
|
tertiary = SECONDARY_DARK
|
||||||
)
|
)
|
||||||
|
|
||||||
private val LightColorScheme = lightColorScheme(
|
private val LightColorScheme = lightColorScheme(
|
||||||
primary = YELLOW,
|
primary = PRIMARY,
|
||||||
secondary = YELLOW_LIGHT,
|
secondary = PRIMARY_LIGHT,
|
||||||
tertiary = SECONDARY_LIGHT
|
tertiary = SECONDARY_LIGHT
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -33,9 +33,18 @@ fun KernelSUTheme(
|
|||||||
darkTheme: Boolean = isSystemInDarkTheme(),
|
darkTheme: Boolean = isSystemInDarkTheme(),
|
||||||
// Dynamic color is available on Android 12+
|
// Dynamic color is available on Android 12+
|
||||||
dynamicColor: Boolean = true,
|
dynamicColor: Boolean = true,
|
||||||
|
amoledMode: Boolean = false,
|
||||||
content: @Composable () -> Unit
|
content: @Composable () -> Unit
|
||||||
) {
|
) {
|
||||||
val colorScheme = when {
|
val colorScheme = when {
|
||||||
|
amoledMode && darkTheme && dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
|
||||||
|
val context = LocalContext.current
|
||||||
|
val dynamicScheme = dynamicDarkColorScheme(context)
|
||||||
|
dynamicScheme.copy(
|
||||||
|
background = AMOLED_BLACK,
|
||||||
|
surface = AMOLED_BLACK
|
||||||
|
)
|
||||||
|
}
|
||||||
dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
|
dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
|
if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
|
||||||
|
|||||||
@@ -142,6 +142,10 @@
|
|||||||
<string name="close">Close</string>
|
<string name="close">Close</string>
|
||||||
<string name="force_stop_app">Force stop</string>
|
<string name="force_stop_app">Force stop</string>
|
||||||
<string name="restart_app">Restart</string>
|
<string name="restart_app">Restart</string>
|
||||||
|
<string name="settings_amoled_mode">AMOLED mode</string>
|
||||||
|
<string name="settings_amoled_mode_summary">Enable a pure black theme useful for AMOLED screens to reduce eye strain and save battery.</string>
|
||||||
|
<string name="restart_required">Restart Required</string>
|
||||||
|
<string name="restart_app_message">The app needs to restart for this change to take effect.</string>
|
||||||
<string name="failed_to_update_sepolicy">Failed to update SELinux rules for: %s</string>
|
<string name="failed_to_update_sepolicy">Failed to update SELinux rules for: %s</string>
|
||||||
<string name="su_not_allowed">Granting superuser isn\'t allowed for: %s</string>
|
<string name="su_not_allowed">Granting superuser isn\'t allowed for: %s</string>
|
||||||
<string name="module_changelog">Changelog</string>
|
<string name="module_changelog">Changelog</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user