@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,548 @@
1
+ package com.tencent.extend.views.fastlist;
2
+
3
+ import static android.view.View.FOCUS_BACKWARD;
4
+ import static android.view.View.FOCUS_DOWN;
5
+ import static android.view.View.FOCUS_FORWARD;
6
+ import static android.view.View.FOCUS_LEFT;
7
+ import static android.view.View.FOCUS_RIGHT;
8
+ import static android.view.View.FOCUS_UP;
9
+
10
+ import android.graphics.Rect;
11
+ import android.support.v7.widget.RecyclerView;
12
+ import android.util.Log;
13
+ import android.view.View;
14
+
15
+ import android.support.annotation.NonNull;
16
+
17
+ import com.tencent.extend.TVViewUtil;
18
+ import com.tencent.mtt.hippy.common.HippyMap;
19
+ import com.tencent.mtt.hippy.utils.LogUtils;
20
+ import com.tencent.mtt.hippy.utils.PixelUtil;
21
+ import com.tencent.mtt.hippy.views.list.TVRecyclerView;
22
+ import com.tencent.mtt.hippy.views.view.HippyViewGroup;
23
+
24
+
25
+ public abstract class ChildOnScreenScroller {
26
+ protected boolean enableScrollToTopOnFirstFocus = false;
27
+ protected boolean noScrollOnFirstScreen = false;
28
+ int type = TVRecyclerView.REQUEST_CHILD_ON_SCREEN_TYPE_CENTER;;
29
+ int clampForward = 0;
30
+ int clampBackward = 0;
31
+ boolean enableScroll = true;
32
+ protected int scrollOffset;
33
+
34
+ public int getScrollType(){
35
+ return type;
36
+ }
37
+
38
+ public void setScrollOffset(int scrollOffset) {
39
+ this.scrollOffset = scrollOffset;
40
+ }
41
+
42
+ public int getScrollOffset() {
43
+ return scrollOffset;
44
+ }
45
+
46
+ public void setEnableScroll(boolean enableScroll) {
47
+ this.enableScroll = enableScroll;
48
+ }
49
+
50
+ public void setClampBackward(int clampBackward) {
51
+ this.clampBackward = clampBackward;
52
+ }
53
+
54
+ public void setClampForward(int clampForward) {
55
+ this.clampForward = clampForward;
56
+ }
57
+
58
+ public void setType(int type) {
59
+ this.type = type;
60
+ }
61
+
62
+ public boolean requestChildRectangleOnScreen(@NonNull RecyclerView parent, @NonNull View child, @NonNull Rect rect, boolean immediate, int direction, boolean focusedChildVisible, int childPosition){
63
+ return false;
64
+ }
65
+
66
+ public boolean smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
67
+ return false;
68
+ }
69
+
70
+ public void setScrollThresholdVertical(int threshold){
71
+
72
+ }
73
+
74
+ public void setScrollThresholdHorizontal(int threshold){
75
+
76
+ }
77
+
78
+
79
+ public void setNoScrollOnFirstScreen(boolean noScrollOnFirstScreen) {
80
+ this.noScrollOnFirstScreen = noScrollOnFirstScreen;
81
+ }
82
+
83
+ public abstract void notifyOnScroll(RecyclerView mRecyclerView, int vector, int sx, int sy);
84
+
85
+ public static class Default extends ChildOnScreenScroller {
86
+ final int orientation ;
87
+ // int scrollOffset;
88
+
89
+
90
+ public int thresholdScrollVertical = PixelUtil.dp2pxInt(50);
91
+ public int thresholdScrollHorizontal = PixelUtil.dp2pxInt(300);
92
+ //public int type = TVRecyclerView.REQUEST_CHILD_ON_SCREEN_TYPE_CENTER;
93
+
94
+
95
+ public Default(int orientation, int scrollOffset) {
96
+ this.orientation = orientation;
97
+ this.scrollOffset = scrollOffset;
98
+ }
99
+
100
+
101
+
102
+
103
+ @Override
104
+ public void setScrollThresholdHorizontal(int threshold) {
105
+ this.thresholdScrollHorizontal = threshold;
106
+ }
107
+
108
+ @Override
109
+ public void notifyOnScroll(RecyclerView mRecyclerView, int vector, int sx, int sy) {
110
+ // assert (mRecyclerView instanceof IRecyclerView): "ChildOnScreenScroller recyclerView必须是IRecyclerView的实例";
111
+ // final IRecyclerView tv = (IRecyclerView) mRecyclerView;
112
+ // int offset = orientation == RecyclerView.HORIZONTAL ? sx : sy;
113
+ // if (vector < 0 && autoScrollCheckLine > 0) {
114
+ // //后退
115
+ // if (offset < autoScrollCheckLine && offset > 0) {
116
+ // Log.e("ChildOnScreenScroller","notifyOnScroll exe scrollToTop");
117
+ // tv.scrollToTop();
118
+ // }
119
+ // }
120
+ }
121
+
122
+
123
+ @Override
124
+ public void setScrollThresholdVertical(int threshold) {
125
+ this.thresholdScrollVertical = threshold;
126
+ }
127
+
128
+ // public int getScrollOffset() {
129
+ // return scrollOffset;
130
+ // }
131
+ // public void setScrollOffset(int scrollOffset) {
132
+ // this.scrollOffset = scrollOffset;
133
+ // }
134
+
135
+ public Default(int orientation) {
136
+ this(orientation,0);
137
+ }
138
+
139
+ int clampOnStart(RecyclerView parent ,View child,int scroll,boolean vertical){
140
+ return scroll;
141
+ // if (parent instanceof TVListView) {
142
+ // int pos = -1;
143
+ // if (child != null) {
144
+ // try {
145
+ // pos = parent.getChildAdapterPosition(child);
146
+ // }catch (Throwable t){}
147
+ // }
148
+ // if (pos > 0) {
149
+ // Log.e("ChildOnScreenScroller","clampOnStart return on pos > 0)");
150
+ // return scroll;
151
+ // }
152
+ //
153
+ // TVListView fv = (TVListView) parent;
154
+ // if (LogUtils.isDebug()) {
155
+ // Log.d("ChildOnScreenScroller","clampOnStart parent getOffsetY() "+fv.getOffsetY()+",getOffsetX:"+fv.getOffsetX()+",scroll:"+scroll);
156
+ // }
157
+ // if(scroll <= 0){ // 向顶端滚动时,检查一下offset值,如果offset <= 0,则不需要再滚动
158
+ // if (vertical) {
159
+ // if (fv.getOffsetY() <= 0) {
160
+ // if (LogUtils.isDebug()) {
161
+ // Log.w("ChildOnScreenScroller","clampOnStart on fv.getOffsetY() "+fv.getOffsetY());
162
+ // }
163
+ // return 0;
164
+ // }
165
+ // }else{
166
+ // if (fv.getOffsetX() <= 0) {
167
+ // if (LogUtils.isDebug()) {
168
+ // Log.w("ChildOnScreenScroller","clampOnStart on fv.getOffsetX() "+fv.getOffsetX());
169
+ // }
170
+ // return 0;
171
+ // }
172
+ // }
173
+ // }
174
+ // }
175
+ // return scroll;
176
+ }
177
+
178
+ private boolean scrollOnOverride(View child, int direction, RecyclerView parent, boolean immediate){
179
+ View sorView = FastAdapterUtil.finalRealContent(child);
180
+ if(sorView instanceof HippyViewGroup && ((HippyViewGroup) sorView).getScrollOverride() != null){
181
+ final HippyMap sor = ((HippyViewGroup) sorView).getScrollOverride();
182
+ final String directionName = HippyViewGroup.getDirectionName(direction);
183
+ if(sor.containsKey(directionName)){
184
+ final float dy = PixelUtil.dp2px(sor.getInt(directionName));
185
+ if(dy != 0){
186
+ // if(dy < 0 && parent instanceof IRecyclerView){
187
+ // final int offsetY = ((IRecyclerView) parent).getOffsetY();
188
+ // Log.e("ChildOnScreenScroller","requestChildRectangleOnScreen on scrollOverride offsetY : "+offsetY+",dy:"+dy);
189
+ // if(dy + offsetY <= 0){
190
+ // Log.e("ChildOnScreenScroller","requestChildRectangleOnScreen scrollToTop on scrollOverride on : "+sor+",dy:"+dy);
191
+ // ((IRecyclerView) parent).scrollToTop();
192
+ // return true;
193
+ // }
194
+ // }
195
+ if (orientation == RecyclerView.VERTICAL) {
196
+ exeScrollRecyclerView(parent, 0, (int) dy, immediate);
197
+ } else {
198
+ exeScrollRecyclerView(parent, (int) dy, 0, immediate);
199
+ }
200
+ }
201
+ Log.e("ChildOnScreenScroller","requestChildRectangleOnScreen return on scrollOverride on : "+sor+",dy:"+dy);
202
+ return true;
203
+ }
204
+ }
205
+ return false;
206
+ }
207
+
208
+ @Override
209
+ public boolean requestChildRectangleOnScreen(@NonNull RecyclerView parent, @NonNull View child, @NonNull Rect rect, boolean immediate,int direction,boolean focusedChildVisible,int childPosition) {
210
+ if(!enableScroll){
211
+ return true;
212
+ }
213
+ if(LogUtils.isDebug()) {
214
+ final Rect childRect = new Rect();
215
+ childRect.set(child.getLeft(),child.getTop(),child.getRight(),child.getBottom());
216
+ Log.i("ChildOnScreenScroller", "<<--------------------------");
217
+ Log.i("ChildOnScreenScroller", "LogChildRect childRect:" + childRect+",rect:"+rect+",noScrollOnFirstScreen:"+noScrollOnFirstScreen);
218
+ boolean isFocusScrollTarget = child instanceof HippyViewGroup && ((HippyViewGroup) child).isFocusScrollTarget();
219
+ Log.i("ChildOnScreenScroller", "LogChildRect child width:"+
220
+ child.getWidth()+",child height:"+child.getHeight()+",child:"+child+",isFocusScrollTarget:"+isFocusScrollTarget);
221
+ childRect.set(parent.getLeft(),parent.getTop(),parent.getRight(),parent.getBottom());
222
+ Log.i("ChildOnScreenScroller", "parent rect : "+childRect+",parent width:"+parent.getWidth()+",parent height:"+ childRect.height());
223
+ // if(child instanceof FastAdapter.ItemRootView){
224
+ // Log.i("ChildOnScreenScroller", "child is ItemRootView item,real content:"+((FastAdapter.ItemRootView) child).getContentView());
225
+ // if(((FastAdapter.ItemRootView) child).getContentView() instanceof FastItemView){
226
+ // final View v = ((FastItemView) ((FastAdapter.ItemRootView) child).getContentView()).getChildAt(0);
227
+ // Log.e("ChildOnScreenScroller", "child View :"+v);
228
+ // }
229
+ // }
230
+ Log.i("ChildOnScreenScroller", "-------------------------->>");
231
+ }
232
+
233
+ if(type == TVRecyclerView.REQUEST_CHILD_ON_SCREEN_TYPE_NONE){
234
+ LogUtils.e("ChildOnScreenScroller","requestChildRectangleOnScreen makeChildVisibleType none scroll Type return ");
235
+ return true;
236
+ }
237
+ int vector = TVViewUtil.getVectorByDirection(direction,orientation);
238
+
239
+ // if(sorView instanceof FastItemView && ((FastItemView) sorView).getContentView() != null){
240
+ // sorView = ((FastItemView) sorView).getContentView();
241
+ // }
242
+ //Log.i("ChildOnScreenScroller", "-----------sorView:"+sorView);
243
+ if(scrollOnOverride(child,direction,parent,immediate)){
244
+ return true;
245
+ }
246
+ if(enableScrollToTopOnFirstFocus){
247
+ if (vector < 0) {
248
+ if (childPosition == 0) {
249
+ if (parent instanceof FastListView) {
250
+ ((FastListView) parent).scrollToTop();
251
+ }else{
252
+ parent.scrollToPosition(0);
253
+ }
254
+ LogUtils.e("ChildOnScreenScroller","requestChildRectangleOnScreen scrollTop on back to firstFocus");
255
+ return true;
256
+ }
257
+ }
258
+ }
259
+ if(LogUtils.isDebug()){
260
+ LogUtils.i("ChildOnScreenScroller","requestChildRectangleOnScreen vector "+vector+",direction:"+direction+", childPos:"+childPosition+",type:"+type+",enableScrollToTopOnFirstFocus:"+enableScrollToTopOnFirstFocus);
261
+ }
262
+ if (orientation == RecyclerView.VERTICAL) {
263
+ final int parentTop = parent.getPaddingTop();
264
+ int childTop = child.getTop() + rect.top - child.getScrollY();
265
+ // Log.i("ZHAOPENG","0000 childTop : "+childTop+",rect.top:"+rect.top+",child.getScrollY():"+child.getScrollY()+",parentTop:"+parentTop);
266
+ final int parentBottom = parent.getHeight() - parent.getPaddingBottom();
267
+ int childBottom = childTop + rect.bottom;
268
+
269
+ final int parentCenter = (int) (parentTop + parent.getHeight() * 0.5f);
270
+ View focused = null;
271
+
272
+ if (focused == null) {
273
+ // Log.i("ZHAOPENG","childScroll child : "+child);
274
+ if(child instanceof HippyViewGroup &&((HippyViewGroup) child).isFocusScrollTarget()){
275
+ focused = child;
276
+ childTop = child.getTop() - child.getScrollY();
277
+ childBottom = childTop + rect.bottom;
278
+ if(LogUtils.isDebug()) {
279
+ Log.i("ChildOnScreenScroller", "ChildOnScreenScroller isFocusScrollTarget true ,child : " + child);
280
+ }
281
+ }else {
282
+ focused = child.findFocus();
283
+ focused = focused != null ? focused : child;
284
+ }
285
+ }
286
+ if (focused != null) {
287
+
288
+ if(type == TVRecyclerView.REQUEST_CHILD_ON_SCREEN_TYPE_CENTER) {
289
+ final int childCenter = (int) (childTop + focused.getHeight() * 0.5f);
290
+ final int dy = clampOnStart(parent,child,childCenter - parentCenter + scrollOffset,true);
291
+ // Log.e("ZHAOPENG","22222 child : "+child+",focused:"+focused+",childCenter:"+childCenter+",height:"+focused.getHeight()+",dy:"+dy);
292
+ final int deltaY = Math.abs(dy);
293
+ childBottom = childTop + focused.getHeight();
294
+ int threshold;
295
+ if (direction == FOCUS_LEFT || direction == FOCUS_RIGHT) {
296
+ threshold = thresholdScrollHorizontal;
297
+ } else {
298
+ threshold = thresholdScrollVertical;
299
+ }
300
+ //isChildVisible判断有误,暂时注释
301
+ // if (deltaY < threshold && isChildVisible) {
302
+ // return true;
303
+ // }
304
+ if(LogUtils.isDebug()) {
305
+ LogUtils.d("ChildOnScreenScroller", "handle Scroll deltaY : " + deltaY + ",threshold:" + threshold+",dy :"+dy);
306
+ LogUtils.d("ScrollLog", "handle Scroll deltaY : " + dy + ",threshold:" + threshold);
307
+ }
308
+ if (Math.abs(deltaY) < threshold) {
309
+ return true;
310
+ }
311
+ if (noScrollOnFirstScreen) {
312
+ if (parent instanceof IRecyclerView) {
313
+ IRecyclerView tv = (IRecyclerView) parent;
314
+ if (tv.getOffsetY() < 5 && dy > 0) {
315
+ // LogUtils.d("ChildOnScreenScroller", "handle autoScrollCheckLine childBottom: " + childBottom + ",parentBottom:" + parentBottom + ",tvOffset:" + ((IRecyclerView) parent).getOffsetY() );
316
+ if (childBottom < parentBottom) {
317
+ Log.e("ChildOnScreenScroller", "handle return on childBottom < parentBottom tv:"+tv);
318
+ return true;
319
+ }
320
+ }else{
321
+ if (dy < 0) {
322
+ int toY = deltaY + tv.getOffsetY();
323
+ if(LogUtils.isDebug()) {
324
+ LogUtils.d("ChildOnScreenScroller", "handle 2 toY " + toY + ",parentBottom:" + parentBottom + ",tv.getOffsetY()" + tv.getOffsetY()+",parent.getHeight():"+parent.getHeight() +",childBottom:"+childBottom);
325
+ }
326
+ if (toY < parentBottom || tv.getOffsetY() < parentBottom) {
327
+ //Log.i("ChildOnScreenScroller", "handle scrollToTop on toY < parentBottom tv:"+tv);
328
+ if((childBottom + tv.getOffsetY()) > parentBottom){
329
+ Log.i("ChildOnScreenScroller", "handle scrollToTop on toY < parentBottom ,skip on childBottom > parentBottom childBottom:"+childBottom+",parentBottom:"+parentBottom);
330
+ }else {
331
+ Log.i("ChildOnScreenScroller", "handle scrollToTop on toY < parentBottom tv:"+tv);
332
+ tv.scrollToTop();
333
+ //parent.smoothScrollToPosition(0);
334
+ //tv.smoothScrollToTop();
335
+ return true;
336
+ }
337
+ }
338
+ }
339
+ }
340
+ }
341
+ }
342
+ exeScrollRecyclerView(parent, 0, dy, immediate);
343
+ return dy != 0;
344
+ }else{
345
+ int dy;
346
+ {
347
+ if(direction == FOCUS_UP || direction == FOCUS_BACKWARD){
348
+ //后退
349
+ dy = Math.min(0,childTop - (parentTop + clampBackward));
350
+ }else if(direction == FOCUS_DOWN || direction == FOCUS_FORWARD){
351
+ //前进
352
+ dy = Math.max(0,childBottom - (parentBottom - clampForward));
353
+ }else{
354
+ dy = 0;
355
+ }
356
+ dy = clampOnStart(parent,child,dy,true);
357
+ if(LogUtils.isDebug()) {
358
+ LogUtils.d("ChildOnScreenScroller", "handle Scroll deltaY : " + dy + ",threshold:" + thresholdScrollVertical);
359
+ LogUtils.d("ScrollLog", "handle Scroll deltaY : " + dy + ",threshold:" + thresholdScrollVertical);
360
+ }
361
+ if(Math.abs(dy) < thresholdScrollVertical){
362
+ LogUtils.d("ChildOnScreenScroller","return on dy < thresholdScrollVertical dy:"+dy+",thresholdScrollVertical:"+thresholdScrollVertical);
363
+ return true;
364
+ }
365
+ exeScrollRecyclerView(parent, 0, dy + scrollOffset, immediate);
366
+ return dy != 0;
367
+ }
368
+ }
369
+ }
370
+ }else{
371
+
372
+
373
+
374
+ final int parentLeft = parent.getPaddingLeft();
375
+ int childLeft = child.getLeft() + rect.left - child.getScrollX();
376
+ final int parentRight = parent.getWidth() - parent.getPaddingRight();
377
+ int childRight = childLeft + rect.right;
378
+
379
+
380
+ final int parentCenter = (int) (parentLeft + parent.getWidth() * 0.5f);
381
+ View focused = null;
382
+
383
+ if (focused == null) {
384
+ if(child instanceof HippyViewGroup &&((HippyViewGroup) child).isFocusScrollTarget()){
385
+ focused = child;
386
+ childLeft = child.getLeft() - child.getScrollY();
387
+ childRight = childLeft + rect.right;
388
+ // Log.e("ZHAOPENG","11111 child : "+child);
389
+ }else {
390
+ focused = child.findFocus();
391
+ focused = focused != null ? focused : child;
392
+ // Log.e("ZHAOPENG","22222 child : "+child+",focused:"+focused);
393
+ }
394
+ }
395
+
396
+
397
+
398
+ if (focused != null) {
399
+
400
+ if(type == TVRecyclerView.REQUEST_CHILD_ON_SCREEN_TYPE_CENTER) {
401
+ final int childCenter = (int) (childLeft + focused.getWidth() * 0.5f);
402
+
403
+ final int dx = clampOnStart(parent,child,childCenter - parentCenter + scrollOffset,false);
404
+
405
+ exeScrollRecyclerView(parent, dx, 0, immediate);
406
+ return dx != 0;
407
+ }else{
408
+ int dx;
409
+ {
410
+ if(direction == FOCUS_LEFT || direction == FOCUS_BACKWARD){
411
+ //后退
412
+ dx = Math.min(0,childLeft - (parentLeft + clampBackward));
413
+ }else if(direction == FOCUS_RIGHT || direction == FOCUS_FORWARD){
414
+ //前进
415
+ dx = Math.max(0,childRight - (parentRight - clampForward));
416
+ }else{
417
+ dx = 0;
418
+ }
419
+ dx = clampOnStart(parent,child,dx,false);
420
+ exeScrollRecyclerView(parent, dx, 0, immediate);
421
+ return dx != 0;
422
+ }
423
+ }
424
+ }
425
+
426
+ }
427
+
428
+ return false;
429
+ }
430
+
431
+
432
+ private void exeScrollRecyclerView(RecyclerView parent, int sx, int sy, boolean immediate){
433
+ if(LogUtils.isDebug()){
434
+ Log.v("ChildOnScreenScroller","exeScrollRecyclerView sx : "+sx+",sy :"+sy+",immediate:"+immediate);
435
+ }
436
+ if(sx == 0 && sy == 0){
437
+ return;
438
+ }
439
+ if (immediate) {
440
+ parent.scrollBy(sx, sy);
441
+ } else {
442
+ parent.smoothScrollBy(sx, sy);
443
+ }
444
+ }
445
+
446
+ @Override
447
+ public boolean smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
448
+ // super.smoothScrollToPosition(recyclerView, state, position);
449
+ return false;
450
+ }
451
+
452
+
453
+
454
+ }
455
+
456
+ public static int getScrollToPositionOffset(TVListView tvList,int position,int offset){
457
+ final View child = tvList.getLayoutExecutor().findViewByPosition(position);
458
+ if (child == null) {
459
+ return 0;
460
+ }
461
+ final int childCount = tvList.getLayoutManagerCompat().getExecutor().getItemCount();
462
+ return getScrollToPositionOffset(position,tvList,child,tvList.getOrientation(),
463
+ childCount,tvList.getChildOnScreenScroller().getScrollType(), offset
464
+ );
465
+ }
466
+
467
+ public static int getScrollToPositionOffset(TVListView tvList,int position,View child,int offset){
468
+ // final View child = tvList.getLayoutExecutor().findViewByPosition(position);
469
+ // if (child == null) {
470
+ // return 0;
471
+ // }
472
+ final int childCount = tvList.getLayoutManagerCompat().getExecutor().getItemCount();
473
+ return getScrollToPositionOffset(position,tvList,child,tvList.getOrientation(),
474
+ childCount,tvList.getChildOnScreenScroller().getScrollType(), offset
475
+ );
476
+ }
477
+
478
+ public static int getScrollToPositionOffset(int position,View parent,View item,int orientation,int itemCount,int type,int offset){
479
+ final int parentSize = orientation == RecyclerView.HORIZONTAL ? parent.getWidth() - parent.getPaddingLeft() - parent.getPaddingRight()
480
+ : parent.getHeight() - parent.getPaddingBottom() - parent.getPaddingTop();
481
+ final int itemSize = orientation == RecyclerView.HORIZONTAL ? item.getWidth() : item.getHeight();
482
+ return getScrollToPositionOffset(position,parentSize,itemSize,itemCount,type,offset);
483
+ }
484
+
485
+ public static void getChildRectangleOnScreen(View parent, View child, Rect rect, boolean immediate,int[] out,int direction) {
486
+ // int[] out = new int[2];
487
+ int parentLeft = parent.getPaddingLeft();
488
+ int parentTop = parent.getPaddingTop();
489
+ int parentRight = parent.getWidth() - parent.getPaddingRight();
490
+ int parentBottom = parent.getHeight() - parent.getPaddingBottom();
491
+ int childLeft = child.getLeft() + rect.left - child.getScrollX();
492
+ int childTop = child.getTop() + rect.top - child.getScrollY();
493
+ int childRight = childLeft + rect.width();
494
+ int childBottom = childTop + rect.height();
495
+ }
496
+
497
+
498
+
499
+ public static int getScrollToPositionOffsetOnCenterType(View parent,View item,int orientation){
500
+ final int parentSize = orientation == RecyclerView.HORIZONTAL ? parent.getWidth() - parent.getPaddingLeft() - parent.getPaddingRight()
501
+ : parent.getHeight() - parent.getPaddingBottom() - parent.getPaddingTop();
502
+ final int itemSize = orientation == RecyclerView.HORIZONTAL ? item.getWidth() : item.getHeight();
503
+
504
+ int offset = (int) ((parentSize - itemSize) * 0.5f);
505
+
506
+ return offset;
507
+ }
508
+
509
+ public static int getScrollToPositionOffset(int position,int parentSize,int itemSize,int itemCount,int type,int scrollOffset) {
510
+
511
+ int offset = 0;
512
+
513
+ final int lastIndex = itemCount - 1;
514
+ if(type == TVRecyclerView.REQUEST_CHILD_ON_SCREEN_TYPE_CENTER){
515
+ offset = (int) ((parentSize - itemSize) * 0.5f);
516
+ }
517
+ if(LogUtils.isDebug()) {
518
+ Log.i("ChildOnScreenScroller", "scrollToPositionBeforeSetListData parentSize:" + parentSize + ",itemSize:" + itemSize + ",offset:" + offset + ",scrollOffset:" + scrollOffset);
519
+ }
520
+ //设置的offset超过边界,跳转到最后一个Item上去
521
+ if (position >= lastIndex) {
522
+ position = lastIndex;
523
+ //不能划出内容高度
524
+ if (offset < 0) {
525
+ offset = 0;
526
+ }
527
+ }
528
+
529
+ return offset + scrollOffset;
530
+ }
531
+
532
+ public static int computeAlignCenterScrollOffset(int parentSize,int itemSize){
533
+ int offset = (int) ((parentSize - itemSize) * 0.5f);
534
+ // if(LogUtils.isDebug()) {
535
+ // Log.i("ChildOnScreenScroller", "computeAlignCenterScrollOffset parentSize:" + parentSize + ",itemSize:" + itemSize + ",offset:" + offset );
536
+ // }
537
+ //设置的offset超过边界,跳转到最后一个Item上去
538
+ return offset;
539
+ }
540
+
541
+ public interface IRecyclerView {
542
+ int getOffsetX();
543
+ int getOffsetY();
544
+ void scrollToTop();
545
+ void smoothScrollToTop();
546
+ }
547
+
548
+ }
@@ -0,0 +1,17 @@
1
+ package com.tencent.extend.views.fastlist;
2
+
3
+ import com.tencent.extend.views.ExtendTag;
4
+ import com.tencent.mtt.hippy.uimanager.RenderNode;
5
+
6
+ public class ClonedViewTag extends ExtendTag {
7
+
8
+ final RenderNode originNode;
9
+
10
+ public ClonedViewTag(RenderNode origin) {
11
+ this.originNode = origin;
12
+ }
13
+
14
+ public RenderNode getOriginNode() {
15
+ return originNode;
16
+ }
17
+ }
@@ -0,0 +1,55 @@
1
+ package com.tencent.extend.views.fastlist;
2
+
3
+
4
+ import android.view.View;
5
+
6
+ import com.tencent.mtt.hippy.HippyEngineContext;
7
+ import com.tencent.mtt.hippy.common.HippyMap;
8
+ import com.tencent.mtt.hippy.uimanager.HippyViewEvent;
9
+
10
+
11
+ public class EventDeliverer {
12
+ final HippyEngineContext context;
13
+
14
+ OnEventListener onEventListener;
15
+
16
+ public EventDeliverer(HippyEngineContext context) {
17
+ this.context = context;
18
+ }
19
+
20
+ public void sendEvent(String eventName, int id, HippyMap params){
21
+ sendEvent(eventName,id,context,params,onEventListener);
22
+ }
23
+
24
+ public void sendEvent(String eventName, View view, HippyMap params){
25
+ sendEvent(eventName,view.getId(),context,params,onEventListener);
26
+ }
27
+
28
+ public void sendEvent(HippyViewEvent event, int id, HippyMap params){
29
+ sendEvent(event,id,context,params,onEventListener);
30
+ }
31
+
32
+ public void sendEvent(HippyViewEvent event, View view, HippyMap params){
33
+ sendEvent(event,view.getId(),context,params,onEventListener);
34
+ }
35
+ public static void sendEvent(String eventName,int id,HippyEngineContext context,HippyMap params,OnEventListener onEventListener){
36
+ sendEvent(new HippyViewEvent(eventName),id,context,params,onEventListener);
37
+ }
38
+
39
+ public static void sendEvent(HippyViewEvent event,int id,HippyEngineContext context,HippyMap params,OnEventListener onEventListener){
40
+ if(context != null && id > -1) {
41
+ if(onEventListener != null){
42
+ onEventListener.onBeforeSend(event,id,context,params);
43
+ }
44
+ event.send(id,context,params);
45
+ }
46
+ }
47
+
48
+ public void setOnEventListener(OnEventListener onEventListener) {
49
+ this.onEventListener = onEventListener;
50
+ }
51
+
52
+ public interface OnEventListener {
53
+ void onBeforeSend(HippyViewEvent event, int id,HippyEngineContext context, HippyMap params);
54
+ }
55
+ }