From af4df0a35343cfd1d1d1dd8c04afcece3b74a249 Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Tue, 3 Feb 2026 16:06:53 +0500 Subject: [PATCH] fix: fix theme switch --- .../com/rosetta/messenger/MainActivity.kt | 25 +++++++++++++++---- .../messenger/data/PreferencesManager.kt | 10 ++++++++ .../messenger/ui/settings/ThemeScreen.kt | 21 +++++++++------- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/rosetta/messenger/MainActivity.kt b/app/src/main/java/com/rosetta/messenger/MainActivity.kt index 98fa160..6679eb1 100644 --- a/app/src/main/java/com/rosetta/messenger/MainActivity.kt +++ b/app/src/main/java/com/rosetta/messenger/MainActivity.kt @@ -12,6 +12,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.animation.* import androidx.compose.animation.core.tween import androidx.compose.foundation.background +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.Surface @@ -129,7 +130,14 @@ class MainActivity : FragmentActivity() { } val scope = rememberCoroutineScope() - val isDarkTheme by preferencesManager.isDarkTheme.collectAsState(initial = true) + val themeMode by preferencesManager.themeMode.collectAsState(initial = "dark") + val systemInDarkTheme = isSystemInDarkTheme() + val isDarkTheme = when (themeMode) { + "light" -> false + "dark" -> true + "auto" -> systemInDarkTheme + else -> true + } val isLoggedIn by accountManager.isLoggedIn.collectAsState(initial = null) var showSplash by remember { mutableStateOf(true) } var showOnboarding by remember { mutableStateOf(true) } @@ -296,11 +304,17 @@ class MainActivity : FragmentActivity() { MainScreen( account = currentAccount, isDarkTheme = isDarkTheme, + themeMode = themeMode, onToggleTheme = { scope.launch { preferencesManager.setDarkTheme(!isDarkTheme) } }, + onThemeModeChange = { mode -> + scope.launch { + preferencesManager.setThemeMode(mode) + } + }, onLogout = { // Set currentAccount to null immediately to prevent UI // lag @@ -461,7 +475,9 @@ class MainActivity : FragmentActivity() { fun MainScreen( account: DecryptedAccount? = null, isDarkTheme: Boolean = true, + themeMode: String = "dark", onToggleTheme: () -> Unit = {}, + onThemeModeChange: (String) -> Unit = {}, onLogout: () -> Unit = {}, onAccountInfoUpdated: suspend () -> Unit = {} ) { @@ -667,13 +683,12 @@ fun MainScreen( if (showThemeScreen) { ThemeScreen( isDarkTheme = isDarkTheme, - onBack = { + currentThemeMode = themeMode, + onBack = { showThemeScreen = false showProfileScreen = true }, - onThemeChange = { isDark -> - onToggleTheme() - } + onThemeModeChange = onThemeModeChange ) } } diff --git a/app/src/main/java/com/rosetta/messenger/data/PreferencesManager.kt b/app/src/main/java/com/rosetta/messenger/data/PreferencesManager.kt index 6262855..a6069e9 100644 --- a/app/src/main/java/com/rosetta/messenger/data/PreferencesManager.kt +++ b/app/src/main/java/com/rosetta/messenger/data/PreferencesManager.kt @@ -20,6 +20,7 @@ class PreferencesManager(private val context: Context) { // Onboarding & Theme val HAS_SEEN_ONBOARDING = booleanPreferencesKey("has_seen_onboarding") val IS_DARK_THEME = booleanPreferencesKey("is_dark_theme") + val THEME_MODE = stringPreferencesKey("theme_mode") // "light", "dark", "auto" // Notifications val NOTIFICATIONS_ENABLED = booleanPreferencesKey("notifications_enabled") @@ -63,6 +64,15 @@ class PreferencesManager(private val context: Context) { context.dataStore.edit { preferences -> preferences[IS_DARK_THEME] = value } } + val themeMode: Flow = + context.dataStore.data.map { preferences -> + preferences[THEME_MODE] ?: "dark" // Default to dark theme + } + + suspend fun setThemeMode(value: String) { + context.dataStore.edit { preferences -> preferences[THEME_MODE] = value } + } + // ═════════════════════════════════════════════════════════════ // 🔔 NOTIFICATIONS // ═════════════════════════════════════════════════════════════ diff --git a/app/src/main/java/com/rosetta/messenger/ui/settings/ThemeScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/settings/ThemeScreen.kt index 140fc72..69a48df 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/settings/ThemeScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/settings/ThemeScreen.kt @@ -29,16 +29,17 @@ import com.rosetta.messenger.ui.components.AppleEmojiText @Composable fun ThemeScreen( isDarkTheme: Boolean, + currentThemeMode: String, onBack: () -> Unit, - onThemeChange: (Boolean) -> Unit + onThemeModeChange: (String) -> Unit ) { val backgroundColor = if (isDarkTheme) Color(0xFF1A1A1A) else Color(0xFFFFFFFF) val surfaceColor = if (isDarkTheme) Color(0xFF2C2C2E) else Color(0xFFF2F2F7) val textColor = if (isDarkTheme) Color.White else Color.Black val secondaryTextColor = if (isDarkTheme) Color(0xFF8E8E93) else Color(0xFF666666) - + // Theme mode: "light", "dark", "auto" - var themeMode by remember { mutableStateOf(if (isDarkTheme) "dark" else "light") } + var themeMode by remember { mutableStateOf(currentThemeMode) } // Handle back gesture BackHandler { onBack() } @@ -105,7 +106,7 @@ fun ThemeScreen( onClick = { if (themeMode != "light") { themeMode = "light" - onThemeChange(false) + onThemeModeChange("light") } }, textColor = textColor, @@ -113,7 +114,7 @@ fun ThemeScreen( showDivider = true, isDarkTheme = isDarkTheme ) - + TelegramThemeOption( icon = TablerIcons.Moon, title = "Dark", @@ -121,7 +122,7 @@ fun ThemeScreen( onClick = { if (themeMode != "dark") { themeMode = "dark" - onThemeChange(true) + onThemeModeChange("dark") } }, textColor = textColor, @@ -129,14 +130,16 @@ fun ThemeScreen( showDivider = true, isDarkTheme = isDarkTheme ) - + TelegramThemeOption( icon = TablerIcons.DeviceMobile, title = "System", isSelected = themeMode == "auto", onClick = { - themeMode = "auto" - // For now, we'll just keep the current theme + if (themeMode != "auto") { + themeMode = "auto" + onThemeModeChange("auto") + } }, textColor = textColor, secondaryTextColor = secondaryTextColor,