react-native-unistyles 2.4.0 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -26
- package/android/CMakeLists.txt +18 -2
- package/android/build.gradle +5 -1
- package/android/src/main/cxx/cpp-adapter.cpp +16 -80
- package/android/src/main/cxx/helpers.cpp +61 -0
- package/android/src/main/cxx/helpers.h +7 -0
- package/android/src/main/cxx/platform.cpp +170 -0
- package/android/src/main/cxx/platform.h +20 -0
- package/android/src/main/java/com/unistyles/Models.kt +12 -70
- package/android/src/main/java/com/unistyles/Platform.kt +311 -10
- package/android/src/main/java/com/unistyles/UnistylesModule.kt +145 -153
- package/cxx/Macros.h +11 -0
- package/cxx/UnistylesImpl.cpp +310 -0
- package/cxx/UnistylesModel.cpp +234 -0
- package/cxx/UnistylesModel.h +141 -0
- package/cxx/UnistylesRuntime.cpp +17 -356
- package/cxx/UnistylesRuntime.h +71 -87
- package/ios/UnistylesModule.h +13 -0
- package/ios/UnistylesModule.mm +20 -90
- package/ios/platform/Platform_Shared.h +8 -0
- package/ios/platform/Platform_Shared.mm +160 -0
- package/ios/platform/Platform_iOS.h +6 -10
- package/ios/platform/Platform_iOS.mm +143 -93
- package/ios/platform/Platform_macOS.h +3 -7
- package/ios/platform/Platform_macOS.mm +52 -34
- package/ios/platform/Platform_tvOS.h +17 -0
- package/ios/platform/Platform_tvOS.mm +96 -0
- package/ios/platform/Platform_visionOS.h +20 -0
- package/ios/platform/Platform_visionOS.mm +120 -0
- package/lib/commonjs/UnistylesProvider.js +32 -0
- package/lib/commonjs/UnistylesProvider.js.map +1 -0
- package/lib/commonjs/common.js +3 -2
- package/lib/commonjs/common.js.map +1 -1
- package/lib/commonjs/core/UnistyleRegistry.js +14 -4
- package/lib/commonjs/core/UnistyleRegistry.js.map +1 -1
- package/lib/commonjs/core/Unistyles.js +7 -0
- package/lib/commonjs/core/Unistyles.js.map +1 -1
- package/lib/commonjs/core/UnistylesModule.js +52 -8
- package/lib/commonjs/core/UnistylesModule.js.map +1 -1
- package/lib/commonjs/core/UnistylesModule.native.js.map +1 -1
- package/lib/commonjs/core/UnistylesModule.windows.js.map +1 -1
- package/lib/commonjs/core/UnistylesRuntime.js +114 -4
- package/lib/commonjs/core/UnistylesRuntime.js.map +1 -1
- package/lib/commonjs/core/index.js.map +1 -1
- package/lib/commonjs/core/mocks/UnistylesMockedBridge.js +36 -0
- package/lib/commonjs/core/mocks/UnistylesMockedBridge.js.map +1 -0
- package/lib/commonjs/core/mocks/UnistylesMockedRegistry.js +46 -0
- package/lib/commonjs/core/mocks/UnistylesMockedRegistry.js.map +1 -0
- package/lib/commonjs/core/mocks/UnistylesMockedRuntime.js +122 -0
- package/lib/commonjs/core/mocks/UnistylesMockedRuntime.js.map +1 -0
- package/lib/commonjs/core/mocks/index.js +27 -0
- package/lib/commonjs/core/mocks/index.js.map +1 -0
- package/lib/commonjs/createStyleSheet.js.map +1 -1
- package/lib/commonjs/global.js.map +1 -1
- package/lib/commonjs/hooks/index.js.map +1 -1
- package/lib/commonjs/hooks/useCSS.js.map +1 -1
- package/lib/commonjs/hooks/useCSS.native.js.map +1 -1
- package/lib/commonjs/hooks/useInitialTheme.js.map +1 -1
- package/lib/commonjs/hooks/useSharedContext.js +77 -0
- package/lib/commonjs/hooks/useSharedContext.js.map +1 -0
- package/lib/commonjs/hooks/useUnistyles.js +18 -65
- package/lib/commonjs/hooks/useUnistyles.js.map +1 -1
- package/lib/commonjs/hooks/useVariants.js.map +1 -1
- package/lib/commonjs/index.js +7 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/normalizer/index.js.map +1 -1
- package/lib/commonjs/normalizer/module.d.js.map +1 -1
- package/lib/commonjs/normalizer/normalizeStyle.js.map +1 -1
- package/lib/commonjs/normalizer/normalizer.js +1 -1
- package/lib/commonjs/normalizer/normalizer.js.map +1 -1
- package/lib/commonjs/normalizer/normalizer.macos.js.map +1 -1
- package/lib/commonjs/plugins/cssMediaQueriesPlugin.js.map +1 -1
- package/lib/commonjs/plugins/index.js.map +1 -1
- package/lib/commonjs/plugins/normalizeWebStylesPlugin.js.map +1 -1
- package/lib/commonjs/types/breakpoints.js.map +1 -1
- package/lib/commonjs/types/color.js +2 -0
- package/lib/commonjs/types/color.js.map +1 -0
- package/lib/commonjs/types/common.js.map +1 -1
- package/lib/commonjs/types/core.js.map +1 -1
- package/lib/commonjs/types/index.js +11 -0
- package/lib/commonjs/types/index.js.map +1 -1
- package/lib/commonjs/types/normalizer.js.map +1 -1
- package/lib/commonjs/types/plugin.js.map +1 -1
- package/lib/commonjs/types/stylesheet.js.map +1 -1
- package/lib/commonjs/types/unistyles.js.map +1 -1
- package/lib/commonjs/types/variants.js.map +1 -1
- package/lib/commonjs/useStyles.js +1 -1
- package/lib/commonjs/useStyles.js.map +1 -1
- package/lib/commonjs/utils/breakpoints.js.map +1 -1
- package/lib/commonjs/utils/cssMediaQuery.js.map +1 -1
- package/lib/commonjs/utils/generateId.js.map +1 -1
- package/lib/commonjs/utils/hash32.js.map +1 -1
- package/lib/commonjs/utils/index.js +7 -0
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/commonjs/utils/mq.js.map +1 -1
- package/lib/commonjs/utils/mqParser.js.map +1 -1
- package/lib/commonjs/utils/parseColor.js +35 -0
- package/lib/commonjs/utils/parseColor.js.map +1 -0
- package/lib/commonjs/utils/styles.js +15 -1
- package/lib/commonjs/utils/styles.js.map +1 -1
- package/lib/commonjs/utils/withPlugins.js.map +1 -1
- package/lib/module/UnistylesProvider.js +24 -0
- package/lib/module/UnistylesProvider.js.map +1 -0
- package/lib/module/common.js +2 -1
- package/lib/module/common.js.map +1 -1
- package/lib/module/core/UnistyleRegistry.js +15 -5
- package/lib/module/core/UnistyleRegistry.js.map +1 -1
- package/lib/module/core/Unistyles.js +8 -1
- package/lib/module/core/Unistyles.js.map +1 -1
- package/lib/module/core/UnistylesModule.js +52 -8
- package/lib/module/core/UnistylesModule.js.map +1 -1
- package/lib/module/core/UnistylesModule.native.js.map +1 -1
- package/lib/module/core/UnistylesModule.windows.js.map +1 -1
- package/lib/module/core/UnistylesRuntime.js +115 -4
- package/lib/module/core/UnistylesRuntime.js.map +1 -1
- package/lib/module/core/index.js +2 -1
- package/lib/module/core/index.js.map +1 -1
- package/lib/module/core/mocks/UnistylesMockedBridge.js +29 -0
- package/lib/module/core/mocks/UnistylesMockedBridge.js.map +1 -0
- package/lib/module/core/mocks/UnistylesMockedRegistry.js +39 -0
- package/lib/module/core/mocks/UnistylesMockedRegistry.js.map +1 -0
- package/lib/module/core/mocks/UnistylesMockedRuntime.js +114 -0
- package/lib/module/core/mocks/UnistylesMockedRuntime.js.map +1 -0
- package/lib/module/core/mocks/index.js +4 -0
- package/lib/module/core/mocks/index.js.map +1 -0
- package/lib/module/createStyleSheet.js.map +1 -1
- package/lib/module/global.js.map +1 -1
- package/lib/module/hooks/index.js.map +1 -1
- package/lib/module/hooks/useCSS.js.map +1 -1
- package/lib/module/hooks/useCSS.native.js.map +1 -1
- package/lib/module/hooks/useInitialTheme.js.map +1 -1
- package/lib/module/hooks/useSharedContext.js +70 -0
- package/lib/module/hooks/useSharedContext.js.map +1 -0
- package/lib/module/hooks/useUnistyles.js +19 -66
- package/lib/module/hooks/useUnistyles.js.map +1 -1
- package/lib/module/hooks/useVariants.js.map +1 -1
- package/lib/module/index.js +2 -2
- package/lib/module/index.js.map +1 -1
- package/lib/module/normalizer/index.js.map +1 -1
- package/lib/module/normalizer/module.d.js.map +1 -1
- package/lib/module/normalizer/normalizeStyle.js.map +1 -1
- package/lib/module/normalizer/normalizer.js.map +1 -1
- package/lib/module/normalizer/normalizer.macos.js.map +1 -1
- package/lib/module/plugins/cssMediaQueriesPlugin.js.map +1 -1
- package/lib/module/plugins/index.js.map +1 -1
- package/lib/module/plugins/normalizeWebStylesPlugin.js.map +1 -1
- package/lib/module/types/breakpoints.js.map +1 -1
- package/lib/module/types/color.js +2 -0
- package/lib/module/types/color.js.map +1 -0
- package/lib/module/types/common.js.map +1 -1
- package/lib/module/types/core.js.map +1 -1
- package/lib/module/types/index.js +1 -0
- package/lib/module/types/index.js.map +1 -1
- package/lib/module/types/normalizer.js.map +1 -1
- package/lib/module/types/plugin.js.map +1 -1
- package/lib/module/types/stylesheet.js.map +1 -1
- package/lib/module/types/unistyles.js.map +1 -1
- package/lib/module/types/variants.js.map +1 -1
- package/lib/module/useStyles.js +1 -1
- package/lib/module/useStyles.js.map +1 -1
- package/lib/module/utils/breakpoints.js.map +1 -1
- package/lib/module/utils/cssMediaQuery.js.map +1 -1
- package/lib/module/utils/generateId.js.map +1 -1
- package/lib/module/utils/hash32.js.map +1 -1
- package/lib/module/utils/index.js +1 -0
- package/lib/module/utils/index.js.map +1 -1
- package/lib/module/utils/mq.js.map +1 -1
- package/lib/module/utils/mqParser.js.map +1 -1
- package/lib/module/utils/parseColor.js +28 -0
- package/lib/module/utils/parseColor.js.map +1 -0
- package/lib/module/utils/styles.js +15 -1
- package/lib/module/utils/styles.js.map +1 -1
- package/lib/module/utils/withPlugins.js.map +1 -1
- package/lib/typescript/src/UnistylesProvider.d.ts +20 -0
- package/lib/typescript/src/UnistylesProvider.d.ts.map +1 -0
- package/lib/typescript/src/common.d.ts +3 -2
- package/lib/typescript/src/common.d.ts.map +1 -1
- package/lib/typescript/src/core/UnistyleRegistry.d.ts.map +1 -1
- package/lib/typescript/src/core/Unistyles.d.ts.map +1 -1
- package/lib/typescript/src/core/UnistylesModule.d.ts +1 -0
- package/lib/typescript/src/core/UnistylesModule.d.ts.map +1 -1
- package/lib/typescript/src/core/UnistylesModule.native.d.ts.map +1 -1
- package/lib/typescript/src/core/UnistylesModule.windows.d.ts.map +1 -1
- package/lib/typescript/src/core/UnistylesRuntime.d.ts +84 -8
- package/lib/typescript/src/core/UnistylesRuntime.d.ts.map +1 -1
- package/lib/typescript/src/core/index.d.ts +3 -1
- package/lib/typescript/src/core/index.d.ts.map +1 -1
- package/lib/typescript/src/core/mocks/UnistylesMockedBridge.d.ts +28 -0
- package/lib/typescript/src/core/mocks/UnistylesMockedBridge.d.ts.map +1 -0
- package/lib/typescript/src/core/mocks/UnistylesMockedRegistry.d.ts +21 -0
- package/lib/typescript/src/core/mocks/UnistylesMockedRegistry.d.ts.map +1 -0
- package/lib/typescript/src/core/mocks/UnistylesMockedRuntime.d.ts +79 -0
- package/lib/typescript/src/core/mocks/UnistylesMockedRuntime.d.ts.map +1 -0
- package/lib/typescript/src/core/mocks/index.d.ts +4 -0
- package/lib/typescript/src/core/mocks/index.d.ts.map +1 -0
- package/lib/typescript/src/createStyleSheet.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useCSS.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useCSS.native.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useSharedContext.d.ts +33 -0
- package/lib/typescript/src/hooks/useSharedContext.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useUnistyles.d.ts +4 -19
- package/lib/typescript/src/hooks/useUnistyles.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useVariants.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +7 -15
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/normalizer/normalizeStyle.d.ts.map +1 -1
- package/lib/typescript/src/types/breakpoints.d.ts +9 -8
- package/lib/typescript/src/types/breakpoints.d.ts.map +1 -1
- package/lib/typescript/src/types/color.d.ts +4 -0
- package/lib/typescript/src/types/color.d.ts.map +1 -0
- package/lib/typescript/src/types/core.d.ts +2 -2
- package/lib/typescript/src/types/core.d.ts.map +1 -1
- package/lib/typescript/src/types/index.d.ts +2 -1
- package/lib/typescript/src/types/index.d.ts.map +1 -1
- package/lib/typescript/src/types/normalizer.d.ts +1 -1
- package/lib/typescript/src/types/normalizer.d.ts.map +1 -1
- package/lib/typescript/src/types/stylesheet.d.ts +9 -6
- package/lib/typescript/src/types/stylesheet.d.ts.map +1 -1
- package/lib/typescript/src/types/unistyles.d.ts +20 -9
- package/lib/typescript/src/types/unistyles.d.ts.map +1 -1
- package/lib/typescript/src/useStyles.d.ts +1 -1
- package/lib/typescript/src/useStyles.d.ts.map +1 -1
- package/lib/typescript/src/utils/breakpoints.d.ts.map +1 -1
- package/lib/typescript/src/utils/index.d.ts +1 -0
- package/lib/typescript/src/utils/index.d.ts.map +1 -1
- package/lib/typescript/src/utils/mqParser.d.ts.map +1 -1
- package/lib/typescript/src/utils/parseColor.d.ts +3 -0
- package/lib/typescript/src/utils/parseColor.d.ts.map +1 -0
- package/lib/typescript/src/utils/styles.d.ts.map +1 -1
- package/package.json +38 -25
- package/react-native-unistyles.podspec +4 -1
- package/src/UnistylesProvider.tsx +33 -0
- package/src/common.ts +3 -2
- package/src/core/UnistyleRegistry.ts +19 -5
- package/src/core/Unistyles.ts +10 -1
- package/src/core/UnistylesModule.ts +61 -14
- package/src/core/UnistylesRuntime.ts +120 -5
- package/src/core/index.ts +7 -1
- package/src/core/mocks/UnistylesMockedBridge.ts +30 -0
- package/src/core/mocks/UnistylesMockedRegistry.ts +47 -0
- package/src/core/mocks/UnistylesMockedRuntime.ts +144 -0
- package/src/core/mocks/index.ts +3 -0
- package/src/hooks/useSharedContext.ts +83 -0
- package/src/hooks/useUnistyles.ts +15 -71
- package/src/index.ts +10 -4
- package/src/types/breakpoints.ts +19 -9
- package/src/types/color.ts +26 -0
- package/src/types/core.ts +2 -2
- package/src/types/index.ts +5 -1
- package/src/types/normalizer.ts +1 -1
- package/src/types/stylesheet.ts +10 -7
- package/src/types/unistyles.ts +28 -12
- package/src/useStyles.ts +1 -1
- package/src/utils/index.ts +1 -0
- package/src/utils/parseColor.ts +33 -0
- package/src/utils/styles.ts +24 -1
- package/windows/ExperimentalFeatures.props +4 -4
- package/windows/NuGet.Config +0 -1
- package/windows/ReactNativeUnistyles/ReactNativeUnistyles.h +42 -118
- package/windows/ReactNativeUnistyles/ReactNativeUnistyles.vcxproj +7 -2
- package/windows/ReactNativeUnistyles/ReactNativeUnistyles.vcxproj.filters +6 -1
- package/windows/ReactNativeUnistyles/packages.lock.json +31 -31
- package/android/src/main/java/com/unistyles/Config.kt +0 -116
- package/android/src/main/java/com/unistyles/Insets.kt +0 -138
- package/ios/UnistylesHelpers.h +0 -3
- package/ios/UnistylesHelpers.mm +0 -5
@@ -1,85 +1,27 @@
|
|
1
1
|
package com.unistyles
|
2
2
|
|
3
|
-
class Dimensions(
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
}
|
8
|
-
|
9
|
-
return this.height == dimensions.height
|
10
|
-
}
|
11
|
-
|
3
|
+
class Dimensions(
|
4
|
+
var width: Int,
|
5
|
+
var height: Int
|
6
|
+
) {
|
12
7
|
override fun toString(): String {
|
13
8
|
return "${width}x${height}"
|
14
9
|
}
|
15
10
|
}
|
16
11
|
|
17
|
-
class
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
if (this.bottom != insets.bottom) {
|
24
|
-
return false
|
25
|
-
}
|
26
|
-
|
27
|
-
if (this.left != insets.left) {
|
28
|
-
return false
|
29
|
-
}
|
30
|
-
|
31
|
-
return this.right == insets.right
|
32
|
-
}
|
33
|
-
|
34
|
-
override fun toString(): String {
|
35
|
-
return "T:${top}B:${bottom}L:${left}R:${right}"
|
36
|
-
}
|
37
|
-
}
|
38
|
-
|
39
|
-
class LayoutConfig(
|
40
|
-
val screen: Dimensions,
|
41
|
-
val insets: Insets,
|
42
|
-
val statusBar: Dimensions,
|
43
|
-
val navigationBar: Dimensions
|
12
|
+
class Screen(
|
13
|
+
var width: Int,
|
14
|
+
var height: Int,
|
15
|
+
var pixelRatio: Float,
|
16
|
+
var fontScale: Float
|
44
17
|
) {
|
45
|
-
fun isEqual(config: LayoutConfig): Boolean {
|
46
|
-
if (!this.screen.isEqual(config.screen)) {
|
47
|
-
return false
|
48
|
-
}
|
49
|
-
|
50
|
-
if (!this.insets.isEqual(config.insets)) {
|
51
|
-
return false
|
52
|
-
}
|
53
|
-
|
54
|
-
if (!this.statusBar.isEqual(config.statusBar)) {
|
55
|
-
return false
|
56
|
-
}
|
57
|
-
|
58
|
-
return this.navigationBar.isEqual(config.navigationBar)
|
59
|
-
}
|
60
|
-
|
61
18
|
override fun toString(): String {
|
62
|
-
return
|
63
|
-
append("screen=")
|
64
|
-
append(screen)
|
65
|
-
append(" insets=")
|
66
|
-
append(insets)
|
67
|
-
append(" statusBar=")
|
68
|
-
append(statusBar)
|
69
|
-
append(" navigationBar=")
|
70
|
-
append(navigationBar)
|
71
|
-
}
|
19
|
+
return "${width}x${height} ${pixelRatio} ${fontScale}"
|
72
20
|
}
|
73
21
|
}
|
74
22
|
|
75
|
-
class
|
76
|
-
val colorScheme: String,
|
77
|
-
val contentSizeCategory: String,
|
78
|
-
) {
|
79
|
-
var hasNewColorScheme: Boolean = false
|
80
|
-
var hasNewContentSizeCategory: Boolean = false
|
81
|
-
|
23
|
+
class Insets(var top: Int, var bottom: Int, var left: Int, var right: Int) {
|
82
24
|
override fun toString(): String {
|
83
|
-
return "
|
25
|
+
return "T:${top}B:${bottom}L:${left}R:${right}"
|
84
26
|
}
|
85
27
|
}
|
@@ -1,23 +1,324 @@
|
|
1
1
|
package com.unistyles
|
2
2
|
|
3
|
+
import android.content.Context
|
4
|
+
import android.content.res.Configuration
|
5
|
+
import android.graphics.Color
|
6
|
+
import android.graphics.Rect
|
7
|
+
import android.os.Build
|
8
|
+
import android.util.DisplayMetrics
|
9
|
+
import android.util.Log
|
10
|
+
import android.view.View
|
11
|
+
import android.view.Window
|
12
|
+
import android.view.WindowManager
|
13
|
+
import androidx.core.graphics.ColorUtils
|
14
|
+
import androidx.core.text.TextUtilsCompat
|
15
|
+
import androidx.core.view.ViewCompat
|
16
|
+
import androidx.core.view.WindowInsetsCompat
|
17
|
+
import androidx.core.view.WindowInsetsControllerCompat
|
3
18
|
import com.facebook.react.bridge.ReactApplicationContext
|
19
|
+
import java.util.Locale
|
20
|
+
import kotlin.math.roundToInt
|
4
21
|
|
5
|
-
class Platform(reactApplicationContext: ReactApplicationContext) {
|
6
|
-
|
22
|
+
class Platform(private val reactApplicationContext: ReactApplicationContext) {
|
23
|
+
var hasAnimatedInsets = true
|
24
|
+
private var insets: Insets = Insets(0, 0, 0, 0)
|
25
|
+
private var defaultNavigationBarColor: Int = -1
|
26
|
+
private var defaultStatusBarColor: Int = -1
|
7
27
|
|
8
|
-
|
9
|
-
|
28
|
+
var orientation: Int = reactApplicationContext.resources.configuration.orientation
|
29
|
+
|
30
|
+
fun disableAnimatedInsets() {
|
31
|
+
this.hasAnimatedInsets = false
|
32
|
+
}
|
33
|
+
|
34
|
+
@Suppress("DEPRECATION")
|
35
|
+
fun getScreenDimensions(): Screen {
|
36
|
+
// function takes in count edge-to-edge layout
|
37
|
+
val displayMetrics = reactApplicationContext.resources.displayMetrics
|
38
|
+
val fontScale = reactApplicationContext.resources.configuration.fontScale
|
39
|
+
|
40
|
+
when {
|
41
|
+
Build.VERSION.SDK_INT < Build.VERSION_CODES.R -> {
|
42
|
+
val windowManager = reactApplicationContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager
|
43
|
+
val metrics = DisplayMetrics()
|
44
|
+
|
45
|
+
windowManager.defaultDisplay.getRealMetrics(metrics)
|
46
|
+
|
47
|
+
val screenWidth = (metrics.widthPixels / metrics.density).roundToInt()
|
48
|
+
val screenHeight = (metrics.heightPixels / metrics.density).roundToInt()
|
49
|
+
|
50
|
+
return Screen(screenWidth, screenHeight, metrics.density, fontScale)
|
51
|
+
}
|
52
|
+
else -> {
|
53
|
+
reactApplicationContext.currentActivity?.windowManager?.currentWindowMetrics?.bounds?.let {
|
54
|
+
val boundsWidth = (it.width() / displayMetrics.density).roundToInt()
|
55
|
+
val boundsHeight = (it.height() / displayMetrics.density).roundToInt()
|
56
|
+
|
57
|
+
return Screen(boundsWidth, boundsHeight, displayMetrics.density, fontScale)
|
58
|
+
} ?: run {
|
59
|
+
val screenWidth = (displayMetrics.widthPixels / displayMetrics.density).roundToInt()
|
60
|
+
val screenHeight = (displayMetrics.heightPixels / displayMetrics.density).roundToInt()
|
61
|
+
|
62
|
+
return Screen(screenWidth, screenHeight, displayMetrics.density, fontScale)
|
63
|
+
}
|
64
|
+
}
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
fun getColorScheme(): String {
|
69
|
+
val uiMode = this.reactApplicationContext.resources.configuration.uiMode
|
70
|
+
|
71
|
+
val colorScheme = when (uiMode.and(Configuration.UI_MODE_NIGHT_MASK)) {
|
72
|
+
Configuration.UI_MODE_NIGHT_YES -> "dark"
|
73
|
+
Configuration.UI_MODE_NIGHT_NO -> "light"
|
74
|
+
else -> "unspecified"
|
75
|
+
}
|
76
|
+
|
77
|
+
return colorScheme
|
78
|
+
}
|
79
|
+
|
80
|
+
fun getStatusBarDimensions(): Dimensions {
|
81
|
+
val displayMetrics = reactApplicationContext.resources.displayMetrics
|
82
|
+
val screenWidth = (displayMetrics.widthPixels / displayMetrics.density).roundToInt()
|
83
|
+
|
84
|
+
return Dimensions(screenWidth, getStatusBarHeight())
|
85
|
+
}
|
86
|
+
|
87
|
+
fun getIsRTL(): Boolean {
|
88
|
+
// forced by React Native
|
89
|
+
val sharedPrefs = reactApplicationContext.getSharedPreferences(
|
90
|
+
"com.facebook.react.modules.i18nmanager.I18nUtil",
|
91
|
+
Context.MODE_PRIVATE
|
92
|
+
)
|
93
|
+
val hasForcedRtl = sharedPrefs.getBoolean("RCTI18nUtil_forceRTL", false)
|
94
|
+
// user preferences
|
95
|
+
val isRtl = TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault()) == ViewCompat.LAYOUT_DIRECTION_RTL
|
96
|
+
|
97
|
+
return hasForcedRtl || isRtl
|
98
|
+
}
|
99
|
+
|
100
|
+
fun getNavigationBarDimensions(): Dimensions {
|
101
|
+
val displayMetrics = reactApplicationContext.resources.displayMetrics
|
102
|
+
val screenWidth = (displayMetrics.widthPixels / displayMetrics.density).roundToInt()
|
103
|
+
|
104
|
+
return Dimensions(screenWidth, getNavigationBarHeight())
|
105
|
+
}
|
106
|
+
|
107
|
+
fun getContentSizeCategory(): String {
|
108
|
+
val fontScale = reactApplicationContext.resources.configuration.fontScale
|
109
|
+
|
110
|
+
val contentSizeCategory = when {
|
111
|
+
fontScale <= 0.85f -> "Small"
|
112
|
+
fontScale <= 1.0f -> "Default"
|
113
|
+
fontScale <= 1.15f -> "Large"
|
114
|
+
fontScale <= 1.3f -> "ExtraLarge"
|
115
|
+
fontScale <= 1.5f -> "Huge"
|
116
|
+
fontScale <= 1.8 -> "ExtraHuge"
|
117
|
+
else -> "ExtraExtraHuge"
|
118
|
+
}
|
119
|
+
|
120
|
+
return contentSizeCategory
|
121
|
+
}
|
122
|
+
|
123
|
+
fun setInsetsCompat(insetsCompat: WindowInsetsCompat, window: Window, animatedBottomInsets: Int?) {
|
124
|
+
// below Android 11, we need to use window flags to detect status bar visibility
|
125
|
+
val isStatusBarVisible = when(Build.VERSION.SDK_INT) {
|
126
|
+
in 30..Int.MAX_VALUE -> {
|
127
|
+
insetsCompat.isVisible(WindowInsetsCompat.Type.statusBars())
|
128
|
+
}
|
129
|
+
else -> {
|
130
|
+
@Suppress("DEPRECATION")
|
131
|
+
window.attributes.flags and WindowManager.LayoutParams.FLAG_FULLSCREEN != WindowManager.LayoutParams.FLAG_FULLSCREEN
|
132
|
+
}
|
133
|
+
}
|
134
|
+
// React Native is forcing insets to make status bar translucent
|
135
|
+
// so we need to calculate top inset manually, as WindowInsetCompat will always return 0
|
136
|
+
val statusBarTopInset = when(isStatusBarVisible) {
|
137
|
+
true -> {
|
138
|
+
val visibleRect = Rect()
|
139
|
+
|
140
|
+
window.decorView.getWindowVisibleDisplayFrame(visibleRect)
|
141
|
+
|
142
|
+
visibleRect.top
|
143
|
+
}
|
144
|
+
false -> 0
|
145
|
+
}
|
146
|
+
|
147
|
+
val insets = insetsCompat.getInsets(WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout())
|
148
|
+
val bottomIME = insetsCompat.getInsets(WindowInsetsCompat.Type.ime()).bottom
|
149
|
+
|
150
|
+
// fix for keyboard controller, that triggers WindowInsetsListener
|
151
|
+
if(!hasAnimatedInsets && bottomIME != 0) {
|
152
|
+
return
|
153
|
+
}
|
154
|
+
|
155
|
+
if (!hasAnimatedInsets) {
|
156
|
+
this.insets = Insets(statusBarTopInset, insets.bottom, insets.left, insets.right)
|
157
|
+
|
158
|
+
return
|
159
|
+
}
|
160
|
+
|
161
|
+
// Android 10 and below - set bottom insets to 0 while keyboard is visible and use default bottom insets otherwise
|
162
|
+
// Android 11 and above - animate bottom insets while keyboard is appearing and disappearing
|
163
|
+
val imeInsets = insetsCompat.getInsets(WindowInsetsCompat.Type.ime())
|
164
|
+
val insetBottom = when(imeInsets.bottom > 0) {
|
165
|
+
true -> {
|
166
|
+
if (Build.VERSION.SDK_INT >= 30 && animatedBottomInsets != null) {
|
167
|
+
animatedBottomInsets
|
168
|
+
} else {
|
169
|
+
0
|
170
|
+
}
|
171
|
+
}
|
172
|
+
else -> {
|
173
|
+
insets.bottom
|
174
|
+
}
|
175
|
+
}
|
176
|
+
|
177
|
+
this.insets = Insets(statusBarTopInset, insetBottom, insets.left, insets.right)
|
178
|
+
}
|
179
|
+
|
180
|
+
fun getInsets(): Insets {
|
181
|
+
val density = reactApplicationContext.resources.displayMetrics.density
|
182
|
+
|
183
|
+
return Insets(
|
184
|
+
(this.insets.top / density).roundToInt(),
|
185
|
+
(this.insets.bottom / density).roundToInt(),
|
186
|
+
(this.insets.left / density).roundToInt(),
|
187
|
+
(this.insets.right / density).roundToInt()
|
188
|
+
)
|
189
|
+
}
|
190
|
+
|
191
|
+
private fun getStatusBarHeight(): Int {
|
192
|
+
val density = reactApplicationContext.resources.displayMetrics.density
|
193
|
+
|
194
|
+
return (this.insets.top / density).roundToInt()
|
195
|
+
}
|
196
|
+
|
197
|
+
private fun getNavigationBarHeight(): Int {
|
198
|
+
val density = reactApplicationContext.resources.displayMetrics.density
|
199
|
+
|
200
|
+
return (this.insets.bottom / density).roundToInt()
|
10
201
|
}
|
11
202
|
|
12
|
-
fun
|
13
|
-
|
203
|
+
fun onSetNavigationBarColor(color: String, alpha: Float) {
|
204
|
+
this.reactApplicationContext.currentActivity?.let { activity ->
|
205
|
+
if (this.defaultNavigationBarColor == -1) {
|
206
|
+
this.defaultNavigationBarColor = activity.window.navigationBarColor
|
207
|
+
}
|
208
|
+
|
209
|
+
try {
|
210
|
+
activity.runOnUiThread {
|
211
|
+
activity.window.navigationBarColor = parseColor(color, alpha, this.defaultNavigationBarColor)
|
212
|
+
}
|
213
|
+
} catch (_: Exception) {
|
214
|
+
Log.d("Unistyles", "Failed to set navigation bar color: $color")
|
215
|
+
}
|
216
|
+
}
|
217
|
+
}
|
218
|
+
|
219
|
+
fun onSetNavigationBarHidden(isHidden: Boolean) {
|
220
|
+
this.reactApplicationContext.currentActivity?.let { activity ->
|
221
|
+
WindowInsetsControllerCompat(activity.window, activity.window.decorView).apply {
|
222
|
+
activity.window?.decorView?.let { decorView ->
|
223
|
+
@Suppress("DEPRECATION")
|
224
|
+
activity.runOnUiThread {
|
225
|
+
if (isHidden) {
|
226
|
+
// below Android 11, we need to use window flags to hide the navigation bar
|
227
|
+
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) {
|
228
|
+
decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
229
|
+
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
|
230
|
+
} else {
|
231
|
+
hide(WindowInsetsCompat.Type.navigationBars())
|
232
|
+
systemBarsBehavior =
|
233
|
+
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
|
234
|
+
}
|
235
|
+
|
236
|
+
// dispatch new insets to invoke the insets listener
|
237
|
+
val newInsets = WindowInsetsCompat.Builder()
|
238
|
+
.setInsets(WindowInsetsCompat.Type.navigationBars(), androidx.core.graphics.Insets.of(0, 0, 0, 0))
|
239
|
+
.build()
|
240
|
+
|
241
|
+
ViewCompat.dispatchApplyWindowInsets(activity.findViewById(android.R.id.content), newInsets)
|
242
|
+
} else {
|
243
|
+
show(WindowInsetsCompat.Type.navigationBars())
|
244
|
+
}
|
245
|
+
}
|
246
|
+
}
|
247
|
+
}
|
248
|
+
}
|
249
|
+
}
|
250
|
+
|
251
|
+
fun onSetStatusBarHidden(isHidden: Boolean) {
|
252
|
+
this.reactApplicationContext.currentActivity?.let { activity ->
|
253
|
+
WindowInsetsControllerCompat(activity.window, activity.window.decorView).apply {
|
254
|
+
activity.window?.let { window ->
|
255
|
+
@Suppress("DEPRECATION")
|
256
|
+
activity.runOnUiThread {
|
257
|
+
if (isHidden) {
|
258
|
+
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) {
|
259
|
+
window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
|
260
|
+
window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN)
|
261
|
+
} else {
|
262
|
+
hide(WindowInsetsCompat.Type.statusBars())
|
263
|
+
}
|
264
|
+
} else {
|
265
|
+
show(WindowInsetsCompat.Type.statusBars())
|
266
|
+
}
|
267
|
+
}
|
268
|
+
}
|
269
|
+
}
|
270
|
+
}
|
14
271
|
}
|
15
272
|
|
16
|
-
fun
|
17
|
-
|
273
|
+
fun onSetStatusBarColor(color: String, alpha: Float) {
|
274
|
+
this.reactApplicationContext.currentActivity?.let { activity ->
|
275
|
+
if (this.defaultStatusBarColor == -1) {
|
276
|
+
this.defaultStatusBarColor = activity.window.statusBarColor
|
277
|
+
}
|
278
|
+
|
279
|
+
try {
|
280
|
+
activity.runOnUiThread {
|
281
|
+
activity.window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
|
282
|
+
activity.window.statusBarColor = parseColor(color, alpha, this.defaultStatusBarColor)
|
283
|
+
}
|
284
|
+
} catch (_: Exception) {
|
285
|
+
Log.d("Unistyles", "Failed to set status bar color: $color")
|
286
|
+
}
|
287
|
+
}
|
18
288
|
}
|
19
289
|
|
20
|
-
fun
|
21
|
-
|
290
|
+
fun onSetImmersiveMode(isEnabled: Boolean) {
|
291
|
+
this.onSetStatusBarHidden(isEnabled)
|
292
|
+
this.onSetNavigationBarHidden(isEnabled)
|
293
|
+
}
|
294
|
+
|
295
|
+
fun onSetRootViewBackgroundColor(color: String, alpha: Float) {
|
296
|
+
this.reactApplicationContext.currentActivity?.let { activity ->
|
297
|
+
activity.window?.decorView?.let { decorView ->
|
298
|
+
try {
|
299
|
+
activity.runOnUiThread {
|
300
|
+
decorView.rootView.setBackgroundColor(parseColor(color, alpha, Color.WHITE))
|
301
|
+
}
|
302
|
+
} catch (_: Exception) {
|
303
|
+
Log.d("Unistyles", "Failed to set root view background color: $color")
|
304
|
+
}
|
305
|
+
}
|
306
|
+
}
|
307
|
+
}
|
308
|
+
|
309
|
+
private fun parseColor(color: String, alpha: Float, defaultColor: Int): Int {
|
310
|
+
if (color == "") {
|
311
|
+
return defaultColor
|
312
|
+
}
|
313
|
+
|
314
|
+
if (color == "transparent") {
|
315
|
+
return Color.TRANSPARENT
|
316
|
+
}
|
317
|
+
|
318
|
+
if (alpha == 1.toFloat()) {
|
319
|
+
return Color.parseColor(color)
|
320
|
+
}
|
321
|
+
|
322
|
+
return ColorUtils.setAlphaComponent(Color.parseColor(color), (255 * alpha).toInt())
|
22
323
|
}
|
23
324
|
}
|