WifiSettingsPage.kt 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package eu.mjdev.desktop.components.controlcenter.pages
  2. import androidx.compose.desktop.ui.tooling.preview.Preview
  3. import androidx.compose.foundation.background
  4. import androidx.compose.foundation.layout.*
  5. import androidx.compose.foundation.lazy.LazyColumn
  6. import androidx.compose.foundation.shape.RoundedCornerShape
  7. import androidx.compose.material.RadioButton
  8. import androidx.compose.material.RadioButtonDefaults
  9. import androidx.compose.material.icons.Icons
  10. import androidx.compose.material.icons.filled.Wifi
  11. import androidx.compose.runtime.Composable
  12. import androidx.compose.runtime.getValue
  13. import androidx.compose.ui.Alignment
  14. import androidx.compose.ui.Modifier
  15. import androidx.compose.ui.graphics.Color
  16. import androidx.compose.ui.text.font.FontWeight
  17. import androidx.compose.ui.text.style.TextAlign
  18. import androidx.compose.ui.unit.dp
  19. import eu.mjdev.desktop.components.controlcenter.base.ControlCenterPage
  20. import eu.mjdev.desktop.components.icon.WifiLevelIcon
  21. import eu.mjdev.desktop.components.text.TextAny
  22. import eu.mjdev.desktop.data.WifiInfo
  23. import eu.mjdev.desktop.extensions.Compose.preview
  24. import eu.mjdev.desktop.extensions.Custom.flowBlock
  25. import eu.mjdev.desktop.provider.DesktopScope.Companion.withDesktopScope
  26. // nmcli -t -f ALL dev wifi
  27. // nmcli device show
  28. @Suppress("FunctionName")
  29. fun WifiSettingsPage() = ControlCenterPage(
  30. icon = Icons.Filled.Wifi,
  31. name = "Wifi",
  32. condition = { connectionManager.isWifiAdapterAvailable }
  33. ) {
  34. val wifiList by flowBlock(emptyList(), 250L) { wifiConnections }
  35. Box(
  36. modifier = Modifier.fillMaxSize()
  37. ) {
  38. LazyColumn(
  39. modifier = Modifier.fillMaxWidth()
  40. ) {
  41. wifiList.forEach { wifiInfo ->
  42. item {
  43. WifiRow(wifiInfo)
  44. }
  45. }
  46. }
  47. }
  48. }
  49. @Composable
  50. fun WifiRow(
  51. info: WifiInfo
  52. ) = withDesktopScope {
  53. Row(
  54. modifier = Modifier
  55. .padding(4.dp)
  56. .fillMaxWidth()
  57. .background(
  58. Color.White.copy(alpha = 0.1f),
  59. RoundedCornerShape(8.dp)
  60. )
  61. .padding(8.dp),
  62. verticalAlignment = Alignment.CenterVertically
  63. ) {
  64. TextAny(
  65. modifier = Modifier.weight(1f),
  66. text = info.ssid,
  67. color = textColor,
  68. fontWeight = FontWeight.Bold,
  69. textAlign = TextAlign.Start,
  70. singleLine = true,
  71. textSelectionEnabled = false
  72. )
  73. Row(
  74. verticalAlignment = Alignment.CenterVertically
  75. ) {
  76. TextAny(
  77. modifier = Modifier.padding(start = 8.dp).wrapContentWidth(),
  78. text = info.encryption,
  79. fontWeight = FontWeight.Bold,
  80. color = textColor,
  81. textAlign = TextAlign.Start,
  82. singleLine = true,
  83. textSelectionEnabled = false
  84. )
  85. WifiLevelIcon(
  86. modifier = Modifier.padding(start = 8.dp).size(28.dp),
  87. color = textColor,
  88. level = info.signalLevel.toInt()
  89. )
  90. RadioButton(
  91. modifier = Modifier.padding(start = 8.dp).size(24.dp),
  92. selected = info.isActive,
  93. enabled = !info.isActive,
  94. onClick = {},
  95. colors = RadioButtonDefaults.colors(
  96. selectedColor = textColor,
  97. unselectedColor = textColor,
  98. disabledColor = textColor
  99. )
  100. )
  101. }
  102. }
  103. }
  104. @Preview
  105. @Composable
  106. fun WifiSettingsPagePreview() = preview {
  107. WifiSettingsPage().render()
  108. }