@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,382 @@
1
+ /* Tencent is pleased to support the open source community by making Hippy available.
2
+ * Copyright (C) 2018 THL A29 Limited, a Tencent company. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ package com.tencent.mtt.hippy.views.image;
17
+
18
+ import android.content.Context;
19
+ import android.content.pm.ApplicationInfo;
20
+ import android.content.pm.PackageInfo;
21
+ import android.content.pm.PackageManager;
22
+ import android.graphics.Bitmap;
23
+ import android.graphics.Canvas;
24
+ import android.graphics.Color;
25
+ import android.graphics.ColorMatrix;
26
+ import android.graphics.ColorMatrixColorFilter;
27
+ import android.graphics.Paint;
28
+ import android.graphics.drawable.AdaptiveIconDrawable;
29
+ import android.graphics.drawable.BitmapDrawable;
30
+ import android.graphics.drawable.Drawable;
31
+ import android.os.Build;
32
+ import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
33
+ import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
34
+ import android.text.TextUtils;
35
+ import android.view.View;
36
+
37
+ import com.tencent.mtt.hippy.HippyInstanceContext;
38
+ import com.tencent.mtt.hippy.R;
39
+ import com.tencent.mtt.hippy.annotation.HippyController;
40
+ import com.tencent.mtt.hippy.annotation.HippyControllerProps;
41
+ import com.tencent.mtt.hippy.common.HippyArray;
42
+ import com.tencent.mtt.hippy.common.HippyMap;
43
+ import com.tencent.mtt.hippy.dom.node.ImageNode;
44
+ import com.tencent.mtt.hippy.dom.node.NodeProps;
45
+ import com.tencent.mtt.hippy.dom.node.StyleNode;
46
+ import com.tencent.mtt.hippy.uimanager.HippyViewController;
47
+
48
+ @SuppressWarnings({"deprecation", "unused"})
49
+ @HippyController(name = HippyImageViewController.CLASS_NAME)
50
+ public class HippyImageViewController extends HippyViewController<HippyImageView> {
51
+
52
+ public static final String CLASS_NAME = "Image";
53
+
54
+ @Override
55
+ protected StyleNode createNode(boolean virtual) {
56
+ return new ImageNode(virtual);
57
+ }
58
+
59
+ @Override
60
+ protected View createViewImpl(Context context, HippyMap iniProps) {
61
+ HippyImageView imageView = new HippyImageView(context);
62
+ if (iniProps != null) {
63
+ imageView.setInitProps(iniProps);
64
+ if (iniProps.containsKey("enablePostTask")) {
65
+ imageView.setEnablePostTask(true);
66
+ }
67
+ }
68
+
69
+ return imageView;
70
+ }
71
+
72
+ @SuppressWarnings("unused")
73
+ @Override
74
+ protected View createViewImpl(Context context) {
75
+ return new HippyImageView(context);
76
+ }
77
+
78
+ @SuppressWarnings("unused")
79
+ @HippyControllerProps(name = NodeProps.CUSTOM_PROP_IMAGE_TYPE, defaultType = HippyControllerProps.STRING)
80
+ public void setImageType(HippyImageView hippyImageView, String type) {
81
+ hippyImageView.setImageType(type);
82
+ }
83
+
84
+ /**
85
+ * zhaopeng add 设置图片的用途
86
+ * @param hippyImageView
87
+ * @param type
88
+ */
89
+ @SuppressWarnings("unused")
90
+ @HippyControllerProps(name = "roleType", defaultType = HippyControllerProps.STRING)
91
+ public void setRoleType(HippyImageView hippyImageView, String type) {
92
+ switch (type) {
93
+ case "cover":
94
+ hippyImageView.setRoleType(HippyImageView.RoleType.COVER);
95
+ break;
96
+ case "icon":
97
+ hippyImageView.setRoleType(HippyImageView.RoleType.ICON);
98
+ break;
99
+ default:
100
+ hippyImageView.setRoleType(HippyImageView.RoleType.UNDEFINE);
101
+ break;
102
+ }
103
+ }
104
+
105
+ @SuppressWarnings("unused")
106
+ @HippyControllerProps(name = "src", defaultType = HippyControllerProps.STRING)
107
+ public void setUrl(HippyImageView hippyImageView, String url) {
108
+ if (!TextUtils.isEmpty(url) && url.startsWith("icon://")) {
109
+ if (setApkIcon(hippyImageView, url)) {
110
+ return;
111
+ }
112
+ try {
113
+ PackageManager pm = hippyImageView.getContext().getPackageManager();
114
+ ApplicationInfo pi = pm.getApplicationInfo(url.replace("icon://", ""), 0);
115
+ Drawable iconDrawable = pi.loadIcon(pm);
116
+ if (iconDrawable == null) iconDrawable = pi.loadLogo(pm);
117
+ hippyImageView.setBackgroundDrawable(iconDrawable);
118
+ } catch (Exception ignored) {
119
+ }
120
+ return;
121
+ }
122
+ hippyImageView.setUrl(getInnerPath((HippyInstanceContext) hippyImageView.getContext(), url));
123
+ }
124
+
125
+ private boolean setApkIcon(HippyImageView hippyImageView, String url) {
126
+ if (!TextUtils.isEmpty(url) && url.startsWith("icon://") && url.endsWith(".apk")) {
127
+ Drawable img = null;
128
+ RoundedBitmapDrawable rbd = null;
129
+ try {
130
+ PackageManager pm = hippyImageView.getContext().getPackageManager();
131
+ String apkPath = url.replace("icon://", "");
132
+ PackageInfo info = pm.getPackageArchiveInfo(apkPath, PackageManager.GET_META_DATA);
133
+ if (info != null) {
134
+ boolean isInstalled = isInstalled(pm, info.packageName);
135
+ ApplicationInfo queryInfo = info.applicationInfo;
136
+ if (isInstalled) {
137
+ queryInfo = pm.getApplicationInfo(info.packageName, PackageManager.GET_META_DATA);
138
+ } else {
139
+ queryInfo.publicSourceDir = apkPath;
140
+ }
141
+ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
142
+ img = pm.getApplicationBanner(queryInfo);
143
+ }
144
+ if (img == null) {
145
+ img = pm.getApplicationIcon(queryInfo);
146
+ }
147
+ }
148
+ } catch (Exception ignored) {
149
+ }
150
+
151
+ try {
152
+ if (img == null) {
153
+ img = hippyImageView.getContext().getResources().getDrawable(R.drawable.apk_error_icon);
154
+ }
155
+ if (img != null) {
156
+ rbd = RoundedBitmapDrawableFactory.create(hippyImageView.getContext().getResources(), parseBitmap(img));
157
+ }
158
+ if (rbd != null) {
159
+ rbd.setCornerRadius(25);
160
+ hippyImageView.setBackgroundDrawable(rbd);
161
+ }
162
+ } catch (Exception e) {
163
+ }
164
+ return true;
165
+ }
166
+ return false;
167
+ }
168
+
169
+ private Bitmap parseBitmap(Drawable drawable) {
170
+ if (drawable == null) {
171
+ return null;
172
+ }
173
+ Bitmap bitmap = null;
174
+ try {
175
+ if(drawable instanceof BitmapDrawable) {
176
+ bitmap = ((BitmapDrawable) drawable).getBitmap();
177
+ }
178
+ if (bitmap == null) {
179
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
180
+ if (drawable instanceof AdaptiveIconDrawable) {
181
+ AdaptiveIconDrawable adaptiveIconDrawable = (AdaptiveIconDrawable) drawable;
182
+ bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
183
+ Canvas canvas = new Canvas(bitmap);
184
+ adaptiveIconDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
185
+ adaptiveIconDrawable.draw(canvas);
186
+ }
187
+ }
188
+ }
189
+ } catch (Exception e) {
190
+ }
191
+ return bitmap;
192
+ }
193
+
194
+ private boolean isInstalled(PackageManager pm, String packageName) {
195
+ if (packageName != null) {
196
+ try {
197
+ PackageInfo info = pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
198
+ if (info != null) {
199
+ return true;
200
+ }
201
+ } catch (Exception e) {
202
+ }
203
+ }
204
+ return false;
205
+ }
206
+
207
+ @SuppressWarnings("unused")
208
+ @HippyControllerProps(name = "tintColor", defaultType = HippyControllerProps.NUMBER, defaultNumber = Color.TRANSPARENT)
209
+ public void setTintColor(HippyImageView hippyImageView, int tintColor) {
210
+ hippyImageView.setTintColor(tintColor);
211
+ }
212
+
213
+ @SuppressWarnings("unused")
214
+ @HippyControllerProps(name = NodeProps.RESIZE_MODE, defaultType = HippyControllerProps.STRING, defaultString = "fitXY")
215
+ public void setResizeMode(HippyImageView hippyImageView, String resizeModeValue) {
216
+ if ("contain".equals(resizeModeValue)) {
217
+ // 在保持图片宽高比的前提下缩放图片,直到宽度和高度都小于等于容器视图的尺寸
218
+ // 这样图片完全被包裹在容器中,容器中可能留有空白
219
+ hippyImageView.setScaleType(HippyImageView.ScaleType.CENTER_INSIDE);
220
+ } else if ("cover".equals(resizeModeValue)) {
221
+ // 在保持图片宽高比的前提下缩放图片,直到宽度和高度都大于等于容器视图的尺寸
222
+ // 这样图片完全覆盖甚至超出容器,容器中不留任何空白
223
+ hippyImageView.setScaleType(HippyImageView.ScaleType.CENTER_CROP);
224
+ } else if ("center".equals(resizeModeValue)) {
225
+ // 居中不拉伸
226
+ hippyImageView.setScaleType(HippyImageView.ScaleType.CENTER);
227
+ } else if ("origin".equals(resizeModeValue)) {
228
+ // 不拉伸,居左上
229
+ hippyImageView.setScaleType(HippyImageView.ScaleType.ORIGIN);
230
+ } else if ("repeat".equals(resizeModeValue)) {
231
+ hippyImageView.setScaleType(HippyImageView.ScaleType.REPEAT);
232
+ } else {
233
+ // stretch and other mode
234
+ // 拉伸图片且不维持宽高比,直到宽高都刚好填满容器
235
+ hippyImageView.setScaleType(HippyImageView.ScaleType.FIT_XY);
236
+ }
237
+ }
238
+
239
+ @SuppressWarnings("unused")
240
+ @HippyControllerProps(name = NodeProps.BACKGROUND_COLOR, defaultType = HippyControllerProps.NUMBER, defaultNumber = Color.TRANSPARENT)
241
+ public void setBackgroundColor(HippyImageView view, int backgroundColor) {
242
+ view.setBackgroundColor(backgroundColor);
243
+ }
244
+
245
+ @SuppressWarnings("unused")
246
+ @HippyControllerProps(name = "defaultSource", defaultType = HippyControllerProps.STRING)
247
+ public void setDefaultSource(HippyImageView hippyImageView, String defaultSource) {
248
+ hippyImageView.setHippyViewDefaultSource(
249
+ getInnerPath((HippyInstanceContext) hippyImageView.getContext(), defaultSource));
250
+ }
251
+
252
+ @SuppressWarnings("unused")
253
+ @HippyControllerProps(name = "capInsets", defaultType = HippyControllerProps.MAP)
254
+ public void setCapInsets(HippyImageView hippyImageView, HippyMap capInsetsMap) {
255
+ if (capInsetsMap == null) {
256
+ hippyImageView.setNinePatchCoordinate(true, 0, 0, 0, 0);
257
+ } else {
258
+ int topCoordinate = capInsetsMap.getInt("top");
259
+ int leftCoordinate = capInsetsMap.getInt("left");
260
+ int bottomCoordinate = capInsetsMap.getInt("bottom");
261
+ int rightCoordinate = capInsetsMap.getInt("right");
262
+ hippyImageView.setNinePatchCoordinate(false, leftCoordinate, topCoordinate, rightCoordinate,
263
+ bottomCoordinate);
264
+ }
265
+ }
266
+
267
+ @SuppressWarnings("unused")
268
+ @HippyControllerProps(name = "onLoad", defaultType = HippyControllerProps.BOOLEAN)
269
+ public void setOnLoad(HippyImageView hippyImageView, boolean enable) {
270
+ hippyImageView.setImageEventEnable(HippyImageView.ImageEvent.ONLOAD.ordinal(), enable);
271
+ }
272
+
273
+ @SuppressWarnings("unused")
274
+ @HippyControllerProps(name = "onLoadEnd", defaultType = HippyControllerProps.BOOLEAN)
275
+ public void setOnLoadEnd(HippyImageView hippyImageView, boolean enable) {
276
+ hippyImageView.setImageEventEnable(HippyImageView.ImageEvent.ONLOAD_END.ordinal(), enable);
277
+ }
278
+
279
+ @SuppressWarnings("unused")
280
+ @HippyControllerProps(name = "onLoadStart", defaultType = HippyControllerProps.BOOLEAN)
281
+ public void setOnLoadStart(HippyImageView hippyImageView, boolean enable) {
282
+ hippyImageView.setImageEventEnable(HippyImageView.ImageEvent.ONLOAD_START.ordinal(), enable);
283
+ }
284
+
285
+ @SuppressWarnings("unused")
286
+ @HippyControllerProps(name = "onError", defaultType = HippyControllerProps.BOOLEAN)
287
+ public void setOnError(HippyImageView hippyImageView, boolean enable) {
288
+ hippyImageView.setImageEventEnable(HippyImageView.ImageEvent.ONERROR.ordinal(), enable);
289
+ }
290
+
291
+ @SuppressWarnings("unused")
292
+ @HippyControllerProps(name = "enableFade", defaultType = HippyControllerProps.BOOLEAN, defaultBoolean = true)
293
+ public void setFadeEnabled(HippyImageView hippyImageView, boolean enable) {
294
+ hippyImageView.setFadeEnabled(enable);
295
+ }
296
+
297
+ @SuppressWarnings("unused")
298
+ @HippyControllerProps(name = "fadeDuration", defaultType = HippyControllerProps.NUMBER)
299
+ public void setFadeDuration(HippyImageView hippyImageView, int fadeDuration) {
300
+ hippyImageView.setFadeDuration(fadeDuration);
301
+ }
302
+
303
+ // @SuppressWarnings("unused")
304
+ // @HippyControllerProps(name = "enablePostTask", defaultType = HippyControllerProps.BOOLEAN)
305
+ // public void setEnablePostTask(HippyImageView hippyImageView, boolean enable) {
306
+ // hippyImageView.setEnablePostTask(enable);
307
+ // }
308
+
309
+ /*** zhaopeng add8***/
310
+ @HippyControllerProps(name = "loadDelay", defaultType = HippyControllerProps.NUMBER, defaultNumber = -1)
311
+ public void setDelayLoad(HippyImageView hippyImageView, int delay) {
312
+ hippyImageView.setDelayLoad(delay);
313
+ }
314
+
315
+ /*** zhaopeng add8***/
316
+ @HippyControllerProps(name = "loadImgDelay", defaultType = HippyControllerProps.NUMBER, defaultNumber = -1)
317
+ public void setDelayLoadImage(HippyImageView hippyImageView, int delay) {
318
+ hippyImageView.setDelayLoad(delay);
319
+ }
320
+
321
+ /*** zhaopeng add8***/
322
+ @HippyControllerProps(name = "postDelay", defaultType = HippyControllerProps.NUMBER, defaultNumber = -1)
323
+ public void setPostDelay(HippyImageView hippyImageView, int delay) {
324
+ hippyImageView.setEnablePostTask(delay > 0);
325
+ hippyImageView.setDelayLoad(delay);
326
+ }
327
+
328
+ /**
329
+ * touch/click
330
+ **/
331
+ @HippyControllerProps(name = NodeProps.FOCUS_BORDER_STYLE, defaultType = HippyControllerProps.STRING, defaultString = "solid")
332
+ public void setFocusBorderStyle(HippyImageView view, String style) {
333
+ if (view != null) {
334
+ view.setFocusBorderEnable(!"none".equals(style));
335
+ }
336
+ }
337
+
338
+ /**
339
+ * touch/click
340
+ **/
341
+ @HippyControllerProps(name = NodeProps.FOCUS_BORDER_ENABLE, defaultType = HippyControllerProps.BOOLEAN, defaultBoolean = true)
342
+ public void setFocusBorderEnable(HippyImageView view, boolean enable) {
343
+ if (view != null) {
344
+ view.setFocusBorderEnable(enable);
345
+ }
346
+ }
347
+
348
+ @HippyControllerProps(name = NodeProps.FOCUS_BORDER_TYPE, defaultType = HippyControllerProps.NUMBER, defaultNumber = 0)
349
+ public void setFocusBorderType(HippyImageView view, int type) {
350
+ if (view != null) {
351
+ view.setFocusBorderType(type);
352
+ }
353
+ }
354
+
355
+ @HippyControllerProps(name = NodeProps.COLOR_FILTER, defaultType = HippyControllerProps.NUMBER, defaultNumber = 0)
356
+ public void setColorFilter(HippyImageView view, int colorType) {
357
+ if (view != null) {
358
+ Paint paint = new Paint();
359
+ ColorMatrix cm = new ColorMatrix();
360
+ if (colorType != 0) {
361
+ cm.setSaturation(0f);
362
+ } else {
363
+ cm.setSaturation(1f);
364
+ }
365
+ paint.setColorFilter(new ColorMatrixColorFilter(cm));
366
+ view.setLayerType(View.LAYER_TYPE_HARDWARE, paint);
367
+ }
368
+ }
369
+
370
+ @Override
371
+ public void dispatchFunction(HippyImageView view, String functionName, HippyArray var) {
372
+ super.dispatchFunction(view, functionName, var);
373
+ switch (functionName) {
374
+ case "setSrc":
375
+ this.setUrl(view, var.getString(0));
376
+ break;
377
+ case "resizeMode":
378
+ this.setResizeMode(view, var.getString(0));
379
+ break;
380
+ }
381
+ }
382
+ }
@@ -0,0 +1,7 @@
1
+ package com.tencent.mtt.hippy.views.image;
2
+
3
+ import com.tencent.mtt.supportui.adapters.image.IImageRequestListener;
4
+
5
+ public interface IImageStateListener<T> extends IImageRequestListener<T> {
6
+ void onImageLayout(T drawableTarget, int left, int top, int right, int bottom);
7
+ }
@@ -0,0 +1,255 @@
1
+ package com.tencent.mtt.hippy.views.list;
2
+
3
+ import android.graphics.Rect;
4
+ import android.util.Log;
5
+ import android.view.View;
6
+
7
+ import android.support.annotation.NonNull;
8
+
9
+ import com.tencent.mtt.hippy.utils.LogUtils;
10
+ import com.tencent.mtt.hippy.views.view.HippyViewGroup;
11
+ import com.tencent.mtt.supportui.views.recyclerview.RecyclerViewBase;
12
+
13
+ import static android.view.View.FOCUS_BACKWARD;
14
+ import static android.view.View.FOCUS_DOWN;
15
+ import static android.view.View.FOCUS_FORWARD;
16
+ import static android.view.View.FOCUS_LEFT;
17
+ import static android.view.View.FOCUS_RIGHT;
18
+ import static android.view.View.FOCUS_UP;
19
+
20
+ public abstract class ChildOnScreenScroller {
21
+
22
+
23
+ public boolean requestChildRectangleOnScreen(@NonNull RecyclerViewBase parent, @NonNull View child, @NonNull Rect rect, boolean immediate, int direction){
24
+ return false;
25
+ }
26
+
27
+ public boolean smoothScrollToPosition(RecyclerViewBase recyclerView, RecyclerViewBase.State state, int position) {
28
+ return false;
29
+ }
30
+
31
+ public void setScrollThresholdVertical(int threshold){
32
+
33
+ }
34
+
35
+ public void setScrollThresholdHorizontal(int threshold){
36
+
37
+ }
38
+
39
+ public static class Default extends ChildOnScreenScroller {
40
+ final int orientation ;
41
+ int scrollOffset;
42
+ int clampForward = 0;
43
+ int clampBackward = 0;
44
+ public int thresholdScrollVertical = 50;
45
+ public int thresholdScrollHorizontal = 300;
46
+ public int type = TVRecyclerView.REQUEST_CHILD_ON_SCREEN_TYPE_CENTER;
47
+
48
+
49
+ public Default(int orientation, int scrollOffset) {
50
+ this.orientation = orientation;
51
+ this.scrollOffset = scrollOffset;
52
+ }
53
+
54
+ public void setType(int type) {
55
+ this.type = type;
56
+ }
57
+
58
+ public void setClampBackward(int clampBackward) {
59
+ this.clampBackward = clampBackward;
60
+ }
61
+
62
+ public void setClampForward(int clampForward) {
63
+ this.clampForward = clampForward;
64
+ }
65
+
66
+ @Override
67
+ public void setScrollThresholdHorizontal(int threshold) {
68
+ this.thresholdScrollHorizontal = threshold;
69
+ }
70
+
71
+ @Override
72
+ public void setScrollThresholdVertical(int threshold) {
73
+ this.thresholdScrollVertical = threshold;
74
+ }
75
+
76
+ public int getScrollOffset() {
77
+ return scrollOffset;
78
+ }
79
+
80
+ public void setScrollOffset(int scrollOffset) {
81
+ this.scrollOffset = scrollOffset;
82
+ }
83
+
84
+ public Default(int orientation) {
85
+ this(orientation,0);
86
+ }
87
+
88
+ @Override
89
+ public boolean requestChildRectangleOnScreen(@NonNull RecyclerViewBase parent, @NonNull View child, @NonNull Rect rect, boolean immediate,int direction) {
90
+
91
+ if(type == TVRecyclerView.REQUEST_CHILD_ON_SCREEN_TYPE_NONE){
92
+ if(LogUtils.isDebug()) {
93
+ LogUtils.e("ChildOnScreenScroller", "requestChildRectangleOnScreen makeChildVisibleType none scroll Type return ");
94
+ }
95
+ return true;
96
+ }
97
+
98
+ if (orientation == RecyclerViewBase.VERTICAL) {
99
+ final int parentTop = parent.getPaddingTop();
100
+ int childTop = child.getTop() + rect.top - child.getScrollY();
101
+ final int parentBottom = parent.getHeight() - parent.getPaddingBottom();
102
+ int childBottom = childTop + rect.bottom;
103
+ boolean isChildVisible = childTop > parentTop && childBottom < parentBottom;
104
+ if(LogUtils.isDebug()) {
105
+ LogUtils.d("ChildOnScreenScroller", "requestChildRectangleOnScreen isChildVisible:" + isChildVisible);
106
+ }
107
+
108
+ final int parentCenter = (int) (parentTop + parent.getHeight() * 0.5f);
109
+ View focused = null;
110
+
111
+ if (focused == null) {
112
+ if(child instanceof HippyViewGroup &&((HippyViewGroup) child).isFocusScrollTarget()){
113
+ focused = child;
114
+ childTop = child.getTop() - child.getScrollY();
115
+ childBottom = childTop + rect.bottom;
116
+ // Log.e("ZHAOPENG","11111 child : "+child);
117
+ }else {
118
+ focused = child.findFocus();
119
+ focused = focused != null ? focused : child;
120
+ // Log.e("ZHAOPENG","22222 child : "+child+",focused:"+focused);
121
+ }
122
+ }
123
+ if (focused != null) {
124
+
125
+ if(type == TVRecyclerView.REQUEST_CHILD_ON_SCREEN_TYPE_CENTER) {
126
+ final int childCenter = (int) (childTop + focused.getHeight() * 0.5f);
127
+
128
+ final int dy = childCenter - parentCenter + scrollOffset;
129
+
130
+ final int deltaY = Math.abs(dy);
131
+ int threshold;
132
+ if (direction == FOCUS_LEFT || direction == FOCUS_RIGHT) {
133
+ threshold = thresholdScrollHorizontal;
134
+ } else {
135
+ threshold = thresholdScrollVertical;
136
+ }
137
+ //isChildVisible判断有误,暂时注释
138
+ // if (deltaY < threshold && isChildVisible) {
139
+ // return true;
140
+ // }
141
+ if(LogUtils.isDebug()) {
142
+ LogUtils.d("ChildOnScreenScroller", "handle Scroll deltaY : " + deltaY + ",threshold:" + threshold);
143
+ }
144
+ if (Math.abs(deltaY) < threshold) {
145
+ return true;
146
+ }
147
+ exeScrollRecyclerView(parent, child, 0, dy, immediate);
148
+ return dy != 0;
149
+ }else{
150
+ final int dy;
151
+ {
152
+ if(direction == FOCUS_UP || direction == FOCUS_BACKWARD){
153
+ //后退
154
+ dy = Math.min(0,childTop - (parentTop + clampBackward));
155
+ }else if(direction == FOCUS_DOWN || direction == FOCUS_FORWARD){
156
+ //前进
157
+ dy = Math.max(0,childBottom - (parentBottom - clampForward));
158
+ }else{
159
+ dy = 0;
160
+ }
161
+
162
+ if(LogUtils.isDebug()) {
163
+ LogUtils.d("ChildOnScreenScroller", "handle Scroll deltaY : " + dy + ",threshold:" + thresholdScrollVertical);
164
+ LogUtils.d("ScrollLog", "handle Scroll deltaY : " + dy + ",threshold:" + thresholdScrollVertical);
165
+ }
166
+
167
+ if(Math.abs(dy) < thresholdScrollVertical){
168
+ LogUtils.d("ChildOnScreenScroller","return on dy < thresholdScrollVertical dy:"+dy+",thresholdScrollVertical:"+thresholdScrollVertical);
169
+ return true;
170
+ }
171
+ exeScrollRecyclerView(parent, child, 0, dy + scrollOffset, immediate);
172
+ return dy != 0;
173
+ }
174
+ }
175
+ }
176
+ }else{
177
+
178
+
179
+
180
+ final int parentLeft = parent.getPaddingLeft();
181
+ int childLeft = child.getLeft() + rect.left - child.getScrollX();
182
+ final int parentRight = parent.getWidth() - parent.getPaddingRight();
183
+ int childRight = childLeft + rect.right;
184
+
185
+
186
+ final int parentCenter = (int) (parentLeft + parent.getWidth() * 0.5f);
187
+ View focused = null;
188
+
189
+ if (focused == null) {
190
+ if(child instanceof HippyViewGroup &&((HippyViewGroup) child).isFocusScrollTarget()){
191
+ focused = child;
192
+ childLeft = child.getLeft() - child.getScrollY();
193
+ childRight = childLeft + rect.right;
194
+ // Log.e("ZHAOPENG","11111 child : "+child);
195
+ }else {
196
+ focused = child.findFocus();
197
+ focused = focused != null ? focused : child;
198
+ // Log.e("ZHAOPENG","22222 child : "+child+",focused:"+focused);
199
+ }
200
+ }
201
+
202
+
203
+
204
+ if (focused != null) {
205
+
206
+ if(type == TVRecyclerView.REQUEST_CHILD_ON_SCREEN_TYPE_CENTER) {
207
+ final int childCenter = (int) (childLeft + focused.getWidth() * 0.5f);
208
+
209
+ final int dx = childCenter - parentCenter + scrollOffset;
210
+
211
+ exeScrollRecyclerView(parent, child, dx, 0, immediate);
212
+ return dx != 0;
213
+ }else{
214
+ final int dx;
215
+ {
216
+ if(direction == FOCUS_LEFT || direction == FOCUS_BACKWARD){
217
+ //后退
218
+ dx = Math.min(0,childLeft - (parentLeft + clampBackward) + scrollOffset) ;
219
+ }else if(direction == FOCUS_RIGHT || direction == FOCUS_FORWARD){
220
+ //前进
221
+ dx = Math.max(0,childRight - (parentRight - clampForward) + scrollOffset);
222
+ }else{
223
+ dx = 0;
224
+ }
225
+ exeScrollRecyclerView(parent, child, dx, 0, immediate);
226
+ return dx != 0;
227
+ }
228
+ }
229
+ }
230
+
231
+ }
232
+
233
+ return false;
234
+ }
235
+
236
+
237
+ private void exeScrollRecyclerView(RecyclerViewBase parent, View child, int sx, int sy, boolean immediate){
238
+ if (immediate) {
239
+ parent.scrollBy(sx, sy);
240
+ } else {
241
+ parent.smoothScrollBy(sx, sy);
242
+ }
243
+ }
244
+
245
+ @Override
246
+ public boolean smoothScrollToPosition(RecyclerViewBase recyclerView, RecyclerViewBase.State state, int position) {
247
+ // super.smoothScrollToPosition(recyclerView, state, position);
248
+ return false;
249
+ }
250
+
251
+
252
+
253
+ }
254
+
255
+ }