From ff3569e1e5a8dc330cdb750f77486a9a47349f8a Mon Sep 17 00:00:00 2001 From: Hein Rutjes Date: Wed, 4 Sep 2019 17:22:49 +0200 Subject: [PATCH 1/4] test: updated deps in example app --- Example/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Example/package.json b/Example/package.json index 0d731e7..d35fb00 100644 --- a/Example/package.json +++ b/Example/package.json @@ -29,10 +29,10 @@ "react-native-photo-view": "https://github.com/tomtom94/react-native-photo-view", "react-native-reanimated": "^1.2.0", "react-native-screens": "1.0.0-alpha.22", - "react-native-shared-element": "^0.4.3", + "react-native-shared-element": "^0.5.0", "react-native-touchable-scale": "^2.0.0", "react-native-vector-icons": "^6.5.0", - "react-navigation-sharedelement": "^0.4.3", + "react-navigation-sharedelement": "^0.4.4", "react-navigation-stack": "1.4.0", "react-navigation-tabs": "^2.3.0", "react-navigation-transitions": "^1.0.12" From 8025d590faf74bccab5e9710d78f20a511d93b15 Mon Sep 17 00:00:00 2001 From: Hein Rutjes Date: Thu, 5 Sep 2019 10:06:38 +0200 Subject: [PATCH 2/4] refactor(android): fixed non-standard initialization in package (expo) --- .../sharedelement/RNSharedElementModule.java | 18 ++++++++++++------ .../sharedelement/RNSharedElementNode.java | 4 ++-- .../RNSharedElementNodeManager.java | 14 +++++--------- .../sharedelement/RNSharedElementPackage.java | 5 ++--- .../RNSharedElementTransition.java | 18 ++++++++++++------ .../RNSharedElementTransitionManager.java | 19 ++++++++----------- 6 files changed, 41 insertions(+), 37 deletions(-) diff --git a/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementModule.java b/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementModule.java index 38ca6c2..f00ae20 100644 --- a/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementModule.java +++ b/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementModule.java @@ -8,21 +8,27 @@ import com.facebook.react.uimanager.UIBlock; import com.facebook.react.uimanager.UIManagerModule; import com.facebook.react.uimanager.NativeViewHierarchyManager; +import com.facebook.react.module.annotations.ReactModule; +@ReactModule(name = RNSharedElementModule.MODULE_NAME) public class RNSharedElementModule extends ReactContextBaseJavaModule { - private RNSharedElementNodeManager mNodeManager; - + public static final String MODULE_NAME = "RNSharedElementTransition"; static String LOG_TAG = "RNSharedElementModule"; - public RNSharedElementModule(ReactApplicationContext reactContext, RNSharedElementNodeManager nodeManager) { + private RNSharedElementNodeManager mNodeManager; + + public RNSharedElementModule(ReactApplicationContext reactContext) { super(reactContext); - mNodeManager = nodeManager; - mNodeManager.setContext(reactContext); + mNodeManager = new RNSharedElementNodeManager(reactContext); } @Override public String getName() { - return "RNSharedElementTransition"; + return MODULE_NAME; + } + + RNSharedElementNodeManager getNodeManager() { + return mNodeManager; } @ReactMethod diff --git a/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementNode.java b/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementNode.java index 22dd773..4661139 100644 --- a/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementNode.java +++ b/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementNode.java @@ -30,12 +30,12 @@ abstract class RetryRunnable implements Runnable { class RNSharedElementNode { static private String LOG_TAG = "RNSharedElementNode"; + private Context mContext; private int mReactTag; private View mView; private View mAncestorView; private boolean mIsParent; private ReadableMap mStyleConfig; - private Context mContext; private View mResolvedView; private int mRefCount; private int mHideRefCount; @@ -47,7 +47,7 @@ class RNSharedElementNode { private BaseControllerListener mDraweeControllerListener; private Handler mRetryHandler; - RNSharedElementNode(int reactTag, View view, boolean isParent, View ancestorView, ReadableMap styleConfig, Context context) { + RNSharedElementNode(Context context, int reactTag, View view, boolean isParent, View ancestorView, ReadableMap styleConfig) { mReactTag = reactTag; mView = view; mAncestorView = ancestorView; diff --git a/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementNodeManager.java b/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementNodeManager.java index 6cb9fb9..454b9d1 100644 --- a/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementNodeManager.java +++ b/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementNodeManager.java @@ -14,6 +14,10 @@ class RNSharedElementNodeManager { private NativeViewHierarchyManager mNativeViewHierarchyManager; private Context mContext; + RNSharedElementNodeManager(Context context) { + mContext = context; + } + void setNativeViewHierarchyManager(NativeViewHierarchyManager nativeViewHierarchyManager) { mNativeViewHierarchyManager = nativeViewHierarchyManager; } @@ -22,14 +26,6 @@ NativeViewHierarchyManager getNativeViewHierarchyManager() { return mNativeViewHierarchyManager; } - void setContext(Context context) { - mContext = context; - } - - Context getContext() { - return mContext; - } - RNSharedElementNode acquire(int reactTag, View view, boolean isParent, View ancestor, ReadableMap styleConfig) { synchronized (mNodes) { RNSharedElementNode node = mNodes.get(reactTag); @@ -37,7 +33,7 @@ RNSharedElementNode acquire(int reactTag, View view, boolean isParent, View ance node.setRefCount(node.getRefCount() + 1); return node; } - node = new RNSharedElementNode(reactTag, view, isParent, ancestor, styleConfig, mContext); + node = new RNSharedElementNode(mContext, reactTag, view, isParent, ancestor, styleConfig); mNodes.put(reactTag, node); return node; } diff --git a/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementPackage.java b/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementPackage.java index aa1977b..1a8fb47 100644 --- a/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementPackage.java +++ b/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementPackage.java @@ -8,15 +8,14 @@ import com.facebook.react.uimanager.ViewManager; public class RNSharedElementPackage implements ReactPackage { - private RNSharedElementNodeManager nodeManager = new RNSharedElementNodeManager(); @Override public List createNativeModules(ReactApplicationContext reactContext) { - return Arrays.asList(new RNSharedElementModule(reactContext, this.nodeManager)); + return Arrays.asList(new RNSharedElementModule(reactContext)); } @Override public List createViewManagers(ReactApplicationContext reactContext) { - return Arrays.asList(new RNSharedElementTransitionManager(reactContext, this.nodeManager)); + return Arrays.asList(new RNSharedElementTransitionManager(reactContext)); } } diff --git a/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementTransition.java b/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementTransition.java index a68a614..4a9f0f6 100644 --- a/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementTransition.java +++ b/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementTransition.java @@ -33,6 +33,7 @@ enum Item { public int getValue() { return value; } } + private RNSharedElementNodeManager mNodeManager = null; private RNSharedElementAnimation mAnimation = RNSharedElementAnimation.MOVE; private RNSharedElementResize mResize = RNSharedElementResize.STRETCH; private RNSharedElementAlign mAlign = RNSharedElementAlign.CENTER_CENTER; @@ -48,6 +49,7 @@ enum Item { public RNSharedElementTransition(ThemedReactContext context, RNSharedElementNodeManager nodeManager) { super(context); + mNodeManager = nodeManager; mItems.add(new RNSharedElementTransitionItem(nodeManager, "start")); mItems.add(new RNSharedElementTransitionItem(nodeManager, "end")); @@ -58,39 +60,43 @@ public RNSharedElementTransition(ThemedReactContext context, RNSharedElementNode addView(mEndView); } - public void releaseData() { + void releaseData() { for (RNSharedElementTransitionItem item : mItems) { item.setNode(null); } } - public void setItemNode(Item item, RNSharedElementNode node) { + RNSharedElementNodeManager getNodeManager() { + return mNodeManager; + } + + void setItemNode(Item item, RNSharedElementNode node) { mItems.get(item.getValue()).setNode(node); requestStylesAndContent(false); } - public void setAnimation(final RNSharedElementAnimation animation) { + void setAnimation(final RNSharedElementAnimation animation) { if (mAnimation != animation) { mAnimation = animation; updateLayout(); } } - public void setResize(final RNSharedElementResize resize) { + void setResize(final RNSharedElementResize resize) { if (mResize != resize) { mResize = resize; updateLayout(); } } - public void setAlign(final RNSharedElementAlign align) { + void setAlign(final RNSharedElementAlign align) { if (mAlign != align) { mAlign = align; updateLayout(); } } - public void setNodePosition(final float nodePosition) { + void setNodePosition(final float nodePosition) { if (mNodePosition != nodePosition) { //Log.d(LOG_TAG, "setNodePosition " + nodePosition + ", mInitialLayoutPassCompleted: " + mInitialLayoutPassCompleted); mNodePosition = nodePosition; diff --git a/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementTransitionManager.java b/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementTransitionManager.java index 24f5667..59ea26d 100644 --- a/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementTransitionManager.java +++ b/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementTransitionManager.java @@ -10,17 +10,13 @@ import com.facebook.react.uimanager.SimpleViewManager; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactApplicationContext; public class RNSharedElementTransitionManager extends SimpleViewManager { - private ReactApplicationContext mReactContext; - private RNSharedElementNodeManager mNodeManager; - public static final String REACT_CLASS = "RNSharedElementTransition"; - RNSharedElementTransitionManager(ReactApplicationContext reactContext, RNSharedElementNodeManager nodeManager) { + public RNSharedElementTransitionManager(ReactApplicationContext reactContext) { super(); - mReactContext = reactContext; - mNodeManager = nodeManager; } @Override @@ -40,8 +36,9 @@ public Map getExportedCustomBubblingEventTypeConstants() { } @Override - public RNSharedElementTransition createViewInstance(ThemedReactContext context) { - return new RNSharedElementTransition(context, mNodeManager); + public RNSharedElementTransition createViewInstance(ThemedReactContext reactContext) { + RNSharedElementModule module = (RNSharedElementModule) reactContext.getNativeModule(RNSharedElementModule.class); + return new RNSharedElementTransition(reactContext, module.getNodeManager()); } @Override @@ -79,9 +76,9 @@ private void setViewItem(final RNSharedElementTransition view, RNSharedElementTr int ancestorHandle = ancestorMap.getInt("nodeHandle"); boolean isParent = nodeMap.getBoolean("isParent"); ReadableMap styleConfig = nodeMap.getMap("nodeStyle"); - View nodeView = mNodeManager.getNativeViewHierarchyManager().resolveView(nodeHandle); - View ancestorView = mNodeManager.getNativeViewHierarchyManager().resolveView(ancestorHandle); - RNSharedElementNode node = mNodeManager.acquire(nodeHandle, nodeView, isParent, ancestorView, styleConfig); + View nodeView = view.getNodeManager().getNativeViewHierarchyManager().resolveView(nodeHandle); + View ancestorView = view.getNodeManager().getNativeViewHierarchyManager().resolveView(ancestorHandle); + RNSharedElementNode node = view.getNodeManager().acquire(nodeHandle, nodeView, isParent, ancestorView, styleConfig); view.setItemNode(item, node); } From 0edad2fdb153a3c1109fba44bf4c7390af539adc Mon Sep 17 00:00:00 2001 From: Hein Rutjes Date: Thu, 5 Sep 2019 10:19:49 +0200 Subject: [PATCH 3/4] refactor(android): better addRef/releaseRef node semantics --- .../sharedelement/RNSharedElementNode.java | 18 +++++++++++++----- .../RNSharedElementNodeManager.java | 8 ++++---- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementNode.java b/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementNode.java index 4661139..1150f9b 100644 --- a/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementNode.java +++ b/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementNode.java @@ -70,16 +70,24 @@ int getReactTag() { return mReactTag; } - int getRefCount() { - return mRefCount; + int addRef() { + return ++mRefCount; } - void setRefCount(int refCount) { - mRefCount = refCount; - if (mRefCount == 0) { + int releaseRef() { + if (--mRefCount == 0) { removeDraweeControllerListener(mResolvedView); stopRetryLoop(); + mView = null; + mAncestorView = null; + mStyleConfig = null; + mResolvedView = null; + mContentCache = null; + mContentCallbacks = null; + mStyleCache = null; + mStyleCallbacks = null; } + return mRefCount; } void addHideRef() { diff --git a/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementNodeManager.java b/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementNodeManager.java index 454b9d1..9eccb34 100644 --- a/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementNodeManager.java +++ b/android/src/main/java/com/ijzerenhein/sharedelement/RNSharedElementNodeManager.java @@ -30,7 +30,7 @@ RNSharedElementNode acquire(int reactTag, View view, boolean isParent, View ance synchronized (mNodes) { RNSharedElementNode node = mNodes.get(reactTag); if (node != null) { - node.setRefCount(node.getRefCount() + 1); + node.addRef(); return node; } node = new RNSharedElementNode(mContext, reactTag, view, isParent, ancestor, styleConfig); @@ -41,11 +41,11 @@ RNSharedElementNode acquire(int reactTag, View view, boolean isParent, View ance int release(RNSharedElementNode node) { synchronized (mNodes) { - node.setRefCount(node.getRefCount() - 1); - if (node.getRefCount() == 0) { + int refCount = node.releaseRef(); + if (refCount == 0) { mNodes.remove(node.getReactTag()); } - return node.getRefCount(); + return refCount; } } } \ No newline at end of file From 2228962db6d070d5d20070c3f8b69343ec247273 Mon Sep 17 00:00:00 2001 From: Hein Rutjes Date: Fri, 6 Sep 2019 10:13:22 +0200 Subject: [PATCH 4/4] 0.5.1 --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ea5088..e3d50e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## [0.5.1](https://github.com/IjzerenHein/react-native-shared-element/compare/v0.5.0...v0.5.1) (2019-09-06) + + + # [0.5.0](https://github.com/IjzerenHein/react-native-shared-element/compare/v0.4.3...v0.5.0) (2019-09-04) diff --git a/package.json b/package.json index f072263..be3214c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-shared-element", - "version": "0.5.0", + "version": "0.5.1", "description": "Native shared element transition primitives for react-native 💫", "author": "IjzerenHein ", "keywords": [