react-native-unistyles 2.8.0-beta.1 → 2.8.0-beta.3

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 (33) hide show
  1. package/android/CMakeLists.txt +8 -1
  2. package/android/build.gradle +4 -1
  3. package/android/src/main/cxx/cpp-adapter.cpp +10 -100
  4. package/android/src/main/cxx/helpers.h +2 -0
  5. package/android/src/main/cxx/platform.cpp +126 -0
  6. package/android/src/main/cxx/platform.h +15 -0
  7. package/android/src/main/java/com/unistyles/Models.kt +14 -35
  8. package/android/src/main/java/com/unistyles/Platform.kt +91 -10
  9. package/android/src/main/java/com/unistyles/UnistylesModule.kt +84 -139
  10. package/cxx/Macros.h +11 -0
  11. package/cxx/UnistylesImpl.cpp +241 -0
  12. package/cxx/UnistylesModel.cpp +234 -0
  13. package/cxx/UnistylesModel.h +112 -0
  14. package/cxx/UnistylesRuntime.cpp +17 -388
  15. package/cxx/UnistylesRuntime.h +56 -95
  16. package/ios/UnistylesModule.h +8 -0
  17. package/ios/UnistylesModule.mm +12 -89
  18. package/ios/platform/Platform_Shared.h +5 -0
  19. package/ios/platform/Platform_Shared.mm +69 -0
  20. package/ios/platform/Platform_iOS.h +2 -9
  21. package/ios/platform/Platform_iOS.mm +47 -94
  22. package/ios/platform/Platform_macOS.h +1 -6
  23. package/ios/platform/Platform_macOS.mm +29 -29
  24. package/ios/platform/Platform_tvOS.h +2 -9
  25. package/ios/platform/Platform_tvOS.mm +30 -92
  26. package/ios/platform/Platform_visionOS.h +2 -8
  27. package/ios/platform/Platform_visionOS.mm +28 -83
  28. package/package.json +1 -1
  29. package/react-native-unistyles.podspec +3 -0
  30. package/android/src/main/java/com/unistyles/Config.kt +0 -116
  31. package/android/src/main/java/com/unistyles/Insets.kt +0 -141
  32. package/ios/UnistylesHelpers.h +0 -3
  33. package/ios/UnistylesHelpers.mm +0 -5
@@ -5,8 +5,11 @@ project(unistyles)
5
5
  add_library(unistyles
6
6
  SHARED
7
7
  ../cxx/UnistylesRuntime.cpp
8
+ ../cxx/UnistylesModel.cpp
9
+ ../cxx/UnistylesImpl.cpp
8
10
  ./src/main/cxx/cpp-adapter.cpp
9
11
  ./src/main/cxx/helpers.cpp
12
+ ./src/main/cxx/platform.cpp
10
13
  )
11
14
 
12
15
  include_directories(
@@ -14,15 +17,19 @@ include_directories(
14
17
  )
15
18
 
16
19
  set_target_properties(unistyles PROPERTIES
17
- CXX_STANDARD 17
20
+ CXX_STANDARD 20
18
21
  CXX_STANDARD_REQUIRED ON
19
22
  CXX_EXTENSIONS OFF
20
23
  POSITION_INDEPENDENT_CODE ON
21
24
  )
22
25
 
23
26
  find_package(ReactAndroid REQUIRED CONFIG)
27
+ find_package(fbjni REQUIRED CONFIG)
24
28
 
25
29
  target_link_libraries(unistyles
26
30
  ReactAndroid::jsi
31
+ ReactAndroid::turbomodulejsijni
32
+ ReactAndroid::react_nativemodule_core
27
33
  android
34
+ fbjni::fbjni
28
35
  )
@@ -60,7 +60,10 @@ android {
60
60
  "META-INF",
61
61
  "META-INF/**",
62
62
  "**/libjsi.so",
63
- "**/libc++_shared.so"
63
+ "**/libc++_shared.so",
64
+ "**/libreact_nativemodule_core.so",
65
+ "**/libturbomodulejsijni.so",
66
+ "**/libfbjni.so"
64
67
  ]
65
68
  }
66
69
  }
@@ -1,8 +1,10 @@
1
1
  #include <jni.h>
2
2
  #include <jsi/jsi.h>
3
3
  #include <map>
4
+ #include <ReactCommon/CallInvokerHolder.h>
4
5
  #include "UnistylesRuntime.h"
5
6
  #include "helpers.h"
7
+ #include "platform.h"
6
8
 
7
9
  using namespace facebook;
8
10
 
@@ -11,116 +13,24 @@ std::shared_ptr<UnistylesRuntime> unistylesRuntime = nullptr;
11
13
 
12
14
  extern "C"
13
15
  JNIEXPORT void JNICALL
14
- Java_com_unistyles_UnistylesModule_nativeInstall(
15
- JNIEnv *env,
16
- jobject thiz,
17
- jlong jsi,
18
- jobject screen,
19
- jstring colorScheme,
20
- jstring contentSizeCategory,
21
- jobject insets,
22
- jobject statusBar,
23
- jobject navigationBar
24
- ) {
25
- auto runtime = reinterpret_cast<facebook::jsi::Runtime *>(jsi);
16
+ Java_com_unistyles_UnistylesModule_nativeInstall(JNIEnv *env, jobject thiz, jlong jsi, jobject callInvokerHolder) {
17
+ auto runtime = reinterpret_cast<jsi::Runtime *>(jsi);
18
+ auto callInvoker{
19
+ jni::alias_ref<react::CallInvokerHolder::javaobject>{ reinterpret_cast<react::CallInvokerHolder::javaobject>(callInvokerHolder)} -> cthis() ->getCallInvoker()
20
+ };
26
21
 
27
22
  if (unistylesModule == nullptr) {
28
23
  unistylesModule = env->NewGlobalRef(thiz);
29
24
  }
30
25
 
31
- if (runtime == nullptr || unistylesModule == nullptr) {
26
+ if (unistylesModule == nullptr) {
32
27
  return throwKotlinException(env, "Something went wrong while initializing UnistylesModule");
33
28
  }
34
29
 
35
- const char *colorSchemeChars = env->GetStringUTFChars(colorScheme, nullptr);
36
- std::string colorSchemeStr(colorSchemeChars);
37
- env->ReleaseStringUTFChars(colorScheme, colorSchemeChars);
38
-
39
- const char *contentSizeCategoryChars = env->GetStringUTFChars(contentSizeCategory, nullptr);
40
- std::string contentSizeCategoryStr(contentSizeCategoryChars);
41
- env->ReleaseStringUTFChars(contentSizeCategory, contentSizeCategoryChars);
42
-
43
- unistylesRuntime = std::make_shared<UnistylesRuntime>(
44
- jobjectToDimensions(env, screen),
45
- colorSchemeStr,
46
- contentSizeCategoryStr,
47
- jobjectToInsets(env, insets),
48
- jobjectToDimensions(env, statusBar),
49
- jobjectToDimensions(env, navigationBar)
50
- );
51
-
52
- unistylesRuntime->onThemeChange([=](const std::string &theme) {
53
- jstring themeStr = env->NewStringUTF(theme.c_str());
54
- jclass cls = env->GetObjectClass(unistylesModule);
55
- jmethodID methodId = env->GetMethodID(cls, "onThemeChange", "(Ljava/lang/String;)V");
56
-
57
- env->CallVoidMethod(unistylesModule, methodId, themeStr);
58
- env->DeleteLocalRef(themeStr);
59
- env->DeleteLocalRef(cls);
60
- });
61
-
62
- unistylesRuntime->onLayoutChange([=](const std::string &breakpoint, const std::string &orientation, Dimensions& screen, Dimensions& statusBar, Insets& insets, Dimensions& navigationBar) {
63
- jstring breakpointStr = env->NewStringUTF(breakpoint.c_str());
64
- jstring orientationStr = env->NewStringUTF(orientation.c_str());
65
- jclass cls = env->GetObjectClass(unistylesModule);
66
- jclass dimensionsClass = env->FindClass("com/unistyles/Dimensions");
67
- jmethodID dimensionsConstructor = env->GetMethodID(dimensionsClass, "<init>", "(II)V");
68
- jobject screenObj = env->NewObject(dimensionsClass, dimensionsConstructor, screen.width, screen.height);
69
- jobject statusBarObj = env->NewObject(dimensionsClass, dimensionsConstructor, statusBar.width, statusBar.height);
70
- jobject navigationBarObj = env->NewObject(dimensionsClass, dimensionsConstructor, navigationBar.width, navigationBar.height);
71
-
72
- jclass insetsClass = env->FindClass("com/unistyles/Insets");
73
- jmethodID insetsConstructor = env->GetMethodID(insetsClass, "<init>", "(IIII)V");
74
- jobject insetsObj = env->NewObject(insetsClass, insetsConstructor, insets.left, insets.top, insets.right, insets.bottom);
75
- jmethodID methodId = env->GetMethodID(cls, "onLayoutChange",
76
- "(Ljava/lang/String;Ljava/lang/String;Lcom/unistyles/Dimensions;Lcom/unistyles/Dimensions;Lcom/unistyles/Insets;Lcom/unistyles/Dimensions;)V");
77
-
78
- env->CallVoidMethod(unistylesModule, methodId, breakpointStr, orientationStr, screenObj, statusBarObj, insetsObj, navigationBarObj);
79
- env->DeleteLocalRef(breakpointStr);
80
- env->DeleteLocalRef(orientationStr);
81
- env->DeleteLocalRef(cls);
82
- });
83
-
84
- unistylesRuntime->onPluginChange([=]() {
85
- jclass cls = env->GetObjectClass(unistylesModule);
86
- jmethodID methodId = env->GetMethodID(cls, "onPluginChange", "()V");
87
-
88
- env->CallVoidMethod(unistylesModule, methodId);
89
- env->DeleteLocalRef(cls);
90
- });
91
-
92
- unistylesRuntime->onContentSizeCategoryChange([=](const std::string &contentSizeCategory) {
93
- jstring contentSizeCategoryStr = env->NewStringUTF(contentSizeCategory.c_str());
94
- jclass cls = env->GetObjectClass(unistylesModule);
95
- jmethodID methodId = env->GetMethodID(cls, "onContentSizeCategoryChange", "(Ljava/lang/String;)V");
96
-
97
- env->CallVoidMethod(unistylesModule, methodId, contentSizeCategoryStr);
98
- env->DeleteLocalRef(contentSizeCategoryStr);
99
- env->DeleteLocalRef(cls);
100
- });
101
-
102
- unistylesRuntime->onSetNavigationBarColor([=](const std::string &color) {
103
- jstring colorStr = env->NewStringUTF(color.c_str());
104
- jclass cls = env->GetObjectClass(unistylesModule);
105
- jmethodID methodId = env->GetMethodID(cls, "onSetNavigationBarColor", "(Ljava/lang/String;)V");
106
-
107
- env->CallVoidMethod(unistylesModule, methodId, colorStr);
108
- env->DeleteLocalRef(colorStr);
109
- env->DeleteLocalRef(cls);
110
- });
111
-
112
- unistylesRuntime->onSetStatusBarColor([=](const std::string &color) {
113
- jstring colorStr = env->NewStringUTF(color.c_str());
114
- jclass cls = env->GetObjectClass(unistylesModule);
115
- jmethodID methodId = env->GetMethodID(cls, "onSetStatusBarColor", "(Ljava/lang/String;)V");
116
-
117
- env->CallVoidMethod(unistylesModule, methodId, colorStr);
118
- env->DeleteLocalRef(colorStr);
119
- env->DeleteLocalRef(cls);
120
- });
30
+ unistylesRuntime = std::make_shared<UnistylesRuntime>(*runtime, callInvoker);
31
+ makeShared(env, unistylesModule, unistylesRuntime);
121
32
 
122
33
  jsi::Object hostObject = jsi::Object::createFromHostObject(*runtime, unistylesRuntime);
123
-
124
34
  runtime->global().setProperty(*runtime, "__UNISTYLES__", std::move(hostObject));
125
35
  }
126
36
 
@@ -1,3 +1,5 @@
1
+ #pragma once
2
+
1
3
  #include <jni.h>
2
4
  #include <string>
3
5
  #include <map>
@@ -0,0 +1,126 @@
1
+ #include "platform.h"
2
+
3
+ void makeShared(JNIEnv *env, jobject unistylesModule, std::shared_ptr<UnistylesRuntime> unistylesRuntime) {
4
+ unistylesRuntime->setScreenDimensionsCallback([&](){
5
+ return getScreenDimensions(env, unistylesModule);
6
+ });
7
+
8
+ unistylesRuntime->setColorSchemeCallback([&](){
9
+ return getColorScheme(env, unistylesModule);
10
+ });
11
+
12
+ unistylesRuntime->setStatusBarDimensionsCallback([&](){
13
+ return getStatusBarDimensions(env, unistylesModule);
14
+ });
15
+
16
+ unistylesRuntime->setNavigationBarDimensionsCallback([&](){
17
+ return getNavigationBarDimensions(env, unistylesModule);
18
+ });
19
+
20
+ unistylesRuntime->setInsetsCallback([&](){
21
+ return getInsets(env, unistylesModule);
22
+ });
23
+
24
+ unistylesRuntime->setContentSizeCategoryCallback([&](){
25
+ return getContentSizeCategory(env, unistylesModule);
26
+ });
27
+
28
+ unistylesRuntime->setNavigationBarColorCallback([=](const std::string &color) {
29
+ setNavigationBarColor(env, unistylesModule, color);
30
+ });
31
+
32
+ unistylesRuntime->setStatusBarColorCallback([=](const std::string &color) {
33
+ setStatusBarColor(env, unistylesModule, color);
34
+ });
35
+
36
+ unistylesRuntime->screen = getScreenDimensions(env, unistylesModule);
37
+ unistylesRuntime->contentSizeCategory = getContentSizeCategory(env, unistylesModule);
38
+ unistylesRuntime->colorScheme = getColorScheme(env, unistylesModule);
39
+ unistylesRuntime->statusBar = getStatusBarDimensions(env, unistylesModule);
40
+ unistylesRuntime->insets = getInsets(env, unistylesModule);
41
+ unistylesRuntime->navigationBar = getNavigationBarDimensions(env, unistylesModule);
42
+ }
43
+
44
+ Dimensions getScreenDimensions(JNIEnv *env, jobject unistylesModule) {
45
+ jclass cls = env->GetObjectClass(unistylesModule);
46
+ jmethodID methodId = env->GetMethodID(cls, "getScreenDimensions", "()Lcom/unistyles/Dimensions;");
47
+ jobject dimensionsObj = env->CallObjectMethod(unistylesModule, methodId);
48
+ Dimensions screenDimensions = jobjectToDimensions(env, dimensionsObj);
49
+
50
+ return screenDimensions;
51
+ }
52
+
53
+ std::string getColorScheme(JNIEnv *env, jobject unistylesModule) {
54
+ jclass cls = env->GetObjectClass(unistylesModule);
55
+ jmethodID methodId = env->GetMethodID(cls, "getColorScheme", "()Ljava/lang/String;");
56
+ jstring colorScheme = (jstring) env->CallObjectMethod(unistylesModule, methodId);
57
+ const char *colorSchemeChars = env->GetStringUTFChars(colorScheme, nullptr);
58
+ std::string colorSchemeStr = std::string(colorSchemeChars);
59
+
60
+ env->ReleaseStringUTFChars(colorScheme, colorSchemeChars);
61
+ env->DeleteLocalRef(colorScheme);
62
+ env->DeleteLocalRef(cls);
63
+
64
+ return colorSchemeStr;
65
+ }
66
+
67
+ Dimensions getStatusBarDimensions(JNIEnv *env, jobject unistylesModule) {
68
+ jclass cls = env->GetObjectClass(unistylesModule);
69
+ jmethodID methodId = env->GetMethodID(cls, "getStatusBarDimensions", "()Lcom/unistyles/Dimensions;");
70
+ jobject dimensionsObj = env->CallObjectMethod(unistylesModule, methodId);
71
+ Dimensions statusBarDimensions = jobjectToDimensions(env, dimensionsObj);
72
+
73
+ return statusBarDimensions;
74
+ }
75
+
76
+ Dimensions getNavigationBarDimensions(JNIEnv *env, jobject unistylesModule) {
77
+ jclass cls = env->GetObjectClass(unistylesModule);
78
+ jmethodID methodId = env->GetMethodID(cls, "getNavigationBarDimensions", "()Lcom/unistyles/Dimensions;");
79
+ jobject dimensionsObj = env->CallObjectMethod(unistylesModule, methodId);
80
+ Dimensions navigationBarDimensions = jobjectToDimensions(env, dimensionsObj);
81
+
82
+ return navigationBarDimensions;
83
+ }
84
+
85
+ Insets getInsets(JNIEnv *env, jobject unistylesModule) {
86
+ jclass cls = env->GetObjectClass(unistylesModule);
87
+ jmethodID methodId = env->GetMethodID(cls, "getInsets", "()Lcom/unistyles/Insets;");
88
+ jobject insetsObj = env->CallObjectMethod(unistylesModule, methodId);
89
+ Insets insets = jobjectToInsets(env, insetsObj);
90
+
91
+ return insets;
92
+ }
93
+
94
+ std::string getContentSizeCategory(JNIEnv *env, jobject unistylesModule) {
95
+ jclass cls = env->GetObjectClass(unistylesModule);
96
+ jmethodID methodId = env->GetMethodID(cls, "getContentSizeCategory", "()Ljava/lang/String;");
97
+ jstring contentSizeCategory = (jstring) env->CallObjectMethod(unistylesModule, methodId);
98
+ const char *contentSizeCategoryChars = env->GetStringUTFChars(contentSizeCategory, nullptr);
99
+ std::string contentSizeCategoryStr = std::string(contentSizeCategoryChars);
100
+
101
+ env->ReleaseStringUTFChars(contentSizeCategory, contentSizeCategoryChars);
102
+ env->DeleteLocalRef(contentSizeCategory);
103
+ env->DeleteLocalRef(cls);
104
+
105
+ return contentSizeCategoryStr;
106
+ }
107
+
108
+ void setStatusBarColor(JNIEnv *env, jobject unistylesModule, std::string color) {
109
+ jstring colorStr = env->NewStringUTF(color.c_str());
110
+ jclass cls = env->GetObjectClass(unistylesModule);
111
+ jmethodID methodId = env->GetMethodID(cls, "onSetStatusBarColor", "(Ljava/lang/String;)V");
112
+
113
+ env->CallVoidMethod(unistylesModule, methodId, colorStr);
114
+ env->DeleteLocalRef(colorStr);
115
+ env->DeleteLocalRef(cls);
116
+ }
117
+
118
+ void setNavigationBarColor(JNIEnv *env, jobject unistylesModule, std::string color) {
119
+ jstring colorStr = env->NewStringUTF(color.c_str());
120
+ jclass cls = env->GetObjectClass(unistylesModule);
121
+ jmethodID methodId = env->GetMethodID(cls, "onSetNavigationBarColor", "(Ljava/lang/String;)V");
122
+
123
+ env->CallVoidMethod(unistylesModule, methodId, colorStr);
124
+ env->DeleteLocalRef(colorStr);
125
+ env->DeleteLocalRef(cls);
126
+ }
@@ -0,0 +1,15 @@
1
+ #pragma once
2
+
3
+ #include "UnistylesRuntime.h"
4
+ #include "helpers.h"
5
+
6
+ void makeShared(JNIEnv *env, jobject unistylesModule, std::shared_ptr<UnistylesRuntime> unistylesRuntime);
7
+ Dimensions getScreenDimensions(JNIEnv *env, jobject unistylesModule);
8
+ std::string getColorScheme(JNIEnv *env, jobject unistylesModule);
9
+ Dimensions getStatusBarDimensions(JNIEnv *env, jobject unistylesModule);
10
+ Dimensions getNavigationBarDimensions(JNIEnv *env, jobject unistylesModule);
11
+ Insets getInsets(JNIEnv *env, jobject unistylesModule);
12
+ std::string getContentSizeCategory(JNIEnv *env, jobject unistylesModule);
13
+
14
+ void setNavigationBarColor(JNIEnv *env, jobject unistylesModule, std::string color);
15
+ void setStatusBarColor(JNIEnv *env, jobject unistylesModule, std::string color);
@@ -36,50 +36,29 @@ class Insets(var top: Int, var bottom: Int, var left: Int, var right: Int) {
36
36
  }
37
37
  }
38
38
 
39
- class LayoutConfig(
40
- val screen: Dimensions,
41
- val insets: Insets,
42
- val statusBar: Dimensions,
43
- val navigationBar: Dimensions
39
+ class InsetsCompat(
40
+ val statusBar: Insets,
41
+ val navigationBar: Insets,
42
+ val cutout: Insets
44
43
  ) {
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
44
  override fun toString(): String {
62
45
  return buildString {
63
- append("screen=")
64
- append(screen)
65
- append(" insets=")
66
- append(insets)
67
46
  append(" statusBar=")
68
47
  append(statusBar)
69
48
  append(" navigationBar=")
70
49
  append(navigationBar)
50
+ append(" cutout=")
51
+ append(cutout)
71
52
  }
72
53
  }
73
- }
74
54
 
75
- class Config(
76
- val colorScheme: String,
77
- val contentSizeCategory: String,
78
- ) {
79
- var hasNewColorScheme: Boolean = false
80
- var hasNewContentSizeCategory: Boolean = false
81
-
82
- override fun toString(): String {
83
- return "colorScheme=${colorScheme} contentSizeCategory:${contentSizeCategory}"
55
+ companion object {
56
+ fun getDefaults(): InsetsCompat {
57
+ return InsetsCompat(
58
+ Insets(0, 0, 0, 0),
59
+ Insets(0, 0, 0, 0),
60
+ Insets(0, 0, 0, 0)
61
+ )
62
+ }
84
63
  }
85
64
  }
@@ -1,26 +1,107 @@
1
1
  package com.unistyles
2
2
 
3
+ import android.content.res.Configuration
4
+ import android.graphics.Rect
5
+ import android.util.DisplayMetrics
6
+ import android.view.View
7
+ import androidx.core.view.WindowInsetsCompat
3
8
  import com.facebook.react.bridge.ReactApplicationContext
9
+ import kotlin.math.max
4
10
 
5
- class Platform(reactApplicationContext: ReactApplicationContext) {
6
- private val config: UnistylesConfig = UnistylesConfig(reactApplicationContext)
11
+ class Platform(private val reactApplicationContext: ReactApplicationContext) {
12
+ private val displayMetrics: DisplayMetrics = reactApplicationContext.resources.displayMetrics
13
+ private val density: Float = reactApplicationContext.resources.displayMetrics.density
14
+ private var insetsCompat: InsetsCompat = InsetsCompat.getDefaults()
7
15
 
8
16
  var defaultNavigationBarColor: Int? = null
9
17
  var defaultStatusBarColor: Int? = null
10
18
 
11
- fun hasNewLayoutConfig(): Boolean {
12
- return this.config.hasNewLayoutConfig()
19
+ fun getScreenDimensions(): Dimensions {
20
+ val screenWidth = (displayMetrics.widthPixels / density).toInt()
21
+ val screenHeight = (displayMetrics.heightPixels / density).toInt()
22
+
23
+ return Dimensions(screenWidth, screenHeight)
24
+ }
25
+
26
+ fun getColorScheme(): String {
27
+ val uiMode = this.reactApplicationContext.resources.configuration.uiMode
28
+
29
+ val colorScheme = when (uiMode.and(Configuration.UI_MODE_NIGHT_MASK)) {
30
+ Configuration.UI_MODE_NIGHT_YES -> "dark"
31
+ Configuration.UI_MODE_NIGHT_NO -> "light"
32
+ else -> "unspecified"
33
+ }
34
+
35
+ return colorScheme
36
+ }
37
+
38
+ fun getStatusBarDimensions(): Dimensions {
39
+ val screenWidth = (displayMetrics.widthPixels / density).toInt()
40
+
41
+ return Dimensions(screenWidth, getStatusBarHeight())
42
+ }
43
+
44
+ fun getNavigationBarDimensions(): Dimensions {
45
+ val screenWidth = (displayMetrics.widthPixels / density).toInt()
46
+
47
+ return Dimensions(screenWidth, getNavigationBarHeight())
13
48
  }
14
49
 
15
- fun hasNewConfig(): Boolean {
16
- return this.config.hasNewConfig()
50
+ fun getContentSizeCategory(): String {
51
+ val fontScale = reactApplicationContext.resources.configuration.fontScale
52
+
53
+ val contentSizeCategory = when {
54
+ fontScale <= 0.85f -> "Small"
55
+ fontScale <= 1.0f -> "Default"
56
+ fontScale <= 1.15f -> "Large"
57
+ fontScale <= 1.3f -> "ExtraLarge"
58
+ fontScale <= 1.5f -> "Huge"
59
+ fontScale <= 1.8 -> "ExtraHuge"
60
+ else -> "ExtraExtraHuge"
61
+ }
62
+
63
+ return contentSizeCategory
64
+ }
65
+
66
+ fun setInsetsCompat(insetsCompat: WindowInsetsCompat, decorView: View) {
67
+ val statusBar = insetsCompat.getInsets(WindowInsetsCompat.Type.statusBars())
68
+ val navigationBar = insetsCompat.getInsets(WindowInsetsCompat.Type.navigationBars())
69
+ val cutout = insetsCompat.getInsets(WindowInsetsCompat.Type.displayCutout())
70
+
71
+ // get the visible frame of the window to detect translucent status bar
72
+ // react native (and expo) are setting top inset to 0
73
+ // so there is no other way to detect if status bar is hidden or translucent
74
+ val visibleFrame = Rect()
75
+ decorView.getWindowVisibleDisplayFrame(visibleFrame)
76
+
77
+ val visibleTopFrame = max(visibleFrame.top, statusBar.top)
78
+
79
+ this.insetsCompat = InsetsCompat(
80
+ Insets(visibleTopFrame, statusBar.bottom, statusBar.left, statusBar.right),
81
+ Insets(navigationBar.top, navigationBar.bottom, navigationBar.left, navigationBar.right),
82
+ Insets(cutout.top, cutout.bottom, cutout.left, cutout.right)
83
+ )
84
+ }
85
+
86
+ fun getInsets(): Insets {
87
+ val top = max(this.insetsCompat.cutout.top, this.insetsCompat.statusBar.top)
88
+ val bottom = this.insetsCompat.navigationBar.bottom
89
+ val left = this.insetsCompat.statusBar.left
90
+ val right = this.insetsCompat.statusBar.right
91
+
92
+ return Insets(
93
+ (top / density).toInt(),
94
+ (bottom / density).toInt(),
95
+ (left / density).toInt(),
96
+ (right / density).toInt()
97
+ )
17
98
  }
18
99
 
19
- fun getConfig(): Config {
20
- return this.config.getConfig()
100
+ private fun getStatusBarHeight(): Int {
101
+ return (this.insetsCompat.statusBar.top / density).toInt()
21
102
  }
22
103
 
23
- fun getLayoutConfig(): LayoutConfig {
24
- return this.config.getLayoutConfig()
104
+ private fun getNavigationBarHeight(): Int {
105
+ return (this.insetsCompat.navigationBar.bottom / density).toInt()
25
106
  }
26
107
  }