react-native-unistyles 2.4.0-rc.2 → 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.
Files changed (266) hide show
  1. package/README.md +72 -26
  2. package/android/CMakeLists.txt +18 -2
  3. package/android/build.gradle +5 -1
  4. package/android/src/main/cxx/cpp-adapter.cpp +16 -80
  5. package/android/src/main/cxx/helpers.cpp +61 -0
  6. package/android/src/main/cxx/helpers.h +7 -0
  7. package/android/src/main/cxx/platform.cpp +170 -0
  8. package/android/src/main/cxx/platform.h +20 -0
  9. package/android/src/main/java/com/unistyles/Models.kt +12 -70
  10. package/android/src/main/java/com/unistyles/Platform.kt +311 -10
  11. package/android/src/main/java/com/unistyles/UnistylesModule.kt +145 -153
  12. package/cxx/Macros.h +11 -0
  13. package/cxx/UnistylesImpl.cpp +310 -0
  14. package/cxx/UnistylesModel.cpp +234 -0
  15. package/cxx/UnistylesModel.h +141 -0
  16. package/cxx/UnistylesRuntime.cpp +17 -356
  17. package/cxx/UnistylesRuntime.h +71 -87
  18. package/ios/UnistylesModule.h +13 -0
  19. package/ios/UnistylesModule.mm +20 -90
  20. package/ios/platform/Platform_Shared.h +8 -0
  21. package/ios/platform/Platform_Shared.mm +160 -0
  22. package/ios/platform/Platform_iOS.h +6 -10
  23. package/ios/platform/Platform_iOS.mm +143 -93
  24. package/ios/platform/Platform_macOS.h +3 -7
  25. package/ios/platform/Platform_macOS.mm +52 -34
  26. package/ios/platform/Platform_tvOS.h +17 -0
  27. package/ios/platform/Platform_tvOS.mm +96 -0
  28. package/ios/platform/Platform_visionOS.h +20 -0
  29. package/ios/platform/Platform_visionOS.mm +120 -0
  30. package/lib/commonjs/UnistylesProvider.js +32 -0
  31. package/lib/commonjs/UnistylesProvider.js.map +1 -0
  32. package/lib/commonjs/common.js +3 -2
  33. package/lib/commonjs/common.js.map +1 -1
  34. package/lib/commonjs/core/UnistyleRegistry.js +14 -4
  35. package/lib/commonjs/core/UnistyleRegistry.js.map +1 -1
  36. package/lib/commonjs/core/Unistyles.js +7 -0
  37. package/lib/commonjs/core/Unistyles.js.map +1 -1
  38. package/lib/commonjs/core/UnistylesModule.js +52 -8
  39. package/lib/commonjs/core/UnistylesModule.js.map +1 -1
  40. package/lib/commonjs/core/UnistylesModule.native.js.map +1 -1
  41. package/lib/commonjs/core/UnistylesModule.windows.js.map +1 -1
  42. package/lib/commonjs/core/UnistylesRuntime.js +114 -4
  43. package/lib/commonjs/core/UnistylesRuntime.js.map +1 -1
  44. package/lib/commonjs/core/index.js.map +1 -1
  45. package/lib/commonjs/core/mocks/UnistylesMockedBridge.js +36 -0
  46. package/lib/commonjs/core/mocks/UnistylesMockedBridge.js.map +1 -0
  47. package/lib/commonjs/core/mocks/UnistylesMockedRegistry.js +46 -0
  48. package/lib/commonjs/core/mocks/UnistylesMockedRegistry.js.map +1 -0
  49. package/lib/commonjs/core/mocks/UnistylesMockedRuntime.js +122 -0
  50. package/lib/commonjs/core/mocks/UnistylesMockedRuntime.js.map +1 -0
  51. package/lib/commonjs/core/mocks/index.js +27 -0
  52. package/lib/commonjs/core/mocks/index.js.map +1 -0
  53. package/lib/commonjs/createStyleSheet.js.map +1 -1
  54. package/lib/commonjs/global.js.map +1 -1
  55. package/lib/commonjs/hooks/index.js.map +1 -1
  56. package/lib/commonjs/hooks/useCSS.js.map +1 -1
  57. package/lib/commonjs/hooks/useCSS.native.js.map +1 -1
  58. package/lib/commonjs/hooks/useInitialTheme.js.map +1 -1
  59. package/lib/commonjs/hooks/useSharedContext.js +77 -0
  60. package/lib/commonjs/hooks/useSharedContext.js.map +1 -0
  61. package/lib/commonjs/hooks/useUnistyles.js +18 -65
  62. package/lib/commonjs/hooks/useUnistyles.js.map +1 -1
  63. package/lib/commonjs/hooks/useVariants.js.map +1 -1
  64. package/lib/commonjs/index.js +7 -0
  65. package/lib/commonjs/index.js.map +1 -1
  66. package/lib/commonjs/normalizer/index.js.map +1 -1
  67. package/lib/commonjs/normalizer/module.d.js.map +1 -1
  68. package/lib/commonjs/normalizer/normalizeStyle.js.map +1 -1
  69. package/lib/commonjs/normalizer/normalizer.js +1 -1
  70. package/lib/commonjs/normalizer/normalizer.js.map +1 -1
  71. package/lib/commonjs/normalizer/normalizer.macos.js.map +1 -1
  72. package/lib/commonjs/plugins/cssMediaQueriesPlugin.js.map +1 -1
  73. package/lib/commonjs/plugins/index.js.map +1 -1
  74. package/lib/commonjs/plugins/normalizeWebStylesPlugin.js.map +1 -1
  75. package/lib/commonjs/types/breakpoints.js.map +1 -1
  76. package/lib/commonjs/types/color.js +2 -0
  77. package/lib/commonjs/types/color.js.map +1 -0
  78. package/lib/commonjs/types/common.js.map +1 -1
  79. package/lib/commonjs/types/core.js.map +1 -1
  80. package/lib/commonjs/types/index.js +11 -0
  81. package/lib/commonjs/types/index.js.map +1 -1
  82. package/lib/commonjs/types/normalizer.js.map +1 -1
  83. package/lib/commonjs/types/plugin.js.map +1 -1
  84. package/lib/commonjs/types/stylesheet.js.map +1 -1
  85. package/lib/commonjs/types/unistyles.js.map +1 -1
  86. package/lib/commonjs/types/variants.js.map +1 -1
  87. package/lib/commonjs/useStyles.js +1 -1
  88. package/lib/commonjs/useStyles.js.map +1 -1
  89. package/lib/commonjs/utils/breakpoints.js.map +1 -1
  90. package/lib/commonjs/utils/cssMediaQuery.js.map +1 -1
  91. package/lib/commonjs/utils/generateId.js.map +1 -1
  92. package/lib/commonjs/utils/hash32.js.map +1 -1
  93. package/lib/commonjs/utils/index.js +7 -0
  94. package/lib/commonjs/utils/index.js.map +1 -1
  95. package/lib/commonjs/utils/mq.js.map +1 -1
  96. package/lib/commonjs/utils/mqParser.js.map +1 -1
  97. package/lib/commonjs/utils/parseColor.js +35 -0
  98. package/lib/commonjs/utils/parseColor.js.map +1 -0
  99. package/lib/commonjs/utils/styles.js +15 -1
  100. package/lib/commonjs/utils/styles.js.map +1 -1
  101. package/lib/commonjs/utils/withPlugins.js.map +1 -1
  102. package/lib/module/UnistylesProvider.js +24 -0
  103. package/lib/module/UnistylesProvider.js.map +1 -0
  104. package/lib/module/common.js +2 -1
  105. package/lib/module/common.js.map +1 -1
  106. package/lib/module/core/UnistyleRegistry.js +15 -5
  107. package/lib/module/core/UnistyleRegistry.js.map +1 -1
  108. package/lib/module/core/Unistyles.js +8 -1
  109. package/lib/module/core/Unistyles.js.map +1 -1
  110. package/lib/module/core/UnistylesModule.js +52 -8
  111. package/lib/module/core/UnistylesModule.js.map +1 -1
  112. package/lib/module/core/UnistylesModule.native.js.map +1 -1
  113. package/lib/module/core/UnistylesModule.windows.js.map +1 -1
  114. package/lib/module/core/UnistylesRuntime.js +115 -4
  115. package/lib/module/core/UnistylesRuntime.js.map +1 -1
  116. package/lib/module/core/index.js +2 -1
  117. package/lib/module/core/index.js.map +1 -1
  118. package/lib/module/core/mocks/UnistylesMockedBridge.js +29 -0
  119. package/lib/module/core/mocks/UnistylesMockedBridge.js.map +1 -0
  120. package/lib/module/core/mocks/UnistylesMockedRegistry.js +39 -0
  121. package/lib/module/core/mocks/UnistylesMockedRegistry.js.map +1 -0
  122. package/lib/module/core/mocks/UnistylesMockedRuntime.js +114 -0
  123. package/lib/module/core/mocks/UnistylesMockedRuntime.js.map +1 -0
  124. package/lib/module/core/mocks/index.js +4 -0
  125. package/lib/module/core/mocks/index.js.map +1 -0
  126. package/lib/module/createStyleSheet.js.map +1 -1
  127. package/lib/module/global.js.map +1 -1
  128. package/lib/module/hooks/index.js.map +1 -1
  129. package/lib/module/hooks/useCSS.js.map +1 -1
  130. package/lib/module/hooks/useCSS.native.js.map +1 -1
  131. package/lib/module/hooks/useInitialTheme.js.map +1 -1
  132. package/lib/module/hooks/useSharedContext.js +70 -0
  133. package/lib/module/hooks/useSharedContext.js.map +1 -0
  134. package/lib/module/hooks/useUnistyles.js +19 -66
  135. package/lib/module/hooks/useUnistyles.js.map +1 -1
  136. package/lib/module/hooks/useVariants.js.map +1 -1
  137. package/lib/module/index.js +2 -2
  138. package/lib/module/index.js.map +1 -1
  139. package/lib/module/normalizer/index.js.map +1 -1
  140. package/lib/module/normalizer/module.d.js.map +1 -1
  141. package/lib/module/normalizer/normalizeStyle.js.map +1 -1
  142. package/lib/module/normalizer/normalizer.js.map +1 -1
  143. package/lib/module/normalizer/normalizer.macos.js.map +1 -1
  144. package/lib/module/plugins/cssMediaQueriesPlugin.js.map +1 -1
  145. package/lib/module/plugins/index.js.map +1 -1
  146. package/lib/module/plugins/normalizeWebStylesPlugin.js.map +1 -1
  147. package/lib/module/types/breakpoints.js.map +1 -1
  148. package/lib/module/types/color.js +2 -0
  149. package/lib/module/types/color.js.map +1 -0
  150. package/lib/module/types/common.js.map +1 -1
  151. package/lib/module/types/core.js.map +1 -1
  152. package/lib/module/types/index.js +1 -0
  153. package/lib/module/types/index.js.map +1 -1
  154. package/lib/module/types/normalizer.js.map +1 -1
  155. package/lib/module/types/plugin.js.map +1 -1
  156. package/lib/module/types/stylesheet.js.map +1 -1
  157. package/lib/module/types/unistyles.js.map +1 -1
  158. package/lib/module/types/variants.js.map +1 -1
  159. package/lib/module/useStyles.js +1 -1
  160. package/lib/module/useStyles.js.map +1 -1
  161. package/lib/module/utils/breakpoints.js.map +1 -1
  162. package/lib/module/utils/cssMediaQuery.js.map +1 -1
  163. package/lib/module/utils/generateId.js.map +1 -1
  164. package/lib/module/utils/hash32.js.map +1 -1
  165. package/lib/module/utils/index.js +1 -0
  166. package/lib/module/utils/index.js.map +1 -1
  167. package/lib/module/utils/mq.js.map +1 -1
  168. package/lib/module/utils/mqParser.js.map +1 -1
  169. package/lib/module/utils/parseColor.js +28 -0
  170. package/lib/module/utils/parseColor.js.map +1 -0
  171. package/lib/module/utils/styles.js +15 -1
  172. package/lib/module/utils/styles.js.map +1 -1
  173. package/lib/module/utils/withPlugins.js.map +1 -1
  174. package/lib/typescript/src/UnistylesProvider.d.ts +20 -0
  175. package/lib/typescript/src/UnistylesProvider.d.ts.map +1 -0
  176. package/lib/typescript/src/common.d.ts +3 -2
  177. package/lib/typescript/src/common.d.ts.map +1 -1
  178. package/lib/typescript/src/core/UnistyleRegistry.d.ts.map +1 -1
  179. package/lib/typescript/src/core/Unistyles.d.ts.map +1 -1
  180. package/lib/typescript/src/core/UnistylesModule.d.ts +1 -0
  181. package/lib/typescript/src/core/UnistylesModule.d.ts.map +1 -1
  182. package/lib/typescript/src/core/UnistylesModule.native.d.ts.map +1 -1
  183. package/lib/typescript/src/core/UnistylesModule.windows.d.ts.map +1 -1
  184. package/lib/typescript/src/core/UnistylesRuntime.d.ts +84 -8
  185. package/lib/typescript/src/core/UnistylesRuntime.d.ts.map +1 -1
  186. package/lib/typescript/src/core/index.d.ts +3 -1
  187. package/lib/typescript/src/core/index.d.ts.map +1 -1
  188. package/lib/typescript/src/core/mocks/UnistylesMockedBridge.d.ts +28 -0
  189. package/lib/typescript/src/core/mocks/UnistylesMockedBridge.d.ts.map +1 -0
  190. package/lib/typescript/src/core/mocks/UnistylesMockedRegistry.d.ts +21 -0
  191. package/lib/typescript/src/core/mocks/UnistylesMockedRegistry.d.ts.map +1 -0
  192. package/lib/typescript/src/core/mocks/UnistylesMockedRuntime.d.ts +79 -0
  193. package/lib/typescript/src/core/mocks/UnistylesMockedRuntime.d.ts.map +1 -0
  194. package/lib/typescript/src/core/mocks/index.d.ts +4 -0
  195. package/lib/typescript/src/core/mocks/index.d.ts.map +1 -0
  196. package/lib/typescript/src/createStyleSheet.d.ts.map +1 -1
  197. package/lib/typescript/src/hooks/useCSS.d.ts.map +1 -1
  198. package/lib/typescript/src/hooks/useCSS.native.d.ts.map +1 -1
  199. package/lib/typescript/src/hooks/useSharedContext.d.ts +33 -0
  200. package/lib/typescript/src/hooks/useSharedContext.d.ts.map +1 -0
  201. package/lib/typescript/src/hooks/useUnistyles.d.ts +4 -19
  202. package/lib/typescript/src/hooks/useUnistyles.d.ts.map +1 -1
  203. package/lib/typescript/src/hooks/useVariants.d.ts.map +1 -1
  204. package/lib/typescript/src/index.d.ts +7 -15
  205. package/lib/typescript/src/index.d.ts.map +1 -1
  206. package/lib/typescript/src/normalizer/normalizeStyle.d.ts.map +1 -1
  207. package/lib/typescript/src/types/breakpoints.d.ts +9 -8
  208. package/lib/typescript/src/types/breakpoints.d.ts.map +1 -1
  209. package/lib/typescript/src/types/color.d.ts +4 -0
  210. package/lib/typescript/src/types/color.d.ts.map +1 -0
  211. package/lib/typescript/src/types/core.d.ts +2 -2
  212. package/lib/typescript/src/types/core.d.ts.map +1 -1
  213. package/lib/typescript/src/types/index.d.ts +2 -1
  214. package/lib/typescript/src/types/index.d.ts.map +1 -1
  215. package/lib/typescript/src/types/normalizer.d.ts +1 -1
  216. package/lib/typescript/src/types/normalizer.d.ts.map +1 -1
  217. package/lib/typescript/src/types/stylesheet.d.ts +9 -6
  218. package/lib/typescript/src/types/stylesheet.d.ts.map +1 -1
  219. package/lib/typescript/src/types/unistyles.d.ts +20 -9
  220. package/lib/typescript/src/types/unistyles.d.ts.map +1 -1
  221. package/lib/typescript/src/useStyles.d.ts +1 -1
  222. package/lib/typescript/src/useStyles.d.ts.map +1 -1
  223. package/lib/typescript/src/utils/breakpoints.d.ts.map +1 -1
  224. package/lib/typescript/src/utils/index.d.ts +1 -0
  225. package/lib/typescript/src/utils/index.d.ts.map +1 -1
  226. package/lib/typescript/src/utils/mqParser.d.ts.map +1 -1
  227. package/lib/typescript/src/utils/parseColor.d.ts +3 -0
  228. package/lib/typescript/src/utils/parseColor.d.ts.map +1 -0
  229. package/lib/typescript/src/utils/styles.d.ts.map +1 -1
  230. package/package.json +38 -25
  231. package/react-native-unistyles.podspec +4 -1
  232. package/src/UnistylesProvider.tsx +33 -0
  233. package/src/common.ts +3 -2
  234. package/src/core/UnistyleRegistry.ts +19 -5
  235. package/src/core/Unistyles.ts +10 -1
  236. package/src/core/UnistylesModule.ts +61 -14
  237. package/src/core/UnistylesRuntime.ts +120 -5
  238. package/src/core/index.ts +7 -1
  239. package/src/core/mocks/UnistylesMockedBridge.ts +30 -0
  240. package/src/core/mocks/UnistylesMockedRegistry.ts +47 -0
  241. package/src/core/mocks/UnistylesMockedRuntime.ts +144 -0
  242. package/src/core/mocks/index.ts +3 -0
  243. package/src/hooks/useSharedContext.ts +83 -0
  244. package/src/hooks/useUnistyles.ts +15 -71
  245. package/src/index.ts +10 -4
  246. package/src/types/breakpoints.ts +19 -9
  247. package/src/types/color.ts +26 -0
  248. package/src/types/core.ts +2 -2
  249. package/src/types/index.ts +5 -1
  250. package/src/types/normalizer.ts +1 -1
  251. package/src/types/stylesheet.ts +10 -7
  252. package/src/types/unistyles.ts +28 -12
  253. package/src/useStyles.ts +1 -1
  254. package/src/utils/index.ts +1 -0
  255. package/src/utils/parseColor.ts +33 -0
  256. package/src/utils/styles.ts +24 -1
  257. package/windows/ExperimentalFeatures.props +4 -4
  258. package/windows/NuGet.Config +0 -1
  259. package/windows/ReactNativeUnistyles/ReactNativeUnistyles.h +42 -112
  260. package/windows/ReactNativeUnistyles/ReactNativeUnistyles.vcxproj +7 -2
  261. package/windows/ReactNativeUnistyles/ReactNativeUnistyles.vcxproj.filters +6 -1
  262. package/windows/ReactNativeUnistyles/packages.lock.json +31 -31
  263. package/android/src/main/java/com/unistyles/Config.kt +0 -116
  264. package/android/src/main/java/com/unistyles/Insets.kt +0 -138
  265. package/ios/UnistylesHelpers.h +0 -3
  266. package/ios/UnistylesHelpers.mm +0 -5
@@ -1,85 +1,27 @@
1
1
  package com.unistyles
2
2
 
3
- class Dimensions(var width: Int, var height: Int) {
4
- fun isEqual(dimensions: Dimensions): Boolean {
5
- if (this.width != dimensions.width) {
6
- return false
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 Insets(var top: Int, var bottom: Int, var left: Int, var right: Int) {
18
- fun isEqual(insets: Insets): Boolean {
19
- if (this.top != insets.top) {
20
- return false
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 buildString {
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 Config(
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 "colorScheme=${colorScheme} contentSizeCategory:${contentSizeCategory}"
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
- private val config: UnistylesConfig = UnistylesConfig(reactApplicationContext)
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
- fun hasNewLayoutConfig(): Boolean {
9
- return this.config.hasNewLayoutConfig()
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 hasNewConfig(): Boolean {
13
- return this.config.hasNewConfig()
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 getConfig(): Config {
17
- return this.config.getConfig()
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 getLayoutConfig(): LayoutConfig {
21
- return this.config.getLayoutConfig()
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
  }