From fc6d5064088b21b78d99906a13e5497b84c5409c Mon Sep 17 00:00:00 2001 From: siguangli Date: Mon, 17 Jun 2024 21:20:10 +0800 Subject: [PATCH 1/5] fix(android): remove onSystemUiVisibilityChange listener (#3913) Co-authored-by: siguangli --- .../android-3.0-upgrade-guidelines.md | 3 ++ .../mtt/hippy/HippyEngineManagerImpl.java | 9 ++-- .../adapter/device/DefaultDeviceAdapter.java | 4 +- .../adapter/device/HippyDeviceAdapter.java | 3 +- .../hippy/bridge/HippyBridgeManagerImpl.java | 5 +-- .../mtt/hippy/utils/DimensionsUtil.java | 21 +++------- .../com/tencent/mtt/hippy/HippyRootView.java | 42 ++++++------------- .../com/tencent/renderer/FrameworkProxy.java | 3 +- .../com/tencent/renderer/NativeRender.java | 3 +- .../com/tencent/renderer/NativeRenderer.java | 6 +-- 10 files changed, 35 insertions(+), 64 deletions(-) diff --git a/docs/development/android-3.0-upgrade-guidelines.md b/docs/development/android-3.0-upgrade-guidelines.md index facbc2a9077..e49e5892009 100644 --- a/docs/development/android-3.0-upgrade-guidelines.md +++ b/docs/development/android-3.0-upgrade-guidelines.md @@ -123,6 +123,9 @@ } ``` +7. HippyDeviceAdapter中reviseDimensionIfNeed接口参数调整
+ 由于HippyRootView不再监听onSystemUiVisibilityChange消息,移除shouldUseScreenDisplay和systemUiVisibilityChanged两个无效参数。 +
# 新增特性 diff --git a/framework/android/src/main/java/com/tencent/mtt/hippy/HippyEngineManagerImpl.java b/framework/android/src/main/java/com/tencent/mtt/hippy/HippyEngineManagerImpl.java index 1e525025c06..a8249d6f0c0 100644 --- a/framework/android/src/main/java/com/tencent/mtt/hippy/HippyEngineManagerImpl.java +++ b/framework/android/src/main/java/com/tencent/mtt/hippy/HippyEngineManagerImpl.java @@ -269,26 +269,25 @@ public void onSizeChanged(int rootId, int w, int h, int ow, int oh) { } @Override - public void updateDimension(int width, int height, boolean shouldUseScreenDisplay, - boolean systemUiVisibilityChanged) { + public void updateDimension(int width, int height) { if (mEngineContext == null) { return; } Context context = mEngineContext.getGlobalConfigs().getContext(); HippyMap dimensionMap = DimensionsUtil - .getDimensions(width, height, context, shouldUseScreenDisplay); + .getDimensions(width, height, context); int dimensionW = 0; int dimensionH = 0; if (dimensionMap != null) { HippyMap windowMap = dimensionMap.getMap("windowPhysicalPixels"); dimensionW = windowMap.getInt("width"); dimensionH = windowMap.getInt("height"); + LogUtils.i(TAG, "updateDimension: " + dimensionMap); } if (height < 0 || dimensionW == dimensionH) { HippyDeviceAdapter deviceAdapter = mEngineContext.getGlobalConfigs().getDeviceAdapter(); if (deviceAdapter != null) { - deviceAdapter.reviseDimensionIfNeed(context, dimensionMap, shouldUseScreenDisplay, - systemUiVisibilityChanged); + deviceAdapter.reviseDimensionIfNeed(context, dimensionMap); } } DimensionsUtil.convertDimensionsToDp(dimensionMap); diff --git a/framework/android/src/main/java/com/tencent/mtt/hippy/adapter/device/DefaultDeviceAdapter.java b/framework/android/src/main/java/com/tencent/mtt/hippy/adapter/device/DefaultDeviceAdapter.java index e9368cf3715..50620b7fd90 100644 --- a/framework/android/src/main/java/com/tencent/mtt/hippy/adapter/device/DefaultDeviceAdapter.java +++ b/framework/android/src/main/java/com/tencent/mtt/hippy/adapter/device/DefaultDeviceAdapter.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.tencent.mtt.hippy.adapter.device; import android.content.Context; @@ -24,8 +25,7 @@ public class DefaultDeviceAdapter implements HippyDeviceAdapter { @SuppressWarnings("unused") @Override - public void reviseDimensionIfNeed(Context context, HippyMap dimensionMap, - boolean shouldUseScreenDisplay, boolean systemUiVisibilityChanged) { + public void reviseDimensionIfNeed(Context context, HippyMap dimensionMap) { // Default do nothing here } } diff --git a/framework/android/src/main/java/com/tencent/mtt/hippy/adapter/device/HippyDeviceAdapter.java b/framework/android/src/main/java/com/tencent/mtt/hippy/adapter/device/HippyDeviceAdapter.java index a55b66e3267..2b174b8dc20 100644 --- a/framework/android/src/main/java/com/tencent/mtt/hippy/adapter/device/HippyDeviceAdapter.java +++ b/framework/android/src/main/java/com/tencent/mtt/hippy/adapter/device/HippyDeviceAdapter.java @@ -23,6 +23,5 @@ public interface HippyDeviceAdapter { @SuppressWarnings({"EmptyMethod", "deprecation"}) - void reviseDimensionIfNeed(Context context, HippyMap dimensionMap, boolean shouldUseScreenDisplay, - boolean systemUiVisibilityChanged); + void reviseDimensionIfNeed(Context context, HippyMap dimensionMap); } diff --git a/framework/android/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridgeManagerImpl.java b/framework/android/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridgeManagerImpl.java index 72a0af5297d..ab830ac3b00 100644 --- a/framework/android/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridgeManagerImpl.java +++ b/framework/android/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridgeManagerImpl.java @@ -506,13 +506,12 @@ String getGlobalConfigs() { assert (context != null); HippyMap globalParams = new HippyMap(); - HippyMap dimensionMap = DimensionsUtil.getDimensions(-1, -1, context, false); + HippyMap dimensionMap = DimensionsUtil.getDimensions(-1, -1, context); if (mContext.getGlobalConfigs() != null && mContext.getGlobalConfigs().getDeviceAdapter() != null) { mContext.getGlobalConfigs().getDeviceAdapter() - .reviseDimensionIfNeed(context, dimensionMap, false, - false); + .reviseDimensionIfNeed(context, dimensionMap); } DimensionsUtil.convertDimensionsToDp(dimensionMap); globalParams.pushMap("Dimensions", dimensionMap); diff --git a/modules/android/hippy_support/src/main/java/com/tencent/mtt/hippy/utils/DimensionsUtil.java b/modules/android/hippy_support/src/main/java/com/tencent/mtt/hippy/utils/DimensionsUtil.java index 22a6473dcd7..d2c60f438f2 100644 --- a/modules/android/hippy_support/src/main/java/com/tencent/mtt/hippy/utils/DimensionsUtil.java +++ b/modules/android/hippy_support/src/main/java/com/tencent/mtt/hippy/utils/DimensionsUtil.java @@ -169,8 +169,7 @@ public static int getStatusBarHeight() { return STATUS_BAR_HEIGHT; } - public static HippyMap getDimensions(int ww, int wh, Context context, - boolean shouldUseScreenDisplay) { + public static HippyMap getDimensions(int ww, int wh, Context context) { if (context == null) { return null; } @@ -191,19 +190,11 @@ public static HippyMap getDimensions(int ww, int wh, Context context, int navigationBarHeight = getNavigationBarHeight(context); HippyMap windowDisplayMetricsMap = new HippyMap(); - if (shouldUseScreenDisplay) { - windowDisplayMetricsMap.pushDouble("width", ww >= 0 ? ww : screenDisplayMetrics.widthPixels); - windowDisplayMetricsMap.pushDouble("height", wh >= 0 ? wh : screenDisplayMetrics.heightPixels); - windowDisplayMetricsMap.pushDouble("scale", screenDisplayMetrics.density); - windowDisplayMetricsMap.pushDouble("fontScale", screenDisplayMetrics.scaledDensity); - windowDisplayMetricsMap.pushDouble("densityDpi", screenDisplayMetrics.densityDpi); - } else { - windowDisplayMetricsMap.pushDouble("width", ww >= 0 ? ww : windowDisplayMetrics.widthPixels); - windowDisplayMetricsMap.pushDouble("height", wh >= 0 ? wh : windowDisplayMetrics.heightPixels); - windowDisplayMetricsMap.pushDouble("scale", windowDisplayMetrics.density); - windowDisplayMetricsMap.pushDouble("fontScale", windowDisplayMetrics.scaledDensity); - windowDisplayMetricsMap.pushDouble("densityDpi", windowDisplayMetrics.densityDpi); - } + windowDisplayMetricsMap.pushDouble("width", ww >= 0 ? ww : windowDisplayMetrics.widthPixels); + windowDisplayMetricsMap.pushDouble("height", wh >= 0 ? wh : windowDisplayMetrics.heightPixels); + windowDisplayMetricsMap.pushDouble("scale", windowDisplayMetrics.density); + windowDisplayMetricsMap.pushDouble("fontScale", windowDisplayMetrics.scaledDensity); + windowDisplayMetricsMap.pushDouble("densityDpi", windowDisplayMetrics.densityDpi); windowDisplayMetricsMap.pushDouble("statusBarHeight", statusBarHeight); windowDisplayMetricsMap.pushDouble("navigationBarHeight", navigationBarHeight); dimensionMap.pushMap("windowPhysicalPixels", windowDisplayMetricsMap); diff --git a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/HippyRootView.java b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/HippyRootView.java index efa30b06893..23a1cb21eff 100644 --- a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/HippyRootView.java +++ b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/HippyRootView.java @@ -53,7 +53,6 @@ public HippyRootView(Context context, int instanceId, int rootId) { setTag(tagMap); if (rootId != SCREEN_SNAPSHOT_ROOT_ID) { getViewTreeObserver().addOnGlobalLayoutListener(getGlobalLayoutListener()); - setOnSystemUiVisibilityChangeListener(getGlobalLayoutListener()); } } @@ -89,7 +88,7 @@ protected void onSizeChanged(int w, int h, int ow, int oh) { super.onSizeChanged(w, h, ow, oh); NativeRender nativeRenderer = NativeRendererManager.getNativeRenderer(getContext()); if ((w != ow || h != oh) && nativeRenderer != null) { - nativeRenderer.updateDimension(w, h, false, false); + nativeRenderer.updateDimension(w, h); nativeRenderer.onSizeChanged(getId(), w, h, ow, oh); } } @@ -122,29 +121,23 @@ private GlobalLayoutListener getGlobalLayoutListener() { return mGlobalLayoutListener; } - private class GlobalLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener, - OnSystemUiVisibilityChangeListener { + private class GlobalLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener { private int mOrientation = ORIENTATION_UNDEFINED; - @SuppressWarnings("RedundantIfStatement") - @Override - public void onSystemUiVisibilityChange(int visibility) { - if ((visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) { - checkUpdateDimension(false, true); - } else { - checkUpdateDimension(true, true); - } - } - @Override public void onGlobalLayout() { - if (getContext() != null) { - int orientation = getContext().getResources().getConfiguration().orientation; - if (orientation != mOrientation) { - mOrientation = orientation; - sendOrientationChangeEvent(mOrientation); - checkUpdateDimension(false, false); + Context context = getContext(); + if (context == null) { + return; + } + int orientation = context.getResources().getConfiguration().orientation; + if (orientation != mOrientation) { + mOrientation = orientation; + sendOrientationChangeEvent(mOrientation); + NativeRender nativeRenderer = NativeRendererManager.getNativeRenderer(context); + if (nativeRenderer != null) { + nativeRenderer.updateDimension(-1, -1); } } } @@ -152,14 +145,5 @@ public void onGlobalLayout() { private void sendOrientationChangeEvent(int orientation) { LogUtils.d(TAG, "sendOrientationChangeEvent: orientation=" + orientation); } - - private void checkUpdateDimension(boolean shouldUseScreenDisplay, - boolean systemUiVisibilityChanged) { - NativeRender nativeRenderer = NativeRendererManager.getNativeRenderer(getContext()); - if (nativeRenderer != null) { - nativeRenderer.updateDimension(-1, -1, shouldUseScreenDisplay, - systemUiVisibilityChanged); - } - } } } diff --git a/renderer/native/android/src/main/java/com/tencent/renderer/FrameworkProxy.java b/renderer/native/android/src/main/java/com/tencent/renderer/FrameworkProxy.java index afb20bd984b..2093b63c536 100644 --- a/renderer/native/android/src/main/java/com/tencent/renderer/FrameworkProxy.java +++ b/renderer/native/android/src/main/java/com/tencent/renderer/FrameworkProxy.java @@ -59,8 +59,7 @@ public interface FrameworkProxy { void handleNativeException(Exception exception); - void updateDimension(int width, int height, boolean shouldUseScreenDisplay, - boolean systemUiVisibilityChanged); + void updateDimension(int width, int height); void onSizeChanged(int rootId, int w, int h, int ow, int oh); } diff --git a/renderer/native/android/src/main/java/com/tencent/renderer/NativeRender.java b/renderer/native/android/src/main/java/com/tencent/renderer/NativeRender.java index 86c8ecbfc02..0a3e18eeb4c 100644 --- a/renderer/native/android/src/main/java/com/tencent/renderer/NativeRender.java +++ b/renderer/native/android/src/main/java/com/tencent/renderer/NativeRender.java @@ -103,8 +103,7 @@ VirtualNode createVirtualNode(int rootId, int id, int pid, int index, @NonNull S void onSizeChanged(int rootId, int nodeId, int width, int height, boolean isSync); - void updateDimension(int width, int height, boolean shouldUseScreenDisplay, - boolean systemUiVisibilityChanged); + void updateDimension(int width, int height); void dispatchEvent(int rootId, int nodeId, @NonNull String eventName, @Nullable Object params, boolean useCapture, boolean useBubble, EventType eventType); diff --git a/renderer/native/android/src/main/java/com/tencent/renderer/NativeRenderer.java b/renderer/native/android/src/main/java/com/tencent/renderer/NativeRenderer.java index f241db49e0e..b78c119fca8 100644 --- a/renderer/native/android/src/main/java/com/tencent/renderer/NativeRenderer.java +++ b/renderer/native/android/src/main/java/com/tencent/renderer/NativeRenderer.java @@ -403,11 +403,9 @@ public void onSizeChanged(int rootId, int nodeId, int width, int height, boolean } @Override - public void updateDimension(int width, int height, boolean shouldUseScreenDisplay, - boolean systemUiVisibilityChanged) { + public void updateDimension(int width, int height) { if (mFrameworkProxy != null) { - mFrameworkProxy.updateDimension(width, height, shouldUseScreenDisplay, - systemUiVisibilityChanged); + mFrameworkProxy.updateDimension(width, height); } } From 22df117146db95fd4cbb4d4b7eff370179bc7de6 Mon Sep 17 00:00:00 2001 From: wwwcg Date: Thu, 13 Jun 2024 15:40:02 +0800 Subject: [PATCH 2/5] refactor(ios): add gesture event delegate for hippyBridge useful for external data reporting of hippy gesture events --- .../ios/base/bridge/HippyBridgeDelegate.h | 23 ++++++++++++++-- .../native/ios/renderer/HippyUIManager.mm | 6 ----- .../touch_handler/HippyTouchHandler.h | 2 +- .../touch_handler/HippyTouchHandler.mm | 27 ++++++++++++++----- 4 files changed, 43 insertions(+), 15 deletions(-) diff --git a/framework/ios/base/bridge/HippyBridgeDelegate.h b/framework/ios/base/bridge/HippyBridgeDelegate.h index b3e32225b54..da1fad1a15e 100644 --- a/framework/ios/base/bridge/HippyBridgeDelegate.h +++ b/framework/ios/base/bridge/HippyBridgeDelegate.h @@ -21,10 +21,29 @@ */ @class HippyBridge; - #import "HippyInvalidating.h" -@protocol HippyBridgeDelegate + +/// An Interceptor protocol for gesture events. +@protocol HippyTouchEventInterceptorProtocol + +@optional + +/// A centralized handler for event sending, +/// which hippy calls before sending events to the JS side. +/// +/// This method is convenient for external data reporting of hippy gesture events +/// - Parameters: +/// - eventName: name of event +/// - point: point in hippyRootView +/// - view: target view +- (void)willSendGestureEvent:(NSString *)eventName withPagePoint:(CGPoint)point toView:(UIView *)view; + +@end + + +/// Delegate of HippyBridge +@protocol HippyBridgeDelegate @optional diff --git a/renderer/native/ios/renderer/HippyUIManager.mm b/renderer/native/ios/renderer/HippyUIManager.mm index 0df1bd9691f..23e9dfb2169 100644 --- a/renderer/native/ios/renderer/HippyUIManager.mm +++ b/renderer/native/ios/renderer/HippyUIManager.mm @@ -1261,8 +1261,6 @@ - (void)addClickEventListenerForView:(UIView *)view onRootNode:(std::weak_ptr)rootNode { @@ -1295,8 +1293,6 @@ - (void)addLongClickEventListenerForView:(UIView *)view onRootNode:(std::weak_pt }; [view setOnLongClick:eventListener]; } - else { - } } - (void)addPressEventListenerForType:(const std::string &)type @@ -1460,8 +1456,6 @@ - (void)addPropertyEvent:(const std::string &)name }]; } } - else { - } } #pragma mark - diff --git a/renderer/native/ios/renderer/touch_handler/HippyTouchHandler.h b/renderer/native/ios/renderer/touch_handler/HippyTouchHandler.h index 20f5006ef50..9142c6b2850 100644 --- a/renderer/native/ios/renderer/touch_handler/HippyTouchHandler.h +++ b/renderer/native/ios/renderer/touch_handler/HippyTouchHandler.h @@ -24,7 +24,7 @@ #import "HippyBridge.h" /// Handles all gestures in Hippy -@interface HippyTouchHandler : UIGestureRecognizer +@interface HippyTouchHandler : UIGestureRecognizer /// Init method /// - Parameters: diff --git a/renderer/native/ios/renderer/touch_handler/HippyTouchHandler.mm b/renderer/native/ios/renderer/touch_handler/HippyTouchHandler.mm index 3bd8dd5c905..6956d428b01 100644 --- a/renderer/native/ios/renderer/touch_handler/HippyTouchHandler.mm +++ b/renderer/native/ios/renderer/touch_handler/HippyTouchHandler.mm @@ -200,8 +200,8 @@ - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { point = [view convertPoint:point toView:_rootView]; if (view.onTouchDown) { if ([self checkViewBelongToTouchHandler:view]) { -// view.onTouchDown(@{ @"page_x": @(point.x), @"page_y": @(point.y) }); const char *name = hippy::kTouchStartEvent; + [self willSendGestureEvent:@(name) withPagePoint:point toView:view]; view.onTouchDown(point, [self canCapture:name], [self canBubble:name], @@ -269,8 +269,8 @@ - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { point = [view convertPoint:point toView:_rootView]; if (view.onTouchEnd) { if ([self checkViewBelongToTouchHandler:view]) { -// view.onTouchEnd(@{ @"page_x": @(point.x), @"page_y": @(point.y) }); const char *name = hippy::kTouchEndEvent; + [self willSendGestureEvent:@(name) withPagePoint:point toView:view]; view.onTouchEnd(point, [self canCapture:name], [self canBubble:name], @@ -288,8 +288,8 @@ - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { point = [theView convertPoint:point toView:_rootView]; if (theView.onTouchEnd) { if ([self checkViewBelongToTouchHandler:theView]) { -// theView.onTouchEnd(@{ @"page_x": @(point.x), @"page_y": @(point.y) }); const char *name = hippy::kTouchEndEvent; + [self willSendGestureEvent:@(name) withPagePoint:point toView:theView]; theView.onTouchEnd(point, [self canCapture:name], [self canBubble:name], @@ -306,6 +306,7 @@ - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if (pressOutView == _onPressInView && pressOutView.onPressOut) { if ([self checkViewBelongToTouchHandler:pressOutView]) { const char *name = hippy::kPressOut; + [self willSendGestureEvent:@(name) withPagePoint:CGPointZero toView:pressOutView]; pressOutView.onPressOut(CGPointZero, [self canCapture:name], [self canBubble:name], @@ -321,6 +322,7 @@ - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if (!_bLongClick && clickView.onClick) { if ([self checkViewBelongToTouchHandler:clickView]) { const char *name = hippy::kClickEvent; + [self willSendGestureEvent:@(name) withPagePoint:CGPointZero toView:clickView]; clickView.onClick(CGPointZero, [self canCapture:name], [self canBubble:name], @@ -377,8 +379,8 @@ - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event point = [view convertPoint:point toView:_rootView]; if (view.onTouchCancel) { if ([self checkViewBelongToTouchHandler:view]) { -// view.onTouchCancel(@{ @"page_x": @(point.x), @"page_y": @(point.y) }); const char *name = hippy::kTouchCancelEvent; + [self willSendGestureEvent:@(name) withPagePoint:point toView:view]; view.onTouchCancel(point, [self canCapture:name], [self canBubble:name], @@ -394,6 +396,7 @@ - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event if (pressOutView == _onPressInView && pressOutView.onPressOut) { if ([self checkViewBelongToTouchHandler:pressOutView]) { const char *name = hippy::kPressOut; + [self willSendGestureEvent:@(name) withPagePoint:CGPointZero toView:pressOutView]; pressOutView.onPressOut(CGPointZero, [self canCapture:name], [self canBubble:name], @@ -470,8 +473,8 @@ - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { CGPoint point = [touch locationInView:view]; point = [view convertPoint:point toView:_rootView]; if ([self checkViewBelongToTouchHandler:view]) { -// view.onTouchMove(@{ @"page_x": @(point.x), @"page_y": @(point.y) }); const char *name = hippy::kTouchMoveEvent; + [self willSendGestureEvent:@(name) withPagePoint:point toView:view]; view.onTouchMove(point, [self canCapture:name], [self canBubble:name], @@ -517,6 +520,7 @@ - (void)scheduleTimer:(__unused NSTimer *)timer { if (_onPressInView && _onPressInView.onPressIn) { if ([self checkViewBelongToTouchHandler:_onPressInView]) { const char *name = hippy::kPressIn; + [self willSendGestureEvent:@(name) withPagePoint:CGPointZero toView:_onPressInView]; _onPressInView.onPressIn(CGPointZero, [self canCapture:name], [self canBubble:name], @@ -533,8 +537,8 @@ - (void)longClickTimer:(__unused NSTimer *)timer { _bLongClick = YES; if (_onLongClickView && _onLongClickView.onLongClick) { if ([self checkViewBelongToTouchHandler:_onLongClickView]) { -// _onLongClickView.onLongClick(@{}); const char *name = hippy::kLongClickEvent; + [self willSendGestureEvent:@(name) withPagePoint:CGPointZero toView:_onLongClickView]; _onLongClickView.onLongClick(CGPointZero, [self canCapture:name], [self canBubble:name], @@ -692,6 +696,7 @@ - (void)cancelTouch { if (_onPressInView.onPressOut) { if ([self checkViewBelongToTouchHandler:_onPressInView]) { const char *name = hippy::kPressOut; + [self willSendGestureEvent:@(name) withPagePoint:CGPointZero toView:_onPressInView]; _onPressInView.onPressOut(CGPointZero, [self canCapture:name], [self canBubble:name], @@ -720,6 +725,7 @@ - (void)reset { if (_onPressInView.onPressOut) { if ([self checkViewBelongToTouchHandler:_onPressInView]) { const char *name = hippy::kPressOut; + [self willSendGestureEvent:@(name) withPagePoint:CGPointZero toView:_onPressInView]; _onPressInView.onPressOut(CGPointZero, [self canCapture:name], [self canBubble:name], @@ -829,5 +835,14 @@ - (BOOL)canBePreventInBubbling:(const char *)name { } +#pragma mark - HippyTouchEventInterceptorProtocol + +- (void)willSendGestureEvent:(NSString *)eventName withPagePoint:(CGPoint)point toView:(UIView *)view { + if ([_bridge.delegate respondsToSelector:@selector(willSendGestureEvent:withPagePoint:toView:)]) { + [_bridge.delegate willSendGestureEvent:eventName withPagePoint:point toView:view]; + } +} + + @end From 201807b967643c1e18213183d8614f73a3c15207 Mon Sep 17 00:00:00 2001 From: wwwcg Date: Mon, 17 Jun 2024 22:09:52 +0800 Subject: [PATCH 3/5] fix(ios): potential thread race in HippyJSExecutor --- .../ios/base/executors/HippyJSExecutor.mm | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/framework/ios/base/executors/HippyJSExecutor.mm b/framework/ios/base/executors/HippyJSExecutor.mm index 21f305e39c6..6351b1bea37 100644 --- a/framework/ios/base/executors/HippyJSExecutor.mm +++ b/framework/ios/base/executors/HippyJSExecutor.mm @@ -78,14 +78,16 @@ @interface HippyJSExecutor () { // Set at setUp time: id _contextWrapper; - NSMutableArray *_pendingCalls; __weak HippyBridge *_bridge; #ifdef JS_JSC BOOL _isInspectable; #endif //JS_JSC } -@property(readwrite, assign) BOOL ready; +/// Whether JSExecutor has done setup. +@property (nonatomic, assign) BOOL ready; +/// Pending blocks to be executed on JS queue. +@property (nonatomic, strong) NSMutableArray *pendingCalls;; @end @@ -211,12 +213,19 @@ - (void)setup { strongSelf.contextCreatedBlock(strongSelf->_contextWrapper); } scope->SyncInitialize(); - strongSelf.ready = YES; - NSArray *pendingCalls = [strongSelf->_pendingCalls copy]; + + // execute pending blocks + NSArray *pendingCalls; + @synchronized (strongSelf) { + strongSelf.ready = YES; + pendingCalls = [strongSelf.pendingCalls copy]; + [strongSelf.pendingCalls removeAllObjects]; + } [pendingCalls enumerateObjectsUsingBlock:^(dispatch_block_t _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { [strongSelf executeBlockOnJavaScriptQueue:obj]; }]; - [strongSelf->_pendingCalls removeAllObjects]; + + // performance record auto entry = scope->GetPerformance()->PerformanceNavigation(hippy::kPerfNavigationHippyInit); entry->SetHippyJsEngineInitStart(startPoint); entry->SetHippyJsEngineInitEnd(footstone::TimePoint::SystemNow()); @@ -245,7 +254,7 @@ - (instancetype)initWithEngineKey:(NSString *)engineKey bridge:(HippyBridge *)br self.bridge = bridge; self.ready = NO; - _pendingCalls = [NSMutableArray arrayWithCapacity:4]; + self.pendingCalls = [NSMutableArray array]; HippyLogInfo(@"[Hippy_OC_Log][Life_Circle],HippyJSCExecutor Init %p, engineKey:%@", self, engineKey); } @@ -595,9 +604,11 @@ static id executeApplicationScript(NSData *script, NSURL *sourceURL, SharedCtxPt } - (void)executeBlockOnJavaScriptQueue:(dispatch_block_t)block { - if (!self.ready) { - [_pendingCalls addObject:block]; - return; + @synchronized (self) { + if (!self.ready) { + [self.pendingCalls addObject:block]; + return; + } } auto engine = [[HippyJSEnginesMapper defaultInstance] JSEngineResourceForKey:self.enginekey]->GetEngine(); if (engine) { @@ -611,9 +622,11 @@ - (void)executeBlockOnJavaScriptQueue:(dispatch_block_t)block { } - (void)executeAsyncBlockOnJavaScriptQueue:(dispatch_block_t)block { - if (!self.ready) { - [_pendingCalls addObject:block]; - return; + @synchronized (self) { + if (!self.ready) { + [self.pendingCalls addObject:block]; + return; + } } auto engine = [[HippyJSEnginesMapper defaultInstance] JSEngineResourceForKey:self.enginekey]->GetEngine(); if (engine) { From d8d3a6f9a9d7c7be5acee885f28b990902b150c8 Mon Sep 17 00:00:00 2001 From: wwwcg Date: Thu, 23 May 2024 17:20:17 +0800 Subject: [PATCH 4/5] chore(ios): add addFrameCallback method for devtools to avoid warning Note that the implementation of this method is empty --- .../native/ios/renderer/component/view/HippyViewManager.mm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/renderer/native/ios/renderer/component/view/HippyViewManager.mm b/renderer/native/ios/renderer/component/view/HippyViewManager.mm index 4b797611b9c..7ff057335fd 100644 --- a/renderer/native/ios/renderer/component/view/HippyViewManager.mm +++ b/renderer/native/ios/renderer/component/view/HippyViewManager.mm @@ -198,6 +198,13 @@ - (void)measureInAppWindow:(NSNumber *)componentTag }]; } +HIPPY_EXPORT_METHOD(addFrameCallback:(nonnull NSNumber *)hippyTag + params:(NSDictionary *__nonnull)params + callback:(HippyPromiseResolveBlock)callback) { + // For devtools + // Leave the implementation empty for now. +} + #pragma mark - View properties HIPPY_EXPORT_VIEW_PROPERTY(accessibilityLabel, NSString) From 473cf27cce2d32433366f20ab325f2318de33c06 Mon Sep 17 00:00:00 2001 From: zealotchen Date: Wed, 19 Jun 2024 11:30:46 +0800 Subject: [PATCH 5/5] feat(doc): update js doc for 3.3 --- .../react-vue-3.0-upgrade-guidelines.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/development/react-vue-3.0-upgrade-guidelines.md b/docs/development/react-vue-3.0-upgrade-guidelines.md index 94c2707d153..af2ee3f5da6 100644 --- a/docs/development/react-vue-3.0-upgrade-guidelines.md +++ b/docs/development/react-vue-3.0-upgrade-guidelines.md @@ -95,6 +95,24 @@ 3. hippy-react animation 事件监听不再支持 onRNfqbAnimationXX 兼容写法,统一用 onHippyAnimationXX 或者 onAnimationXX +4. hippy-react 初始化动画对象(new Animation),需要在根节点渲染之后,否则会因为 Dom Manager未创建提示报错 + hippy-vue/hippy-vue-next 初始化动画对象(new Animation),需要在 Vue.start 回调之后,否则会因为 Dom Manager未创建提示报错 + +5. hippy-react/hippy-vue/hippy-vue-next 如果使用了颜色属性的渐变动画,需要显示指定 color 单位,添加 valueType:'color' 字段,例如: + +``` javascript + animation: new Animation({ + startValue: 'red', + toValue: 'yellow', + valueType: 'color', // 颜色动画需显式指定color单位 + duration: 1000, + delay: 0, + mode: 'timing', + timingFunction: 'linear', + }), +``` + + # 验证关注点 一、Hippy 3.0 前端架构升级主要有如下改动点: