@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,289 @@
1
+ package com.tencent.extend.views.fastlist.diff;
2
+
3
+ import static com.tencent.extend.views.fastlist.diff.FastListDataBindingHelper.Patch;
4
+ import static com.tencent.extend.views.fastlist.diff.FastListDataBindingHelper.DiffItem;
5
+ import static com.tencent.extend.views.fastlist.diff.FastListDataBindingHelper.MoveDiffItem;
6
+ import static com.tencent.extend.views.fastlist.diff.FastListDataBindingHelper.OnTransFormListener;
7
+ import static com.tencent.extend.views.fastlist.diff.FastListDataBindingHelper.RangeDiffItem.handleRangeList;
8
+ import static com.tencent.extend.views.fastlist.diff.NoKeyDiffHelper.diffArray;
9
+ import static com.tencent.extend.views.fastlist.diff.NoKeyDiffHelper.diffMap;
10
+
11
+ import android.text.TextUtils;
12
+ import android.util.Log;
13
+
14
+ import com.tencent.mtt.hippy.common.HippyArray;
15
+ import com.tencent.mtt.hippy.common.HippyMap;
16
+
17
+ import java.util.ArrayList;
18
+ import java.util.HashMap;
19
+ import java.util.List;
20
+ import java.util.Map;
21
+
22
+ /**
23
+ * 有key diff实现类
24
+ */
25
+ public class KeyDiffHelper {
26
+ public static String KEY = "key";
27
+
28
+ // 先处理有key的情况 key需要调用方自己控制处理,类型需要为String
29
+ public static <T> Map<Integer, List<DiffItem>> handleKeyDataDiff(HippyArray beforeArray, HippyArray array, String keyName,
30
+ OnTransFormListener<T> listener, Class<T> tClass) {
31
+ KEY = keyName;
32
+ Map<Integer, List<DiffItem>> resultMap = new HashMap<>();
33
+
34
+ if (beforeArray == null || array == null || beforeArray.size() < 1 || array.size() < 1) {
35
+ resultMap.put(Patch.ALL_UPDATE, new ArrayList<>());
36
+ return resultMap;
37
+ }
38
+
39
+ List<DiffItem> updateList = new ArrayList<>();
40
+ List<DiffItem> deleteList = new ArrayList<>();
41
+ List<DiffItem> insertList = new ArrayList<>();
42
+ List<DiffItem> moveList = new ArrayList<>();
43
+ resultMap.put(Patch.TYPE_UPDATE, updateList);
44
+ resultMap.put(Patch.TYPE_DELETE, deleteList);
45
+ resultMap.put(Patch.TYPE_INSERT, insertList);
46
+ resultMap.put(Patch.TYPE_MOVE, moveList);
47
+
48
+ realDiffByKey(beforeArray, array, resultMap, true, listener, tClass);
49
+
50
+ return resultMap;
51
+ }
52
+
53
+ // 先不考虑被别人调用,判空逻辑基于已知调用,不过多处理
54
+ private static <T> void realDiffByKey(HippyArray oldArray, HippyArray newArray,
55
+ Map<Integer, List<DiffItem>> resultMap,
56
+ boolean experimental,
57
+ OnTransFormListener<T> listener, Class<T> tClass) {
58
+ assert resultMap != null;
59
+
60
+ List<DiffItem> updateList = resultMap.get(Patch.TYPE_UPDATE);
61
+ List<DiffItem> deleteList = resultMap.get(Patch.TYPE_DELETE);
62
+ List<DiffItem> insertList = resultMap.get(Patch.TYPE_INSERT);
63
+ List<DiffItem> moveList = resultMap.get(Patch.TYPE_MOVE);
64
+
65
+ assert updateList != null;
66
+ assert deleteList != null;
67
+ assert insertList != null;
68
+ assert moveList != null;
69
+
70
+ int i = 0, oldSize = oldArray.size(), newSize = newArray.size();
71
+
72
+ // 第一步:先从头开始遍历 发现不同key就跳出
73
+ Object o;
74
+ while (i < oldSize && i < newSize) {
75
+ o = transForm(oldArray.get(i), listener, tClass);
76
+ if (isSameKey(o, newArray.get(i))) {
77
+ // key相同 判断是否需要update
78
+ handleUpdate(o, newArray.get(i), resultMap, i, newArray.get(i), false, listener, tClass);
79
+ } else {
80
+ break;
81
+ }
82
+ i++;
83
+ }
84
+ int oldLast = oldSize - 1, newLast = newSize - 1;
85
+ // 第二步:从尾开始遍历 发现不同key跳出
86
+ while (i <= oldLast && i <= newLast) {
87
+ o = transForm(oldArray.get(oldLast), listener, tClass);
88
+ if (isSameKey(o, newArray.get(newLast))) {
89
+ // key相同 可以判断是否需要update
90
+ handleUpdate(o, newArray.get(newLast), resultMap, oldLast, newArray.get(newLast), true, listener, tClass);
91
+ } else {
92
+ break;
93
+ }
94
+ oldLast--;
95
+ newLast--;
96
+ }
97
+ // 第三步:假如新老数据中已经有遍历完的了
98
+ if (i > oldLast) { // 旧数据已经遍历完,只要添加新数据就行
99
+ while (i <= newLast) {
100
+ handleRangeList(insertList, i, newArray.get(i));
101
+ i++;
102
+ }
103
+
104
+ } else if (i > newLast) {
105
+ while (i <= oldLast) {
106
+ handleRangeList(deleteList, i, transForm(oldArray.get(i), listener, tClass));
107
+ i++;
108
+ }
109
+ } else {
110
+ if (!experimental) {
111
+ resultMap.put(Patch.ALL_UPDATE, new ArrayList<>());
112
+ return;
113
+ }
114
+ int s1 = i, s2 = i; // 记录第一步遍历到的index
115
+ Map<String, Integer> keyToNewIndexMap = new HashMap<>(); // 保存新数据中未处理的数据 key:key值,value:数据位置
116
+ for (i = s2; i <= newLast; i++) {
117
+ if (realHasKey(newArray.get(i))) {
118
+ keyToNewIndexMap.put((String) ((HippyMap) newArray.get(i)).get(KEY), i);
119
+ } else {
120
+ try {
121
+ throw new IllegalArgumentException("使用有key的diff算法 每个item必须都有" + KEY + " new" + newArray.get(i));
122
+ } catch (Exception e) {
123
+ Log.e("KeyDiffHelper", Log.getStackTraceString(e));
124
+ }
125
+ resultMap.put(Patch.ALL_UPDATE, new ArrayList<>());
126
+ return;
127
+ }
128
+ }
129
+ int j, patched = 0, toBePatched = newLast - s2 + 1, maxNewIndexSoFar = 0; // toBePatched未处理的新数据个数
130
+ boolean moved = false; // 是否有数据移动
131
+ int[] newIndexToOldIndexArray = new int[toBePatched];
132
+ for (i = s1; i <= oldLast; i++) { // 遍历未处理的旧数据
133
+ Object oldItem = transForm(oldArray.get(i), listener, tClass);
134
+ if (patched >= toBePatched) { // 新数据已经处理完,剩下的都是要删除的
135
+ handleRangeList(deleteList, i, oldItem);
136
+ continue;
137
+ }
138
+ Integer newIndex;
139
+ if (realHasKey(oldItem)) {
140
+ newIndex = keyToNewIndexMap.get((String) ((HippyMap) oldItem).get(KEY));
141
+ } else {
142
+ try {
143
+ throw new IllegalArgumentException("使用有key的diff算法 每个item必须都有" + KEY + " old" + oldItem);
144
+ } catch (Exception e) {
145
+ Log.e("KeyDiffHelper", Log.getStackTraceString(e));
146
+ }
147
+ resultMap.put(Patch.ALL_UPDATE, new ArrayList<>());
148
+ return;
149
+ }
150
+ if (newIndex == null) {
151
+ handleRangeList(deleteList, i, oldItem);
152
+ } else {
153
+ newIndexToOldIndexArray[newIndex - s2] = i + 1; // 这里故意加1 区分0
154
+ if (newIndex >= maxNewIndexSoFar) {
155
+ maxNewIndexSoFar = newIndex;
156
+ } else {
157
+ moved = true;
158
+ }
159
+ patched++;
160
+ }
161
+ }
162
+ // 处理新增的item和move的情况
163
+ Integer[] increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexArray) : new Integer[0];
164
+ j = increasingNewIndexSequence.length - 1;
165
+ for (i = toBePatched - 1; i >= 0; i--) {
166
+ int newIndex = i + s2;
167
+ if (newIndexToOldIndexArray[i] == 0) {
168
+ handleRangeList(insertList, newIndex, newArray.get(newIndex), true);
169
+ } else if (moved) {
170
+ int oldIndex = newIndexToOldIndexArray[i] - 1;
171
+ Object oldItem = transForm(oldArray.get(oldIndex), listener, tClass),
172
+ newItem = newArray.get(newIndex);
173
+ if (j < 0 || i != increasingNewIndexSequence[j]) {
174
+ moveList.add(new MoveDiffItem(oldIndex, newIndex, oldItem, newItem));
175
+ } else {
176
+ handleUpdate(oldItem, newItem, resultMap, oldIndex, newItem, true, listener, tClass);
177
+ j--;
178
+ }
179
+ }
180
+ }
181
+ }
182
+
183
+ }
184
+
185
+ private static <T> void handleUpdate(Object oldItem, Object newItem,
186
+ Map<Integer, List<DiffItem>> resultMap,
187
+ int rootPosition, Object rootItem, boolean isReverse,
188
+ OnTransFormListener<T> listener, Class<T> tClass) {
189
+ List<DiffItem> updateList = resultMap.get(Patch.TYPE_UPDATE);
190
+ assert updateList != null;
191
+
192
+ if (oldItem instanceof Boolean) {
193
+ boolean fromBool = (boolean) oldItem;
194
+ if (!(newItem instanceof Boolean) || fromBool != (boolean) newItem) {
195
+ handleRangeList(updateList, rootPosition, rootItem, isReverse);
196
+ }
197
+ } else if (oldItem instanceof Number) {
198
+ boolean isSame = false;
199
+ double fromDoubleValue = ((Number) oldItem).doubleValue();
200
+ if (newItem instanceof Number) {
201
+ double toDoubleValue = ((Number) newItem).doubleValue();
202
+ isSame = (fromDoubleValue == toDoubleValue);
203
+ }
204
+ if (!isSame) {
205
+ handleRangeList(updateList, rootPosition, rootItem, isReverse);
206
+ }
207
+ } else if (oldItem instanceof String) {
208
+ if (newItem == null || !TextUtils.equals(oldItem.toString(), newItem.toString())) {
209
+ handleRangeList(updateList, rootPosition, rootItem, isReverse);
210
+ }
211
+ } else if (oldItem instanceof HippyArray) {
212
+ if (newItem instanceof HippyArray) {
213
+ diffArray((HippyArray) oldItem, (HippyArray) newItem, resultMap, 1, rootPosition, rootItem, listener, tClass);
214
+ } else {
215
+ handleRangeList(updateList, rootPosition, rootItem, isReverse);
216
+ }
217
+ } else if (oldItem instanceof HippyMap) {
218
+ if (newItem instanceof HippyMap) {
219
+ diffMap((HippyMap) oldItem, (HippyMap) newItem, resultMap,
220
+ 1, rootPosition, rootItem, listener, tClass);
221
+ } else {
222
+ handleRangeList(updateList, rootPosition, rootItem, isReverse);
223
+ }
224
+ }
225
+ }
226
+
227
+ private static <T> Object transForm(Object item, OnTransFormListener<T> listener, Class<T> tClass) {
228
+ if (listener != null && item.getClass() == tClass) {
229
+ item = listener.onTransForm((T) item);
230
+ }
231
+ return item;
232
+ }
233
+
234
+ public static boolean realHasKey(Object o) {
235
+ return (o instanceof HippyMap) && (((HippyMap) o).get(KEY) instanceof String)
236
+ && !TextUtils.isEmpty((String) ((HippyMap) o).get(KEY));
237
+ }
238
+
239
+ public static boolean isSameKey(Object o1, Object o2) {
240
+ if (realHasKey(o1) && realHasKey(o2)) {
241
+ return ((String) ((HippyMap) o1).get(KEY)).equals(((HippyMap) o2).get(KEY));
242
+ }
243
+ return false;
244
+ }
245
+
246
+ private static Integer[] getSequence(int[] arr) {
247
+ int[] p = arr.clone();
248
+ List<Integer> result = new ArrayList<>();
249
+ result.add(0);
250
+ int i, j, u, v, c;
251
+ int len = arr.length;
252
+ for (i = 0; i < len; i++) {
253
+ int arrI = arr[i];
254
+ if (arrI != 0) {
255
+ j = result.get(result.size() - 1);
256
+ if (arr[j] < arrI) {
257
+ p[i] = j;
258
+ result.add(i);
259
+ continue;
260
+ }
261
+ u = 0;
262
+ v = result.size() - 1;
263
+ // 二分查找
264
+ while (u < v) {
265
+ c = ((u + v) / 2);
266
+ if (arr[result.get(c)] < arrI) {
267
+ u = c + 1;
268
+ } else {
269
+ v = c;
270
+ }
271
+ }
272
+ if (arrI < arr[result.get(u)]) {
273
+ if (u > 0) {
274
+ p[i] = result.get(u - 1);
275
+ }
276
+ result.set(u, i);
277
+ }
278
+ }
279
+ }
280
+ u = result.size();
281
+ v = result.get(u - 1);
282
+ while (u-- > 0) {
283
+ result.set(u, v);
284
+ v = p[v];
285
+ }
286
+
287
+ return result.toArray(new Integer[0]);
288
+ }
289
+ }
@@ -0,0 +1,278 @@
1
+ package com.tencent.extend.views.fastlist.diff;
2
+
3
+ import static com.tencent.extend.views.fastlist.diff.FastListDataBindingHelper.RangeDiffItem.handleRangeList;
4
+
5
+ import android.text.TextUtils;
6
+
7
+ import com.tencent.mtt.hippy.common.HippyArray;
8
+ import com.tencent.mtt.hippy.common.HippyMap;
9
+
10
+ import java.util.ArrayList;
11
+ import java.util.HashMap;
12
+ import java.util.List;
13
+ import java.util.Map;
14
+
15
+ import com.tencent.extend.views.fastlist.diff.FastListDataBindingHelper.DiffItem;
16
+ import com.tencent.extend.views.fastlist.diff.FastListDataBindingHelper.Patch;
17
+ import com.tencent.extend.views.fastlist.diff.FastListDataBindingHelper.OnTransFormListener;
18
+ import com.tencent.extend.views.fastlist.diff.FastListDataBindingHelper.RangeDiffItem;
19
+
20
+ /**
21
+ * 无key diff实现类
22
+ */
23
+ public class NoKeyDiffHelper {
24
+
25
+ /**
26
+ * 无key diff入口方法
27
+ *
28
+ * @param beforeArray 旧数据
29
+ * @param array 新数据
30
+ * @param listener 旧数据item转换
31
+ * @param tClass 旧数据item Class类型
32
+ * @param <T> 旧数据item类型
33
+ * @return diff结果map
34
+ */
35
+ public static <T> Map<Integer, List<DiffItem>> handleNoKeyDataDiff(HippyArray beforeArray, HippyArray array,
36
+ OnTransFormListener<T> listener, Class<T> tClass) {
37
+
38
+ Map<Integer, List<DiffItem>> resultMap = new HashMap<>();
39
+ List<DiffItem> updateList = new ArrayList<>();
40
+ List<DiffItem> insertList = new ArrayList<>();
41
+ List<DiffItem> deleteList = new ArrayList<>();
42
+ resultMap.put(Patch.TYPE_UPDATE, updateList);
43
+ resultMap.put(Patch.TYPE_INSERT, insertList);
44
+ resultMap.put(Patch.TYPE_DELETE, deleteList);
45
+
46
+ diffArray(beforeArray, array, resultMap, listener, tClass);
47
+
48
+ return resultMap;
49
+ }
50
+
51
+ private static <T> void diffArray(HippyArray oldArray, HippyArray newArray,
52
+ Map<Integer, List<DiffItem>> resultMap,
53
+ OnTransFormListener<T> listener, Class<T> tClass) {
54
+ diffArray(oldArray, newArray, resultMap, 0, -1, null, listener, tClass);
55
+ }
56
+
57
+ public static <T> void diffArray(HippyArray oldArray, HippyArray newArray,
58
+ Map<Integer, List<DiffItem>> resultMap,
59
+ int diffLevel, int rootPosition, Object rootItem,
60
+ OnTransFormListener<T> listener, Class<T> tClass) {
61
+
62
+ List<DiffItem> updateList = resultMap.get(Patch.TYPE_UPDATE);
63
+ List<DiffItem> insertList = resultMap.get(Patch.TYPE_INSERT);
64
+ List<DiffItem> deleteList = resultMap.get(Patch.TYPE_DELETE);
65
+
66
+ assert updateList != null;
67
+ assert insertList != null;
68
+ assert deleteList != null;
69
+
70
+ if (diffLevel != 0 && oldArray.size() != newArray.size()) {
71
+ handleRangeList(updateList, rootPosition, rootItem);
72
+ return;
73
+ }
74
+
75
+ for (int position = 0; position < oldArray.size(); position++) {
76
+ Object oldItem = oldArray.getObject(position);
77
+ if (diffLevel == 0 && listener != null && oldItem.getClass() == tClass) {
78
+ oldItem = listener.onTransForm((T) oldItem);
79
+ }
80
+ Object newItem;
81
+ if (position < newArray.size()) {
82
+ newItem = newArray.getObject(position);
83
+ } else { // 说明新数组比较短
84
+ if (diffLevel != 0) {
85
+ handleRangeList(updateList, rootPosition, rootItem);
86
+ return;
87
+ } else {
88
+ handleRangeList(deleteList, position, oldItem);
89
+ continue;
90
+ }
91
+ }
92
+ if (oldItem instanceof Boolean) {
93
+ boolean fromBool = (boolean) oldItem;
94
+ if (!(newItem instanceof Boolean) || fromBool != (boolean) newItem) {
95
+ if (diffLevel != 0) {
96
+ handleRangeList(updateList, rootPosition, rootItem);
97
+ return;
98
+ } else {
99
+ handleRangeList(updateList, position, newItem);
100
+ }
101
+ }
102
+ } else if (oldItem instanceof Number) {
103
+ boolean isSame = false;
104
+ double fromDoubleValue = ((Number) oldItem).doubleValue();
105
+ if (newItem instanceof Number) {
106
+ double toDoubleValue = ((Number) newItem).doubleValue();
107
+ isSame = (fromDoubleValue == toDoubleValue);
108
+ }
109
+ if (!isSame) {
110
+ if (diffLevel != 0) {
111
+ handleRangeList(updateList, rootPosition, rootItem);
112
+ return;
113
+ } else {
114
+ handleRangeList(updateList, position, newItem);
115
+ }
116
+ }
117
+ } else if (oldItem instanceof String) {
118
+ if (newItem == null || !TextUtils.equals(oldItem.toString(), newItem.toString())) {
119
+ if (diffLevel != 0) {
120
+ handleRangeList(updateList, rootPosition, rootItem);
121
+ return;
122
+ } else {
123
+ handleRangeList(updateList, position, newItem);
124
+ }
125
+ }
126
+ } else if (oldItem instanceof HippyArray) {
127
+ if (newItem instanceof HippyArray) {
128
+ if (diffLevel != 0) {
129
+ int sizeBefore = updateList.size();
130
+ int innerSizeBefore = -1;
131
+ RangeDiffItem item = null;
132
+ if (sizeBefore > 0) {
133
+ item = (RangeDiffItem) updateList.get(sizeBefore - 1);
134
+ innerSizeBefore = item.getListSize();
135
+ }
136
+ diffArray((HippyArray) oldItem, (HippyArray) newItem, resultMap,
137
+ diffLevel + 1, rootPosition, rootItem, listener, tClass);
138
+ // update有新增,不需要继续循环
139
+ if (sizeBefore != updateList.size() || innerSizeBefore != -1 && innerSizeBefore != item.getListSize()) {
140
+ break;
141
+ }
142
+ } else {
143
+ diffArray((HippyArray) oldItem, (HippyArray) newItem, resultMap,
144
+ diffLevel + 1, position, newItem, listener, tClass);
145
+ }
146
+ } else {
147
+ if (diffLevel != 0) {
148
+ handleRangeList(updateList, rootPosition, rootItem);
149
+ return;
150
+ } else {
151
+ handleRangeList(updateList, position, newItem);
152
+ }
153
+ }
154
+ } else if (oldItem instanceof HippyMap) {
155
+ if (newItem instanceof HippyMap) {
156
+ if (diffLevel != 0) {
157
+ int sizeBefore = updateList.size();
158
+ int innerSizeBefore = -1;
159
+ RangeDiffItem item = null;
160
+ if (sizeBefore > 0) {
161
+ item = (RangeDiffItem) updateList.get(sizeBefore - 1);
162
+ innerSizeBefore = item.getListSize();
163
+ }
164
+ diffMap((HippyMap) oldItem, (HippyMap) newItem, resultMap,
165
+ diffLevel + 1, rootPosition, rootItem, listener, tClass);
166
+ // 这快应该判断是否进入继续循环
167
+ if (sizeBefore != updateList.size() || innerSizeBefore != -1 && innerSizeBefore != item.getListSize()) {
168
+ break;
169
+ }
170
+ } else {
171
+ diffMap((HippyMap) oldItem, (HippyMap) newItem, resultMap,
172
+ diffLevel + 1, position, newItem, listener, tClass);
173
+ }
174
+ } else {
175
+ if (diffLevel != 0) {
176
+ handleRangeList(updateList, rootPosition, rootItem);
177
+ return;
178
+ } else {
179
+ handleRangeList(updateList, position, newItem);
180
+ }
181
+ }
182
+ }
183
+ }
184
+
185
+ if (newArray.size() > oldArray.size()) {
186
+ for (int position = oldArray.size(); position < newArray.size(); position++) {
187
+ if (diffLevel != 0) {
188
+ handleRangeList(updateList, rootPosition, rootItem);
189
+ } else {
190
+ handleRangeList(insertList, position, newArray.get(position));
191
+ }
192
+ }
193
+ }
194
+ }
195
+
196
+ protected static <T> void diffMap(HippyMap oldMap, HippyMap newMap, Map<Integer,
197
+ List<DiffItem>> resultMap, int diffLevel, int rootPosition, Object rootItem,
198
+ OnTransFormListener<T> listener, Class<T> tClass) {
199
+ assert resultMap != null;
200
+
201
+ List<DiffItem> updateList = resultMap.get(Patch.TYPE_UPDATE);
202
+
203
+ assert updateList != null;
204
+
205
+ if (oldMap.keySet().size() != newMap.keySet().size()) {
206
+ handleRangeList(updateList, rootPosition, rootItem);
207
+ return;
208
+ }
209
+
210
+ for (String key : oldMap.keySet()) {
211
+ Object oldValue = oldMap.get(key);
212
+ Object newValue = newMap.get(key);
213
+
214
+ if (oldValue instanceof Boolean) {
215
+ boolean fromBool = (boolean) oldValue;
216
+ if (!(newValue instanceof Boolean) || fromBool != (boolean) newValue) {
217
+ handleRangeList(updateList, rootPosition, rootItem);
218
+ return;
219
+ }
220
+ } else if (oldValue instanceof Number) {
221
+ boolean isSame = false;
222
+ double fromDoubleValue = ((Number) oldValue).doubleValue();
223
+ if (newValue instanceof Number) {
224
+ double toDoubleValue = ((Number) newValue).doubleValue();
225
+ isSame = (fromDoubleValue == toDoubleValue);
226
+ }
227
+ if (!isSame) {
228
+ handleRangeList(updateList, rootPosition, rootItem);
229
+ return;
230
+ }
231
+ } else if (oldValue instanceof String) {
232
+ if (newValue == null || !TextUtils.equals(oldValue.toString(), newValue.toString())) {
233
+ handleRangeList(updateList, rootPosition, rootItem);
234
+ return;
235
+ }
236
+ } else if (oldValue instanceof HippyArray) {
237
+ if (newValue instanceof HippyArray) {
238
+ int sizeBefore = updateList.size();
239
+ int innerSizeBefore = -1;
240
+ RangeDiffItem item = null;
241
+ if (sizeBefore > 0) {
242
+ item = (RangeDiffItem) updateList.get(sizeBefore - 1);
243
+ innerSizeBefore = item.getListSize();
244
+ }
245
+ diffArray((HippyArray) oldValue, (HippyArray) newValue, resultMap,
246
+ diffLevel + 1, rootPosition, rootItem, listener, tClass);
247
+ // update有新增,不需要继续循环
248
+ if (sizeBefore != updateList.size() || innerSizeBefore != -1 && innerSizeBefore != item.getListSize()) {
249
+ return;
250
+ }
251
+ } else {
252
+ handleRangeList(updateList, rootPosition, rootItem);
253
+ return;
254
+ }
255
+ } else if (oldValue instanceof HippyMap) {
256
+ if (newValue instanceof HippyMap) {
257
+ int sizeBefore = updateList.size();
258
+ int innerSizeBefore = -1;
259
+ RangeDiffItem item = null;
260
+ if (sizeBefore > 0) {
261
+ item = (RangeDiffItem) updateList.get(sizeBefore - 1);
262
+ innerSizeBefore = item.getListSize();
263
+ }
264
+ diffMap((HippyMap) oldValue, (HippyMap) newValue, resultMap,
265
+ diffLevel + 1, rootPosition, rootItem, listener, tClass);
266
+ // update有新增,不需要继续循环
267
+ if (sizeBefore != updateList.size() || innerSizeBefore != -1 && innerSizeBefore != item.getListSize()) {
268
+ return;
269
+ }
270
+ } else {
271
+ handleRangeList(updateList, rootPosition, rootItem);
272
+ return;
273
+ }
274
+ }
275
+ }
276
+ }
277
+
278
+ }
@@ -0,0 +1,53 @@
1
+ package com.tencent.extend.views.tag;
2
+
3
+ import android.content.Context;
4
+ import android.text.Editable;
5
+ import android.text.TextUtils;
6
+ import android.text.style.BackgroundColorSpan;
7
+ import android.text.style.ForegroundColorSpan;
8
+
9
+ import org.xml.sax.Attributes;
10
+
11
+ /**
12
+ * Create by sorosunrain on 2021/07/19 15:22
13
+ */
14
+ public class FontTag extends HtmlTag{
15
+
16
+ public FontTag(Context context) {
17
+ super(context);
18
+ }
19
+
20
+ @Override
21
+ public void startHandleTag(Editable text, Attributes attributes) {
22
+ String textColor = attributes.getValue("", "color");
23
+ String textSize = attributes.getValue("", "size");
24
+
25
+ if(!TextUtils.isEmpty(textColor)){
26
+ int color = getHtmlColor(textColor) | 0xFF000000;
27
+ start(text, new ForegroundColorSpan(color));
28
+ }
29
+
30
+ if(!TextUtils.isEmpty(textSize)){
31
+ int size = getHtmlSize(textSize);
32
+ start(text, new Font(size));
33
+ }
34
+ }
35
+
36
+ @Override
37
+ public void endHandleTag(Editable text) {
38
+ Background b = getLast(text, Background.class); //读取出最后标记类型
39
+ if (b != null) {
40
+ end(text, Background.class, new BackgroundColorSpan(b.color)); //设置为Android可以解析的24种ParcelableSpan基本分类,当然也可以自己定义,但需要集成原有的分类
41
+ }
42
+
43
+ final ForegroundColorSpan fc = getLast(text, ForegroundColorSpan.class);
44
+ if (fc != null) {
45
+ end(text, ForegroundColorSpan.class, new ForegroundColorSpan(fc.getForegroundColor()));
46
+ }
47
+
48
+ Font f = getLast(text, Font.class);
49
+ if (f != null) {
50
+ end(text, Font.class, new TextFontSpan(f.textSize, f.textDecordation, f.fontWeidght)); //使用自定义的
51
+ }
52
+ }
53
+ }