react-native-screens 3.31.1 → 3.33.0

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 (203) hide show
  1. package/README.md +21 -11
  2. package/RNScreens.podspec +11 -52
  3. package/android/CMakeLists.txt +48 -4
  4. package/android/build.gradle +16 -9
  5. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +25 -16
  6. package/android/src/fabric/java/com/swmansion/rnscreens/NativeProxy.kt +53 -0
  7. package/android/src/main/cpp/NativeProxy.cpp +51 -0
  8. package/android/src/main/cpp/NativeProxy.h +35 -0
  9. package/android/src/main/cpp/OnLoad.cpp +8 -0
  10. package/android/src/main/cpp/jni-adapter.cpp +86 -93
  11. package/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt +7 -2
  12. package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +6 -1
  13. package/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt +2 -2
  14. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +36 -17
  15. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +150 -40
  16. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +52 -30
  17. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +27 -4
  18. package/android/src/main/java/com/swmansion/rnscreens/ScreenEventDispatcher.kt +10 -2
  19. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +56 -27
  20. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +8 -1
  21. package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +50 -19
  22. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +63 -39
  23. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +4 -0
  24. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +88 -57
  25. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +131 -36
  26. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +19 -4
  27. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +16 -10
  28. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +28 -25
  29. package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +177 -77
  30. package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +77 -25
  31. package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +31 -9
  32. package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +3 -1
  33. package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +160 -54
  34. package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +29 -22
  35. package/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt +7 -2
  36. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderAttachedEvent.kt +4 -1
  37. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt +4 -1
  38. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderDetachedEvent.kt +4 -1
  39. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +5 -6
  40. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt +4 -1
  41. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt +4 -1
  42. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt +8 -4
  43. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt +7 -6
  44. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt +4 -1
  45. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt +4 -1
  46. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarBlurEvent.kt +5 -2
  47. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarChangeTextEvent.kt +4 -3
  48. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarCloseEvent.kt +4 -1
  49. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarFocusEvent.kt +5 -2
  50. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarOpenEvent.kt +4 -1
  51. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarSearchButtonPressEvent.kt +9 -4
  52. package/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt +4 -1
  53. package/android/src/main/java/com/swmansion/rnscreens/utils/DeviceUtils.kt +1 -5
  54. package/android/src/main/java/com/swmansion/rnscreens/utils/ScreenDummyLayoutHelper.kt +214 -0
  55. package/android/src/main/jni/CMakeLists.txt +5 -4
  56. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerDelegate.java +25 -0
  57. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerInterface.java +16 -0
  58. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +6 -0
  59. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +2 -0
  60. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +3 -0
  61. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +1 -0
  62. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerDelegate.java +99 -0
  63. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerInterface.java +37 -0
  64. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +10 -5
  65. package/android/src/paper/java/com/swmansion/rnscreens/NativeProxy.kt +19 -0
  66. package/android/src/paper/java/com/swmansion/rnscreens/NativeScreensModuleSpec.java +4 -0
  67. package/common/cpp/react/renderer/components/rnscreens/FrameCorrectionModes.h +51 -0
  68. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenComponentDescriptor.h +8 -9
  69. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.cpp +2 -1
  70. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.h +9 -8
  71. package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +147 -10
  72. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +51 -1
  73. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +29 -7
  74. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +22 -1
  75. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +30 -10
  76. package/common/cpp/react/renderer/components/rnscreens/utils/RectUtil.h +36 -0
  77. package/cpp/RNSScreenRemovalListener.cpp +25 -0
  78. package/cpp/RNSScreenRemovalListener.h +20 -0
  79. package/cpp/RNScreensTurboModule.cpp +31 -23
  80. package/cpp/RNScreensTurboModule.h +17 -20
  81. package/ios/RNSConvert.h +7 -0
  82. package/ios/RNSConvert.mm +24 -0
  83. package/ios/RNSModalScreen.mm +22 -0
  84. package/ios/RNSModule.mm +2 -3
  85. package/ios/RNSScreen.h +2 -1
  86. package/ios/RNSScreen.mm +35 -19
  87. package/ios/RNSScreenContainer.mm +1 -1
  88. package/ios/RNSScreenStack.mm +59 -54
  89. package/ios/RNSScreenStackAnimator.mm +43 -6
  90. package/ios/RNSScreenStackHeaderConfig.h +2 -0
  91. package/ios/RNSScreenStackHeaderConfig.mm +93 -28
  92. package/ios/RNSScreenStackHeaderSubview.mm +8 -0
  93. package/ios/RNSSearchBar.h +5 -5
  94. package/ios/RNSSearchBar.mm +11 -11
  95. package/ios/utils/RCTSurfaceTouchHandler+RNSUtility.h +15 -0
  96. package/ios/utils/RCTSurfaceTouchHandler+RNSUtility.mm +14 -0
  97. package/ios/utils/RCTTouchHandler+RNSUtility.h +15 -0
  98. package/ios/utils/RCTTouchHandler+RNSUtility.mm +15 -0
  99. package/ios/utils/UIView+RNSUtility.h +23 -0
  100. package/ios/utils/UIView+RNSUtility.mm +55 -0
  101. package/lib/commonjs/components/Screen.js +119 -127
  102. package/lib/commonjs/components/Screen.js.map +1 -1
  103. package/lib/commonjs/components/ScreenStack.js +8 -1
  104. package/lib/commonjs/components/ScreenStack.js.map +1 -1
  105. package/lib/commonjs/components/SearchBar.js +39 -36
  106. package/lib/commonjs/components/SearchBar.js.map +1 -1
  107. package/lib/commonjs/fabric/ModalScreenNativeComponent.js.map +1 -1
  108. package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
  109. package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  110. package/lib/commonjs/native-stack/views/HeaderConfig.js +2 -0
  111. package/lib/commonjs/native-stack/views/HeaderConfig.js.map +1 -1
  112. package/lib/commonjs/native-stack/views/NativeStackView.js +4 -0
  113. package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
  114. package/lib/module/components/Screen.js +118 -126
  115. package/lib/module/components/Screen.js.map +1 -1
  116. package/lib/module/components/ScreenStack.js +8 -1
  117. package/lib/module/components/ScreenStack.js.map +1 -1
  118. package/lib/module/components/SearchBar.js +39 -36
  119. package/lib/module/components/SearchBar.js.map +1 -1
  120. package/lib/module/fabric/ModalScreenNativeComponent.js.map +1 -1
  121. package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
  122. package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  123. package/lib/module/native-stack/views/HeaderConfig.js +2 -0
  124. package/lib/module/native-stack/views/HeaderConfig.js.map +1 -1
  125. package/lib/module/native-stack/views/NativeStackView.js +4 -0
  126. package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
  127. package/lib/typescript/TransitionProgressContext.d.ts +1 -1
  128. package/lib/typescript/TransitionProgressContext.d.ts.map +1 -1
  129. package/lib/typescript/components/Screen.d.ts +3 -14
  130. package/lib/typescript/components/Screen.d.ts.map +1 -1
  131. package/lib/typescript/components/ScreenStack.d.ts.map +1 -1
  132. package/lib/typescript/components/SearchBar.d.ts +14 -21
  133. package/lib/typescript/components/SearchBar.d.ts.map +1 -1
  134. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +12 -10
  135. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -1
  136. package/lib/typescript/fabric/ScreenNativeComponent.d.ts +12 -10
  137. package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -1
  138. package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts +5 -3
  139. package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts.map +1 -1
  140. package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts +1 -1
  141. package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -1
  142. package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts +1 -1
  143. package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts.map +1 -1
  144. package/lib/typescript/fabric/SearchBarNativeComponent.d.ts +9 -9
  145. package/lib/typescript/fabric/SearchBarNativeComponent.d.ts.map +1 -1
  146. package/lib/typescript/gesture-handler/RNScreensTurboModule.d.ts +1 -1
  147. package/lib/typescript/gesture-handler/RNScreensTurboModule.d.ts.map +1 -1
  148. package/lib/typescript/native-stack/types.d.ts +39 -14
  149. package/lib/typescript/native-stack/types.d.ts.map +1 -1
  150. package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts +1 -1
  151. package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts.map +1 -1
  152. package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts +1 -1
  153. package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts.map +1 -1
  154. package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts +1 -1
  155. package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts.map +1 -1
  156. package/lib/typescript/native-stack/views/HeaderConfig.d.ts +2 -2
  157. package/lib/typescript/native-stack/views/HeaderConfig.d.ts.map +1 -1
  158. package/lib/typescript/native-stack/views/NativeStackView.d.ts +1 -1
  159. package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -1
  160. package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts +1 -1
  161. package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts.map +1 -1
  162. package/lib/typescript/types.d.ts +39 -13
  163. package/lib/typescript/types.d.ts.map +1 -1
  164. package/lib/typescript/useTransitionProgress.d.ts +3 -3
  165. package/native-stack/README.md +116 -98
  166. package/package.json +16 -7
  167. package/react-native.config.js +17 -15
  168. package/src/TransitionProgressContext.tsx +1 -1
  169. package/src/components/Screen.tsx +31 -37
  170. package/src/components/ScreenStack.tsx +11 -1
  171. package/src/components/ScreenStackHeaderConfig.tsx +5 -5
  172. package/src/components/ScreenStackHeaderConfig.web.tsx +6 -6
  173. package/src/components/SearchBar.tsx +77 -65
  174. package/src/core.ts +1 -1
  175. package/src/fabric/ModalScreenNativeComponent.ts +2 -0
  176. package/src/fabric/ScreenNativeComponent.ts +2 -0
  177. package/src/fabric/ScreenNavigationContainerNativeComponent.ts +1 -1
  178. package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +4 -1
  179. package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +1 -1
  180. package/src/fabric/SearchBarNativeComponent.ts +7 -7
  181. package/src/gesture-handler/ScreenGestureDetector.tsx +5 -5
  182. package/src/gesture-handler/constraints.ts +5 -5
  183. package/src/gesture-handler/fabricUtils.ts +1 -1
  184. package/src/native-stack/contexts/GHContext.tsx +1 -1
  185. package/src/native-stack/navigators/createNativeStackNavigator.tsx +3 -3
  186. package/src/native-stack/types.tsx +29 -4
  187. package/src/native-stack/utils/getDefaultHeaderHeight.tsx +1 -1
  188. package/src/native-stack/utils/getStatusBarHeight.tsx +1 -1
  189. package/src/native-stack/utils/useAnimatedHeaderHeight.tsx +1 -1
  190. package/src/native-stack/utils/useBackPressSubscription.tsx +1 -1
  191. package/src/native-stack/utils/useHeaderHeight.tsx +1 -1
  192. package/src/native-stack/views/FontProcessor.tsx +1 -1
  193. package/src/native-stack/views/HeaderConfig.tsx +3 -1
  194. package/src/native-stack/views/NativeStackView.tsx +13 -9
  195. package/src/reanimated/ReanimatedHeaderHeightContext.tsx +1 -1
  196. package/src/reanimated/ReanimatedNativeStackScreen.tsx +5 -5
  197. package/src/reanimated/ReanimatedScreen.tsx +2 -2
  198. package/src/reanimated/ReanimatedScreenProvider.tsx +1 -1
  199. package/src/reanimated/useReanimatedHeaderHeight.tsx +1 -1
  200. package/src/reanimated/useReanimatedTransitionProgress.tsx +1 -1
  201. package/src/types.tsx +31 -5
  202. package/src/useTransitionProgress.tsx +1 -1
  203. package/windows/README.md +4 -1
@@ -1,110 +1,103 @@
1
- #include <array>
2
- #include <mutex>
3
1
  #include <jni.h>
4
2
  #include <jsi/jsi.h>
3
+ #include <array>
4
+ #include <mutex>
5
5
  #include "RNScreensTurboModule.h"
6
6
 
7
7
  using namespace facebook;
8
8
 
9
9
  jobject globalThis;
10
10
 
11
- extern "C"
12
- JNIEXPORT void JNICALL
13
- Java_com_swmansion_rnscreens_ScreensModule_nativeInstall(JNIEnv *env, jobject thiz, jlong jsiPtr) {
14
- auto runtime = reinterpret_cast<jsi::Runtime*>(jsiPtr);
15
- if (!runtime) {
16
- return;
17
- }
18
- jsi::Runtime &rt = *runtime;
19
- globalThis = env->NewGlobalRef(thiz);
20
- JavaVM* jvm;
21
- env->GetJavaVM(&jvm);
11
+ extern "C" JNIEXPORT void JNICALL
12
+ Java_com_swmansion_rnscreens_ScreensModule_nativeInstall(
13
+ JNIEnv *env,
14
+ jobject thiz,
15
+ jlong jsiPtr) {
16
+ auto runtime = reinterpret_cast<jsi::Runtime *>(jsiPtr);
17
+ if (!runtime) {
18
+ return;
19
+ }
20
+ jsi::Runtime &rt = *runtime;
21
+ globalThis = env->NewGlobalRef(thiz);
22
+ JavaVM *jvm;
23
+ env->GetJavaVM(&jvm);
22
24
 
23
- const auto &startTransition = [jvm](int stackTag) -> std::array<int, 2> {
24
- JNIEnv* currentEnv;
25
- if (jvm->AttachCurrentThread(&currentEnv, nullptr) != JNI_OK) {
26
- return {0, 0};
27
- }
28
- jclass javaClass = currentEnv->GetObjectClass(globalThis);
29
- jmethodID methodID = currentEnv->GetMethodID(
30
- javaClass,
31
- "startTransition",
32
- "(Ljava/lang/Integer;)[I"
33
- );
34
- jclass integerClass = currentEnv->FindClass("java/lang/Integer");
35
- jmethodID integerConstructor = currentEnv->GetMethodID(integerClass, "<init>", "(I)V");
36
- jobject integerArg = currentEnv->NewObject(integerClass, integerConstructor, stackTag);
37
- jintArray resultArray = (jintArray) currentEnv->CallObjectMethod(
38
- globalThis,
39
- methodID,
40
- integerArg
41
- );
42
- std::array<int, 2> result = {-1, -1};
43
- jint* elements = currentEnv->GetIntArrayElements(resultArray, nullptr);
44
- if (elements != nullptr) {
45
- result[0] = elements[0];
46
- result[1] = elements[1];
47
- currentEnv->ReleaseIntArrayElements(resultArray, elements, JNI_ABORT);
48
- }
49
- return result;
50
- };
25
+ const auto &startTransition = [jvm](int stackTag) -> std::array<int, 2> {
26
+ JNIEnv *currentEnv;
27
+ if (jvm->AttachCurrentThread(&currentEnv, nullptr) != JNI_OK) {
28
+ return {0, 0};
29
+ }
30
+ jclass javaClass = currentEnv->GetObjectClass(globalThis);
31
+ jmethodID methodID = currentEnv->GetMethodID(
32
+ javaClass, "startTransition", "(Ljava/lang/Integer;)[I");
33
+ jclass integerClass = currentEnv->FindClass("java/lang/Integer");
34
+ jmethodID integerConstructor =
35
+ currentEnv->GetMethodID(integerClass, "<init>", "(I)V");
36
+ jobject integerArg =
37
+ currentEnv->NewObject(integerClass, integerConstructor, stackTag);
38
+ jintArray resultArray = (jintArray)currentEnv->CallObjectMethod(
39
+ globalThis, methodID, integerArg);
40
+ std::array<int, 2> result = {-1, -1};
41
+ jint *elements = currentEnv->GetIntArrayElements(resultArray, nullptr);
42
+ if (elements != nullptr) {
43
+ result[0] = elements[0];
44
+ result[1] = elements[1];
45
+ currentEnv->ReleaseIntArrayElements(resultArray, elements, JNI_ABORT);
46
+ }
47
+ return result;
48
+ };
51
49
 
52
- const auto &updateTransition = [jvm](int stackTag, double progress){
53
- JNIEnv* currentEnv;
54
- if (jvm->AttachCurrentThread(&currentEnv, nullptr) != JNI_OK) {
55
- return;
56
- }
57
- jclass javaClass = currentEnv->GetObjectClass(globalThis);
58
- jmethodID methodID = currentEnv->GetMethodID(
59
- javaClass,
60
- "updateTransition",
61
- "(D)V"
62
- );
63
- currentEnv->CallVoidMethod(globalThis, methodID, progress);
64
- };
50
+ const auto &updateTransition = [jvm](int stackTag, double progress) {
51
+ JNIEnv *currentEnv;
52
+ if (jvm->AttachCurrentThread(&currentEnv, nullptr) != JNI_OK) {
53
+ return;
54
+ }
55
+ jclass javaClass = currentEnv->GetObjectClass(globalThis);
56
+ jmethodID methodID =
57
+ currentEnv->GetMethodID(javaClass, "updateTransition", "(D)V");
58
+ currentEnv->CallVoidMethod(globalThis, methodID, progress);
59
+ };
65
60
 
66
- const auto &finishTransition = [jvm](int stackTag, bool canceled){
67
- JNIEnv* currentEnv;
68
- if (jvm->AttachCurrentThread(&currentEnv, nullptr) != JNI_OK) {
69
- return;
70
- }
71
- jclass javaClass = currentEnv->GetObjectClass(globalThis);
72
- jmethodID methodID = currentEnv->GetMethodID(
73
- javaClass,
74
- "finishTransition",
75
- "(Ljava/lang/Integer;Z)V"
76
- );
77
- jclass integerClass = currentEnv->FindClass("java/lang/Integer");
78
- jmethodID integerConstructor = currentEnv->GetMethodID(integerClass, "<init>", "(I)V");
79
- jobject integerArg = currentEnv->NewObject(integerClass, integerConstructor, stackTag);
80
- currentEnv->CallVoidMethod(globalThis, methodID, integerArg, canceled);
81
- };
61
+ const auto &finishTransition = [jvm](int stackTag, bool canceled) {
62
+ JNIEnv *currentEnv;
63
+ if (jvm->AttachCurrentThread(&currentEnv, nullptr) != JNI_OK) {
64
+ return;
65
+ }
66
+ jclass javaClass = currentEnv->GetObjectClass(globalThis);
67
+ jmethodID methodID = currentEnv->GetMethodID(
68
+ javaClass, "finishTransition", "(Ljava/lang/Integer;Z)V");
69
+ jclass integerClass = currentEnv->FindClass("java/lang/Integer");
70
+ jmethodID integerConstructor =
71
+ currentEnv->GetMethodID(integerClass, "<init>", "(I)V");
72
+ jobject integerArg =
73
+ currentEnv->NewObject(integerClass, integerConstructor, stackTag);
74
+ currentEnv->CallVoidMethod(globalThis, methodID, integerArg, canceled);
75
+ };
82
76
 
83
- const auto &disableSwipeBackForTopScreen = [](int _stackTag){
84
- // no implementation for Android
85
- };
77
+ const auto &disableSwipeBackForTopScreen = [](int _stackTag) {
78
+ // no implementation for Android
79
+ };
86
80
 
87
- auto rnScreensModule = std::make_shared<RNScreens::RNScreensTurboModule>(
88
- startTransition,
89
- updateTransition,
90
- finishTransition,
91
- disableSwipeBackForTopScreen
92
- );
93
- auto rnScreensModuleHostObject = jsi::Object::createFromHostObject(rt, rnScreensModule);
94
- rt.global().setProperty(
95
- rt,
96
- RNScreens::RNScreensTurboModule::MODULE_NAME,
97
- std::move(rnScreensModuleHostObject)
98
- );
81
+ auto rnScreensModule = std::make_shared<RNScreens::RNScreensTurboModule>(
82
+ startTransition,
83
+ updateTransition,
84
+ finishTransition,
85
+ disableSwipeBackForTopScreen);
86
+ auto rnScreensModuleHostObject =
87
+ jsi::Object::createFromHostObject(rt, rnScreensModule);
88
+ rt.global().setProperty(
89
+ rt,
90
+ RNScreens::RNScreensTurboModule::MODULE_NAME,
91
+ std::move(rnScreensModuleHostObject));
99
92
  }
100
93
 
101
94
  void JNICALL JNI_OnUnload(JavaVM *jvm, void *) {
102
- JNIEnv *env;
103
- if (jvm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
104
- return;
105
- }
106
- if (globalThis != nullptr) {
107
- env->DeleteGlobalRef(globalThis);
108
- globalThis = nullptr;
109
- }
95
+ JNIEnv *env;
96
+ if (jvm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK) {
97
+ return;
98
+ }
99
+ if (globalThis != nullptr) {
100
+ env->DeleteGlobalRef(globalThis);
101
+ globalThis = nullptr;
102
+ }
110
103
  }
@@ -1,18 +1,23 @@
1
1
  package com.swmansion.rnscreens
2
2
 
3
+ import android.annotation.SuppressLint
3
4
  import android.content.Context
4
5
  import androidx.activity.OnBackPressedCallback
5
6
  import androidx.appcompat.widget.SearchView
6
7
  import androidx.fragment.app.Fragment
7
8
 
8
- class CustomSearchView(context: Context, fragment: Fragment) : SearchView(context) {
9
+ @SuppressLint("ViewConstructor") // Only we construct this view, it is never inflated.
10
+ class CustomSearchView(
11
+ context: Context,
12
+ fragment: Fragment,
13
+ ) : SearchView(context) {
9
14
  /*
10
15
  CustomSearchView uses some variables from SearchView. They are listed below with links to documentation
11
16
  isIconified - https://developer.android.com/reference/android/widget/SearchView#setIconified(boolean)
12
17
  maxWidth - https://developer.android.com/reference/android/widget/SearchView#setMaxWidth(int)
13
18
  setOnSearchClickListener - https://developer.android.com/reference/android/widget/SearchView#setOnSearchClickListener(android.view.View.OnClickListener)
14
19
  setOnCloseListener - https://developer.android.com/reference/android/widget/SearchView#setOnCloseListener(android.widget.SearchView.OnCloseListener)
15
- */
20
+ */
16
21
  private var onCloseListener: OnCloseListener? = null
17
22
  private var onSearchClickedListener: OnClickListener? = null
18
23
 
@@ -1,7 +1,12 @@
1
1
  package com.swmansion.rnscreens
2
2
 
3
+ import android.annotation.SuppressLint
3
4
  import android.content.Context
4
5
  import androidx.appcompat.widget.Toolbar
5
6
 
6
7
  // This class is used to store config closer to search bar
7
- open class CustomToolbar(context: Context, val config: ScreenStackHeaderConfig) : Toolbar(context)
8
+ @SuppressLint("ViewConstructor") // Only we construct this view, it is never inflated.
9
+ open class CustomToolbar(
10
+ context: Context,
11
+ val config: ScreenStackHeaderConfig,
12
+ ) : Toolbar(context)
@@ -5,7 +5,7 @@ import androidx.fragment.app.Fragment
5
5
 
6
6
  class FragmentBackPressOverrider(
7
7
  private val fragment: Fragment,
8
- private val onBackPressedCallback: OnBackPressedCallback
8
+ private val onBackPressedCallback: OnBackPressedCallback,
9
9
  ) {
10
10
  private var isCallbackAdded: Boolean = false
11
11
  var overrideBackAction: Boolean = true
@@ -14,7 +14,7 @@ class FragmentBackPressOverrider(
14
14
  if (!isCallbackAdded && overrideBackAction) {
15
15
  fragment.activity?.onBackPressedDispatcher?.addCallback(
16
16
  fragment,
17
- onBackPressedCallback
17
+ onBackPressedCallback,
18
18
  )
19
19
  isCallbackAdded = true
20
20
  }
@@ -7,27 +7,42 @@ import com.facebook.react.module.annotations.ReactModuleList
7
7
  import com.facebook.react.module.model.ReactModuleInfo
8
8
  import com.facebook.react.module.model.ReactModuleInfoProvider
9
9
  import com.facebook.react.uimanager.ViewManager
10
+ import com.swmansion.rnscreens.utils.ScreenDummyLayoutHelper
10
11
 
11
12
  @ReactModuleList(
12
13
  nativeModules = [
13
- ScreensModule::class
14
- ]
14
+ ScreensModule::class,
15
+ ],
15
16
  )
16
17
  class RNScreensPackage : TurboReactPackage() {
17
- override fun createViewManagers(reactContext: ReactApplicationContext) =
18
- listOf<ViewManager<*, *>>(
18
+ // We just retain it here. This object helps us tackle jumping content when using native header.
19
+ // See: https://github.com/software-mansion/react-native-screens/pull/2169
20
+ private var screenDummyLayoutHelper: ScreenDummyLayoutHelper? = null
21
+
22
+ override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
23
+ // This is the earliest we lay our hands on react context.
24
+ // Moreover this is called before FabricUIManger has finished initializing, not to mention
25
+ // installing its C++ bindings - so we are safe in terms of creating this helper
26
+ // before RN starts creating shadow nodes.
27
+ // See https://github.com/software-mansion/react-native-screens/pull/2169
28
+ if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
29
+ screenDummyLayoutHelper = ScreenDummyLayoutHelper(reactContext)
30
+ }
31
+
32
+ return listOf<ViewManager<*, *>>(
19
33
  ScreenContainerViewManager(),
20
34
  ScreenViewManager(),
21
35
  ModalScreenViewManager(),
22
36
  ScreenStackViewManager(),
23
37
  ScreenStackHeaderConfigViewManager(),
24
38
  ScreenStackHeaderSubviewManager(),
25
- SearchBarManager()
39
+ SearchBarManager(),
26
40
  )
41
+ }
27
42
 
28
43
  override fun getModule(
29
44
  s: String,
30
- reactApplicationContext: ReactApplicationContext
45
+ reactApplicationContext: ReactApplicationContext,
31
46
  ): NativeModule? {
32
47
  when (s) {
33
48
  ScreensModule.NAME -> return ScreensModule(reactApplicationContext)
@@ -35,20 +50,24 @@ class RNScreensPackage : TurboReactPackage() {
35
50
  return null
36
51
  }
37
52
 
38
- override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
39
- return ReactModuleInfoProvider {
53
+ override fun getReactModuleInfoProvider(): ReactModuleInfoProvider =
54
+ ReactModuleInfoProvider {
40
55
  val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
41
56
  val isTurboModule = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
42
- moduleInfos[ScreensModule.NAME] = ReactModuleInfo(
43
- ScreensModule.NAME,
44
- ScreensModule.NAME,
45
- false, // canOverrideExistingModule
46
- false, // needsEagerInit
47
- true, // hasConstants
48
- false, // isCxxModule
49
- isTurboModule
50
- )
57
+ moduleInfos[ScreensModule.NAME] =
58
+ ReactModuleInfo(
59
+ ScreensModule.NAME,
60
+ ScreensModule.NAME,
61
+ false, // canOverrideExistingModule
62
+ false, // needsEagerInit
63
+ true, // hasConstants
64
+ false, // isCxxModule
65
+ isTurboModule,
66
+ )
51
67
  moduleInfos
52
68
  }
69
+
70
+ companion object {
71
+ const val TAG = "RNScreensPackage"
53
72
  }
54
73
  }
@@ -6,6 +6,7 @@ import android.graphics.Paint
6
6
  import android.os.Parcelable
7
7
  import android.util.SparseArray
8
8
  import android.util.TypedValue
9
+ import android.view.View
9
10
  import android.view.ViewGroup
10
11
  import android.view.WindowManager
11
12
  import android.webkit.WebView
@@ -18,8 +19,10 @@ import com.facebook.react.uimanager.UIManagerHelper
18
19
  import com.facebook.react.uimanager.UIManagerModule
19
20
  import com.swmansion.rnscreens.events.HeaderHeightChangeEvent
20
21
 
21
- @SuppressLint("ViewConstructor")
22
- class Screen(context: ReactContext?) : FabricEnabledViewGroup(context) {
22
+ @SuppressLint("ViewConstructor") // Only we construct this view, it is never inflated.
23
+ class Screen(
24
+ context: ReactContext?,
25
+ ) : FabricEnabledViewGroup(context) {
23
26
  val fragment: Fragment?
24
27
  get() = fragmentWrapper?.fragment
25
28
 
@@ -35,6 +38,7 @@ class Screen(context: ReactContext?) : FabricEnabledViewGroup(context) {
35
38
  var screenOrientation: Int? = null
36
39
  private set
37
40
  var isStatusBarAnimated: Boolean? = null
41
+ var isBeingRemoved = false
38
42
 
39
43
  init {
40
44
  // we set layout params as WindowManager.LayoutParams to workaround the issue with TextInputs
@@ -60,13 +64,20 @@ class Screen(context: ReactContext?) : FabricEnabledViewGroup(context) {
60
64
  // ignore restoring instance state too as we are not saving anything anyways.
61
65
  }
62
66
 
63
- override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
67
+ override fun onLayout(
68
+ changed: Boolean,
69
+ l: Int,
70
+ t: Int,
71
+ r: Int,
72
+ b: Int,
73
+ ) {
64
74
  if (container is ScreenStack && changed) {
65
75
  val width = r - l
66
76
  val height = b - t
67
77
 
68
78
  val headerHeight = calculateHeaderHeight()
69
- val totalHeight = headerHeight.first + headerHeight.second // action bar height + status bar height
79
+ val totalHeight =
80
+ headerHeight.first + headerHeight.second // action bar height + status bar height
70
81
  if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
71
82
  updateScreenSizeFabric(width, height, totalHeight)
72
83
  } else {
@@ -77,16 +88,20 @@ class Screen(context: ReactContext?) : FabricEnabledViewGroup(context) {
77
88
  }
78
89
  }
79
90
 
80
- private fun updateScreenSizePaper(width: Int, height: Int) {
91
+ private fun updateScreenSizePaper(
92
+ width: Int,
93
+ height: Int,
94
+ ) {
81
95
  val reactContext = context as ReactContext
82
96
  reactContext.runOnNativeModulesQueueThread(
83
- object : GuardedRunnable(reactContext) {
97
+ object : GuardedRunnable(reactContext.exceptionHandler) {
84
98
  override fun runGuarded() {
85
99
  reactContext
86
100
  .getNativeModule(UIManagerModule::class.java)
87
101
  ?.updateNodeSize(id, width, height)
88
102
  }
89
- })
103
+ },
104
+ )
90
105
  }
91
106
 
92
107
  val headerConfig: ScreenStackHeaderConfig?
@@ -108,7 +123,7 @@ class Screen(context: ReactContext?) : FabricEnabledViewGroup(context) {
108
123
  }
109
124
  super.setLayerType(
110
125
  if (transitioning && !isWebViewInScreen) LAYER_TYPE_HARDWARE else LAYER_TYPE_NONE,
111
- null
126
+ null,
112
127
  )
113
128
  }
114
129
 
@@ -126,7 +141,10 @@ class Screen(context: ReactContext?) : FabricEnabledViewGroup(context) {
126
141
  return false
127
142
  }
128
143
 
129
- override fun setLayerType(layerType: Int, paint: Paint?) {
144
+ override fun setLayerType(
145
+ layerType: Int,
146
+ paint: Paint?,
147
+ ) {
130
148
  // ignore - layer type is controlled by `transitioning` prop
131
149
  }
132
150
 
@@ -144,16 +162,17 @@ class Screen(context: ReactContext?) : FabricEnabledViewGroup(context) {
144
162
  return
145
163
  }
146
164
  ScreenWindowTraits.applyDidSetOrientation()
147
- this.screenOrientation = when (screenOrientation) {
148
- "all" -> ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR
149
- "portrait" -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT
150
- "portrait_up" -> ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
151
- "portrait_down" -> ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT
152
- "landscape" -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
153
- "landscape_left" -> ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
154
- "landscape_right" -> ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
155
- else -> ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
156
- }
165
+ this.screenOrientation =
166
+ when (screenOrientation) {
167
+ "all" -> ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR
168
+ "portrait" -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT
169
+ "portrait_up" -> ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
170
+ "portrait_down" -> ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT
171
+ "landscape" -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
172
+ "landscape_left" -> ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
173
+ "landscape_right" -> ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
174
+ else -> ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
175
+ }
157
176
 
158
177
  fragmentWrapper?.let { ScreenWindowTraits.setOrientation(this, it.tryGetActivity()) }
159
178
  }
@@ -171,7 +190,13 @@ class Screen(context: ReactContext?) : FabricEnabledViewGroup(context) {
171
190
  ScreenWindowTraits.applyDidSetStatusBarAppearance()
172
191
  }
173
192
  field = statusBarStyle
174
- fragmentWrapper?.let { ScreenWindowTraits.setStyle(this, it.tryGetActivity(), it.tryGetContext()) }
193
+ fragmentWrapper?.let {
194
+ ScreenWindowTraits.setStyle(
195
+ this,
196
+ it.tryGetActivity(),
197
+ it.tryGetContext(),
198
+ )
199
+ }
175
200
  }
176
201
 
177
202
  var isStatusBarHidden: Boolean? = null
@@ -193,7 +218,7 @@ class Screen(context: ReactContext?) : FabricEnabledViewGroup(context) {
193
218
  ScreenWindowTraits.setTranslucent(
194
219
  this,
195
220
  it.tryGetActivity(),
196
- it.tryGetContext()
221
+ it.tryGetContext(),
197
222
  )
198
223
  }
199
224
  }
@@ -204,7 +229,13 @@ class Screen(context: ReactContext?) : FabricEnabledViewGroup(context) {
204
229
  ScreenWindowTraits.applyDidSetStatusBarAppearance()
205
230
  }
206
231
  field = statusBarColor
207
- fragmentWrapper?.let { ScreenWindowTraits.setColor(this, it.tryGetActivity(), it.tryGetContext()) }
232
+ fragmentWrapper?.let {
233
+ ScreenWindowTraits.setColor(
234
+ this,
235
+ it.tryGetActivity(),
236
+ it.tryGetContext(),
237
+ )
238
+ }
208
239
  }
209
240
 
210
241
  var navigationBarColor: Int? = null
@@ -213,7 +244,26 @@ class Screen(context: ReactContext?) : FabricEnabledViewGroup(context) {
213
244
  ScreenWindowTraits.applyDidSetNavigationBarAppearance()
214
245
  }
215
246
  field = navigationBarColor
216
- fragmentWrapper?.let { ScreenWindowTraits.setNavigationBarColor(this, it.tryGetActivity()) }
247
+ fragmentWrapper?.let {
248
+ ScreenWindowTraits.setNavigationBarColor(
249
+ this,
250
+ it.tryGetActivity(),
251
+ )
252
+ }
253
+ }
254
+
255
+ var isNavigationBarTranslucent: Boolean? = null
256
+ set(navigationBarTranslucent) {
257
+ if (navigationBarTranslucent != null) {
258
+ ScreenWindowTraits.applyDidSetNavigationBarAppearance()
259
+ }
260
+ field = navigationBarTranslucent
261
+ fragmentWrapper?.let {
262
+ ScreenWindowTraits.setNavigationBarTranslucent(
263
+ this,
264
+ it.tryGetActivity(),
265
+ )
266
+ }
217
267
  }
218
268
 
219
269
  var isNavigationBarHidden: Boolean? = null
@@ -232,22 +282,61 @@ class Screen(context: ReactContext?) : FabricEnabledViewGroup(context) {
232
282
 
233
283
  var nativeBackButtonDismissalEnabled: Boolean = true
234
284
 
285
+ fun startRemovalTransition() {
286
+ if (!isBeingRemoved) {
287
+ isBeingRemoved = true
288
+ startTransitionRecursive(this)
289
+ }
290
+ }
291
+
292
+ private fun startTransitionRecursive(parent: ViewGroup?) {
293
+ parent?.let {
294
+ for (i in 0 until it.childCount) {
295
+ val child = it.getChildAt(i)
296
+ if (child.javaClass.simpleName.equals("CircleImageView")) {
297
+ // SwipeRefreshLayout class which has CircleImageView as a child,
298
+ // does not handle `startViewTransition` properly.
299
+ // It has a custom `getChildDrawingOrder` method which returns
300
+ // wrong index if we called `startViewTransition` on the views on new arch.
301
+ // We add a simple View to bump the number of children to make it work.
302
+ // TODO: find a better way to handle this scenario
303
+ it.addView(View(context), i)
304
+ } else {
305
+ child?.let { view -> it.startViewTransition(view) }
306
+ }
307
+ if (child is ScreenStackHeaderConfig) {
308
+ // we want to start transition on children of the toolbar too,
309
+ // which is not a child of ScreenStackHeaderConfig
310
+ startTransitionRecursive(child.toolbar)
311
+ }
312
+ if (child is ViewGroup) {
313
+ startTransitionRecursive(child)
314
+ }
315
+ }
316
+ }
317
+ }
318
+
235
319
  private fun calculateHeaderHeight(): Pair<Double, Double> {
236
320
  val actionBarTv = TypedValue()
237
- val resolvedActionBarSize = context.theme.resolveAttribute(android.R.attr.actionBarSize, actionBarTv, true)
321
+ val resolvedActionBarSize =
322
+ context.theme.resolveAttribute(android.R.attr.actionBarSize, actionBarTv, true)
238
323
 
239
324
  // Check if it's possible to get an attribute from theme context and assign a value from it.
240
325
  // Otherwise, the default value will be returned.
241
- val actionBarHeight = TypedValue.complexToDimensionPixelSize(actionBarTv.data, resources.displayMetrics)
242
- .takeIf { resolvedActionBarSize && headerConfig?.isHeaderHidden != true && headerConfig?.isHeaderTranslucent != true }
243
- ?.let { PixelUtil.toDIPFromPixel(it.toFloat()).toDouble() } ?: 0.0
244
-
245
- val statusBarHeight = context.resources.getIdentifier("status_bar_height", "dimen", "android")
246
- // Count only status bar when action bar is visible and status bar is not hidden
247
- .takeIf { it > 0 && isStatusBarHidden != true && actionBarHeight > 0 }
248
- ?.let { (context.resources::getDimensionPixelSize)(it) }
249
- ?.let { PixelUtil.toDIPFromPixel(it.toFloat()).toDouble() }
250
- ?: 0.0
326
+ val actionBarHeight =
327
+ TypedValue
328
+ .complexToDimensionPixelSize(actionBarTv.data, resources.displayMetrics)
329
+ .takeIf { resolvedActionBarSize && headerConfig?.isHeaderHidden != true && headerConfig?.isHeaderTranslucent != true }
330
+ ?.let { PixelUtil.toDIPFromPixel(it.toFloat()).toDouble() } ?: 0.0
331
+
332
+ val statusBarHeight =
333
+ context.resources
334
+ .getIdentifier("status_bar_height", "dimen", "android")
335
+ // Count only status bar when action bar is visible and status bar is not hidden
336
+ .takeIf { it > 0 && isStatusBarHidden != true && actionBarHeight > 0 }
337
+ ?.let { (context.resources::getDimensionPixelSize)(it) }
338
+ ?.let { PixelUtil.toDIPFromPixel(it.toFloat()).toDouble() }
339
+ ?: 0.0
251
340
 
252
341
  return actionBarHeight to statusBarHeight
253
342
  }
@@ -255,27 +344,48 @@ class Screen(context: ReactContext?) : FabricEnabledViewGroup(context) {
255
344
  private fun notifyHeaderHeightChange(headerHeight: Double) {
256
345
  val screenContext = context as ReactContext
257
346
  val surfaceId = UIManagerHelper.getSurfaceId(screenContext)
258
- UIManagerHelper.getEventDispatcherForReactTag(screenContext, id)
347
+ UIManagerHelper
348
+ .getEventDispatcherForReactTag(screenContext, id)
259
349
  ?.dispatchEvent(HeaderHeightChangeEvent(surfaceId, id, headerHeight))
260
350
  }
261
351
 
262
352
  enum class StackPresentation {
263
- PUSH, MODAL, TRANSPARENT_MODAL
353
+ PUSH,
354
+ MODAL,
355
+ TRANSPARENT_MODAL,
264
356
  }
265
357
 
266
358
  enum class StackAnimation {
267
- DEFAULT, NONE, FADE, SLIDE_FROM_BOTTOM, SLIDE_FROM_RIGHT, SLIDE_FROM_LEFT, FADE_FROM_BOTTOM, IOS
359
+ DEFAULT,
360
+ NONE,
361
+ FADE,
362
+ SLIDE_FROM_BOTTOM,
363
+ SLIDE_FROM_RIGHT,
364
+ SLIDE_FROM_LEFT,
365
+ FADE_FROM_BOTTOM,
366
+ IOS,
268
367
  }
269
368
 
270
369
  enum class ReplaceAnimation {
271
- PUSH, POP
370
+ PUSH,
371
+ POP,
272
372
  }
273
373
 
274
374
  enum class ActivityState {
275
- INACTIVE, TRANSITIONING_OR_BELOW_TOP, ON_TOP
375
+ INACTIVE,
376
+ TRANSITIONING_OR_BELOW_TOP,
377
+ ON_TOP,
276
378
  }
277
379
 
278
380
  enum class WindowTraits {
279
- ORIENTATION, COLOR, STYLE, TRANSLUCENT, HIDDEN, ANIMATED, NAVIGATION_BAR_COLOR, NAVIGATION_BAR_HIDDEN
381
+ ORIENTATION,
382
+ COLOR,
383
+ STYLE,
384
+ TRANSLUCENT,
385
+ HIDDEN,
386
+ ANIMATED,
387
+ NAVIGATION_BAR_COLOR,
388
+ NAVIGATION_BAR_TRANSLUCENT,
389
+ NAVIGATION_BAR_HIDDEN,
280
390
  }
281
391
  }