Skip to content

Commit 8eb4111

Browse files
committed
Handle feature flag for commit hook
1 parent 55eefa7 commit 8eb4111

File tree

16 files changed

+162
-9
lines changed

16 files changed

+162
-9
lines changed

FabricExample/App.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ import { featureFlags } from '../src';
44
featureFlags.experiment.synchronousScreenUpdatesEnabled = false
55
featureFlags.experiment.synchronousHeaderConfigUpdatesEnabled = false
66
featureFlags.experiment.synchronousHeaderSubviewUpdatesEnabled = false
7+
featureFlags.experiment.earlyScreenOrientationChangeEnabled = true
78

89
export default App;

android/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ project(rnscreens)
55
if(${RNS_NEW_ARCH_ENABLED})
66
add_library(rnscreens
77
SHARED
8+
../common/cpp/react/renderer/components/rnscreens/utils/FeatureFlags.cpp
9+
../common/cpp/react/renderer/components/rnscreens/utils/FeatureFlagsJNI.cpp
810
../cpp/RNScreensTurboModule.cpp
911
../cpp/RNSScreenRemovalListener.cpp
1012
./src/main/cpp/jni-adapter.cpp

android/src/main/cpp/OnLoad.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include <fbjni/fbjni.h>
22

33
#include "NativeProxy.h"
4+
#include "../../../../common/cpp/react/renderer/components/rnscreens/utils/FeatureFlagsJNIHelper.h"
45

56
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {
67
return facebook::jni::initialize(

android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import com.swmansion.rnscreens.events.ScreenTransitionProgressEvent
2323
import com.swmansion.rnscreens.events.ScreenWillAppearEvent
2424
import com.swmansion.rnscreens.events.ScreenWillDisappearEvent
2525
import com.swmansion.rnscreens.events.SheetDetentChangedEvent
26+
import com.swmansion.rnscreens.utils.FeatureFlags
2627

2728
@ReactModule(name = ScreenViewManager.REACT_CLASS)
2829
open class ScreenViewManager :
@@ -342,6 +343,13 @@ open class ScreenViewManager :
342343

343344
// END mark: iOS-only
344345

346+
override fun setEarlyScreenOrientationChangeEnabled(
347+
view: Screen?,
348+
value: Boolean,
349+
) {
350+
FeatureFlags.setFlag("EARLY_SCREEN_ORIENTATION_CHANGE", value)
351+
}
352+
345353
@ReactProp(name = "sheetAllowedDetents")
346354
override fun setSheetAllowedDetents(
347355
view: Screen,
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.swmansion.rnscreens.utils
2+
3+
object FeatureFlags {
4+
init {
5+
System.loadLibrary("rnscreens")
6+
}
7+
8+
external fun setFlag(name: String, value: Boolean)
9+
external fun getFlag(name: String): Boolean
10+
}

apps/App.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import React from 'react';
22
import { enableFreeze } from 'react-native-screens';
33
import Example from './Example';
4-
import * as Test from './src/tests';
4+
// import * as Test from './src/tests';
55

66
enableFreeze(true);
77

88
export default function App() {
9-
// return <Example />;
10-
return <Test.Test3295 />;
9+
return <Example />;
10+
// return <Test.TestBottomTabs />;
1111
}

apps/src/tests/Test3212/ScrollViewTemplate.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export function ScrollViewTemplate() {
1212
setConfig({ bottom: 'hidden', top: 'hidden', left: 'hidden', right: 'hidden' });
1313
}}/>
1414
<Text style={{ fontSize: 21 }}>
15-
{Array.from({ length: 50000 }).map(_ => emoji[Math.floor(Math.random() * emoji.length)])}
15+
{Array.from({ length: 1000 }).map(_ => emoji[Math.floor(Math.random() * emoji.length)])}
1616
</Text>
1717
</ScrollView>
1818
);

common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <react/renderer/uimanager/UIManager.h>
1313
#include <react/renderer/uimanager/UIManagerCommitHook.h>
1414
#include "RNSScreenShadowNode.h"
15+
#include "utils/FeatureFlags.h"
1516

1617
namespace facebook {
1718
namespace react {
@@ -47,11 +48,13 @@ class RNSScreenComponentDescriptor final
4748
shadowNode.getState());
4849
auto stateData = state->getData();
4950
#ifdef ANDROID
50-
if (!commitHook_) {
51-
// The hook couldn't be attached in constructor because UIManager was
52-
// missing from ContextContainer. Instead, we do it here, on the first
53-
// call to the function. We don't anticipate any orientation changes that
54-
// we need to respond to prior to this.
51+
if (!commitHook_ &&
52+
FeatureFlags::getFlag("EARLY_SCREEN_ORIENTATION_CHANGE")) {
53+
// I the developer needs to react to orientation change as early as
54+
// possible, we attach a commit hook that checks the old vs new
55+
// RootShadowNode for the change. The hook cannot be attached in the
56+
// constructor because UIManager is still missing from ContextContainer.
57+
// Instead, we do it here, on the first call to the function.
5558
commitHook_ =
5659
std::make_shared<RNSScreenShadowNodeCommitHook>(contextContainer_);
5760
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#include "FeatureFlags.h"
2+
3+
std::unordered_map<std::string, bool> FeatureFlags::flagValues_;
4+
5+
void FeatureFlags::setFlag(const std::string name, bool value) {
6+
flagValues_[name] = value;
7+
}
8+
9+
bool FeatureFlags::getFlag(const std::string name) {
10+
auto it = flagValues_.find(name);
11+
return it != flagValues_.end() && it->second;
12+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#pragma once
2+
3+
#include <fbjni/fbjni.h>
4+
#include <string>
5+
#include <unordered_map>
6+
7+
using namespace facebook;
8+
using namespace facebook::jni;
9+
10+
class FeatureFlags : public jni::HybridClass<FeatureFlags> {
11+
public:
12+
FeatureFlags() = delete;
13+
14+
static void registerNatives();
15+
16+
static void setFlag(const std::string name, bool value);
17+
static bool getFlag(const std::string name);
18+
19+
private:
20+
static std::unordered_map<std::string, bool> flagValues_;
21+
};

0 commit comments

Comments
 (0)