Ver Fonte

control center scoped pages

milan jurkulák há 2 anos atrás
pai
commit
0e3de0260a

+ 2 - 0
build.gradle.kts

@@ -67,6 +67,8 @@ allprojects {
         implementation(libs.charts)
         // qr code
         implementation("io.github.alexzhirkevich:qrose:1.0.1")
+        // connectivity
+        implementation("dev.tmapps:konnection:1.4.1")
         // bar code
 //        implementation("io.github.alexzhirkevich:qrose-oned:1.0.1")
         // flow extensions

+ 10 - 8
src/main/kotlin/eu/mjdev/desktop/components/controlcenter/ControlCenter.kt

@@ -18,6 +18,7 @@ import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.window.WindowPosition
+import eu.mjdev.desktop.components.controlcenter.ControlCenterPage.Companion.rememberControlCenterScope
 import eu.mjdev.desktop.components.shadow.LeftShadow
 import eu.mjdev.desktop.components.shadow.RightShadow
 import eu.mjdev.desktop.components.sliding.SlidingMenu
@@ -63,6 +64,12 @@ fun ControlCenter(
         onFocusChange(focused)
     }
 ) {
+    val cscope = rememberControlCenterScope(backgroundColor, api)
+    val pagesFiltered = remember(pages) {
+        derivedStateOf {
+            pages.filter { p -> p.condition.invoke(cscope) }
+        }
+    }
     SlidingMenu(
         modifier = Modifier.fillMaxHeight(),
         orientation = Horizontal,
@@ -99,7 +106,7 @@ fun ControlCenter(
                             verticalArrangement = Arrangement.Top,
                             horizontalAlignment = Alignment.Start
                         ) {
-                            itemsIndexed(pages) { idx, page ->
+                            itemsIndexed(pagesFiltered.value) { idx, page ->
                                 val isSelected = (pagerState.value == idx)
                                 Icon(
                                     modifier = Modifier
@@ -139,13 +146,8 @@ fun ControlCenter(
                                 Box(
                                     modifier = Modifier.width(controlCenterExpandedWidth),
                                 ) {
-                                    with(
-                                        ControlCenterPage.ControlCenterPageScope(
-                                            backgroundColor,
-                                            api
-                                        )
-                                    ) {
-                                        pages[pagerState.value].content(this)
+                                    with(pagesFiltered.value[pagerState.value]) {
+                                        content(cscope)
                                     }
                                 }
                                 Divider(

+ 12 - 0
src/main/kotlin/eu/mjdev/desktop/components/controlcenter/ControlCenterPage.kt

@@ -3,6 +3,7 @@ package eu.mjdev.desktop.components.controlcenter
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Settings
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.vector.ImageVector
 import eu.mjdev.desktop.provider.DesktopProvider
@@ -10,10 +11,21 @@ import eu.mjdev.desktop.provider.DesktopProvider
 class ControlCenterPage(
     val icon: ImageVector = Icons.Filled.Settings,
     val name: String = "",
+    val condition: ControlCenterPageScope.() -> Boolean = { true },
     val content: @Composable ControlCenterPageScope.() -> Unit = {}
 ) {
     class ControlCenterPageScope(
         val backgroundColor: Color,
         val api: DesktopProvider
     )
+
+    companion object {
+        @Composable
+        fun rememberControlCenterScope(
+            backgroundColor: Color,
+            api: DesktopProvider
+        ) = remember(backgroundColor, api) {
+            ControlCenterPageScope(backgroundColor, api)
+        }
+    }
 }

+ 19 - 0
src/main/kotlin/eu/mjdev/desktop/components/controlcenter/pages/EthSettingsPage.kt

@@ -0,0 +1,19 @@
+package eu.mjdev.desktop.components.controlcenter.pages
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.SettingsEthernet
+import androidx.compose.ui.Modifier
+import eu.mjdev.desktop.components.controlcenter.ControlCenterPage
+
+@Suppress("FunctionName")
+fun EthSettingsPage() = ControlCenterPage(
+    icon = Icons.Filled.SettingsEthernet,
+    name = "Ethernet",
+    condition = { api.connection.isEthAdapterAvailable }
+) {
+    Box(
+        modifier = Modifier.fillMaxSize()
+    )
+}

+ 2 - 1
src/main/kotlin/eu/mjdev/desktop/components/controlcenter/pages/WifiSettingsPage.kt

@@ -10,7 +10,8 @@ import eu.mjdev.desktop.components.controlcenter.ControlCenterPage
 @Suppress("FunctionName")
 fun WifiSettingsPage() = ControlCenterPage(
     icon = Icons.Filled.Wifi,
-    name = "Wifi"
+    name = "Wifi",
+    condition = { api.connection.isWifiAdapterAvailable }
 ) {
     Box(
         modifier = Modifier.fillMaxSize()

+ 30 - 0
src/main/kotlin/eu/mjdev/desktop/helpers/ConnectivityManager.kt

@@ -0,0 +1,30 @@
+package eu.mjdev.desktop.helpers
+
+import dev.tmapps.konnection.Konnection
+import dev.tmapps.konnection.NetworkConnection
+
+@Suppress("MemberVisibilityCanBePrivate", "unused")
+class ConnectivityManager {
+    val connection = Konnection.createInstance(enableDebugLog = false)
+
+    // todo
+    val isWifiAdapterAvailable
+        get() = true
+
+    // todo
+    val isEthAdapterAvailable
+        get() = true
+
+    val isConnected
+        get() = connection.isConnected()
+
+    val isWifiConnection
+        get() = isConnected && connection.getCurrentNetworkConnection() == NetworkConnection.WIFI
+
+    val isEthConnection
+        get() = isConnected && connection.getCurrentNetworkConnection() == NetworkConnection.ETHERNET
+
+    val isMobileConnection
+        get() = isConnected && connection.getCurrentNetworkConnection() == NetworkConnection.MOBILE
+
+}

+ 5 - 2
src/main/kotlin/eu/mjdev/desktop/provider/DesktopProvider.kt

@@ -9,6 +9,7 @@ import coil3.ImageLoader
 import eu.mjdev.desktop.components.controlcenter.ControlCenterPage
 import eu.mjdev.desktop.components.controlcenter.pages.*
 import eu.mjdev.desktop.data.User
+import eu.mjdev.desktop.helpers.ConnectivityManager
 import eu.mjdev.desktop.helpers.ResourceStream
 import eu.mjdev.desktop.provider.providers.AppsProvider
 import kotlinx.coroutines.CoroutineScope
@@ -24,7 +25,9 @@ import kotlin.system.exitProcess
 @Suppress("unused", "MemberVisibilityCanBePrivate", "PrivatePropertyName", "SameParameterValue")
 class DesktopProvider(
     val scope: CoroutineScope? = null,
-    val imageLoader: ImageLoader? = null
+    val imageLoader: ImageLoader? = null,
+    val connection: ConnectivityManager = ConnectivityManager(),
+    private val scriptManager: ScriptEngineManager = ScriptEngineManager()
 ) {
     private val __currentUser: User by lazy { User.load() }
     private val _currentUser: MutableState<User> = mutableStateOf(__currentUser)
@@ -33,7 +36,6 @@ class DesktopProvider(
 
     private val _controlCenterPages: MutableState<List<ControlCenterPage>> = mutableStateOf(CONTROL_CENTER_PAGES)
 
-    private val scriptManager by lazy { ScriptEngineManager() }
     private val engine: ScriptEngine by lazy {
         scriptManager.getEngineByName("JavaScript").apply {
             // todo
@@ -131,6 +133,7 @@ class DesktopProvider(
     companion object {
         private val CONTROL_CENTER_PAGES = listOf(
             MainSettingsPage(),
+            EthSettingsPage(),
             WifiSettingsPage(),
             BluetoothSettingsPage(),
             DisplaySettingsPage(),