Brightness Slider Sync 1

This commit is contained in:
Gezim
2025-12-26 22:20:31 +02:00
parent ec2ac6531c
commit 1e19ea89d9
2 changed files with 29 additions and 61 deletions

View File

@@ -1178,12 +1178,11 @@ class SimpleTrayFragment : Fragment() {
}
}
// Brightness state (initialize from prefs saved system value using perceptual mapping)
val initialBrightnessPref = remember { prefs.brightnessLevel.coerceIn(0, 255) }
val initialBrightnessValue = remember {
if (initialBrightnessPref == 0) 0f else kotlin.math.sqrt((initialBrightnessPref / 255f).coerceIn(0f, 1f))
}
var brightness by remember { mutableFloatStateOf(initialBrightnessValue) }
// Brightness state (collect from ViewModel when available)
val vmLocal = simpleTrayViewModel
val brightnessState = vmLocal?.brightnessLevel?.collectAsState(initial = prefs.brightnessLevel.coerceIn(0, 255)) ?: remember { mutableIntStateOf(prefs.brightnessLevel.coerceIn(0, 255)) }
val brightnessLevel by brightnessState
val brightness = if (brightnessLevel == 0) 0f else kotlin.math.sqrt((brightnessLevel / 255f).coerceIn(0f, 1f))
val sliderToSystem: (Float) -> Int = { s ->
val v = (s * s * 255f).toInt().coerceIn(0, 255)
@@ -1191,7 +1190,6 @@ class SimpleTrayFragment : Fragment() {
}
val onBrightnessChange: (Float) -> Unit = { newBrightness ->
brightness = newBrightness
val systemValue = sliderToSystem(newBrightness)
// Check permission before trying to set brightness
@@ -1217,19 +1215,7 @@ class SimpleTrayFragment : Fragment() {
} catch (_: Exception) {}
}
}
// Also set window brightness for immediate effect
try {
val activity = ctx as? android.app.Activity
if (activity != null) {
val lp = activity.window.attributes
lp.screenBrightness = (systemValue / 255f).coerceIn(0.0f, 1f)
activity.window.attributes = lp
}
} catch (_: Exception) {}
}
// Quick settings toggle states reflect system status (collect from ViewModel when available)
val vmLocal = simpleTrayViewModel
val wifiState = vmLocal?.wifiEnabled?.collectAsState(initial = currentWifiState()) ?: remember { mutableStateOf(currentWifiState()) }
val wifiEnabled by wifiState
val bluetoothState = vmLocal?.bluetoothEnabled?.collectAsState(initial = currentBluetoothState()) ?: remember { mutableStateOf(currentBluetoothState()) }
@@ -1243,7 +1229,7 @@ class SimpleTrayFragment : Fragment() {
val signalEnabled by signalState
val flashlightState = vmLocal?.flashlightEnabled?.collectAsState(initial = false) ?: remember { mutableStateOf(false) }
val flashlightEnabled by flashlightState
val brightnessEnabled = brightness > 0f
val brightnessEnabled = brightnessLevel > 1
val phonePermissionGranted = ContextCompat.checkSelfPermission(
ctx,
@@ -2142,47 +2128,7 @@ class SimpleTrayFragment : Fragment() {
}
}
// Observe system brightness changes so external changes update the slider
DisposableEffect(ctx) {
val resolver = ctx.contentResolver
val observer = object : android.database.ContentObserver(Handler(Looper.getMainLooper())) {
override fun onChange(selfChange: Boolean) {
try {
// Read actual system brightness
val systemBrightness = Settings.System.getInt(
resolver,
Settings.System.SCREEN_BRIGHTNESS
)
// Check if user intended zero (system shows 1 but prefs shows 0)
val userIntended = if (systemBrightness == 1 && prefs.brightnessLevel == 0) {
0
} else {
// External change - update brightness via MainViewModel to keep state in sync
val activity = ctx as? androidx.activity.ComponentActivity
val vm = activity?.let { androidx.lifecycle.ViewModelProvider(it)[com.github.gezimos.inkos.MainViewModel::class.java] }
vm?.setBrightnessLevel(systemBrightness)
systemBrightness
}
val slider = if (userIntended == 0) {
0f
} else {
systemToSlider(userIntended)
}
internalBrightness = slider
// notify parent so the external change updates the fragment state
try { onBrightnessChange(internalBrightness) } catch (_: Exception) {}
} catch (_: Exception) {}
}
}
try {
resolver.registerContentObserver(Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS), false, observer)
} catch (_: Exception) {}
onDispose {
try { resolver.unregisterContentObserver(observer) } catch (_: Exception) {}
}
}
// System brightness changes are handled by the ViewModel
BrightnessSliderBar(
internalBrightness = internalBrightness,

View File

@@ -7,6 +7,7 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.database.ContentObserver
import android.hardware.camera2.CameraManager
import android.media.AudioManager
import android.net.ConnectivityManager
@@ -116,6 +117,11 @@ class SimpleTrayViewModel(application: Application) : AndroidViewModel(applicati
// torch state will be updated via TorchCallback when available; set false if not available
_flashlightEnabled.value = false
// Update brightness from system
_brightnessLevel.value = try {
Settings.System.getInt(appContext.contentResolver, Settings.System.SCREEN_BRIGHTNESS)
} catch (_: Exception) { prefs.brightnessLevel }
}
}
@@ -209,6 +215,22 @@ class SimpleTrayViewModel(application: Application) : AndroidViewModel(applicati
appContext.registerReceiver(simReceiver, IntentFilter("android.intent.action.SIM_STATE_CHANGED"))
} catch (_: Exception) {}
// Brightness observer
try {
val brightnessObserver = object : ContentObserver(Handler(Looper.getMainLooper())) {
override fun onChange(selfChange: Boolean) {
super.onChange(selfChange)
viewModelScope.launch {
try {
val current = Settings.System.getInt(appContext.contentResolver, Settings.System.SCREEN_BRIGHTNESS)
_brightnessLevel.value = current
} catch (_: Exception) {}
}
}
}
appContext.contentResolver.registerContentObserver(Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS), false, brightnessObserver)
} catch (_: Exception) {}
} catch (_: Exception) {}
}