@quicktvui/ai 1.0.7 → 1.0.8

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 (204) hide show
  1. package/package.json +1 -1
  2. package/rules/.clinerules +27 -4
  3. package/rules/.cursorrules +27 -4
  4. package/rules/.github/copilot-instructions.md +27 -4
  5. package/rules/.source/hippy/extend_views/CoverFlowHorizontalView.java +203 -0
  6. package/rules/.source/hippy/extend_views/CoverFlowVerticalView.java +203 -0
  7. package/rules/.source/hippy/extend_views/CoverFlowViewController.java +195 -0
  8. package/rules/.source/hippy/extend_views/EngineRootView.java +125 -0
  9. package/rules/.source/hippy/extend_views/ExtendTag.java +83 -0
  10. package/rules/.source/hippy/extend_views/FocusSearchHelper.java +124 -0
  11. package/rules/.source/hippy/extend_views/IRecyclerItemView.java +12 -0
  12. package/rules/.source/hippy/extend_views/JSEventHandleView.java +5 -0
  13. package/rules/.source/hippy/extend_views/MarqueeRelayManager.java +133 -0
  14. package/rules/.source/hippy/extend_views/MarqueeRelayTextView.java +211 -0
  15. package/rules/.source/hippy/extend_views/ProgressBarView.java +83 -0
  16. package/rules/.source/hippy/extend_views/ProgressBarViewController.java +145 -0
  17. package/rules/.source/hippy/extend_views/SeekBarView.java +104 -0
  18. package/rules/.source/hippy/extend_views/SeekBarViewController.java +218 -0
  19. package/rules/.source/hippy/extend_views/StateImageView.java +149 -0
  20. package/rules/.source/hippy/extend_views/StateImageViewController.java +34 -0
  21. package/rules/.source/hippy/extend_views/TVButtonView.java +314 -0
  22. package/rules/.source/hippy/extend_views/TVButtonViewController.java +89 -0
  23. package/rules/.source/hippy/extend_views/TVTextView.java +684 -0
  24. package/rules/.source/hippy/extend_views/TVViewActor.java +811 -0
  25. package/rules/.source/hippy/extend_views/TVViewActorHost.java +6 -0
  26. package/rules/.source/hippy/extend_views/TVViewActor/346/216/245/345/205/245.md +66 -0
  27. package/rules/.source/hippy/extend_views/TemplateUtil.java +336 -0
  28. package/rules/.source/hippy/extend_views/TextButtonNode.java +47 -0
  29. package/rules/.source/hippy/extend_views/TextViewController.java +377 -0
  30. package/rules/.source/hippy/extend_views/fastlist/CenterFlyInAnimator.java +96 -0
  31. package/rules/.source/hippy/extend_views/fastlist/ChildOnScreenScroller.java +548 -0
  32. package/rules/.source/hippy/extend_views/fastlist/ClonedViewTag.java +17 -0
  33. package/rules/.source/hippy/extend_views/fastlist/EventDeliverer.java +55 -0
  34. package/rules/.source/hippy/extend_views/fastlist/FastAdapter.java +4683 -0
  35. package/rules/.source/hippy/extend_views/fastlist/FastAdapterUtil.java +982 -0
  36. package/rules/.source/hippy/extend_views/fastlist/FastFlexNode.java +48 -0
  37. package/rules/.source/hippy/extend_views/fastlist/FastFlexView.java +873 -0
  38. package/rules/.source/hippy/extend_views/fastlist/FastFlexViewController.java +130 -0
  39. package/rules/.source/hippy/extend_views/fastlist/FastItemNode.java +67 -0
  40. package/rules/.source/hippy/extend_views/fastlist/FastItemView.java +306 -0
  41. package/rules/.source/hippy/extend_views/fastlist/FastItemViewController.java +106 -0
  42. package/rules/.source/hippy/extend_views/fastlist/FastListModule.java +95 -0
  43. package/rules/.source/hippy/extend_views/fastlist/FastListNode.java +90 -0
  44. package/rules/.source/hippy/extend_views/fastlist/FastListView.java +2466 -0
  45. package/rules/.source/hippy/extend_views/fastlist/FastListViewController.java +1038 -0
  46. package/rules/.source/hippy/extend_views/fastlist/FastListView/346/270/262/346/237/223/346/265/201/347/250/213/345/233/276.graffle +0 -0
  47. package/rules/.source/hippy/extend_views/fastlist/FastPendingView.java +47 -0
  48. package/rules/.source/hippy/extend_views/fastlist/ItemDecorations.java +71 -0
  49. package/rules/.source/hippy/extend_views/fastlist/ItemStoreNode.java +64 -0
  50. package/rules/.source/hippy/extend_views/fastlist/ItemStoreView.java +13 -0
  51. package/rules/.source/hippy/extend_views/fastlist/ItemStoreViewController.java +45 -0
  52. package/rules/.source/hippy/extend_views/fastlist/ListItemHolder.java +7 -0
  53. package/rules/.source/hippy/extend_views/fastlist/ListViewControlProp.java +41 -0
  54. package/rules/.source/hippy/extend_views/fastlist/MouseRecycleView.java +509 -0
  55. package/rules/.source/hippy/extend_views/fastlist/OnFastItemClickListener.java +12 -0
  56. package/rules/.source/hippy/extend_views/fastlist/OnFastItemFocusChangeListener.java +9 -0
  57. package/rules/.source/hippy/extend_views/fastlist/OnFastScrollStateChangedListener.java +7 -0
  58. package/rules/.source/hippy/extend_views/fastlist/PendingListNode.java +18 -0
  59. package/rules/.source/hippy/extend_views/fastlist/PendingViewController.java +13 -0
  60. package/rules/.source/hippy/extend_views/fastlist/PostHandlerView.java +6 -0
  61. package/rules/.source/hippy/extend_views/fastlist/PostTaskHolder.java +20 -0
  62. package/rules/.source/hippy/extend_views/fastlist/ReplaceChildController.java +105 -0
  63. package/rules/.source/hippy/extend_views/fastlist/ReplaceChildView.java +312 -0
  64. package/rules/.source/hippy/extend_views/fastlist/TVListView.java +3692 -0
  65. package/rules/.source/hippy/extend_views/fastlist/TemplateCodeParser.java +247 -0
  66. package/rules/.source/hippy/extend_views/fastlist/Utils.java +572 -0
  67. package/rules/.source/hippy/extend_views/fastlist/ViewTag.java +317 -0
  68. package/rules/.source/hippy/extend_views/fastlist/VirtualListView.java +8 -0
  69. package/rules/.source/hippy/extend_views/fastlist/diff/FastListDataBindingHelper.java +320 -0
  70. package/rules/.source/hippy/extend_views/fastlist/diff/KeyDiffHelper.java +289 -0
  71. package/rules/.source/hippy/extend_views/fastlist/diff/NoKeyDiffHelper.java +278 -0
  72. package/rules/.source/hippy/extend_views/tag/FontTag.java +53 -0
  73. package/rules/.source/hippy/extend_views/tag/HtmlTag.java +191 -0
  74. package/rules/.source/hippy/extend_views/tag/HtmlTagHandler.java +185 -0
  75. package/rules/.source/hippy/extend_views/tag/SpanTag.java +160 -0
  76. package/rules/.source/hippy/extend_views/tag/TextFontSpan.java +102 -0
  77. package/rules/.source/hippy/extend_views/waterfall/Chunk.java +10 -0
  78. package/rules/.source/hippy/extend_views/waterfall/ChunkGroup.java +5 -0
  79. package/rules/.source/hippy/extend_views/waterfall/Section.java +4 -0
  80. package/rules/.source/hippy/extend_views/waterfall/Tabs.java +5 -0
  81. package/rules/.source/hippy/extend_views/waterfall/WaterfallUtils.java +26 -0
  82. package/rules/.source/hippy/hippy_uimanager/ControllerHolder.java +30 -0
  83. package/rules/.source/hippy/hippy_uimanager/ControllerManager.java +651 -0
  84. package/rules/.source/hippy/hippy_uimanager/ControllerRegistry.java +102 -0
  85. package/rules/.source/hippy/hippy_uimanager/ControllerUpdateManger.java +252 -0
  86. package/rules/.source/hippy/hippy_uimanager/CustomControllerHelper.java +425 -0
  87. package/rules/.source/hippy/hippy_uimanager/DiffUtils.java +526 -0
  88. package/rules/.source/hippy/hippy_uimanager/ExtendViewGroup.java +36 -0
  89. package/rules/.source/hippy/hippy_uimanager/HippyCustomViewCreator.java +29 -0
  90. package/rules/.source/hippy/hippy_uimanager/HippyGroupController.java +83 -0
  91. package/rules/.source/hippy/hippy_uimanager/HippyViewBase.java +27 -0
  92. package/rules/.source/hippy/hippy_uimanager/HippyViewController.java +2189 -0
  93. package/rules/.source/hippy/hippy_uimanager/HippyViewEvent.java +52 -0
  94. package/rules/.source/hippy/hippy_uimanager/IHippyZIndexViewGroup.java +24 -0
  95. package/rules/.source/hippy/hippy_uimanager/InternalExtendViewUtil.java +395 -0
  96. package/rules/.source/hippy/hippy_uimanager/ListItemRenderNode.java +143 -0
  97. package/rules/.source/hippy/hippy_uimanager/ListViewRenderNode.java +44 -0
  98. package/rules/.source/hippy/hippy_uimanager/MatrixUtil.java +470 -0
  99. package/rules/.source/hippy/hippy_uimanager/NativeGestureDispatcher.java +349 -0
  100. package/rules/.source/hippy/hippy_uimanager/NativeGestureProcessor.java +188 -0
  101. package/rules/.source/hippy/hippy_uimanager/PullFooterRenderNode.java +43 -0
  102. package/rules/.source/hippy/hippy_uimanager/PullHeaderRenderNode.java +43 -0
  103. package/rules/.source/hippy/hippy_uimanager/RenderManager.java +304 -0
  104. package/rules/.source/hippy/hippy_uimanager/RenderNode.java +533 -0
  105. package/rules/.source/hippy/hippy_uimanager/StateView.java +17 -0
  106. package/rules/.source/hippy/hippy_uimanager/TransformUtil.java +125 -0
  107. package/rules/.source/hippy/hippy_uimanager/ViewGroupDrawingOrderHelper.java +108 -0
  108. package/rules/.source/hippy/hippy_uimanager/ViewStateProvider.java +10 -0
  109. package/rules/.source/hippy/hippy_views/audioview/AudioPlayManager.java +457 -0
  110. package/rules/.source/hippy/hippy_views/audioview/AudioView.java +225 -0
  111. package/rules/.source/hippy/hippy_views/audioview/AudioViewController.java +135 -0
  112. package/rules/.source/hippy/hippy_views/common/CommonBackgroundDrawable.java +58 -0
  113. package/rules/.source/hippy/hippy_views/common/CommonBorder.java +37 -0
  114. package/rules/.source/hippy/hippy_views/custom/HippyCustomPropsController.java +61 -0
  115. package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerListAdapter.java +399 -0
  116. package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerView.java +378 -0
  117. package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerViewController.java +187 -0
  118. package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerViewHolder.java +39 -0
  119. package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerViewWrapper.java +134 -0
  120. package/rules/.source/hippy/hippy_views/hippylist/NodePositionHelper.java +55 -0
  121. package/rules/.source/hippy/hippy_views/hippylist/PreloadHelper.java +54 -0
  122. package/rules/.source/hippy/hippy_views/hippylist/PullFooterEventHelper.java +61 -0
  123. package/rules/.source/hippy/hippy_views/hippylist/PullHeaderEventHelper.java +127 -0
  124. package/rules/.source/hippy/hippy_views/hippylist/RecyclerViewEventHelper.java +394 -0
  125. package/rules/.source/hippy/hippy_views/image/HippyContentDrawable.java +113 -0
  126. package/rules/.source/hippy/hippy_views/image/HippyImageView.java +1608 -0
  127. package/rules/.source/hippy/hippy_views/image/HippyImageViewController.java +382 -0
  128. package/rules/.source/hippy/hippy_views/image/IImageStateListener.java +7 -0
  129. package/rules/.source/hippy/hippy_views/list/ChildOnScreenScroller.java +255 -0
  130. package/rules/.source/hippy/hippy_views/list/HippyListAdapter.java +647 -0
  131. package/rules/.source/hippy/hippy_views/list/HippyListItemView.java +162 -0
  132. package/rules/.source/hippy/hippy_views/list/HippyListItemViewController.java +45 -0
  133. package/rules/.source/hippy/hippy_views/list/HippyListView.java +915 -0
  134. package/rules/.source/hippy/hippy_views/list/HippyListViewController.java +622 -0
  135. package/rules/.source/hippy/hippy_views/list/HippyRecycler.java +31 -0
  136. package/rules/.source/hippy/hippy_views/list/IRecycleItemTypeChange.java +23 -0
  137. package/rules/.source/hippy/hippy_views/list/ItemDecorations.java +70 -0
  138. package/rules/.source/hippy/hippy_views/list/NegativeLongKeyFlinger.java +156 -0
  139. package/rules/.source/hippy/hippy_views/list/NodeHolder.java +34 -0
  140. package/rules/.source/hippy/hippy_views/list/RecycleViewFlinger.java +126 -0
  141. package/rules/.source/hippy/hippy_views/list/TVRecyclerView.java +2070 -0
  142. package/rules/.source/hippy/hippy_views/list/TVSingleLineListView.java +15 -0
  143. package/rules/.source/hippy/hippy_views/modal/HippyModalHostManager.java +102 -0
  144. package/rules/.source/hippy/hippy_views/modal/HippyModalHostView.java +597 -0
  145. package/rules/.source/hippy/hippy_views/modal/ModalHostHelper.java +46 -0
  146. package/rules/.source/hippy/hippy_views/modal/ModalStyleNode.java +34 -0
  147. package/rules/.source/hippy/hippy_views/modal/RequestCloseEvent.java +32 -0
  148. package/rules/.source/hippy/hippy_views/modal/ShowEvent.java +31 -0
  149. package/rules/.source/hippy/hippy_views/navigator/Navigator.java +126 -0
  150. package/rules/.source/hippy/hippy_views/navigator/NavigatorController.java +120 -0
  151. package/rules/.source/hippy/hippy_views/refresh/HippyPullFooterView.java +47 -0
  152. package/rules/.source/hippy/hippy_views/refresh/HippyPullFooterViewController.java +65 -0
  153. package/rules/.source/hippy/hippy_views/refresh/HippyPullHeaderView.java +39 -0
  154. package/rules/.source/hippy/hippy_views/refresh/HippyPullHeaderViewController.java +104 -0
  155. package/rules/.source/hippy/hippy_views/refresh/RefreshWrapper.java +237 -0
  156. package/rules/.source/hippy/hippy_views/refresh/RefreshWrapperController.java +62 -0
  157. package/rules/.source/hippy/hippy_views/refresh/RefreshWrapperItemController.java +39 -0
  158. package/rules/.source/hippy/hippy_views/refresh/RefreshWrapperItemView.java +26 -0
  159. package/rules/.source/hippy/hippy_views/scroll/HippyHorizontalScrollView.java +500 -0
  160. package/rules/.source/hippy/hippy_views/scroll/HippyOnScrollHelper.java +39 -0
  161. package/rules/.source/hippy/hippy_views/scroll/HippyScrollView.java +46 -0
  162. package/rules/.source/hippy/hippy_views/scroll/HippyScrollViewController.java +178 -0
  163. package/rules/.source/hippy/hippy_views/scroll/HippyScrollViewEventHelper.java +92 -0
  164. package/rules/.source/hippy/hippy_views/scroll/HippyVerticalScrollView.java +522 -0
  165. package/rules/.source/hippy/hippy_views/text/HippyTextView.java +512 -0
  166. package/rules/.source/hippy/hippy_views/text/HippyTextViewController.java +77 -0
  167. package/rules/.source/hippy/hippy_views/textinput/HippyTextInput.java +668 -0
  168. package/rules/.source/hippy/hippy_views/textinput/HippyTextInputController.java +528 -0
  169. package/rules/.source/hippy/hippy_views/textinput/TextInputNode.java +115 -0
  170. package/rules/.source/hippy/hippy_views/videoview/APEZProvider.java +287 -0
  171. package/rules/.source/hippy/hippy_views/videoview/APKExpansionSupport.java +82 -0
  172. package/rules/.source/hippy/hippy_views/videoview/PivotPoint.java +13 -0
  173. package/rules/.source/hippy/hippy_views/videoview/ScalableType.java +34 -0
  174. package/rules/.source/hippy/hippy_views/videoview/ScalableVideoView.java +265 -0
  175. package/rules/.source/hippy/hippy_views/videoview/ScaleManager.java +191 -0
  176. package/rules/.source/hippy/hippy_views/videoview/Size.java +19 -0
  177. package/rules/.source/hippy/hippy_views/videoview/VideoHippyView.java +917 -0
  178. package/rules/.source/hippy/hippy_views/videoview/VideoHippyViewController.java +236 -0
  179. package/rules/.source/hippy/hippy_views/videoview/ZipResourceFile.java +427 -0
  180. package/rules/.source/hippy/hippy_views/view/CardRootView.java +28 -0
  181. package/rules/.source/hippy/hippy_views/view/CustomLayoutView.java +10 -0
  182. package/rules/.source/hippy/hippy_views/view/CustomNodeView.java +5 -0
  183. package/rules/.source/hippy/hippy_views/view/DialogViewGroup.java +113 -0
  184. package/rules/.source/hippy/hippy_views/view/HippyViewGroup.java +2042 -0
  185. package/rules/.source/hippy/hippy_views/view/HippyViewGroupController.java +583 -0
  186. package/rules/.source/hippy/hippy_views/view/WindowRoot.java +5 -0
  187. package/rules/.source/hippy/hippy_views/viewpager/HippyViewPager.java +308 -0
  188. package/rules/.source/hippy/hippy_views/viewpager/HippyViewPagerAdapter.java +148 -0
  189. package/rules/.source/hippy/hippy_views/viewpager/HippyViewPagerController.java +246 -0
  190. package/rules/.source/hippy/hippy_views/viewpager/HippyViewPagerItem.java +27 -0
  191. package/rules/.source/hippy/hippy_views/viewpager/HippyViewPagerItemController.java +42 -0
  192. package/rules/.source/hippy/hippy_views/viewpager/ViewPagerPageChangeListener.java +114 -0
  193. package/rules/.source/hippy/hippy_views/viewpager/event/HippyPageItemExposureEvent.java +40 -0
  194. package/rules/.source/hippy/hippy_views/viewpager/event/HippyPageScrollEvent.java +43 -0
  195. package/rules/.source/hippy/hippy_views/viewpager/event/HippyPageScrollStateChangedEvent.java +42 -0
  196. package/rules/.source/hippy/hippy_views/viewpager/event/HippyPageSelectedEvent.java +42 -0
  197. package/rules/.source/hippy/hippy_views/webview/HippyWebView.java +160 -0
  198. package/rules/.source/hippy/hippy_views/webview/HippyWebViewBridge.java +20 -0
  199. package/rules/.source/hippy/hippy_views/webview/HippyWebViewController.java +103 -0
  200. package/rules/.source/hippy/hippy_views/webview/HippyWebViewInner.java +77 -0
  201. package/rules/.windsurfrules +27 -4
  202. package/rules/AGENTS.md +27 -4
  203. package/rules/CLAUDE.md +27 -3
  204. package/rules/GEMINI.md +25 -3
@@ -0,0 +1,394 @@
1
+ /* Tencent is pleased to support the open source community by making Hippy available.
2
+ * Copyright (C) 2018 THL A29 Limited, a Tencent company. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ package com.tencent.mtt.hippy.views.hippylist;
18
+
19
+ import static android.support.v7.widget.RecyclerView.SCROLL_STATE_DRAGGING;
20
+ import static android.support.v7.widget.RecyclerView.SCROLL_STATE_IDLE;
21
+ import static android.support.v7.widget.RecyclerView.SCROLL_STATE_SETTLING;
22
+
23
+ import android.graphics.Rect;
24
+ import android.support.annotation.NonNull;
25
+ import android.support.v7.widget.OverPullHelper;
26
+ import android.support.v7.widget.OverPullListener;
27
+ import android.support.v7.widget.RecyclerView;
28
+ import android.support.v7.widget.RecyclerView.OnScrollListener;
29
+ import android.view.View;
30
+ import android.view.View.OnAttachStateChangeListener;
31
+ import android.view.View.OnLayoutChangeListener;
32
+ import android.view.ViewGroup;
33
+ import android.view.ViewTreeObserver;
34
+ import android.view.ViewTreeObserver.OnPreDrawListener;
35
+ import com.tencent.mtt.hippy.common.HippyMap;
36
+ import com.tencent.mtt.hippy.uimanager.HippyViewEvent;
37
+ import com.tencent.mtt.hippy.utils.LogUtils;
38
+ import com.tencent.mtt.hippy.utils.PixelUtil;
39
+ import com.tencent.mtt.hippy.views.list.HippyListItemView;
40
+ import com.tencent.mtt.hippy.views.scroll.HippyScrollViewEventHelper;
41
+
42
+ public class RecyclerViewEventHelper extends OnScrollListener implements OnLayoutChangeListener,
43
+ OnAttachStateChangeListener, OverPullListener {
44
+
45
+ public static final String EVENT_ON_END_REACHED = "onEndReached";
46
+ public static final String EVENT_ON_TOP_REACHED = "onTopReached";
47
+ public static final String INITIAL_LIST_READY = "initialListReady";
48
+ protected final HippyRecyclerView hippyRecyclerView;
49
+ private boolean scrollBeginDragEventEnable;
50
+ private boolean scrollEndDragEventEnable;
51
+ private HippyViewEvent onScrollDragEndedEvent;
52
+ private boolean momentumScrollBeginEventEnable;
53
+ private boolean momentumScrollEndEventEnable;
54
+ private HippyViewEvent onScrollFlingStartedEvent;
55
+ private HippyViewEvent onScrollFlingEndedEvent;
56
+ private int currentState;
57
+ protected boolean onScrollEventEnable = true;
58
+ private HippyViewEvent onScrollEvent;
59
+ private long lastScrollEventTimeStamp;
60
+ private int scrollEventThrottle;
61
+ private boolean exposureEventEnable;
62
+ private HippyViewEvent onScrollDragStartedEvent;
63
+
64
+ //initialListReady event
65
+ private boolean isInitialListReadyNotified = false;
66
+ private ViewTreeObserver viewTreeObserver;
67
+ private OnPreDrawListener preDrawListener;
68
+
69
+
70
+ public RecyclerViewEventHelper(HippyRecyclerView recyclerView) {
71
+ this.hippyRecyclerView = recyclerView;
72
+ hippyRecyclerView.addOnScrollListener(this);
73
+ hippyRecyclerView.addOnAttachStateChangeListener(this);
74
+ hippyRecyclerView.addOnLayoutChangeListener(this);
75
+ preDrawListener = new ViewTreeObserver.OnPreDrawListener() {
76
+ @Override
77
+ public boolean onPreDraw() {
78
+ notifyInitialListReady();
79
+ return true;
80
+ }
81
+ };
82
+ }
83
+
84
+ void notifyInitialListReady() {
85
+ if (canNotifyInit()) {
86
+ isInitialListReadyNotified = true;
87
+ viewTreeObserver.removeOnPreDrawListener(preDrawListener);
88
+ hippyRecyclerView.post(new Runnable() {
89
+ @Override
90
+ public void run() {
91
+ new HippyViewEvent(INITIAL_LIST_READY).send(getParentView(), null);
92
+ }
93
+ });
94
+ }
95
+ }
96
+
97
+ protected View getParentView() {
98
+ return (View) hippyRecyclerView.getParent();
99
+ }
100
+
101
+ /**
102
+ * 是否满足initialListReady的通知条件,需要有真实view上屏才进行通知
103
+ */
104
+ private boolean canNotifyInit() {
105
+ return !isInitialListReadyNotified && hippyRecyclerView.getAdapter().getItemCount() > 0
106
+ && hippyRecyclerView.getChildCount() > 0
107
+ && viewTreeObserver.isAlive();
108
+ }
109
+
110
+ public void setScrollBeginDragEventEnable(boolean enable) {
111
+ scrollBeginDragEventEnable = enable;
112
+ }
113
+
114
+ public void setScrollEndDragEventEnable(boolean enable) {
115
+ scrollEndDragEventEnable = enable;
116
+ }
117
+
118
+ public void setMomentumScrollBeginEventEnable(boolean enable) {
119
+ momentumScrollBeginEventEnable = enable;
120
+ }
121
+
122
+ public void setMomentumScrollEndEventEnable(boolean enable) {
123
+ momentumScrollEndEventEnable = enable;
124
+ }
125
+
126
+ public void setOnScrollEventEnable(boolean enable) {
127
+ onScrollEventEnable = enable;
128
+ }
129
+
130
+ @Override
131
+ public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,
132
+ int oldTop, int oldRight,
133
+ int oldBottom) {
134
+ checkSendExposureEvent();
135
+ }
136
+
137
+ protected HippyViewEvent getOnScrollDragStartedEvent() {
138
+ if (onScrollDragStartedEvent == null) {
139
+ onScrollDragStartedEvent = new HippyViewEvent(
140
+ HippyScrollViewEventHelper.EVENT_TYPE_BEGIN_DRAG);
141
+ }
142
+ return onScrollDragStartedEvent;
143
+ }
144
+
145
+ // scroll
146
+ protected HippyViewEvent getOnScrollEvent() {
147
+ if (onScrollEvent == null) {
148
+ onScrollEvent = new HippyViewEvent(HippyScrollViewEventHelper.EVENT_TYPE_SCROLL);
149
+ }
150
+ return onScrollEvent;
151
+ }
152
+
153
+ // start fling
154
+ protected HippyViewEvent getOnScrollFlingStartedEvent() {
155
+ if (onScrollFlingStartedEvent == null) {
156
+ onScrollFlingStartedEvent = new HippyViewEvent(
157
+ HippyScrollViewEventHelper.EVENT_TYPE_MOMENTUM_BEGIN);
158
+ }
159
+ return onScrollFlingStartedEvent;
160
+ }
161
+
162
+ // end drag event
163
+ protected HippyViewEvent getOnScrollDragEndedEvent() {
164
+ if (onScrollDragEndedEvent == null) {
165
+ onScrollDragEndedEvent = new HippyViewEvent(HippyScrollViewEventHelper.EVENT_TYPE_END_DRAG);
166
+ }
167
+ return onScrollDragEndedEvent;
168
+ }
169
+
170
+ @Override
171
+ public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
172
+ int oldState = currentState;
173
+ currentState = newState;
174
+ sendDragEvent(newState);
175
+ sendDragEndEvent(oldState, currentState);
176
+ sendFlingEvent(newState);
177
+ sendFlingEndEvent(oldState, currentState);
178
+ }
179
+
180
+ @Override
181
+ public void onScrolled(@NonNull final RecyclerView recyclerView, int dx, int dy) {
182
+ if (dx != 0 || dy != 0) {
183
+ checkSendOnScrollEvent();
184
+ }
185
+
186
+ checkSendExposureEvent();
187
+
188
+ if (!recyclerView.canScrollVertically(1)) {
189
+ sendOnEndReachedEvent();
190
+ }
191
+
192
+ if (!recyclerView.canScrollVertically(-1)) {
193
+ sendOnTopReachedEvent();
194
+ }
195
+ }
196
+
197
+ protected void sendOnEndReachedEvent() {
198
+ new HippyViewEvent(EVENT_ON_END_REACHED).send(getParentView(), null);
199
+ }
200
+
201
+ protected void sendOnTopReachedEvent() {
202
+ new HippyViewEvent(EVENT_ON_TOP_REACHED).send(getParentView(), null);
203
+ }
204
+
205
+ private void checkSendOnScrollEvent() {
206
+ if (onScrollEventEnable) {
207
+ long currTime = System.currentTimeMillis();
208
+ if (currTime - lastScrollEventTimeStamp >= scrollEventThrottle) {
209
+ lastScrollEventTimeStamp = currTime;
210
+ sendOnScrollEvent();
211
+ }
212
+ }
213
+ }
214
+
215
+ public void sendOnScrollEvent() {
216
+ getOnScrollEvent().send(getParentView(), generateScrollEvent());
217
+ }
218
+
219
+ private void observePreDraw() {
220
+ if (!isInitialListReadyNotified && viewTreeObserver == null) {
221
+ viewTreeObserver = hippyRecyclerView.getViewTreeObserver();
222
+ viewTreeObserver.addOnPreDrawListener(preDrawListener);
223
+ }
224
+ }
225
+
226
+ protected void sendFlingEvent(int newState) {
227
+ if (momentumScrollBeginEventEnable && newState == SCROLL_STATE_SETTLING) {
228
+ getOnScrollFlingStartedEvent().send(getParentView(), generateScrollEvent());
229
+ }
230
+ }
231
+
232
+ protected void sendDragEndEvent(int oldState, int newState) {
233
+ if (scrollEndDragEventEnable && isReleaseDrag(oldState, newState) && !hippyRecyclerView
234
+ .isOverPulling()) {
235
+ getOnScrollDragEndedEvent().send(getParentView(), generateScrollEvent());
236
+ }
237
+ }
238
+
239
+ private boolean isReleaseDrag(int oldState, int newState) {
240
+ return (oldState == SCROLL_STATE_DRAGGING &&
241
+ (newState == SCROLL_STATE_IDLE || newState == SCROLL_STATE_SETTLING));
242
+ }
243
+
244
+ protected void sendFlingEndEvent(int oldState, int newState) {
245
+ if (momentumScrollEndEventEnable && oldState == SCROLL_STATE_SETTLING
246
+ && newState != SCROLL_STATE_SETTLING) {
247
+ getOnScrollFlingEndedEvent().send(getParentView(), generateScrollEvent());
248
+ }
249
+ }
250
+
251
+ protected void sendDragEvent(int newState) {
252
+ if (scrollBeginDragEventEnable && newState == RecyclerView.SCROLL_STATE_DRAGGING) {
253
+ getOnScrollDragStartedEvent().send(getParentView(), generateScrollEvent());
254
+ }
255
+ }
256
+
257
+ // end fling
258
+ protected HippyViewEvent getOnScrollFlingEndedEvent() {
259
+ if (onScrollFlingEndedEvent == null) {
260
+ onScrollFlingEndedEvent = new HippyViewEvent(
261
+ HippyScrollViewEventHelper.EVENT_TYPE_MOMENTUM_END);
262
+ }
263
+ return onScrollFlingEndedEvent;
264
+ }
265
+
266
+ public void setScrollEventThrottle(int scrollEventThrottle) {
267
+ this.scrollEventThrottle = scrollEventThrottle;
268
+ }
269
+
270
+ public final HippyMap generateScrollEvent() {
271
+ HippyMap contentOffset = new HippyMap();
272
+
273
+ float offsetX = hippyRecyclerView.getContentOffsetX();
274
+ float offsetY = hippyRecyclerView.getContentOffsetY();
275
+
276
+ if (offsetX != 0) {
277
+ offsetX = PixelUtil.px2dp(offsetX);
278
+ }
279
+
280
+ if (offsetY != 0) {
281
+ offsetY = PixelUtil.px2dp(offsetY);
282
+ }
283
+
284
+ contentOffset.pushDouble("x", offsetX);
285
+ contentOffset.pushDouble("y", offsetY);
286
+ HippyMap event = new HippyMap();
287
+ event.pushMap("contentOffset", contentOffset);
288
+ return event;
289
+ }
290
+
291
+ public void setExposureEventEnable(boolean enable) {
292
+ exposureEventEnable = enable;
293
+ }
294
+
295
+ /**
296
+ * 可视面积小于10%,任务view当前已经不在可视区域
297
+ */
298
+ private boolean isViewVisible(View view) {
299
+ if (view == null) {
300
+ return false;
301
+ }
302
+ Rect rect = new Rect();
303
+ boolean visibility = view.getGlobalVisibleRect(rect);
304
+ if (!visibility) {
305
+ return false;
306
+ } else {
307
+ float visibleArea = rect.height() * rect.width(); //可见区域的面积
308
+ float viewArea = view.getMeasuredWidth() * view.getMeasuredHeight();//当前view的总面积
309
+ return visibleArea > viewArea * 0.1f;
310
+ }
311
+ }
312
+
313
+ protected void checkExposureView(View view) {
314
+ if (view instanceof HippyListItemView) {
315
+ HippyListItemView itemView = (HippyListItemView) view;
316
+ if (isViewVisible(view)) {
317
+ if (itemView.getExposureState() != HippyListItemView.EXPOSURE_STATE_APPEAR) {
318
+ sendExposureEvent(view, HippyListItemView.EXPOSURE_EVENT_APPEAR);
319
+ itemView.setExposureState(HippyListItemView.EXPOSURE_STATE_APPEAR);
320
+ }
321
+ } else {
322
+ if (itemView.getExposureState() != HippyListItemView.EXPOSURE_STATE_DISAPPEAR) {
323
+ sendExposureEvent(view, HippyListItemView.EXPOSURE_EVENT_DISAPPEAR);
324
+ itemView.setExposureState(HippyListItemView.EXPOSURE_STATE_DISAPPEAR);
325
+ }
326
+ }
327
+ }
328
+ }
329
+
330
+ protected void sendExposureEvent(View view, String eventName) {
331
+ if (eventName.equals(HippyListItemView.EXPOSURE_EVENT_APPEAR) || eventName
332
+ .equals(HippyListItemView.EXPOSURE_EVENT_DISAPPEAR)) {
333
+ new HippyViewEvent(eventName).send(view, null);
334
+ }
335
+ }
336
+
337
+ private void checkSendExposureEvent() {
338
+ if (!exposureEventEnable) {
339
+ return;
340
+ }
341
+ int childCount = hippyRecyclerView.getChildCount();
342
+ for (int i = 0; i < childCount; i++) {
343
+ checkExposureView(findHippyListItemView((ViewGroup) hippyRecyclerView.getChildAt(i)));
344
+ }
345
+ }
346
+
347
+ /**
348
+ * 由于挂载到RecyclerView到子View可能不是HippyListItemView,比如对于stickyItem,我们会包一层
349
+ * ViewGroup,所以这里拿HippyListItemView,需要做两层的判断
350
+ */
351
+ private View findHippyListItemView(ViewGroup viewGroup) {
352
+ if (viewGroup instanceof HippyListItemView) {
353
+ return viewGroup;
354
+ }
355
+ if (viewGroup.getChildCount() > 0) {
356
+ View child = viewGroup.getChildAt(0);
357
+ if (child instanceof HippyListItemView) {
358
+ return child;
359
+ }
360
+ }
361
+ return null;
362
+ }
363
+
364
+ @Override
365
+ public void onViewAttachedToWindow(View v) {
366
+ observePreDraw();
367
+ }
368
+
369
+ @Override
370
+ public void onViewDetachedFromWindow(View v) {
371
+
372
+ }
373
+
374
+ @Override
375
+ public void onOverPullStateChanged(int oldState, int newState, int offset) {
376
+ LogUtils.d("QBRecyclerViewEventHelper", "oldState:" + oldState + ",newState:" + newState);
377
+ if (oldState == OverPullHelper.OVER_PULL_NONE && isOverPulling(newState)) {
378
+ sendOnEndReachedEvent();
379
+ getOnScrollDragStartedEvent().send(getParentView(), generateScrollEvent());
380
+ }
381
+ if (isOverPulling(oldState) && isOverPulling(newState)) {
382
+ sendOnScrollEvent();
383
+ }
384
+ if (newState == OverPullHelper.OVER_PULL_SETTLING
385
+ && oldState != OverPullHelper.OVER_PULL_SETTLING) {
386
+ getOnScrollDragEndedEvent().send(getParentView(), generateScrollEvent());
387
+ }
388
+ }
389
+
390
+ private boolean isOverPulling(int newState) {
391
+ return newState == OverPullHelper.OVER_PULL_DOWN_ING
392
+ || newState == OverPullHelper.OVER_PULL_UP_ING;
393
+ }
394
+ }
@@ -0,0 +1,113 @@
1
+ /* Tencent is pleased to support the open source community by making Hippy available.
2
+ * Copyright (C) 2018 THL A29 Limited, a Tencent company. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ package com.tencent.mtt.hippy.views.image;
17
+
18
+ import java.nio.ByteBuffer;
19
+ import java.nio.ByteOrder;
20
+
21
+ import com.tencent.mtt.hippy.utils.ContextHolder;
22
+ import com.tencent.mtt.supportui.views.asyncimage.ContentDrawable;
23
+
24
+ import android.graphics.Bitmap;
25
+ import android.graphics.Canvas;
26
+ import android.graphics.Color;
27
+ import android.graphics.PorterDuff;
28
+ import android.graphics.PorterDuffColorFilter;
29
+ import android.graphics.Rect;
30
+ import android.graphics.drawable.NinePatchDrawable;
31
+
32
+ class HippyContentDrawable extends ContentDrawable {
33
+
34
+ private Rect mNinePatchRect;
35
+ private NinePatchDrawable mNinePatchDrawable;
36
+
37
+ HippyContentDrawable() {
38
+ super();
39
+ }
40
+
41
+ void setNinePatchCoordinate(Rect rect) {
42
+ mNinePatchRect = rect;
43
+ mNinePatchDrawable = null;
44
+ }
45
+
46
+ @Override
47
+ public void draw(Canvas canvas) {
48
+ // 处理.9Patch的形式,不支持缩放、圆角
49
+ if (mNinePatchRect != null && mContentBitmap != null) {
50
+ if (mNinePatchDrawable == null) {
51
+ mNinePatchDrawable = new NinePatchDrawable(ContextHolder.getAppContext().getResources(),
52
+ mContentBitmap,
53
+ createNinePatchTrunk(mContentBitmap, mNinePatchRect), null, null);
54
+ }
55
+ mNinePatchDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
56
+ mNinePatchDrawable.setAlpha(mAlpha);
57
+ if (mTintColor != Color.TRANSPARENT) {
58
+ mNinePatchDrawable
59
+ .setColorFilter(new PorterDuffColorFilter(mTintColor, PorterDuff.Mode.SRC_ATOP));
60
+ }
61
+ mNinePatchDrawable.draw(canvas);
62
+ return;
63
+ }
64
+ super.draw(canvas);
65
+ }
66
+
67
+ private byte[] createNinePatchTrunk(Bitmap bitmap, Rect ninePatchRect) {
68
+ int[] xRegions = new int[]{ninePatchRect.left, bitmap.getWidth() - ninePatchRect.right};
69
+ int[] yRegions = new int[]{ninePatchRect.top, bitmap.getHeight() - ninePatchRect.bottom};
70
+ int NO_COLOR = 0x00000001;
71
+ int colorSize = 9;
72
+ int bufferSize = xRegions.length * 4 + yRegions.length * 4 + colorSize * 4 + 32;
73
+
74
+ ByteBuffer byteBuffer = ByteBuffer.allocate(bufferSize).order(ByteOrder.nativeOrder());
75
+ // 第一个byte,要不等于0
76
+ byteBuffer.put((byte) 1);
77
+
78
+ //mDivX length
79
+ byteBuffer.put((byte) 2);
80
+ //mDivY length
81
+ byteBuffer.put((byte) 2);
82
+ //mColors length
83
+ byteBuffer.put((byte) colorSize);
84
+
85
+ //skip
86
+ byteBuffer.putInt(0);
87
+ byteBuffer.putInt(0);
88
+
89
+ //padding 先设为0
90
+ byteBuffer.putInt(0);
91
+ byteBuffer.putInt(0);
92
+ byteBuffer.putInt(0);
93
+ byteBuffer.putInt(0);
94
+
95
+ //skip
96
+ byteBuffer.putInt(0);
97
+
98
+ // mDivX
99
+ byteBuffer.putInt(xRegions[0]);
100
+ byteBuffer.putInt(xRegions[1]);
101
+
102
+ // mDivY
103
+ byteBuffer.putInt(yRegions[0]);
104
+ byteBuffer.putInt(yRegions[1]);
105
+
106
+ // mColors
107
+ for (int i = 0; i < colorSize; i++) {
108
+ byteBuffer.putInt(NO_COLOR);
109
+ }
110
+
111
+ return byteBuffer.array();
112
+ }
113
+ }