mirror of
https://github.com/kavishdevar/librepods.git
synced 2026-02-10 19:52:24 +00:00
android: update haze uses
This commit is contained in:
@@ -78,9 +78,11 @@ import androidx.compose.ui.unit.dp
|
|||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
import androidx.navigation.NavController
|
import androidx.navigation.NavController
|
||||||
import androidx.navigation.compose.rememberNavController
|
import androidx.navigation.compose.rememberNavController
|
||||||
|
import dev.chrisbanes.haze.HazeEffectScope
|
||||||
import dev.chrisbanes.haze.HazeState
|
import dev.chrisbanes.haze.HazeState
|
||||||
import dev.chrisbanes.haze.haze
|
import dev.chrisbanes.haze.haze
|
||||||
import dev.chrisbanes.haze.hazeChild
|
import dev.chrisbanes.haze.hazeEffect
|
||||||
|
import dev.chrisbanes.haze.hazeSource
|
||||||
import dev.chrisbanes.haze.materials.CupertinoMaterials
|
import dev.chrisbanes.haze.materials.CupertinoMaterials
|
||||||
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
|
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
@@ -149,7 +151,7 @@ fun AirPodsSettingsScreen(dev: BluetoothDevice?, service: AirPodsService,
|
|||||||
}
|
}
|
||||||
|
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
|
|
||||||
val connectionReceiver = remember {
|
val connectionReceiver = remember {
|
||||||
object : BroadcastReceiver() {
|
object : BroadcastReceiver() {
|
||||||
override fun onReceive(context: Context?, intent: Intent?) {
|
override fun onReceive(context: Context?, intent: Intent?) {
|
||||||
@@ -232,14 +234,13 @@ fun AirPodsSettingsScreen(dev: BluetoothDevice?, service: AirPodsService,
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.hazeChild(
|
.hazeEffect(
|
||||||
state = hazeState,
|
state = hazeState,
|
||||||
style = CupertinoMaterials.thick(),
|
style = CupertinoMaterials.thick(),
|
||||||
block = {
|
block = fun HazeEffectScope.() {
|
||||||
alpha =
|
alpha =
|
||||||
if (verticalScrollState.value > 60.dp.value * mDensity.floatValue) 1f else 0f
|
if (verticalScrollState.value > 60.dp.value * mDensity.floatValue) 1f else 0f
|
||||||
}
|
})
|
||||||
)
|
|
||||||
.drawBehind {
|
.drawBehind {
|
||||||
mDensity.floatValue = density
|
mDensity.floatValue = density
|
||||||
val strokeWidth = 0.7.dp.value * density
|
val strokeWidth = 0.7.dp.value * density
|
||||||
@@ -295,7 +296,7 @@ fun AirPodsSettingsScreen(dev: BluetoothDevice?, service: AirPodsService,
|
|||||||
if (isLocallyConnected || isRemotelyConnected) {
|
if (isLocallyConnected || isRemotelyConnected) {
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.haze(hazeState)
|
.hazeSource(hazeState)
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
.padding(horizontal = 16.dp)
|
.padding(horizontal = 16.dp)
|
||||||
.verticalScroll(
|
.verticalScroll(
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ import androidx.compose.foundation.layout.Spacer
|
|||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.height
|
import androidx.compose.foundation.layout.height
|
||||||
|
import androidx.compose.foundation.layout.navigationBarsPadding
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.layout.size
|
import androidx.compose.foundation.layout.size
|
||||||
import androidx.compose.foundation.layout.width
|
import androidx.compose.foundation.layout.width
|
||||||
@@ -49,6 +50,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape
|
|||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowLeft
|
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowLeft
|
||||||
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
|
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
|
||||||
|
import androidx.compose.material.icons.filled.Check
|
||||||
import androidx.compose.material.icons.filled.Delete
|
import androidx.compose.material.icons.filled.Delete
|
||||||
import androidx.compose.material.icons.filled.MoreVert
|
import androidx.compose.material.icons.filled.MoreVert
|
||||||
import androidx.compose.material.icons.filled.Send
|
import androidx.compose.material.icons.filled.Send
|
||||||
@@ -89,33 +91,18 @@ import androidx.compose.ui.text.input.TextFieldValue
|
|||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
import androidx.navigation.NavController
|
import androidx.navigation.NavController
|
||||||
|
import dev.chrisbanes.haze.HazeEffectScope
|
||||||
import dev.chrisbanes.haze.HazeState
|
import dev.chrisbanes.haze.HazeState
|
||||||
import dev.chrisbanes.haze.haze
|
import dev.chrisbanes.haze.hazeEffect
|
||||||
import dev.chrisbanes.haze.hazeChild
|
import dev.chrisbanes.haze.hazeSource
|
||||||
import dev.chrisbanes.haze.materials.CupertinoMaterials
|
import dev.chrisbanes.haze.materials.CupertinoMaterials
|
||||||
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
|
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
|
||||||
import me.kavishdevar.librepods.R
|
import me.kavishdevar.librepods.R
|
||||||
import me.kavishdevar.librepods.services.ServiceManager
|
import me.kavishdevar.librepods.services.ServiceManager
|
||||||
import me.kavishdevar.librepods.utils.BatteryStatus
|
import me.kavishdevar.librepods.utils.BatteryStatus
|
||||||
import me.kavishdevar.librepods.utils.isHeadTrackingData
|
import me.kavishdevar.librepods.utils.isHeadTrackingData
|
||||||
import me.kavishdevar.librepods.composables.StyledSwitch
|
|
||||||
import androidx.compose.foundation.layout.navigationBarsPadding
|
|
||||||
import androidx.compose.foundation.layout.imePadding
|
|
||||||
import androidx.compose.ui.geometry.Offset
|
|
||||||
import androidx.compose.ui.input.pointer.pointerInput
|
|
||||||
import androidx.compose.ui.platform.LocalDensity
|
|
||||||
import androidx.compose.ui.layout.onGloballyPositioned
|
|
||||||
import androidx.compose.ui.layout.positionInRoot
|
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
|
||||||
import androidx.compose.foundation.gestures.detectTapGestures
|
|
||||||
import androidx.compose.foundation.gestures.detectDragGestures
|
|
||||||
import androidx.compose.material.icons.filled.Check
|
|
||||||
import androidx.compose.ui.input.pointer.PointerInputChange
|
|
||||||
|
|
||||||
data class PacketInfo(
|
data class PacketInfo(
|
||||||
val type: String,
|
val type: String,
|
||||||
@@ -349,13 +336,13 @@ fun DebugScreen(navController: NavController) {
|
|||||||
val scrollOffset by remember { derivedStateOf { listState.firstVisibleItemScrollOffset } }
|
val scrollOffset by remember { derivedStateOf { listState.firstVisibleItemScrollOffset } }
|
||||||
val focusManager = LocalFocusManager.current
|
val focusManager = LocalFocusManager.current
|
||||||
val coroutineScope = rememberCoroutineScope()
|
val coroutineScope = rememberCoroutineScope()
|
||||||
|
|
||||||
val showMenu = remember { mutableStateOf(false) }
|
val showMenu = remember { mutableStateOf(false) }
|
||||||
|
|
||||||
val airPodsService = remember { ServiceManager.getService() }
|
val airPodsService = remember { ServiceManager.getService() }
|
||||||
val packetLogs = airPodsService?.packetLogsFlow?.collectAsState(emptySet())?.value ?: emptySet()
|
val packetLogs = airPodsService?.packetLogsFlow?.collectAsState(emptySet())?.value ?: emptySet()
|
||||||
val shouldScrollToBottom = remember { mutableStateOf(true) }
|
val shouldScrollToBottom = remember { mutableStateOf(true) }
|
||||||
|
|
||||||
val refreshTrigger = remember { mutableStateOf(0) }
|
val refreshTrigger = remember { mutableStateOf(0) }
|
||||||
LaunchedEffect(refreshTrigger.value) {
|
LaunchedEffect(refreshTrigger.value) {
|
||||||
while(true) {
|
while(true) {
|
||||||
@@ -363,16 +350,16 @@ fun DebugScreen(navController: NavController) {
|
|||||||
refreshTrigger.value = refreshTrigger.value + 1
|
refreshTrigger.value = refreshTrigger.value + 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val expandedItems = remember { mutableStateOf(setOf<Int>()) }
|
val expandedItems = remember { mutableStateOf(setOf<Int>()) }
|
||||||
|
|
||||||
fun copyToClipboard(text: String) {
|
fun copyToClipboard(text: String) {
|
||||||
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
||||||
val clip = ClipData.newPlainText("Packet Data", text)
|
val clip = ClipData.newPlainText("Packet Data", text)
|
||||||
clipboard.setPrimaryClip(clip)
|
clipboard.setPrimaryClip(clip)
|
||||||
Toast.makeText(context, "Packet copied to clipboard", Toast.LENGTH_SHORT).show()
|
Toast.makeText(context, "Packet copied to clipboard", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
|
|
||||||
LaunchedEffect(packetLogs.size, refreshTrigger.value) {
|
LaunchedEffect(packetLogs.size, refreshTrigger.value) {
|
||||||
if (shouldScrollToBottom.value && packetLogs.isNotEmpty()) {
|
if (shouldScrollToBottom.value && packetLogs.isNotEmpty()) {
|
||||||
listState.animateScrollToItem(packetLogs.size - 1)
|
listState.animateScrollToItem(packetLogs.size - 1)
|
||||||
@@ -415,7 +402,7 @@ fun DebugScreen(navController: NavController) {
|
|||||||
tint = if (isSystemInDarkTheme()) Color.White else Color.Black
|
tint = if (isSystemInDarkTheme()) Color.White else Color.Black
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
DropdownMenu(
|
DropdownMenu(
|
||||||
expanded = showMenu.value,
|
expanded = showMenu.value,
|
||||||
onDismissRequest = { showMenu.value = false },
|
onDismissRequest = { showMenu.value = false },
|
||||||
@@ -446,17 +433,17 @@ fun DebugScreen(navController: NavController) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onClick = {
|
onClick = {
|
||||||
shouldScrollToBottom.value = !shouldScrollToBottom.value
|
shouldScrollToBottom.value = !shouldScrollToBottom.value
|
||||||
showMenu.value = false
|
showMenu.value = false
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
HorizontalDivider(
|
HorizontalDivider(
|
||||||
color = if (isSystemInDarkTheme()) Color(0xFF3A3A3C) else Color(0xFFE5E5EA),
|
color = if (isSystemInDarkTheme()) Color(0xFF3A3A3C) else Color(0xFFE5E5EA),
|
||||||
thickness = 0.5.dp
|
thickness = 0.5.dp
|
||||||
)
|
)
|
||||||
|
|
||||||
DropdownMenuItem(
|
DropdownMenuItem(
|
||||||
text = {
|
text = {
|
||||||
Row(
|
Row(
|
||||||
@@ -478,7 +465,7 @@ fun DebugScreen(navController: NavController) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onClick = {
|
onClick = {
|
||||||
ServiceManager.getService()?.clearLogs()
|
ServiceManager.getService()?.clearLogs()
|
||||||
expandedItems.value = emptySet()
|
expandedItems.value = emptySet()
|
||||||
showMenu.value = false
|
showMenu.value = false
|
||||||
@@ -487,13 +474,12 @@ fun DebugScreen(navController: NavController) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
modifier = Modifier.hazeChild(
|
modifier = Modifier.hazeEffect(
|
||||||
state = hazeState,
|
state = hazeState,
|
||||||
style = CupertinoMaterials.thick(),
|
style = CupertinoMaterials.thick(),
|
||||||
block = {
|
block = fun HazeEffectScope.() {
|
||||||
alpha = if (scrollOffset > 0) 1f else 0f
|
alpha = if (scrollOffset > 0) 1f else 0f
|
||||||
}
|
}),
|
||||||
),
|
|
||||||
colors = TopAppBarDefaults.topAppBarColors(containerColor = Color.Transparent),
|
colors = TopAppBarDefaults.topAppBarColors(containerColor = Color.Transparent),
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
@@ -502,7 +488,7 @@ fun DebugScreen(navController: NavController) {
|
|||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
.haze(hazeState)
|
.hazeSource(hazeState)
|
||||||
.padding(top = paddingValues.calculateTopPadding())
|
.padding(top = paddingValues.calculateTopPadding())
|
||||||
.navigationBarsPadding()
|
.navigationBarsPadding()
|
||||||
) {
|
) {
|
||||||
@@ -633,7 +619,7 @@ fun DebugScreen(navController: NavController) {
|
|||||||
airPodsService?.value?.sendPacket(packet.value.text)
|
airPodsService?.value?.sendPacket(packet.value.text)
|
||||||
packet.value = TextFieldValue("")
|
packet.value = TextFieldValue("")
|
||||||
focusManager.clearFocus()
|
focusManager.clearFocus()
|
||||||
|
|
||||||
if (shouldScrollToBottom.value && packetLogs.isNotEmpty()) {
|
if (shouldScrollToBottom.value && packetLogs.isNotEmpty()) {
|
||||||
coroutineScope.launch {
|
coroutineScope.launch {
|
||||||
try {
|
try {
|
||||||
@@ -643,6 +629,7 @@ fun DebugScreen(navController: NavController) {
|
|||||||
scrollOffset = 0
|
scrollOffset = 0
|
||||||
)
|
)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
listState.scrollToItem(
|
listState.scrollToItem(
|
||||||
index = (packetLogs.size - 1).coerceAtLeast(0)
|
index = (packetLogs.size - 1).coerceAtLeast(0)
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user