@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,191 @@
1
+ package com.tencent.extend.views.tag;
2
+
3
+ import android.content.Context;
4
+ import android.graphics.Color;
5
+ import android.text.Editable;
6
+ import android.text.Spannable;
7
+ import android.text.Spanned;
8
+ import android.text.TextUtils;
9
+ import android.util.TypedValue;
10
+
11
+ import android.support.annotation.ColorInt;
12
+
13
+ import org.xml.sax.Attributes;
14
+
15
+ import java.util.HashMap;
16
+ import java.util.Map;
17
+
18
+ public abstract class HtmlTag {
19
+
20
+ private Context context;
21
+
22
+ public HtmlTag(Context context) {
23
+ this.context = context;
24
+ }
25
+
26
+ public Context getContext() {
27
+ return context;
28
+ }
29
+
30
+ private static final Map<String, Integer> sColorNameMap;
31
+
32
+ static {
33
+ sColorNameMap = new HashMap<>();
34
+ sColorNameMap.put("black", Color.BLACK);
35
+ sColorNameMap.put("darkgray", Color.DKGRAY);
36
+ sColorNameMap.put("gray", Color.GRAY);
37
+ sColorNameMap.put("lightgray", Color.LTGRAY);
38
+ sColorNameMap.put("white", Color.WHITE);
39
+ sColorNameMap.put("red", Color.RED);
40
+ sColorNameMap.put("green", Color.GREEN);
41
+ sColorNameMap.put("blue", Color.BLUE);
42
+ sColorNameMap.put("yellow", Color.YELLOW);
43
+ sColorNameMap.put("cyan", Color.CYAN);
44
+ sColorNameMap.put("magenta", Color.MAGENTA);
45
+ sColorNameMap.put("aqua", 0xFF00FFFF);
46
+ sColorNameMap.put("fuchsia", 0xFFFF00FF);
47
+ sColorNameMap.put("darkgrey", Color.DKGRAY);
48
+ sColorNameMap.put("grey", Color.GRAY);
49
+ sColorNameMap.put("lightgrey", Color.LTGRAY);
50
+ sColorNameMap.put("lime", 0xFF00FF00);
51
+ sColorNameMap.put("maroon", 0xFF800000);
52
+ sColorNameMap.put("navy", 0xFF000080);
53
+ sColorNameMap.put("olive", 0xFF808000);
54
+ sColorNameMap.put("purple", 0xFF800080);
55
+ sColorNameMap.put("silver", 0xFFC0C0C0);
56
+ sColorNameMap.put("teal", 0xFF008080);
57
+ sColorNameMap.put("white", Color.WHITE);
58
+ sColorNameMap.put("transparent", Color.TRANSPARENT);
59
+
60
+ }
61
+
62
+ @ColorInt
63
+ public static int getHtmlColor(String colorString) {
64
+
65
+ if (sColorNameMap.containsKey(colorString.toLowerCase())) {
66
+ Integer colorInt = sColorNameMap.get(colorString);
67
+ if (colorInt != null) return colorInt;
68
+ }
69
+
70
+ return parseHtmlColor(colorString.toLowerCase());
71
+ }
72
+
73
+ @ColorInt
74
+ public static int parseHtmlColor(String colorString) {
75
+
76
+ if (colorString.charAt(0) == '#') {
77
+ if (colorString.length() == 4) {
78
+ StringBuilder sb = new StringBuilder("#");
79
+ for (int i = 1; i < colorString.length(); i++) {
80
+ char c = colorString.charAt(i);
81
+ sb.append(c).append(c);
82
+ }
83
+ colorString = sb.toString();
84
+ }
85
+ long color = Long.parseLong(colorString.substring(1), 16);
86
+ if (colorString.length() == 7) {
87
+ // Set the alpha value
88
+ color |= 0x00000000ff000000;
89
+ } else if (colorString.length() == 9) {
90
+
91
+ int alpha = Integer.parseInt(colorString.substring(1, 3), 16);
92
+ int red = Integer.parseInt(colorString.substring(3, 5), 16);
93
+ int green = Integer.parseInt(colorString.substring(5, 7), 16);
94
+ int blue = Integer.parseInt(colorString.substring(7, 8), 16);
95
+ color = Color.argb(alpha, red, green, blue);
96
+ } else {
97
+ throw new IllegalArgumentException("Unknown color");
98
+ }
99
+ return (int) color;
100
+ } else if (colorString.startsWith("rgb(") || colorString.startsWith("rgba(") && colorString.endsWith(")")) {
101
+ colorString = colorString.substring(colorString.indexOf("("), colorString.indexOf(")"));
102
+ colorString = colorString.replaceAll(" ", "");
103
+ String[] colorArray = colorString.split(",");
104
+ if (colorArray.length == 3) {
105
+ return Color.argb(255, Integer.parseInt(colorArray[0]), Integer.parseInt(colorArray[1]), Integer.parseInt(colorArray[2]));
106
+ } else if (colorArray.length == 4) {
107
+ return Color.argb(Integer.parseInt(colorArray[3]), Integer.parseInt(colorArray[0]), Integer.parseInt(colorArray[1]), Integer.parseInt(colorArray[2]));
108
+ }
109
+
110
+ }
111
+ throw new IllegalArgumentException("Unknown color");
112
+ }
113
+
114
+ public int getHtmlSize(String fontSize) {
115
+ fontSize = fontSize.toLowerCase();
116
+ if (fontSize.endsWith("px")) {
117
+ return (int) Double.parseDouble(fontSize.substring(0, fontSize.indexOf("px")));
118
+ } else if (fontSize.endsWith("sp")) {
119
+ float sp = (float) Double.parseDouble(fontSize.substring(0, fontSize.indexOf("sp")));
120
+ return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getContext().getResources().getDisplayMetrics());
121
+ } else if (TextUtils.isDigitsOnly(fontSize)) { //如果不带单位,默认按照sp处理
122
+ float sp = (float) Double.parseDouble(fontSize);
123
+ return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getContext().getResources().getDisplayMetrics());
124
+ }
125
+ return -1;
126
+ }
127
+
128
+ public static <T> T getLast(Spanned text, Class<T> kind) {
129
+
130
+ T[] objs = text.getSpans(0, text.length(), kind);
131
+ if (objs.length == 0) {
132
+ return null;
133
+ } else {
134
+ return objs[objs.length - 1];
135
+ }
136
+ }
137
+
138
+ public static void start(Editable text, Object mark) {
139
+ int len = text.length();
140
+ text.setSpan(mark, len, len, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //添加标记在最后一位,注意开始位置和结束位置
141
+ }
142
+
143
+ @SuppressWarnings("unchecked")
144
+ public static void end(Editable text, Class kind, Object repl) {
145
+ Object obj = getLast(text, kind); //读取kind类型
146
+ if (obj != null) {
147
+ setSpanFromMark(text, obj, repl);
148
+ }
149
+ }
150
+
151
+ private static void setSpanFromMark(Spannable text, Object mark, Object... spans) {
152
+ int where = text.getSpanStart(mark);
153
+ text.removeSpan(mark);
154
+ //移除原有标记,因为原有标记不是默认的24种ParcelableSpan子类,因此无法渲染文本
155
+ int len = text.length();
156
+ if (where != len) {
157
+ for (Object span : spans) {
158
+ text.setSpan(span, where, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //注意:开始位置和结束位置,因为SpannableStringBuilder的append添加字符方法导致len已经大于where了
159
+ }
160
+ }
161
+ }
162
+
163
+ public abstract void startHandleTag(Editable text, Attributes attributes); //开始解析
164
+
165
+ public abstract void endHandleTag(Editable text); //结束解析
166
+
167
+
168
+ public static class Font { //定义标记
169
+ int textSize;
170
+ int textDecordation;
171
+ int fontWeidght;
172
+
173
+ public Font(int textSize) {
174
+ this.textSize = textSize;
175
+ }
176
+
177
+ public Font(int textSize, int textDecordation, int fontWeidght) {
178
+ this.textSize = textSize;
179
+ this.textDecordation = textDecordation;
180
+ this.fontWeidght = fontWeidght;
181
+ }
182
+ }
183
+
184
+ public static class Background { //定义标记
185
+ int color;
186
+
187
+ public Background(int color) {
188
+ this.color = color;
189
+ }
190
+ }
191
+ }
@@ -0,0 +1,185 @@
1
+ package com.tencent.extend.views.tag;
2
+
3
+ import android.graphics.drawable.Drawable;
4
+ import android.text.Editable;
5
+ import android.text.Html;
6
+
7
+ import org.xml.sax.Attributes;
8
+ import org.xml.sax.ContentHandler;
9
+ import org.xml.sax.Locator;
10
+ import org.xml.sax.SAXException;
11
+ import org.xml.sax.XMLReader;
12
+
13
+ import java.util.Arrays;
14
+ import java.util.HashMap;
15
+ import java.util.List;
16
+ import java.util.Map;
17
+
18
+ public class HtmlTagHandler implements Html.TagHandler, Html.ImageGetter, ContentHandler {
19
+
20
+ private static final String LOG_TAG = "HtmlTagHandler";
21
+
22
+ private final String H5_TAG = "html"; //自定义标签,该标签无法在原Html类中解析
23
+ private volatile ContentHandler orginalContentHandler;
24
+ private int count = 0; //防止自定义的相互嵌套的情况 如:<html><html></html></html>
25
+ //设置标签计数器,防止自定义标签嵌套自定义标签
26
+ private XMLReader originalXmlReader;
27
+ private Editable originlaEditableText; //该对象是SpannableStringBuilder
28
+ private List<String> orginalTags = null;
29
+
30
+ //自定义解析器集合
31
+ private final Map<String, HtmlTag> tagHandlerMap;
32
+
33
+
34
+ public HtmlTagHandler() {
35
+ String orginalContentHandlerTag = "br|p|ul|li|div|span|strong|b|em|cite|dnf|i|big|small|font|blockquote|tt|a|u|del|s|strike|sup|sub|h1|h2|h3|h4|h5|h6|img";
36
+ //原android.text.Html类中可以解析的标签
37
+ orginalTags = Arrays.asList(orginalContentHandlerTag.split("|"));
38
+ tagHandlerMap = new HashMap<>();
39
+ }
40
+
41
+ //注册解析器
42
+ public void registerTag(String tagName, HtmlTag tagHandler) {
43
+ tagHandlerMap.put(tagName, tagHandler);
44
+ }
45
+
46
+ public HtmlTag unregisterTag(String tagName) {
47
+ return tagHandlerMap.remove(tagName);
48
+ }
49
+
50
+ @Override
51
+ public Drawable getDrawable(String source) {
52
+ return null;
53
+ }
54
+
55
+ //处理原Html中无法识别的标签
56
+ @Override
57
+ public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
58
+ if (opening) {
59
+ startHandleTag(tag, output, xmlReader);
60
+ } else {
61
+ endHandleTag(tag, output, xmlReader);
62
+ }
63
+
64
+ }
65
+
66
+ private void startHandleTag(String tag, Editable output, XMLReader xmlReader) {
67
+
68
+ if (tag.equalsIgnoreCase(H5_TAG)) {
69
+ if (orginalContentHandler == null) {
70
+ orginalContentHandler = xmlReader.getContentHandler();
71
+ this.originalXmlReader = xmlReader; //获取XmlReader
72
+ this.originalXmlReader.setContentHandler(this);//获取控制权,让本类监听解析流程
73
+ this.originlaEditableText = output; //获取到SpannableStringBuilder
74
+
75
+ }
76
+ count++;
77
+ }
78
+
79
+ }
80
+
81
+ private void endHandleTag(String tag, Editable output, XMLReader xmlReader) {
82
+ if (tag.equalsIgnoreCase(tag)) {
83
+ count--;
84
+ if (count == 0) {
85
+ this.originalXmlReader.setContentHandler(this.orginalContentHandler);
86
+ //将原始的handler交还
87
+ this.originalXmlReader = null;
88
+ this.originlaEditableText = null;
89
+ this.orginalContentHandler = null;
90
+ //还原控制权
91
+ }
92
+ }
93
+
94
+ }
95
+
96
+ @Override
97
+ public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
98
+
99
+ if (localName.equalsIgnoreCase(H5_TAG)) {
100
+ handleTag(true, localName, this.originlaEditableText, this.originalXmlReader);
101
+ } else if (canHandleTag(localName)) { //拦截,判断是否可以解析该标签
102
+
103
+ final HtmlTag htmlTag = tagHandlerMap.get(localName); //读取自定义解析器开始解析
104
+ htmlTag.startHandleTag(this.originlaEditableText, atts);
105
+
106
+ } else if (orginalTags.contains(localName)) { //无法解析的优先让原Html类解析
107
+ this.orginalContentHandler.startElement(uri, localName, qName, atts);
108
+ } else {
109
+ // Log.e(LOG_TAG, "无法解析的标签<" + localName + ">");
110
+ }
111
+
112
+ }
113
+
114
+ private boolean canHandleTag(String tagName) {
115
+ if (!tagHandlerMap.containsKey(tagName)) {
116
+ return false;
117
+ }
118
+ final HtmlTag htmlTag = tagHandlerMap.get(tagName);
119
+ return htmlTag != null;
120
+
121
+ }
122
+
123
+ @Override
124
+ public void endElement(String uri, String localName, String qName) throws SAXException {
125
+
126
+ if (localName.equalsIgnoreCase(H5_TAG)) {
127
+ handleTag(false, localName, this.originlaEditableText, this.originalXmlReader);
128
+ } else if (canHandleTag(localName)) {
129
+ final HtmlTag htmlTag = tagHandlerMap.get(localName); //读取自定义解析器结束解析
130
+ htmlTag.endHandleTag(this.originlaEditableText);
131
+ } else if (orginalTags.contains(localName)) {
132
+ this.orginalContentHandler.endElement(uri, localName, qName);
133
+ } else {
134
+ // Log.e(LOG_TAG, "无法解析的标签</" + localName + ">");
135
+ }
136
+ }
137
+
138
+ @Override
139
+ public void characters(char[] ch, int start, int length) throws SAXException {
140
+ orginalContentHandler.characters(ch, start, length);
141
+ }
142
+
143
+ @Override
144
+ public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
145
+ orginalContentHandler.ignorableWhitespace(ch, start, length);
146
+ }
147
+
148
+ @Override
149
+ public void processingInstruction(String target, String data) throws SAXException {
150
+ orginalContentHandler.processingInstruction(target, data);
151
+ }
152
+
153
+ @Override
154
+ public void skippedEntity(String name) throws SAXException {
155
+ orginalContentHandler.skippedEntity(name);
156
+ }
157
+
158
+
159
+ @Override
160
+ public void setDocumentLocator(Locator locator) {
161
+ orginalContentHandler.setDocumentLocator(locator);
162
+ }
163
+
164
+ @Override
165
+ public void startDocument() throws SAXException {
166
+ orginalContentHandler.startDocument();
167
+ }
168
+
169
+ @Override
170
+ public void endDocument() throws SAXException {
171
+ orginalContentHandler.endDocument();
172
+ }
173
+
174
+ @Override
175
+ public void startPrefixMapping(String prefix, String uri) throws SAXException {
176
+ orginalContentHandler.startPrefixMapping(prefix, uri);
177
+ }
178
+
179
+ @Override
180
+ public void endPrefixMapping(String prefix) throws SAXException {
181
+ orginalContentHandler.endPrefixMapping(prefix);
182
+ }
183
+
184
+
185
+ }
@@ -0,0 +1,160 @@
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 android.support.annotation.Nullable;
10
+
11
+ import org.xml.sax.Attributes;
12
+
13
+ public class SpanTag extends HtmlTag {
14
+
15
+ public SpanTag(Context context) {
16
+ super(context);
17
+ }
18
+
19
+ private static String getTextColorPattern(String style) {
20
+ String cssName = "text-color";
21
+ String cssVal = getHtmlCssValue(style, cssName);
22
+ if (TextUtils.isEmpty(cssVal)) {
23
+ cssName = "color";
24
+ cssVal = getHtmlCssValue(style, cssName);
25
+ }
26
+ return cssVal;
27
+ }
28
+
29
+ @Nullable
30
+ private static String getHtmlCssValue(String style, String cssName) {
31
+ if (TextUtils.isEmpty(style)) return null;
32
+ final String[] keyValueSet = style.toLowerCase().split(";");
33
+ if (keyValueSet == null) return null;
34
+ for (int i = 0; i < keyValueSet.length; i++) {
35
+ final String match = keyValueSet[i].replaceAll(" ", "").toLowerCase();
36
+ if (match.indexOf(cssName) == 0) {
37
+ final String[] parts = match.split(":");
38
+ if (parts == null || parts.length != 2) continue;
39
+ return parts[1];
40
+ }
41
+ }
42
+ return null;
43
+ }
44
+
45
+ private static String getBackgroundColorPattern(String style) {
46
+ String cssName = "background-color";
47
+ String cssVal = getHtmlCssValue(style, cssName);
48
+
49
+ if (TextUtils.isEmpty(cssVal)) {
50
+ cssName = "bakground";
51
+ cssVal = getHtmlCssValue(style, cssName);
52
+ }
53
+
54
+ return cssVal;
55
+ }
56
+
57
+ private static String getTextFontSizePattern(String style) {
58
+ String cssName = "font-size";
59
+ String cssVal = getHtmlCssValue(style, cssName);
60
+ if (TextUtils.isEmpty(cssVal)) {
61
+ cssName = "text-size";
62
+ cssVal = getHtmlCssValue(style, cssName);
63
+ }
64
+ return cssVal;
65
+ }
66
+
67
+ private static String getTextDecorationPattern(String style) {
68
+ String cssName = "text-decoration";
69
+ String cssVal = getHtmlCssValue(style, cssName);
70
+ return cssVal;
71
+ }
72
+
73
+ private static String getTextFontPattern(String style) {
74
+ String cssName = "font-weight";
75
+ String cssVal = getHtmlCssValue(style, cssName);
76
+ return cssVal;
77
+ }
78
+
79
+
80
+ @Override
81
+ public void startHandleTag(Editable text, Attributes attributes) {
82
+ String style = attributes.getValue("", "style");
83
+ if (TextUtils.isEmpty(style)) return;
84
+
85
+
86
+ String textColorPattern = getTextColorPattern(style);
87
+ if (!TextUtils.isEmpty(textColorPattern)) {
88
+ int c = getHtmlColor(textColorPattern);
89
+ c = c | 0xFF000000;
90
+ start(text, new ForegroundColorSpan(c));
91
+
92
+ }
93
+
94
+ startMarkTextFont(text, style);
95
+
96
+ String backgroundColorPattern = getBackgroundColorPattern(style);
97
+ if (!TextUtils.isEmpty(backgroundColorPattern)) {
98
+ int c = getHtmlColor(backgroundColorPattern);
99
+ c = c | 0xFF000000;
100
+ //注意,第二个参数可以为任意Object类型,这里起到标记的作用
101
+ start(text, new Background(c));
102
+ }
103
+
104
+ }
105
+
106
+ private void startMarkTextFont(Editable text, String style) {
107
+
108
+ String fontSize = getTextFontSizePattern(style);
109
+ String textDecoration = getTextDecorationPattern(style);
110
+ String fontWidget = getTextFontPattern(style);
111
+
112
+ int textSize = -1;
113
+ if (!TextUtils.isEmpty(fontSize)) {
114
+ textSize = getHtmlSize(fontSize);
115
+ }
116
+ int textDecorationVal = -1;
117
+ if (!TextUtils.isEmpty(textDecoration)) {
118
+ if (textDecoration.equals("underline")) {
119
+ textDecorationVal = TextFontSpan.TextDecoration_UNDERLINE;
120
+ } else if (textDecoration.equals("line-through")) {
121
+ textDecorationVal = TextFontSpan.TextDecoration_LINE_THROUGH;
122
+ } else if (textDecoration.equals("overline")) {
123
+ textDecorationVal = TextFontSpan.TextDecoration_OVERLINE;//暂不支持
124
+ } else if (textDecoration.equals("none")) {
125
+ textDecorationVal = TextFontSpan.TextDecoration_NONE;
126
+ }
127
+ }
128
+ int fontWeidgtVal = -1;
129
+ if (!TextUtils.isEmpty(fontWidget)) {
130
+ if (textDecoration.equals("normal")) {
131
+ fontWeidgtVal = TextFontSpan.FontWidget_NORMAL;
132
+ } else if (textDecoration.equals("bold")) {
133
+ fontWeidgtVal = TextFontSpan.FontWidget_BOLD;
134
+ }
135
+ }
136
+
137
+ start(text, new Font(textSize, textDecorationVal, fontWeidgtVal));
138
+ }
139
+
140
+ @Override
141
+ public void endHandleTag(Editable text) {
142
+
143
+
144
+ Background b = getLast(text, Background.class); //读取出最后标记类型
145
+ if (b != null) {
146
+ end(text, Background.class, new BackgroundColorSpan(b.color)); //设置为Android可以解析的24种ParcelableSpan基本分类,当然也可以自己定义,但需要集成原有的分类
147
+ }
148
+
149
+ final ForegroundColorSpan fc = getLast(text, ForegroundColorSpan.class);
150
+ if (fc != null) {
151
+ end(text, ForegroundColorSpan.class, new ForegroundColorSpan(fc.getForegroundColor()));
152
+ }
153
+
154
+ Font f = getLast(text, Font.class);
155
+ if (f != null) {
156
+ end(text, Font.class, new TextFontSpan(f.textSize, f.textDecordation, f.fontWeidght)); //使用自定义的
157
+ }
158
+ }
159
+
160
+ }
@@ -0,0 +1,102 @@
1
+ package com.tencent.extend.views.tag;
2
+
3
+ import android.os.Parcel;
4
+ import android.text.TextPaint;
5
+ import android.text.style.AbsoluteSizeSpan;
6
+
7
+ public class TextFontSpan extends AbsoluteSizeSpan {
8
+
9
+ public static final int FontWidget_NORMAL = 400;
10
+ public static final int FontWidget_BOLD = 750;
11
+
12
+ public static final int TextDecoration_NONE = 0;
13
+ public static final int TextDecoration_UNDERLINE = 1;
14
+ public static final int TextDecoration_LINE_THROUGH = 2;
15
+ public static final int TextDecoration_OVERLINE = 3;
16
+
17
+ private int fontWidget = -1;
18
+ private int textDecoration = -1;
19
+
20
+ private int mSize = -1;
21
+
22
+ public TextFontSpan(int size, int textDecoration, int fontWidget) {
23
+ this(size, false);
24
+ this.mSize = size;
25
+ this.fontWidget = fontWidget;
26
+ this.textDecoration = textDecoration;
27
+ //这里我们以px作为单位,方便统一调用
28
+ }
29
+
30
+ /**
31
+ * 保持构造方法无法被外部调用
32
+ *
33
+ * @param size
34
+ * @param dip
35
+ */
36
+ protected TextFontSpan(int size, boolean dip) {
37
+ super(size, dip);
38
+ }
39
+
40
+ public TextFontSpan(Parcel src) {
41
+ super(src);
42
+ fontWidget = src.readInt();
43
+ textDecoration = src.readInt();
44
+ mSize = src.readInt();
45
+ }
46
+
47
+ @Override
48
+ public void writeToParcel(Parcel dest, int flags) {
49
+ super.writeToParcel(dest, flags);
50
+ dest.writeInt(fontWidget);
51
+ dest.writeInt(textDecoration);
52
+ dest.writeInt(mSize);
53
+ }
54
+
55
+ @Override
56
+ public void updateDrawState(TextPaint ds) {
57
+ if (this.mSize >= 0) {
58
+ super.updateDrawState(ds);
59
+ }
60
+
61
+ if (fontWidget == FontWidget_BOLD) {
62
+ ds.setFakeBoldText(true);
63
+ } else if (fontWidget == FontWidget_NORMAL) {
64
+ ds.setFakeBoldText(false);
65
+ }
66
+ if (textDecoration == TextDecoration_NONE) {
67
+ ds.setStrikeThruText(false);
68
+ ds.setUnderlineText(false);
69
+ } else if (textDecoration == TextDecoration_LINE_THROUGH) {
70
+ ds.setStrikeThruText(true);
71
+ ds.setUnderlineText(false);
72
+ } else if (textDecoration == TextDecoration_UNDERLINE) {
73
+ ds.setStrikeThruText(false);
74
+ ds.setUnderlineText(true);
75
+ }
76
+
77
+ }
78
+
79
+ @Override
80
+ public void updateMeasureState(TextPaint ds) {
81
+ if (this.mSize >= 0) {
82
+ super.updateMeasureState(ds);
83
+ }
84
+
85
+ if (fontWidget == FontWidget_BOLD) {
86
+ ds.setFakeBoldText(true);
87
+ } else if (fontWidget == FontWidget_NORMAL) {
88
+ ds.setFakeBoldText(false);
89
+ }
90
+
91
+ if (textDecoration == TextDecoration_NONE) {
92
+ ds.setStrikeThruText(false);
93
+ ds.setUnderlineText(false);
94
+ } else if (textDecoration == TextDecoration_LINE_THROUGH) {
95
+ ds.setStrikeThruText(true);
96
+ ds.setUnderlineText(false);
97
+ } else if (textDecoration == TextDecoration_UNDERLINE) {
98
+ ds.setStrikeThruText(false);
99
+ ds.setUnderlineText(true);
100
+ }
101
+ }
102
+ }
@@ -0,0 +1,10 @@
1
+ package com.tencent.extend.views.waterfall;
2
+
3
+ import android.view.View;
4
+
5
+ /**
6
+ * 瀑布流中的一个块
7
+ */
8
+ public interface Chunk {
9
+ View getView();
10
+ }
@@ -0,0 +1,5 @@
1
+ package com.tencent.extend.views.waterfall;
2
+
3
+ public interface ChunkGroup extends Chunk {
4
+ void onChildAttachedToWindow(Chunk chunk);
5
+ }
@@ -0,0 +1,4 @@
1
+ package com.tencent.extend.views.waterfall;
2
+
3
+ public interface Section extends ChunkGroup{
4
+ }
@@ -0,0 +1,5 @@
1
+ package com.tencent.extend.views.waterfall;
2
+
3
+ public interface Tabs {
4
+ void onChunkAttachedToWindow(Chunk chunk);
5
+ }
@@ -0,0 +1,26 @@
1
+ package com.tencent.extend.views.waterfall;
2
+
3
+ import android.view.View;
4
+
5
+ import com.tencent.mtt.hippy.utils.ExtendUtil;
6
+
7
+ public class WaterfallUtils {
8
+
9
+ public static String debugChunk(Chunk chunk) {
10
+ // Log the chunk
11
+ if (chunk == null) {
12
+ return "null";
13
+ }
14
+ View view = chunk.getView();
15
+ return "Chunk: " + ExtendUtil.debugView(view);
16
+ }
17
+
18
+ public static String getChunkSID(Chunk chunk) {
19
+ // Get the SID of the chunk
20
+ if (chunk == null) {
21
+ return null;
22
+ }
23
+ View view = chunk.getView();
24
+ return ExtendUtil.getViewSID(view);
25
+ }
26
+ }