Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SET] Tab Navigator support #5793

Merged
merged 76 commits into from
Jun 25, 2024
Merged
Show file tree
Hide file tree
Changes from 68 commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
9395a59
Update layout animations
bartlomiejbloniarz Nov 13, 2023
272399c
Add example
bartlomiejbloniarz Nov 13, 2023
fd7aaea
batchinator
bartlomiejbloniarz Nov 17, 2023
de8c246
`'use strict'` 😭
bartlomiejbloniarz Nov 17, 2023
2ee764d
Mock web
bartlomiejbloniarz Nov 17, 2023
ee5eae0
Fix `enableLayoutAnimations` call
bartlomiejbloniarz Nov 20, 2023
9d480e9
Fix overlapping layout animations
bartlomiejbloniarz Nov 20, 2023
73603db
Fix `MethodMetadata`
bartlomiejbloniarz Nov 20, 2023
722ec07
Update docs
bartlomiejbloniarz Nov 21, 2023
056deb8
Merge branch 'main' into @bartlomiejbloniarz/modify-layout-animations
bartlomiejbloniarz Nov 21, 2023
9c77015
Merge branch 'main' into @bartlomiejbloniarz/modify-layout-animations
bartlomiejbloniarz Nov 22, 2023
cc02106
Merge branch 'main' into @bartlomiejbloniarz/modify-layout-animations
bartlomiejbloniarz Nov 22, 2023
efbd197
Big commit
bartlomiejbloniarz Dec 13, 2023
778fa63
change Android implementation
bartlomiejbloniarz Dec 29, 2023
a30284a
Remove unnecessary configuration calls
bartlomiejbloniarz Jan 8, 2024
aaf7149
Move animation start to `willAppear`
bartlomiejbloniarz Jan 8, 2024
f3debe0
Fix interactivity
bartlomiejbloniarz Jan 12, 2024
05bac12
merg
bartlomiejbloniarz Jan 15, 2024
577feea
fix java lint
bartlomiejbloniarz Jan 15, 2024
15974e1
Merge branch 'main' into @bartlomiejbloniarz/modify-sets
bartlomiejbloniarz Jan 17, 2024
1771706
Add tsdoc
bartlomiejbloniarz Jan 17, 2024
6adce90
Fix transforms on iOS
bartlomiejbloniarz Jan 24, 2024
6de03aa
Simplify configuration
bartlomiejbloniarz Jan 24, 2024
a9a5461
Remove old api
bartlomiejbloniarz Jan 26, 2024
7b3d4dc
Add comment
bartlomiejbloniarz Jan 26, 2024
0b0fcdc
Fix [SET] Modals example
bartlomiejbloniarz Jan 26, 2024
5748249
Change config cleanup
bartlomiejbloniarz Jan 26, 2024
c5ae961
Rename listener
bartlomiejbloniarz Jan 26, 2024
2ccf49e
merg
bartlomiejbloniarz Jan 26, 2024
bfd5391
Split cleanup for shared transitions
bartlomiejbloniarz Feb 21, 2024
3d04f0f
Merge main
piaskowyk Mar 8, 2024
17add2d
Update name
piaskowyk Mar 8, 2024
ed5f2ca
SET everywhere
piaskowyk Mar 15, 2024
b2eaf60
Merge branch 'main' into @bartlomiejbloniarz/modify-sets
piaskowyk Mar 15, 2024
260614f
Improvements after review
piaskowyk Mar 15, 2024
ba6256e
Merge branch '@bartlomiejbloniarz/modify-sets' into @piaskowyk/SET-ev…
piaskowyk Mar 15, 2024
0618d41
Nested stacks
piaskowyk Mar 25, 2024
0cfdc62
Tab support
piaskowyk Apr 8, 2024
dcdd688
Stack inside tab
piaskowyk Apr 8, 2024
de7a827
Go back button
piaskowyk Apr 8, 2024
3b55b68
Merge branch 'main' into @piaskowyk/SET-everywhere
piaskowyk Apr 8, 2024
f38abbe
Basic nested navigators support
piaskowyk Apr 29, 2024
dc3d88b
Basic tab navigator support
piaskowyk Apr 29, 2024
90d9346
Examples
piaskowyk Apr 29, 2024
214e956
Merge branch 'main' into @piaskowyk/SET-everywhere
piaskowyk Apr 29, 2024
56373b3
Android, tab transiton - I am shocked that it works
piaskowyk Apr 29, 2024
d4761bf
Update an example
piaskowyk Apr 29, 2024
3c2599e
Merge branch 'main' into @piaskowyk/SET-everywhere
piaskowyk May 9, 2024
f8d9d2a
Fix snapshot flatlist rerender issue (#6007)
bartlomiejbloniarz May 13, 2024
9bf8f1d
merge
piaskowyk May 13, 2024
6972b08
Add bottom-tabs
piaskowyk May 13, 2024
5e10c0a
Experimental release
piaskowyk May 13, 2024
6cf5ec5
Move screen header
piaskowyk May 13, 2024
3469a1d
Merge
piaskowyk May 29, 2024
86fe27d
iOS improvements
piaskowyk May 31, 2024
378ba34
Add viewTag cleanup
piaskowyk Jun 3, 2024
5de7d20
Clean up Java part
piaskowyk Jun 3, 2024
9a98602
Clean up JS part
piaskowyk Jun 4, 2024
4a30312
Restore changes in UIManager
piaskowyk Jun 4, 2024
d03689a
Cleanup
piaskowyk Jun 4, 2024
098feb9
Remove unused variables
piaskowyk Jun 4, 2024
269e2bc
Merge branch 'main' into @piaskowyk/SET-everywhere
piaskowyk Jun 4, 2024
aa92185
Improvements after review
piaskowyk Jun 11, 2024
33565e0
Merge with main
piaskowyk Jun 11, 2024
9010500
Update package.json
piaskowyk Jun 11, 2024
cdbd576
Improvements after review
piaskowyk Jun 13, 2024
7138062
Update yarn.lock
piaskowyk Jun 14, 2024
3504153
Java lint
piaskowyk Jun 14, 2024
696e4bb
Merge branch 'main' into @piaskowyk/SET-everywhere
piaskowyk Jun 20, 2024
eb7573d
Improvements after review
piaskowyk Jun 20, 2024
ac21d5e
run lineter
piaskowyk Jun 20, 2024
f4ac4b0
Add comment
piaskowyk Jun 20, 2024
7f2d24d
Merge branch 'main' into @piaskowyk/SET-everywhere
piaskowyk Jun 25, 2024
2b83956
Run formatter
piaskowyk Jun 25, 2024
ebe8c24
Added mocks
piaskowyk Jun 25, 2024
4f7bc15
Run formatter
piaskowyk Jun 25, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions apps/common-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"@react-native-community/slider": "*",
"@react-native-masked-view/masked-view": "*",
"@react-native-picker/picker": "*",
"@react-navigation/bottom-tabs": "*",
"@react-navigation/native": "*",
"@react-navigation/native-stack": "*",
"@react-navigation/stack": "*",
Expand All @@ -38,6 +39,7 @@
"@react-native-community/slider": "^4.5.0",
"@react-native-masked-view/masked-view": "^0.3.1",
"@react-native-picker/picker": "^2.5.1",
"@react-navigation/bottom-tabs": "^6.5.20",
"@react-navigation/native": "^6.1.9",
"@react-navigation/native-stack": "^6.9.17",
"@react-navigation/stack": "^6.3.18",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import React from 'react';
import { StyleSheet, View, Button, Text } from 'react-native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import type {NativeStackScreenProps} from '@react-navigation/native-stack';
piaskowyk marked this conversation as resolved.
Show resolved Hide resolved
import {createNativeStackNavigator} from '@react-navigation/native-stack';
import Animated from 'react-native-reanimated';

function getStyle(index: number) {
switch (index) {
case 0:
return styles.box1;
case 1:
return styles.box2;
default:
return styles.box3;
}
}

type ScreenProps = {
[key: string]: {
id?: number;
showButtons?: boolean;
};
};
function Screen({ navigation, route }: NativeStackScreenProps<ScreenProps>) {
const id = route.params?.id ?? 0;
const showButtons = !!route.params?.showButtons;
return (
<View style={styles.container}>
<Text>Current id: {id}</Text>
{showButtons && id < 2 && (
<Button
title={`Go next ${id + 1}`}
onPress={() => navigation.push('Details', { id: id + 1 })}
/>
)}
{showButtons && id > 0 && (
<Button
onPress={() => navigation.push('Details', { id: id - 1 })}
title={`Go next ${id - 1}`}
/>
)}
<Animated.View style={getStyle(id)} sharedTransitionTag="test" />
</View>
);
};

function createStack() {
const Stack = createNativeStackNavigator();
return () => (
<Stack.Navigator>
<Stack.Screen
name="Details"
initialParams={{ showButtons: true }}
component={Screen as React.ComponentType}
/>
</Stack.Navigator>
);
};

const Tab = createBottomTabNavigator();
const StackA = createStack();
const StackB = createStack();

function TabNavigatorExample() {
return (
<Tab.Navigator screenOptions={{ headerShown: false }}>
<Tab.Screen
name="A"
initialParams={{ id: 0 }}
component={Screen as React.ComponentType}
/>
<Tab.Screen
name="B"
initialParams={{ id: 1 }}
component={Screen as React.ComponentType}
/>
<Tab.Screen name="C" component={StackA} />
<Tab.Screen name="D" component={StackB} />
</Tab.Navigator>
);
};

const styles = StyleSheet.create({
container: {
flex: 1,
paddingTop: 10,
},
box1: {
width: 100,
height: 100,
backgroundColor: 'green',
},
box2: {
width: 200,
height: 100,
backgroundColor: 'blue',
},
box3: {
width: 150,
height: 250,
backgroundColor: 'red',
marginLeft: 50,
},
});

export default TabNavigatorExample;
9 changes: 9 additions & 0 deletions apps/common-app/src/examples/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ import ComposedHandlerDifferentEventsExample from './ComposedHandlerDifferentEve
import ComposedHandlerInternalMergingExample from './ComposedHandlerInternalMergingExample';
import BorderRadiiExample from './SharedElementTransitions/BorderRadii';
import FreezingShareablesExample from './ShareableFreezingExample';
import TabNavigatorExample from './SharedElementTransitions/TabNavigatorExample';

interface Example {
icon?: string;
Expand Down Expand Up @@ -785,13 +786,21 @@ export const EXAMPLES: Record<string, Example> = {
ChangeThemeSharedExample: {
title: '[SET] Change theme',
screen: ChangeThemeSharedExample,
missingOnFabric: true,
},
NestedRotationSharedExample: {
title: '[SET] Nested Transforms',
screen: NestedRotationExample,
missingOnFabric: true,
},
BorderRadiiExample: {
title: '[SET] Border Radii',
screen: BorderRadiiExample,
missingOnFabric: true,
},
TabNavigatorExample: {
title: '[SET] Tab Navigator',
screen: TabNavigatorExample,
missingOnFabric: true,
},
} as const;
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,11 @@ int LayoutAnimationsManager::findPrecedingViewTagForTransition(const int tag) {
return -1;
}

const std::vector<int> &LayoutAnimationsManager::getSharedGroup(const int viewTag) {
const auto &groupSharedTag = viewTagToSharedTag_[viewTag];
return sharedTransitionGroups_[groupSharedTag];
}

#ifndef NDEBUG
std::string LayoutAnimationsManager::getScreenSharedTagPairString(
const int screenTag,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class LayoutAnimationsManager {
void clearSharedTransitionConfig(const int tag);
void cancelLayoutAnimation(jsi::Runtime &rt, const int tag) const;
int findPrecedingViewTagForTransition(const int tag);
const std::vector<int> &getSharedGroup(const int viewTag);
#ifndef NDEBUG
std::string getScreenSharedTagPairString(
const int screenTag,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "LayoutAnimations.h"
#include <vector>
#include "FeaturesConfig.h"
#include "Logger.h"

Expand Down Expand Up @@ -100,10 +101,22 @@ void LayoutAnimations::setFindPrecedingViewTagForTransition(
findPrecedingViewTagForTransitionBlock;
}

void LayoutAnimations::setGetSharedGroupBlock(
GetSharedGroupBlock getSharedGroupBlock) {
getSharedGroupBlock_ = getSharedGroupBlock;
}

int LayoutAnimations::findPrecedingViewTagForTransition(int tag) {
return findPrecedingViewTagForTransitionBlock_(tag);
}

jni::local_ref<JArrayInt> LayoutAnimations::getSharedGroup(const int tag) {
const auto &group = getSharedGroupBlock_(tag);
auto jGroup = JArrayInt::newArray(group.size());
jGroup->setRegion(0, group.size(), group.data());
return jGroup;
}

void LayoutAnimations::registerNatives() {
registerHybrid({
makeNativeMethod("initHybrid", LayoutAnimations::initHybrid),
Expand All @@ -124,6 +137,7 @@ void LayoutAnimations::registerNatives() {
makeNativeMethod(
"findPrecedingViewTagForTransition",
LayoutAnimations::findPrecedingViewTagForTransition),
makeNativeMethod("getSharedGroup", LayoutAnimations::getSharedGroup),
#ifndef NDEBUG
makeNativeMethod(
"checkDuplicateSharedTag", LayoutAnimations::checkDuplicateSharedTag),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <jsi/jsi.h>
#include <memory>
#include <string>
#include <vector>
#include "JNIHelper.h"

namespace reanimated {
Expand All @@ -22,6 +23,7 @@ class LayoutAnimations : public jni::HybridClass<LayoutAnimations> {
using ClearAnimationConfigBlock = std::function<void(int)>;
using CancelAnimationBlock = std::function<void(int)>;
using FindPrecedingViewTagForTransitionBlock = std::function<int(int)>;
using GetSharedGroupBlock = std::function<std::vector<int>(const int)>;

public:
static auto constexpr kJavaDescriptor =
Expand Down Expand Up @@ -53,6 +55,7 @@ class LayoutAnimations : public jni::HybridClass<LayoutAnimations> {
void setFindPrecedingViewTagForTransition(
FindPrecedingViewTagForTransitionBlock
findPrecedingViewTagForTransitionBlock);
void setGetSharedGroupBlock(const GetSharedGroupBlock getSharedGroupBlock);

void progressLayoutAnimation(
int tag,
Expand All @@ -62,6 +65,7 @@ class LayoutAnimations : public jni::HybridClass<LayoutAnimations> {
void clearAnimationConfigForTag(int tag);
void cancelAnimationForTag(int tag);
int findPrecedingViewTagForTransition(int tag);
jni::local_ref<JArrayInt> getSharedGroup(const int tag);
piaskowyk marked this conversation as resolved.
Show resolved Hide resolved

private:
friend HybridBase;
Expand All @@ -73,6 +77,7 @@ class LayoutAnimations : public jni::HybridClass<LayoutAnimations> {
CancelAnimationBlock cancelAnimationBlock_;
FindPrecedingViewTagForTransitionBlock
findPrecedingViewTagForTransitionBlock_;
GetSharedGroupBlock getSharedGroupBlock_;
#ifndef NDEBUG
CheckDuplicateSharedTag checkDuplicateSharedTag_;
#endif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -652,6 +652,16 @@ void NativeProxy::setupLayoutAnimations() {
return -1;
}
});

layoutAnimations_->cthis()->setGetSharedGroupBlock(
[weakNativeReanimatedModule](int tag) -> std::vector<int> {
if (auto nativeReanimatedModule = weakNativeReanimatedModule.lock()) {
return nativeReanimatedModule->layoutAnimationsManager()
.getSharedGroup(tag);
} else {
return {};
}
});
}

} // namespace reanimated
Original file line number Diff line number Diff line change
Expand Up @@ -494,7 +494,7 @@ public boolean shouldAnimateExiting(int tag, boolean shouldAnimate) {
}

public boolean hasAnimationForTag(int tag, int type) {
return mNativeMethodsHolder.hasAnimation(tag, type);
return mNativeMethodsHolder != null && mNativeMethodsHolder.hasAnimation(tag, type);
piaskowyk marked this conversation as resolved.
Show resolved Hide resolved
}

public boolean isLayoutAnimationEnabled() {
Expand Down Expand Up @@ -680,7 +680,7 @@ private void cancelAnimationsInSubviews(ViewGroup view) {
}
}

private View resolveView(int tag) {
protected View resolveView(int tag) {
tjzel marked this conversation as resolved.
Show resolved Hide resolved
if (mExitingViews.containsKey(tag)) {
return mExitingViews.get(tag);
} else {
Expand Down Expand Up @@ -718,6 +718,14 @@ public void screenDidLayout(View view) {
mSharedTransitionManager.screenDidLayout(view);
}

public void navigationTabChanged(View previousTab, View newTab) {
mSharedTransitionManager.navigationTabChanged(previousTab, newTab);
}

public void visitNativeTreeAndMakeSnapshot(View view) {
mSharedTransitionManager.visitNativeTreeAndMakeSnapshot(view);
}

public void viewDidLayout(View view) {
mSharedTransitionManager.viewDidLayout(view);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ public LayoutAnimations(ReactApplicationContext context) {

public native int findPrecedingViewTagForTransition(int tag);

public native int[] getSharedGroup(int tag);

private void endLayoutAnimation(int tag, boolean removeView) {
AnimationsManager animationsManager = getAnimationsManager();
if (animationsManager == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,6 @@ public interface NativeMethodsHolder {
int findPrecedingViewTagForTransition(int tag);

void checkDuplicateSharedTag(int viewTag, int screenTag);

int[] getSharedGroup(int viewTag);
piaskowyk marked this conversation as resolved.
Show resolved Hide resolved
}
Original file line number Diff line number Diff line change
Expand Up @@ -214,12 +214,14 @@ public class ReanimatedNativeHierarchyManager extends NativeViewHierarchyManager
private final ReaLayoutAnimator mReaLayoutAnimator;
private final HashMap<Integer, Set<Integer>> mPendingDeletionsForTag = new HashMap<>();
private boolean initOk = true;
private final TabNavigatorObserver mTabNavigatorObserver;

public ReanimatedNativeHierarchyManager(
ViewManagerRegistry viewManagers, ReactApplicationContext reactContext) {
super(viewManagers);

mReaLayoutAnimator = new ReaLayoutAnimator(reactContext, this);
mTabNavigatorObserver = new TabNavigatorObserver(mReaLayoutAnimator);

Class<?> clazz = this.getClass().getSuperclass();
if (clazz == null) {
Expand Down Expand Up @@ -293,6 +295,14 @@ public synchronized void updateLayout(
if (!hasHeader || !container.isLayoutRequested()) {
mReaLayoutAnimator.getAnimationsManager().screenDidLayout(container);
}
View screen = resolveView(tag);
View screenFragmentManager = (View) screen.getParent();
if (screenFragmentManager != null) {
View screenHolder = (View) screenFragmentManager.getParent();
if (ScreensHelper.isScreenContainer(screenHolder)) {
mTabNavigatorObserver.handleScreenContainerUpdate(screen);
}
}
}
View view = resolveView(tag);
if (view != null && mReaLayoutAnimator != null) {
Expand Down
Loading
Loading