From aac71b3639a00aefc037e3fd1b28b97cb01cd8e7 Mon Sep 17 00:00:00 2001 From: Jordon de Hoog Date: Tue, 25 Jun 2024 12:20:40 -0400 Subject: [PATCH] Fix iOS device implementation (#21) --- .../internal/AppleConnectivityProvider.kt | 16 +++++++++------- .../connectivity/internal/DefaultConnectivity.kt | 2 +- .../src/commonMain/kotlin/HomeScreen.kt | 4 ++-- .../src/deviceMain/kotlin/HomeScreen.device.kt | 4 ++-- .../src/httpMain/kotlin/HomeScreen.http.kt | 4 ++-- demo/iosApp/iosApp.xcodeproj/project.pbxproj | 6 +++--- 6 files changed, 19 insertions(+), 17 deletions(-) diff --git a/connectivity-apple/src/appleMain/kotlin/dev/jordond/connectivity/internal/AppleConnectivityProvider.kt b/connectivity-apple/src/appleMain/kotlin/dev/jordond/connectivity/internal/AppleConnectivityProvider.kt index 4431399..aca0f56 100644 --- a/connectivity-apple/src/appleMain/kotlin/dev/jordond/connectivity/internal/AppleConnectivityProvider.kt +++ b/connectivity-apple/src/appleMain/kotlin/dev/jordond/connectivity/internal/AppleConnectivityProvider.kt @@ -6,6 +6,9 @@ import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import platform.Network.nw_interface_type_wifi +import platform.Network.nw_path_get_status +import platform.Network.nw_path_is_constrained +import platform.Network.nw_path_is_expensive import platform.Network.nw_path_monitor_cancel import platform.Network.nw_path_monitor_create import platform.Network.nw_path_monitor_set_queue @@ -13,8 +16,6 @@ import platform.Network.nw_path_monitor_set_update_handler import platform.Network.nw_path_monitor_start import platform.Network.nw_path_status_satisfied import platform.Network.nw_path_uses_interface_type -import platform.NetworkExtension.NWPath -import platform.NetworkExtension.NWPathStatus import platform.darwin.DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL import platform.darwin.dispatch_queue_create @@ -29,16 +30,17 @@ internal object AppleConnectivityProvider : ConnectivityProvider { return callbackFlow { nw_path_monitor_set_update_handler(monitor) { path -> - val nwPath: NWPath? = path as? NWPath - val status: NWPathStatus? = nwPath?.status() + val status = nw_path_get_status(path) when { - status != null && status == nw_path_status_satisfied.toLong() -> { + status == nw_path_status_satisfied -> { val isWifi = nw_path_uses_interface_type(path, nw_interface_type_wifi) - val isMetered = !isWifi && (path.isExpensive() || path.isConstrained()) + val isExpensive = nw_path_is_expensive(path) + val isConstrained = nw_path_is_constrained(path) + val isMetered = !isWifi && (isExpensive || isConstrained) trySend(Connectivity.Status.Connected(isMetered)) } - else -> Connectivity.Status.Disconnected + else -> trySend(Connectivity.Status.Disconnected) } } diff --git a/connectivity-core/src/commonMain/kotlin/dev/jordond/connectivity/internal/DefaultConnectivity.kt b/connectivity-core/src/commonMain/kotlin/dev/jordond/connectivity/internal/DefaultConnectivity.kt index 267e95e..fa19b44 100644 --- a/connectivity-core/src/commonMain/kotlin/dev/jordond/connectivity/internal/DefaultConnectivity.kt +++ b/connectivity-core/src/commonMain/kotlin/dev/jordond/connectivity/internal/DefaultConnectivity.kt @@ -45,7 +45,7 @@ internal class DefaultConnectivity( Update(isMonitoring, status) }.stateIn( scope = scope, - started = SharingStarted.WhileSubscribed(), + started = SharingStarted.WhileSubscribed(5000), initialValue = Update(isMonitoring = false, Connectivity.Status.Disconnected) ) diff --git a/demo/composeApp/src/commonMain/kotlin/HomeScreen.kt b/demo/composeApp/src/commonMain/kotlin/HomeScreen.kt index 046fc6a..36e41ae 100644 --- a/demo/composeApp/src/commonMain/kotlin/HomeScreen.kt +++ b/demo/composeApp/src/commonMain/kotlin/HomeScreen.kt @@ -41,7 +41,7 @@ class HomeScreen : Screen { ) Card { - val connectivityState = createConnectivityState() + val connectivityState = createConnectivityState(false) ConnectivityContent( title = "Compose Connectivity", status = connectivityState.status, @@ -62,7 +62,7 @@ class HomeScreen : Screen { } @Composable -internal expect fun createConnectivityState(): ConnectivityState +internal expect fun createConnectivityState(autoStart: Boolean = true): ConnectivityState @Composable private fun ConnectivityContent( diff --git a/demo/composeApp/src/deviceMain/kotlin/HomeScreen.device.kt b/demo/composeApp/src/deviceMain/kotlin/HomeScreen.device.kt index 0645fde..c67beef 100644 --- a/demo/composeApp/src/deviceMain/kotlin/HomeScreen.device.kt +++ b/demo/composeApp/src/deviceMain/kotlin/HomeScreen.device.kt @@ -3,8 +3,8 @@ import dev.jordond.connectivity.compose.ConnectivityState import dev.jordond.connectivity.compose.rememberConnectivityState @Composable -internal actual fun createConnectivityState(): ConnectivityState { +internal actual fun createConnectivityState(autoStart: Boolean): ConnectivityState { return rememberConnectivityState { - autoStart = true + this.autoStart = autoStart } } \ No newline at end of file diff --git a/demo/composeApp/src/httpMain/kotlin/HomeScreen.http.kt b/demo/composeApp/src/httpMain/kotlin/HomeScreen.http.kt index 0f6e1d4..4193a10 100644 --- a/demo/composeApp/src/httpMain/kotlin/HomeScreen.http.kt +++ b/demo/composeApp/src/httpMain/kotlin/HomeScreen.http.kt @@ -3,9 +3,9 @@ import dev.jordond.connectivity.compose.ConnectivityState import dev.jordond.connectivity.compose.rememberConnectivityState @Composable -internal actual fun createConnectivityState(): ConnectivityState { +internal actual fun createConnectivityState(autoStart: Boolean): ConnectivityState { return rememberConnectivityState { - autoStart = true + this.autoStart = autoStart url("www.google.com") pollingIntervalMs = 5.seconds } diff --git a/demo/iosApp/iosApp.xcodeproj/project.pbxproj b/demo/iosApp/iosApp.xcodeproj/project.pbxproj index fe40700..f16f053 100644 --- a/demo/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/demo/iosApp/iosApp.xcodeproj/project.pbxproj @@ -17,7 +17,7 @@ 058557BA273AAA24004C7B11 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 2152FB032600AC8F00CF470E /* iOSApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSApp.swift; sourceTree = ""; }; - 7555FF7B242A565900829871 /* iosApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; name = iosApp.app; path = demo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 7555FF7B242A565900829871 /* demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = demo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 7555FF82242A565900829871 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 7555FF8C242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; AB3632DC29227652001CCB65 /* Config.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; @@ -62,7 +62,7 @@ 7555FF7C242A565900829871 /* Products */ = { isa = PBXGroup; children = ( - 7555FF7B242A565900829871 /* iosApp.app */, + 7555FF7B242A565900829871 /* demo.app */, ); name = Products; sourceTree = ""; @@ -107,7 +107,7 @@ packageProductDependencies = ( ); productName = iosApp; - productReference = 7555FF7B242A565900829871 /* iosApp.app */; + productReference = 7555FF7B242A565900829871 /* demo.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */