fix for pre-tiramisu android versions

This commit is contained in:
Kavish Devar
2025-01-07 23:22:16 +05:30
parent 278dc44796
commit 9838dbd921
8 changed files with 120 additions and 23 deletions

View File

@@ -23,20 +23,29 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.SharedPreferences
import android.os.Build
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.gestures.draggable
import androidx.compose.foundation.gestures.rememberDraggableState
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.VerticalDivider
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -50,19 +59,36 @@ import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import me.kavishdevar.aln.R
import me.kavishdevar.aln.services.AirPodsService
import me.kavishdevar.aln.utils.AirPodsNotifications
import me.kavishdevar.aln.utils.NoiseControlMode
import kotlin.math.roundToInt
@SuppressLint("UnspecifiedRegisterReceiverFlag")
@Composable
fun NoiseControlSettings(service: AirPodsService) {
val context = LocalContext.current
val sharedPreferences = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
val offListeningMode = sharedPreferences.getBoolean("off_listening_mode", true)
val offListeningMode = remember { mutableStateOf(sharedPreferences.getBoolean("off_listening_mode", true)) }
val preferenceChangeListener = remember {
SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
if (key == "off_listening_mode") {
offListeningMode.value = sharedPreferences.getBoolean("off_listening_mode", true)
}
}
}
DisposableEffect(Unit) {
sharedPreferences.registerOnSharedPreferenceChangeListener(preferenceChangeListener)
onDispose {
sharedPreferences.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener)
}
}
val isDarkTheme = isSystemInDarkTheme()
val backgroundColor = if (isDarkTheme) Color(0xFF1C1C1E) else Color(0xFFE3E3E8)
@@ -71,18 +97,28 @@ fun NoiseControlSettings(service: AirPodsService) {
val selectedBackground = if (isDarkTheme) Color(0xFF5C5A5F) else Color(0xFFFFFFFF)
val noiseControlMode = remember { mutableStateOf(NoiseControlMode.OFF) }
val selectedOffset = remember { mutableFloatStateOf(0f) }
val animatedOffset = animateFloatAsState(targetValue = selectedOffset.floatValue)
val d1a = remember { mutableFloatStateOf(0f) }
val d2a = remember { mutableFloatStateOf(0f) }
val d3a = remember { mutableFloatStateOf(0f) }
val boxWidth = 200.dp.value
fun onModeSelected(mode: NoiseControlMode, received: Boolean = false) {
if (!received && !offListeningMode && mode == NoiseControlMode.OFF) {
if (!received && !offListeningMode.value && mode == NoiseControlMode.OFF) {
noiseControlMode.value = NoiseControlMode.ADAPTIVE
} else {
noiseControlMode.value = mode
}
if (!received) service.setANCMode(mode.ordinal + 1)
selectedOffset.floatValue = when (noiseControlMode.value) {
NoiseControlMode.NOISE_CANCELLATION -> 3 * boxWidth
NoiseControlMode.OFF -> 0f
NoiseControlMode.ADAPTIVE -> 2 * boxWidth
NoiseControlMode.TRANSPARENCY -> 1 * boxWidth
}
when (noiseControlMode.value) {
NoiseControlMode.NOISE_CANCELLATION -> {
d1a.floatValue = 1f
@@ -107,6 +143,15 @@ fun NoiseControlSettings(service: AirPodsService) {
}
}
LaunchedEffect(noiseControlMode.value) {
selectedOffset.value = when (noiseControlMode.value) {
NoiseControlMode.NOISE_CANCELLATION -> 3 * boxWidth
NoiseControlMode.OFF -> 0f
NoiseControlMode.ADAPTIVE -> 2 * boxWidth
NoiseControlMode.TRANSPARENCY -> 1 * boxWidth
}
}
val noiseControlReceiver = remember {
object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
@@ -154,13 +199,26 @@ fun NoiseControlSettings(service: AirPodsService) {
.fillMaxWidth()
.height(75.dp)
.padding(8.dp)
.draggable(
orientation = Orientation.Horizontal,
state = rememberDraggableState { delta ->
selectedOffset.floatValue = (selectedOffset.floatValue + delta).coerceIn(0f, 3 * boxWidth)
}
)
) {
Row(
modifier = Modifier
.fillMaxWidth()
.background(backgroundColor, RoundedCornerShape(14.dp))
) {
if (offListeningMode) {
Box(
modifier = Modifier
.offset { IntOffset(animatedOffset.value.roundToInt(), 0) }
.width(boxWidth.dp)
.height(75.dp)
.background(selectedBackground, RoundedCornerShape(14.dp))
)
if (offListeningMode.value) {
NoiseControlButton(
icon = ImageBitmap.imageResource(R.drawable.noise_cancellation),
onClick = { onModeSelected(NoiseControlMode.OFF) },
@@ -219,7 +277,7 @@ fun NoiseControlSettings(service: AirPodsService) {
.padding(horizontal = 8.dp)
.padding(top = 1.dp)
) {
if (offListeningMode) {
if (offListeningMode.value) {
Text(
text = "Off",
style = TextStyle(fontSize = 12.sp, color = textColor),