From 6c7e2d48ad69cd94941099d063adf26bd1da28e3 Mon Sep 17 00:00:00 2001 From: Swapnil Musale Date: Wed, 3 Apr 2024 13:22:22 +0530 Subject: [PATCH] Refactor Device Orientation API --- .../model/AndroidDeviceOrientation.kt | 2 +- .../devx/kdeviceinfo/model/AndroidInfoImpl.kt | 8 +++-- .../kdeviceinfo/model/android/AndroidInfo.kt | 1 + .../{android => common}/DeviceOrientation.kt | 3 +- .../model/ios/DeviceOrientation.kt | 16 --------- .../com/devx/kdeviceinfo/model/ios/IosInfo.kt | 1 + .../com/devx/kdeviceinfo/IosDeviceInfo.kt | 5 ++- .../model/IosDeviceOrientationImpl.kt | 34 ++++++++----------- .../com/devx/kdeviceinfo/model/IosInfoImpl.kt | 2 +- .../kotlin/com/devx/kdeviceinfo/sample/App.kt | 6 ++-- 10 files changed, 35 insertions(+), 43 deletions(-) rename KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/{android => common}/DeviceOrientation.kt (84%) delete mode 100644 KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/ios/DeviceOrientation.kt diff --git a/KDeviceInfo/src/androidMain/kotlin/com/devx/kdeviceinfo/model/AndroidDeviceOrientation.kt b/KDeviceInfo/src/androidMain/kotlin/com/devx/kdeviceinfo/model/AndroidDeviceOrientation.kt index 86a686e..215a52c 100644 --- a/KDeviceInfo/src/androidMain/kotlin/com/devx/kdeviceinfo/model/AndroidDeviceOrientation.kt +++ b/KDeviceInfo/src/androidMain/kotlin/com/devx/kdeviceinfo/model/AndroidDeviceOrientation.kt @@ -2,7 +2,7 @@ package com.devx.kdeviceinfo.model import android.content.res.Configuration import com.devx.kdeviceinfo.initilizer.applicationContext -import com.devx.kdeviceinfo.model.android.DeviceOrientation +import com.devx.kdeviceinfo.model.common.DeviceOrientation internal class AndroidDeviceOrientation : DeviceOrientation { diff --git a/KDeviceInfo/src/androidMain/kotlin/com/devx/kdeviceinfo/model/AndroidInfoImpl.kt b/KDeviceInfo/src/androidMain/kotlin/com/devx/kdeviceinfo/model/AndroidInfoImpl.kt index 50cc096..2c3c335 100644 --- a/KDeviceInfo/src/androidMain/kotlin/com/devx/kdeviceinfo/model/AndroidInfoImpl.kt +++ b/KDeviceInfo/src/androidMain/kotlin/com/devx/kdeviceinfo/model/AndroidInfoImpl.kt @@ -9,10 +9,10 @@ import androidx.core.app.LocaleManagerCompat import androidx.core.content.pm.PackageInfoCompat import com.devx.kdeviceinfo.initilizer.applicationContext import com.devx.kdeviceinfo.model.android.AndroidInfo -import com.devx.kdeviceinfo.model.android.DeviceOrientation import com.devx.kdeviceinfo.model.android.DisplayMetrics import com.devx.kdeviceinfo.model.android.Version import com.devx.kdeviceinfo.model.android.VersionCode +import com.devx.kdeviceinfo.model.common.DeviceOrientation import com.devx.kdeviceinfo.model.common.Locale internal class AndroidInfoImpl : AndroidInfo { @@ -33,6 +33,10 @@ internal class AndroidInfoImpl : AndroidInfo { AndroidDisplayMetricsImpl() } + private val androidDeviceOrientation: DeviceOrientation by lazy { + AndroidDeviceOrientation() + } + override val appName: String get() = packageInfo.applicationInfo?.loadLabel(packageManager)?.toString().orEmpty() @@ -102,7 +106,7 @@ internal class AndroidInfoImpl : AndroidInfo { } override val deviceOrientation: DeviceOrientation - get() = AndroidDeviceOrientation() + get() = androidDeviceOrientation private fun getIsPhysicalDevice(): Boolean { return !((Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) diff --git a/KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/android/AndroidInfo.kt b/KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/android/AndroidInfo.kt index 9b3cd95..2d91e5e 100644 --- a/KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/android/AndroidInfo.kt +++ b/KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/android/AndroidInfo.kt @@ -2,6 +2,7 @@ package com.devx.kdeviceinfo.model.android +import com.devx.kdeviceinfo.model.common.DeviceOrientation import com.devx.kdeviceinfo.model.common.Locale interface AndroidInfo { diff --git a/KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/android/DeviceOrientation.kt b/KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/common/DeviceOrientation.kt similarity index 84% rename from KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/android/DeviceOrientation.kt rename to KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/common/DeviceOrientation.kt index 3ecb0c7..d6a5ab2 100644 --- a/KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/android/DeviceOrientation.kt +++ b/KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/common/DeviceOrientation.kt @@ -1,6 +1,6 @@ @file:Suppress("PropertyName") -package com.devx.kdeviceinfo.model.android +package com.devx.kdeviceinfo.model.common interface DeviceOrientation { val UNKNOWN: String @@ -8,5 +8,6 @@ interface DeviceOrientation { val LANDSCAPE: String val isPortrait: Boolean val isLandscape: Boolean + fun getDeviceOrientation(): String } \ No newline at end of file diff --git a/KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/ios/DeviceOrientation.kt b/KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/ios/DeviceOrientation.kt deleted file mode 100644 index 07118b8..0000000 --- a/KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/ios/DeviceOrientation.kt +++ /dev/null @@ -1,16 +0,0 @@ -@file:Suppress("PropertyName") - -package com.devx.kdeviceinfo.model.ios - -interface DeviceOrientation { - val UNKNOWN: String - val PORTRAIT: String - val LANDSCAPE: String - val PORTRAIT_UPSIDE_DOWN: String - val LANDSCAPE_LEFT: String - val LANDSCAPE_RIGHT: String - val FACE_UP: String - val FACE_DOWN: String - val isPortrait: Boolean - fun getDeviceOrientation(): String -} \ No newline at end of file diff --git a/KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/ios/IosInfo.kt b/KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/ios/IosInfo.kt index a986376..f229307 100644 --- a/KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/ios/IosInfo.kt +++ b/KDeviceInfo/src/commonMain/kotlin/com/devx/kdeviceinfo/model/ios/IosInfo.kt @@ -1,5 +1,6 @@ package com.devx.kdeviceinfo.model.ios +import com.devx.kdeviceinfo.model.common.DeviceOrientation import com.devx.kdeviceinfo.model.common.Locale interface IosInfo { diff --git a/KDeviceInfo/src/iosMain/kotlin/com/devx/kdeviceinfo/IosDeviceInfo.kt b/KDeviceInfo/src/iosMain/kotlin/com/devx/kdeviceinfo/IosDeviceInfo.kt index 400850d..138471f 100644 --- a/KDeviceInfo/src/iosMain/kotlin/com/devx/kdeviceinfo/IosDeviceInfo.kt +++ b/KDeviceInfo/src/iosMain/kotlin/com/devx/kdeviceinfo/IosDeviceInfo.kt @@ -4,9 +4,11 @@ package com.devx.kdeviceinfo import androidx.compose.runtime.Composable import androidx.compose.runtime.remember +import androidx.compose.ui.interop.LocalUIViewController import com.devx.kdeviceinfo.model.IosInfoImpl import com.devx.kdeviceinfo.model.android.AndroidInfo import com.devx.kdeviceinfo.model.ios.IosInfo +import platform.UIKit.interfaceOrientation actual class DeviceInfoXState { @@ -29,5 +31,6 @@ actual class DeviceInfoXState { @Composable actual fun rememberDeviceInfoXState(): DeviceInfoXState { - return remember { DeviceInfoXState() } + val orientation = LocalUIViewController.current.interfaceOrientation + return remember(key1 = orientation) { DeviceInfoXState() } } \ No newline at end of file diff --git a/KDeviceInfo/src/iosMain/kotlin/com/devx/kdeviceinfo/model/IosDeviceOrientationImpl.kt b/KDeviceInfo/src/iosMain/kotlin/com/devx/kdeviceinfo/model/IosDeviceOrientationImpl.kt index 12f7a22..6b886ae 100644 --- a/KDeviceInfo/src/iosMain/kotlin/com/devx/kdeviceinfo/model/IosDeviceOrientationImpl.kt +++ b/KDeviceInfo/src/iosMain/kotlin/com/devx/kdeviceinfo/model/IosDeviceOrientationImpl.kt @@ -1,37 +1,33 @@ package com.devx.kdeviceinfo.model -import com.devx.kdeviceinfo.model.ios.DeviceOrientation -import platform.UIKit.UIDevice +import com.devx.kdeviceinfo.model.common.DeviceOrientation +import platform.UIKit.UIApplication +import platform.UIKit.UIWindow +import platform.UIKit.UIWindowScene internal class IosDeviceOrientationImpl : DeviceOrientation { + + private val windows = + (UIApplication.sharedApplication.connectedScenes.first() as UIWindowScene).windows + private val windowOrientation = + (windows.first() as UIWindow).windowScene?.interfaceOrientation?.toInt() + override val UNKNOWN: String get() = "unknown" override val PORTRAIT: String get() = "portrait" override val LANDSCAPE: String get() = "landscape" - override val PORTRAIT_UPSIDE_DOWN: String - get() = "portraitUpsideDown" - override val LANDSCAPE_LEFT: String - get() = "landscapeLeft" - override val LANDSCAPE_RIGHT: String - get() = "landscapeRight" - override val FACE_UP: String - get() = "faceUp" - override val FACE_DOWN: String - get() = "faceDown" override val isPortrait: Boolean - get() = UIDevice.currentDevice.orientation.value.toString() == PORTRAIT + get() = windowOrientation == 1 + override val isLandscape: Boolean + get() = windowOrientation == 3 || windowOrientation == 4 override fun getDeviceOrientation(): String { - return when (UIDevice.currentDevice.orientation.value.toInt()) { + return when (windowOrientation) { 0 -> UNKNOWN 1 -> PORTRAIT - 2 -> PORTRAIT_UPSIDE_DOWN - 3 -> LANDSCAPE_LEFT - 4 -> LANDSCAPE_RIGHT - 5 -> FACE_UP - 6 -> FACE_DOWN + 3, 4 -> LANDSCAPE else -> UNKNOWN } } diff --git a/KDeviceInfo/src/iosMain/kotlin/com/devx/kdeviceinfo/model/IosInfoImpl.kt b/KDeviceInfo/src/iosMain/kotlin/com/devx/kdeviceinfo/model/IosInfoImpl.kt index ff0c417..187e1f1 100644 --- a/KDeviceInfo/src/iosMain/kotlin/com/devx/kdeviceinfo/model/IosInfoImpl.kt +++ b/KDeviceInfo/src/iosMain/kotlin/com/devx/kdeviceinfo/model/IosInfoImpl.kt @@ -1,7 +1,7 @@ package com.devx.kdeviceinfo.model +import com.devx.kdeviceinfo.model.common.DeviceOrientation import com.devx.kdeviceinfo.model.common.Locale -import com.devx.kdeviceinfo.model.ios.DeviceOrientation import com.devx.kdeviceinfo.model.ios.IosInfo import platform.Foundation.NSBundle import platform.Foundation.NSLocale diff --git a/sampleApp/composeApp/src/commonMain/kotlin/com/devx/kdeviceinfo/sample/App.kt b/sampleApp/composeApp/src/commonMain/kotlin/com/devx/kdeviceinfo/sample/App.kt index 0ce1ef6..88e9114 100644 --- a/sampleApp/composeApp/src/commonMain/kotlin/com/devx/kdeviceinfo/sample/App.kt +++ b/sampleApp/composeApp/src/commonMain/kotlin/com/devx/kdeviceinfo/sample/App.kt @@ -70,7 +70,8 @@ private fun ShowAndroidDeviceInfo(androidInfo: AndroidInfo) { Text(text = "IsPhysicalDevice : ${androidInfo.isPhysicalDevice}") Text(text = "Manufacturer : ${androidInfo.manufacturer}") Text(text = "Model : ${androidInfo.model}") - Text(text = "Orientation : ${androidInfo.deviceOrientation.getDeviceOrientation()}") + Text(text = "Device Orientation : ${androidInfo.deviceOrientation.getDeviceOrientation()}") + Text(text = "IsPortrait : ${androidInfo.deviceOrientation.isPortrait}") Spacer(modifier = Modifier.fillMaxWidth().height(height = 20.dp)) // Locale @@ -103,7 +104,8 @@ private fun ShowIosDeviceInfo(iosInfo: IosInfo) { Text(text = "SystemVersion : ${iosInfo.systemVersion}") Text(text = "LocalizedModel : ${iosInfo.localizedModel}") Text(text = "IsPhysicalDevice : ${iosInfo.isPhysicalDevice}") - Text(text = "Orientation : ${iosInfo.deviceOrientation.getDeviceOrientation()}") + Text(text = "Device Orientation : ${iosInfo.deviceOrientation.getDeviceOrientation()}") + Text(text = "IsPortrait : ${iosInfo.deviceOrientation.isPortrait}") Spacer(modifier = Modifier.fillMaxWidth().height(height = 20.dp)) // Locale Info