@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.
- package/package.json +1 -1
- package/rules/.clinerules +27 -4
- package/rules/.cursorrules +27 -4
- package/rules/.github/copilot-instructions.md +27 -4
- package/rules/.source/hippy/extend_views/CoverFlowHorizontalView.java +203 -0
- package/rules/.source/hippy/extend_views/CoverFlowVerticalView.java +203 -0
- package/rules/.source/hippy/extend_views/CoverFlowViewController.java +195 -0
- package/rules/.source/hippy/extend_views/EngineRootView.java +125 -0
- package/rules/.source/hippy/extend_views/ExtendTag.java +83 -0
- package/rules/.source/hippy/extend_views/FocusSearchHelper.java +124 -0
- package/rules/.source/hippy/extend_views/IRecyclerItemView.java +12 -0
- package/rules/.source/hippy/extend_views/JSEventHandleView.java +5 -0
- package/rules/.source/hippy/extend_views/MarqueeRelayManager.java +133 -0
- package/rules/.source/hippy/extend_views/MarqueeRelayTextView.java +211 -0
- package/rules/.source/hippy/extend_views/ProgressBarView.java +83 -0
- package/rules/.source/hippy/extend_views/ProgressBarViewController.java +145 -0
- package/rules/.source/hippy/extend_views/SeekBarView.java +104 -0
- package/rules/.source/hippy/extend_views/SeekBarViewController.java +218 -0
- package/rules/.source/hippy/extend_views/StateImageView.java +149 -0
- package/rules/.source/hippy/extend_views/StateImageViewController.java +34 -0
- package/rules/.source/hippy/extend_views/TVButtonView.java +314 -0
- package/rules/.source/hippy/extend_views/TVButtonViewController.java +89 -0
- package/rules/.source/hippy/extend_views/TVTextView.java +684 -0
- package/rules/.source/hippy/extend_views/TVViewActor.java +811 -0
- package/rules/.source/hippy/extend_views/TVViewActorHost.java +6 -0
- package/rules/.source/hippy/extend_views/TVViewActor/346/216/245/345/205/245.md +66 -0
- package/rules/.source/hippy/extend_views/TemplateUtil.java +336 -0
- package/rules/.source/hippy/extend_views/TextButtonNode.java +47 -0
- package/rules/.source/hippy/extend_views/TextViewController.java +377 -0
- package/rules/.source/hippy/extend_views/fastlist/CenterFlyInAnimator.java +96 -0
- package/rules/.source/hippy/extend_views/fastlist/ChildOnScreenScroller.java +548 -0
- package/rules/.source/hippy/extend_views/fastlist/ClonedViewTag.java +17 -0
- package/rules/.source/hippy/extend_views/fastlist/EventDeliverer.java +55 -0
- package/rules/.source/hippy/extend_views/fastlist/FastAdapter.java +4683 -0
- package/rules/.source/hippy/extend_views/fastlist/FastAdapterUtil.java +982 -0
- package/rules/.source/hippy/extend_views/fastlist/FastFlexNode.java +48 -0
- package/rules/.source/hippy/extend_views/fastlist/FastFlexView.java +873 -0
- package/rules/.source/hippy/extend_views/fastlist/FastFlexViewController.java +130 -0
- package/rules/.source/hippy/extend_views/fastlist/FastItemNode.java +67 -0
- package/rules/.source/hippy/extend_views/fastlist/FastItemView.java +306 -0
- package/rules/.source/hippy/extend_views/fastlist/FastItemViewController.java +106 -0
- package/rules/.source/hippy/extend_views/fastlist/FastListModule.java +95 -0
- package/rules/.source/hippy/extend_views/fastlist/FastListNode.java +90 -0
- package/rules/.source/hippy/extend_views/fastlist/FastListView.java +2466 -0
- package/rules/.source/hippy/extend_views/fastlist/FastListViewController.java +1038 -0
- 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
- package/rules/.source/hippy/extend_views/fastlist/FastPendingView.java +47 -0
- package/rules/.source/hippy/extend_views/fastlist/ItemDecorations.java +71 -0
- package/rules/.source/hippy/extend_views/fastlist/ItemStoreNode.java +64 -0
- package/rules/.source/hippy/extend_views/fastlist/ItemStoreView.java +13 -0
- package/rules/.source/hippy/extend_views/fastlist/ItemStoreViewController.java +45 -0
- package/rules/.source/hippy/extend_views/fastlist/ListItemHolder.java +7 -0
- package/rules/.source/hippy/extend_views/fastlist/ListViewControlProp.java +41 -0
- package/rules/.source/hippy/extend_views/fastlist/MouseRecycleView.java +509 -0
- package/rules/.source/hippy/extend_views/fastlist/OnFastItemClickListener.java +12 -0
- package/rules/.source/hippy/extend_views/fastlist/OnFastItemFocusChangeListener.java +9 -0
- package/rules/.source/hippy/extend_views/fastlist/OnFastScrollStateChangedListener.java +7 -0
- package/rules/.source/hippy/extend_views/fastlist/PendingListNode.java +18 -0
- package/rules/.source/hippy/extend_views/fastlist/PendingViewController.java +13 -0
- package/rules/.source/hippy/extend_views/fastlist/PostHandlerView.java +6 -0
- package/rules/.source/hippy/extend_views/fastlist/PostTaskHolder.java +20 -0
- package/rules/.source/hippy/extend_views/fastlist/ReplaceChildController.java +105 -0
- package/rules/.source/hippy/extend_views/fastlist/ReplaceChildView.java +312 -0
- package/rules/.source/hippy/extend_views/fastlist/TVListView.java +3692 -0
- package/rules/.source/hippy/extend_views/fastlist/TemplateCodeParser.java +247 -0
- package/rules/.source/hippy/extend_views/fastlist/Utils.java +572 -0
- package/rules/.source/hippy/extend_views/fastlist/ViewTag.java +317 -0
- package/rules/.source/hippy/extend_views/fastlist/VirtualListView.java +8 -0
- package/rules/.source/hippy/extend_views/fastlist/diff/FastListDataBindingHelper.java +320 -0
- package/rules/.source/hippy/extend_views/fastlist/diff/KeyDiffHelper.java +289 -0
- package/rules/.source/hippy/extend_views/fastlist/diff/NoKeyDiffHelper.java +278 -0
- package/rules/.source/hippy/extend_views/tag/FontTag.java +53 -0
- package/rules/.source/hippy/extend_views/tag/HtmlTag.java +191 -0
- package/rules/.source/hippy/extend_views/tag/HtmlTagHandler.java +185 -0
- package/rules/.source/hippy/extend_views/tag/SpanTag.java +160 -0
- package/rules/.source/hippy/extend_views/tag/TextFontSpan.java +102 -0
- package/rules/.source/hippy/extend_views/waterfall/Chunk.java +10 -0
- package/rules/.source/hippy/extend_views/waterfall/ChunkGroup.java +5 -0
- package/rules/.source/hippy/extend_views/waterfall/Section.java +4 -0
- package/rules/.source/hippy/extend_views/waterfall/Tabs.java +5 -0
- package/rules/.source/hippy/extend_views/waterfall/WaterfallUtils.java +26 -0
- package/rules/.source/hippy/hippy_uimanager/ControllerHolder.java +30 -0
- package/rules/.source/hippy/hippy_uimanager/ControllerManager.java +651 -0
- package/rules/.source/hippy/hippy_uimanager/ControllerRegistry.java +102 -0
- package/rules/.source/hippy/hippy_uimanager/ControllerUpdateManger.java +252 -0
- package/rules/.source/hippy/hippy_uimanager/CustomControllerHelper.java +425 -0
- package/rules/.source/hippy/hippy_uimanager/DiffUtils.java +526 -0
- package/rules/.source/hippy/hippy_uimanager/ExtendViewGroup.java +36 -0
- package/rules/.source/hippy/hippy_uimanager/HippyCustomViewCreator.java +29 -0
- package/rules/.source/hippy/hippy_uimanager/HippyGroupController.java +83 -0
- package/rules/.source/hippy/hippy_uimanager/HippyViewBase.java +27 -0
- package/rules/.source/hippy/hippy_uimanager/HippyViewController.java +2189 -0
- package/rules/.source/hippy/hippy_uimanager/HippyViewEvent.java +52 -0
- package/rules/.source/hippy/hippy_uimanager/IHippyZIndexViewGroup.java +24 -0
- package/rules/.source/hippy/hippy_uimanager/InternalExtendViewUtil.java +395 -0
- package/rules/.source/hippy/hippy_uimanager/ListItemRenderNode.java +143 -0
- package/rules/.source/hippy/hippy_uimanager/ListViewRenderNode.java +44 -0
- package/rules/.source/hippy/hippy_uimanager/MatrixUtil.java +470 -0
- package/rules/.source/hippy/hippy_uimanager/NativeGestureDispatcher.java +349 -0
- package/rules/.source/hippy/hippy_uimanager/NativeGestureProcessor.java +188 -0
- package/rules/.source/hippy/hippy_uimanager/PullFooterRenderNode.java +43 -0
- package/rules/.source/hippy/hippy_uimanager/PullHeaderRenderNode.java +43 -0
- package/rules/.source/hippy/hippy_uimanager/RenderManager.java +304 -0
- package/rules/.source/hippy/hippy_uimanager/RenderNode.java +533 -0
- package/rules/.source/hippy/hippy_uimanager/StateView.java +17 -0
- package/rules/.source/hippy/hippy_uimanager/TransformUtil.java +125 -0
- package/rules/.source/hippy/hippy_uimanager/ViewGroupDrawingOrderHelper.java +108 -0
- package/rules/.source/hippy/hippy_uimanager/ViewStateProvider.java +10 -0
- package/rules/.source/hippy/hippy_views/audioview/AudioPlayManager.java +457 -0
- package/rules/.source/hippy/hippy_views/audioview/AudioView.java +225 -0
- package/rules/.source/hippy/hippy_views/audioview/AudioViewController.java +135 -0
- package/rules/.source/hippy/hippy_views/common/CommonBackgroundDrawable.java +58 -0
- package/rules/.source/hippy/hippy_views/common/CommonBorder.java +37 -0
- package/rules/.source/hippy/hippy_views/custom/HippyCustomPropsController.java +61 -0
- package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerListAdapter.java +399 -0
- package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerView.java +378 -0
- package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerViewController.java +187 -0
- package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerViewHolder.java +39 -0
- package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerViewWrapper.java +134 -0
- package/rules/.source/hippy/hippy_views/hippylist/NodePositionHelper.java +55 -0
- package/rules/.source/hippy/hippy_views/hippylist/PreloadHelper.java +54 -0
- package/rules/.source/hippy/hippy_views/hippylist/PullFooterEventHelper.java +61 -0
- package/rules/.source/hippy/hippy_views/hippylist/PullHeaderEventHelper.java +127 -0
- package/rules/.source/hippy/hippy_views/hippylist/RecyclerViewEventHelper.java +394 -0
- package/rules/.source/hippy/hippy_views/image/HippyContentDrawable.java +113 -0
- package/rules/.source/hippy/hippy_views/image/HippyImageView.java +1608 -0
- package/rules/.source/hippy/hippy_views/image/HippyImageViewController.java +382 -0
- package/rules/.source/hippy/hippy_views/image/IImageStateListener.java +7 -0
- package/rules/.source/hippy/hippy_views/list/ChildOnScreenScroller.java +255 -0
- package/rules/.source/hippy/hippy_views/list/HippyListAdapter.java +647 -0
- package/rules/.source/hippy/hippy_views/list/HippyListItemView.java +162 -0
- package/rules/.source/hippy/hippy_views/list/HippyListItemViewController.java +45 -0
- package/rules/.source/hippy/hippy_views/list/HippyListView.java +915 -0
- package/rules/.source/hippy/hippy_views/list/HippyListViewController.java +622 -0
- package/rules/.source/hippy/hippy_views/list/HippyRecycler.java +31 -0
- package/rules/.source/hippy/hippy_views/list/IRecycleItemTypeChange.java +23 -0
- package/rules/.source/hippy/hippy_views/list/ItemDecorations.java +70 -0
- package/rules/.source/hippy/hippy_views/list/NegativeLongKeyFlinger.java +156 -0
- package/rules/.source/hippy/hippy_views/list/NodeHolder.java +34 -0
- package/rules/.source/hippy/hippy_views/list/RecycleViewFlinger.java +126 -0
- package/rules/.source/hippy/hippy_views/list/TVRecyclerView.java +2070 -0
- package/rules/.source/hippy/hippy_views/list/TVSingleLineListView.java +15 -0
- package/rules/.source/hippy/hippy_views/modal/HippyModalHostManager.java +102 -0
- package/rules/.source/hippy/hippy_views/modal/HippyModalHostView.java +597 -0
- package/rules/.source/hippy/hippy_views/modal/ModalHostHelper.java +46 -0
- package/rules/.source/hippy/hippy_views/modal/ModalStyleNode.java +34 -0
- package/rules/.source/hippy/hippy_views/modal/RequestCloseEvent.java +32 -0
- package/rules/.source/hippy/hippy_views/modal/ShowEvent.java +31 -0
- package/rules/.source/hippy/hippy_views/navigator/Navigator.java +126 -0
- package/rules/.source/hippy/hippy_views/navigator/NavigatorController.java +120 -0
- package/rules/.source/hippy/hippy_views/refresh/HippyPullFooterView.java +47 -0
- package/rules/.source/hippy/hippy_views/refresh/HippyPullFooterViewController.java +65 -0
- package/rules/.source/hippy/hippy_views/refresh/HippyPullHeaderView.java +39 -0
- package/rules/.source/hippy/hippy_views/refresh/HippyPullHeaderViewController.java +104 -0
- package/rules/.source/hippy/hippy_views/refresh/RefreshWrapper.java +237 -0
- package/rules/.source/hippy/hippy_views/refresh/RefreshWrapperController.java +62 -0
- package/rules/.source/hippy/hippy_views/refresh/RefreshWrapperItemController.java +39 -0
- package/rules/.source/hippy/hippy_views/refresh/RefreshWrapperItemView.java +26 -0
- package/rules/.source/hippy/hippy_views/scroll/HippyHorizontalScrollView.java +500 -0
- package/rules/.source/hippy/hippy_views/scroll/HippyOnScrollHelper.java +39 -0
- package/rules/.source/hippy/hippy_views/scroll/HippyScrollView.java +46 -0
- package/rules/.source/hippy/hippy_views/scroll/HippyScrollViewController.java +178 -0
- package/rules/.source/hippy/hippy_views/scroll/HippyScrollViewEventHelper.java +92 -0
- package/rules/.source/hippy/hippy_views/scroll/HippyVerticalScrollView.java +522 -0
- package/rules/.source/hippy/hippy_views/text/HippyTextView.java +512 -0
- package/rules/.source/hippy/hippy_views/text/HippyTextViewController.java +77 -0
- package/rules/.source/hippy/hippy_views/textinput/HippyTextInput.java +668 -0
- package/rules/.source/hippy/hippy_views/textinput/HippyTextInputController.java +528 -0
- package/rules/.source/hippy/hippy_views/textinput/TextInputNode.java +115 -0
- package/rules/.source/hippy/hippy_views/videoview/APEZProvider.java +287 -0
- package/rules/.source/hippy/hippy_views/videoview/APKExpansionSupport.java +82 -0
- package/rules/.source/hippy/hippy_views/videoview/PivotPoint.java +13 -0
- package/rules/.source/hippy/hippy_views/videoview/ScalableType.java +34 -0
- package/rules/.source/hippy/hippy_views/videoview/ScalableVideoView.java +265 -0
- package/rules/.source/hippy/hippy_views/videoview/ScaleManager.java +191 -0
- package/rules/.source/hippy/hippy_views/videoview/Size.java +19 -0
- package/rules/.source/hippy/hippy_views/videoview/VideoHippyView.java +917 -0
- package/rules/.source/hippy/hippy_views/videoview/VideoHippyViewController.java +236 -0
- package/rules/.source/hippy/hippy_views/videoview/ZipResourceFile.java +427 -0
- package/rules/.source/hippy/hippy_views/view/CardRootView.java +28 -0
- package/rules/.source/hippy/hippy_views/view/CustomLayoutView.java +10 -0
- package/rules/.source/hippy/hippy_views/view/CustomNodeView.java +5 -0
- package/rules/.source/hippy/hippy_views/view/DialogViewGroup.java +113 -0
- package/rules/.source/hippy/hippy_views/view/HippyViewGroup.java +2042 -0
- package/rules/.source/hippy/hippy_views/view/HippyViewGroupController.java +583 -0
- package/rules/.source/hippy/hippy_views/view/WindowRoot.java +5 -0
- package/rules/.source/hippy/hippy_views/viewpager/HippyViewPager.java +308 -0
- package/rules/.source/hippy/hippy_views/viewpager/HippyViewPagerAdapter.java +148 -0
- package/rules/.source/hippy/hippy_views/viewpager/HippyViewPagerController.java +246 -0
- package/rules/.source/hippy/hippy_views/viewpager/HippyViewPagerItem.java +27 -0
- package/rules/.source/hippy/hippy_views/viewpager/HippyViewPagerItemController.java +42 -0
- package/rules/.source/hippy/hippy_views/viewpager/ViewPagerPageChangeListener.java +114 -0
- package/rules/.source/hippy/hippy_views/viewpager/event/HippyPageItemExposureEvent.java +40 -0
- package/rules/.source/hippy/hippy_views/viewpager/event/HippyPageScrollEvent.java +43 -0
- package/rules/.source/hippy/hippy_views/viewpager/event/HippyPageScrollStateChangedEvent.java +42 -0
- package/rules/.source/hippy/hippy_views/viewpager/event/HippyPageSelectedEvent.java +42 -0
- package/rules/.source/hippy/hippy_views/webview/HippyWebView.java +160 -0
- package/rules/.source/hippy/hippy_views/webview/HippyWebViewBridge.java +20 -0
- package/rules/.source/hippy/hippy_views/webview/HippyWebViewController.java +103 -0
- package/rules/.source/hippy/hippy_views/webview/HippyWebViewInner.java +77 -0
- package/rules/.windsurfrules +27 -4
- package/rules/AGENTS.md +27 -4
- package/rules/CLAUDE.md +27 -3
- package/rules/GEMINI.md +25 -3
|
@@ -0,0 +1,668 @@
|
|
|
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.textinput;
|
|
17
|
+
|
|
18
|
+
import com.tencent.mtt.hippy.HippyEngineContext;
|
|
19
|
+
import com.tencent.mtt.hippy.HippyInstanceContext;
|
|
20
|
+
import com.tencent.mtt.hippy.common.HippyMap;
|
|
21
|
+
import com.tencent.mtt.hippy.modules.javascriptmodules.EventDispatcher;
|
|
22
|
+
import com.tencent.mtt.hippy.uimanager.HippyViewBase;
|
|
23
|
+
import com.tencent.mtt.hippy.uimanager.NativeGestureDispatcher;
|
|
24
|
+
import com.tencent.mtt.hippy.utils.ContextHolder;
|
|
25
|
+
import com.tencent.mtt.hippy.utils.LogUtils;
|
|
26
|
+
import com.tencent.mtt.hippy.views.common.CommonBackgroundDrawable;
|
|
27
|
+
import com.tencent.mtt.hippy.views.common.CommonBorder;
|
|
28
|
+
|
|
29
|
+
import android.content.Context;
|
|
30
|
+
import android.graphics.Color;
|
|
31
|
+
import android.graphics.PorterDuff;
|
|
32
|
+
import android.graphics.Rect;
|
|
33
|
+
import android.graphics.drawable.Drawable;
|
|
34
|
+
import android.graphics.drawable.LayerDrawable;
|
|
35
|
+
import android.os.Build;
|
|
36
|
+
import android.text.Editable;
|
|
37
|
+
import android.text.TextUtils;
|
|
38
|
+
import android.text.TextWatcher;
|
|
39
|
+
import android.view.Display;
|
|
40
|
+
import android.view.Gravity;
|
|
41
|
+
import android.view.KeyEvent;
|
|
42
|
+
import android.view.MotionEvent;
|
|
43
|
+
import android.view.View;
|
|
44
|
+
import android.view.ViewGroup;
|
|
45
|
+
import android.view.ViewTreeObserver;
|
|
46
|
+
import android.view.inputmethod.EditorInfo;
|
|
47
|
+
import android.view.inputmethod.InputMethodManager;
|
|
48
|
+
import android.widget.EditText;
|
|
49
|
+
import android.widget.TextView;
|
|
50
|
+
|
|
51
|
+
import java.lang.reflect.Field;
|
|
52
|
+
|
|
53
|
+
@SuppressWarnings({"deprecation", "unused"})
|
|
54
|
+
public class HippyTextInput extends EditText implements HippyViewBase, CommonBorder,
|
|
55
|
+
TextView.OnEditorActionListener, View.OnFocusChangeListener {
|
|
56
|
+
|
|
57
|
+
private CommonBackgroundDrawable mReactBackgroundDrawable;
|
|
58
|
+
final HippyEngineContext mHippyContext;
|
|
59
|
+
boolean mHasAddWatcher = false;
|
|
60
|
+
private String mPreviousText;
|
|
61
|
+
TextWatcher mTextWatcher = null;
|
|
62
|
+
boolean mHasSetOnSelectListener = false;
|
|
63
|
+
|
|
64
|
+
private final int mDefaultGravityHorizontal;
|
|
65
|
+
private final int mDefaultGravityVertical;
|
|
66
|
+
//输入法键盘的相关方法
|
|
67
|
+
private final Rect mRect = new Rect(); //获取当前RootView的大小位置信息
|
|
68
|
+
private int mLastRootViewVisibleHeight = -1; //当前RootView的上一次大小
|
|
69
|
+
private boolean mIsKeyBoardShow = false; //键盘是否在显示
|
|
70
|
+
private ReactContentSizeWatcher mReactContentSizeWatcher = null;
|
|
71
|
+
|
|
72
|
+
public HippyTextInput(Context context) {
|
|
73
|
+
super(context);
|
|
74
|
+
mHippyContext = ((HippyInstanceContext) context).getEngineContext();
|
|
75
|
+
setFocusable(true);
|
|
76
|
+
setFocusableInTouchMode(true);
|
|
77
|
+
setOverScrollMode(View.OVER_SCROLL_IF_CONTENT_SCROLLS);
|
|
78
|
+
|
|
79
|
+
mDefaultGravityHorizontal =
|
|
80
|
+
getGravity() & (Gravity.HORIZONTAL_GRAVITY_MASK | Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK);
|
|
81
|
+
mDefaultGravityVertical = getGravity() & Gravity.VERTICAL_GRAVITY_MASK;
|
|
82
|
+
// 临时规避一下EditTextView重设hint不生效的问题
|
|
83
|
+
setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
|
|
84
|
+
ViewGroup.LayoutParams.MATCH_PARENT));
|
|
85
|
+
setPadding(0, 0, 0, 0);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@Override
|
|
89
|
+
public void onEditorAction(int actionCode) {
|
|
90
|
+
HippyMap hippyMap = new HippyMap();
|
|
91
|
+
hippyMap.pushInt("actionCode", actionCode);
|
|
92
|
+
hippyMap.pushString("text", getText().toString());
|
|
93
|
+
switch (actionCode) {
|
|
94
|
+
case EditorInfo.IME_ACTION_GO:
|
|
95
|
+
hippyMap.pushString("actionName", "go");
|
|
96
|
+
break;
|
|
97
|
+
case EditorInfo.IME_ACTION_NEXT:
|
|
98
|
+
hippyMap.pushString("actionName", "next");
|
|
99
|
+
break;
|
|
100
|
+
case EditorInfo.IME_ACTION_NONE:
|
|
101
|
+
hippyMap.pushString("actionName", "none");
|
|
102
|
+
break;
|
|
103
|
+
case EditorInfo.IME_ACTION_PREVIOUS:
|
|
104
|
+
hippyMap.pushString("actionName", "previous");
|
|
105
|
+
break;
|
|
106
|
+
case EditorInfo.IME_ACTION_SEARCH:
|
|
107
|
+
hippyMap.pushString("actionName", "search");
|
|
108
|
+
break;
|
|
109
|
+
case EditorInfo.IME_ACTION_SEND:
|
|
110
|
+
hippyMap.pushString("actionName", "send");
|
|
111
|
+
break;
|
|
112
|
+
case EditorInfo.IME_ACTION_DONE:
|
|
113
|
+
hippyMap.pushString("actionName", "done");
|
|
114
|
+
break;
|
|
115
|
+
default:
|
|
116
|
+
hippyMap.pushString("actionName", "unknown");
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
mHippyContext.getModuleManager().getJavaScriptModule(EventDispatcher.class)
|
|
120
|
+
.receiveUIComponentEvent(getId(),
|
|
121
|
+
"onEditorAction", hippyMap);
|
|
122
|
+
super.onEditorAction(actionCode);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
@Override
|
|
126
|
+
protected void onAttachedToWindow() {
|
|
127
|
+
super.onAttachedToWindow();
|
|
128
|
+
//监听RootView的布局变化,来判断键盘是否弹起
|
|
129
|
+
if (getRootView() != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
|
|
130
|
+
getRootView().getViewTreeObserver().addOnGlobalLayoutListener(globaListener);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
@Override
|
|
136
|
+
protected void onDetachedFromWindow() {
|
|
137
|
+
super.onDetachedFromWindow();
|
|
138
|
+
//监听RootView的布局变化,Listern去掉
|
|
139
|
+
if (getRootView() != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
|
|
140
|
+
getRootView().getViewTreeObserver().removeOnGlobalLayoutListener(globaListener);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
void setGravityHorizontal(int gravityHorizontal) {
|
|
145
|
+
if (gravityHorizontal == 0) {
|
|
146
|
+
gravityHorizontal = mDefaultGravityHorizontal;
|
|
147
|
+
}
|
|
148
|
+
setGravity((getGravity() & ~Gravity.HORIZONTAL_GRAVITY_MASK
|
|
149
|
+
& ~Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK) | gravityHorizontal);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
void setGravityVertical(int gravityVertical) {
|
|
153
|
+
if (gravityVertical == 0) {
|
|
154
|
+
gravityVertical = mDefaultGravityVertical;
|
|
155
|
+
}
|
|
156
|
+
setGravity((getGravity() & ~Gravity.VERTICAL_GRAVITY_MASK) | gravityVertical);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
@Override
|
|
160
|
+
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
|
161
|
+
super.onLayout(changed, left, top, right, bottom);
|
|
162
|
+
if (mReactContentSizeWatcher != null) {
|
|
163
|
+
mReactContentSizeWatcher.onLayout();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
@Override
|
|
168
|
+
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
|
|
169
|
+
super.onTextChanged(text, start, lengthBefore, lengthAfter);
|
|
170
|
+
if (mReactContentSizeWatcher != null) {
|
|
171
|
+
mReactContentSizeWatcher.onLayout();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
public class ReactContentSizeWatcher {
|
|
176
|
+
|
|
177
|
+
private final EditText mEditText;
|
|
178
|
+
final HippyEngineContext mHippyContext;
|
|
179
|
+
private int mPreviousContentWidth = 0;
|
|
180
|
+
private int mPreviousContentHeight = 0;
|
|
181
|
+
|
|
182
|
+
public ReactContentSizeWatcher(EditText editText, HippyEngineContext hippyContext) {
|
|
183
|
+
mEditText = editText;
|
|
184
|
+
mHippyContext = hippyContext;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
public void onLayout() {
|
|
188
|
+
int contentWidth = mEditText.getWidth();
|
|
189
|
+
int contentHeight = mEditText.getHeight();
|
|
190
|
+
|
|
191
|
+
// Use instead size of text content within EditText when available
|
|
192
|
+
if (mEditText.getLayout() != null) {
|
|
193
|
+
contentWidth = mEditText.getCompoundPaddingLeft() + mEditText.getLayout().getWidth() < 0 ? 0
|
|
194
|
+
: mEditText.getLayout().getWidth() +
|
|
195
|
+
mEditText.getCompoundPaddingRight();
|
|
196
|
+
contentHeight =
|
|
197
|
+
mEditText.getCompoundPaddingTop() + mEditText.getLayout().getHeight() < 0 ? 0
|
|
198
|
+
: mEditText.getLayout().getHeight() +
|
|
199
|
+
mEditText.getCompoundPaddingBottom();
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (contentWidth != mPreviousContentWidth || contentHeight != mPreviousContentHeight) {
|
|
203
|
+
mPreviousContentHeight = contentHeight;
|
|
204
|
+
mPreviousContentWidth = contentWidth;
|
|
205
|
+
HippyMap contentSize = new HippyMap();
|
|
206
|
+
contentSize.pushDouble("width", mPreviousContentWidth);
|
|
207
|
+
contentSize.pushDouble("height", mPreviousContentWidth);
|
|
208
|
+
HippyMap eventData = new HippyMap();
|
|
209
|
+
eventData.pushMap("contentSize", contentSize);
|
|
210
|
+
mHippyContext.getModuleManager().getJavaScriptModule(EventDispatcher.class)
|
|
211
|
+
.receiveUIComponentEvent(getId(), "onContentSizeChange", eventData);
|
|
212
|
+
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
public void setOnContentSizeChange(boolean contentSizeChange) {
|
|
218
|
+
if (contentSizeChange) {
|
|
219
|
+
mReactContentSizeWatcher = new ReactContentSizeWatcher(this, mHippyContext);
|
|
220
|
+
} else {
|
|
221
|
+
mReactContentSizeWatcher = null;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
@Override
|
|
226
|
+
public boolean onTouchEvent(MotionEvent event) {
|
|
227
|
+
// if (handleTouch)
|
|
228
|
+
// {
|
|
229
|
+
// if (getParent() != null)
|
|
230
|
+
// {
|
|
231
|
+
// getParent().requestDisallowInterceptTouchEvent(true);
|
|
232
|
+
// }
|
|
233
|
+
// }
|
|
234
|
+
return super.onTouchEvent(event);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
public InputMethodManager getInputMethodManager() {
|
|
238
|
+
return (InputMethodManager) this.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
public void hideInputMethod() {
|
|
242
|
+
InputMethodManager imm = this.getInputMethodManager();
|
|
243
|
+
if (imm != null && imm.isActive(this)) {
|
|
244
|
+
try {
|
|
245
|
+
imm.hideSoftInputFromWindow(this.getWindowToken(), 0);
|
|
246
|
+
} catch (Exception e) {
|
|
247
|
+
e.printStackTrace();
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
//成功的話返回手機屏幕的高度,失敗返回-1
|
|
254
|
+
private int getScreenHeight() {
|
|
255
|
+
try {
|
|
256
|
+
Context context = ContextHolder.getAppContext();
|
|
257
|
+
android.view.WindowManager manager = (android.view.WindowManager) context
|
|
258
|
+
.getSystemService(Context.WINDOW_SERVICE);
|
|
259
|
+
Display display = manager.getDefaultDisplay();
|
|
260
|
+
|
|
261
|
+
if (display != null) {
|
|
262
|
+
int width = manager.getDefaultDisplay().getWidth();
|
|
263
|
+
int height = manager.getDefaultDisplay().getHeight();
|
|
264
|
+
return Math.max(width, height);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
} catch (SecurityException e) {
|
|
268
|
+
LogUtils.d("HippyTextInput", "getScreenHeight: " + e.getMessage());
|
|
269
|
+
}
|
|
270
|
+
return -1;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* 返回RootView的高度,要注意即使全屏,他應該也少了一個狀態欄的高度
|
|
275
|
+
*/
|
|
276
|
+
private int getRootViewHeight() {
|
|
277
|
+
int height = -1;
|
|
278
|
+
View rootView = getRootView();
|
|
279
|
+
if (rootView == null) {
|
|
280
|
+
return height;
|
|
281
|
+
}
|
|
282
|
+
// 问题ID: 106874510 某些奇葩手机ROM调用此方法会报错,做下捕获吧
|
|
283
|
+
try {
|
|
284
|
+
rootView.getWindowVisibleDisplayFrame(mRect);
|
|
285
|
+
} catch (Throwable e) {
|
|
286
|
+
LogUtils.d("InputMethodStatusMonitor:", "getWindowVisibleDisplayFrame failed !" + e);
|
|
287
|
+
e.printStackTrace();
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
int visibleHeight = mRect.bottom - mRect.top;
|
|
291
|
+
if (visibleHeight < 0) {
|
|
292
|
+
return -1;
|
|
293
|
+
}
|
|
294
|
+
return visibleHeight;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
//监听RootView布局变化的listener
|
|
298
|
+
final ViewTreeObserver.OnGlobalLayoutListener globaListener = new ViewTreeObserver.OnGlobalLayoutListener() {
|
|
299
|
+
@Override
|
|
300
|
+
public void onGlobalLayout() {
|
|
301
|
+
int rootViewVisibleHeight = getRootViewHeight(); //RootView的高度
|
|
302
|
+
int screenHeight = getScreenHeight(); //屏幕高度
|
|
303
|
+
if (rootViewVisibleHeight == -1 || screenHeight == -1) //如果有失败直接返回 //TODO...仔细检查下这里的逻辑
|
|
304
|
+
{
|
|
305
|
+
mLastRootViewVisibleHeight = rootViewVisibleHeight;
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
if (mLastRootViewVisibleHeight == -1) // 首次
|
|
309
|
+
{
|
|
310
|
+
//假设输入键盘的高度位屏幕高度20%
|
|
311
|
+
if (rootViewVisibleHeight > screenHeight * 0.8f) {
|
|
312
|
+
|
|
313
|
+
mIsKeyBoardShow = false; //键盘没有显示
|
|
314
|
+
} else {
|
|
315
|
+
if (!mIsKeyBoardShow) {
|
|
316
|
+
HippyMap hippyMap = new HippyMap();
|
|
317
|
+
hippyMap.pushInt("keyboardHeight", Math.abs(
|
|
318
|
+
screenHeight - rootViewVisibleHeight)); //TODO 首次输入这里需要减去一个statusbar的高度,但是又要当心全屏模式
|
|
319
|
+
mHippyContext.getModuleManager().getJavaScriptModule(EventDispatcher.class)
|
|
320
|
+
.receiveUIComponentEvent(getId(),
|
|
321
|
+
"onKeyboardWillShow", hippyMap);
|
|
322
|
+
}
|
|
323
|
+
mIsKeyBoardShow = true; //键盘显示 ----s首次需要通知
|
|
324
|
+
}
|
|
325
|
+
} else {
|
|
326
|
+
//假设输入键盘的高度位屏幕高度20%
|
|
327
|
+
if (rootViewVisibleHeight > screenHeight * 0.8f) {
|
|
328
|
+
if (mIsKeyBoardShow) {
|
|
329
|
+
HippyMap hippyMap = new HippyMap();
|
|
330
|
+
mHippyContext.getModuleManager().getJavaScriptModule(EventDispatcher.class)
|
|
331
|
+
.receiveUIComponentEvent(getId(),
|
|
332
|
+
"onKeyboardWillHide", hippyMap);
|
|
333
|
+
}
|
|
334
|
+
mIsKeyBoardShow = false; //键盘没有显示
|
|
335
|
+
} else {
|
|
336
|
+
if (!mIsKeyBoardShow) {
|
|
337
|
+
HippyMap hippyMap = new HippyMap();
|
|
338
|
+
hippyMap.pushInt("keyboardHeight",
|
|
339
|
+
Math.abs(mLastRootViewVisibleHeight - rootViewVisibleHeight));
|
|
340
|
+
mHippyContext.getModuleManager().getJavaScriptModule(EventDispatcher.class)
|
|
341
|
+
.receiveUIComponentEvent(getId(),
|
|
342
|
+
"onKeyboardWillShow", hippyMap);
|
|
343
|
+
}
|
|
344
|
+
mIsKeyBoardShow = true; //键盘显示 ----s首次需要通知
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
mLastRootViewVisibleHeight = rootViewVisibleHeight;
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
public void showInputMethodManager() {
|
|
353
|
+
|
|
354
|
+
InputMethodManager imm = this.getInputMethodManager();
|
|
355
|
+
|
|
356
|
+
try {
|
|
357
|
+
imm.showSoftInput(this, 0, null);
|
|
358
|
+
} catch (Exception e) {
|
|
359
|
+
e.printStackTrace();
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
private String mValidator = ""; //这则表达式,前端传入,要比较小心导致的crash
|
|
366
|
+
private String sRegrexValidBefore = "";
|
|
367
|
+
private String sRegrexValidRepeat = ""; //如果有无效的正则输入,会设置.
|
|
368
|
+
private boolean mTextInputed = false; //文本是否输入过
|
|
369
|
+
|
|
370
|
+
public void setValidator(String validator) {
|
|
371
|
+
mValidator = validator;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
//changeListener == true 代表前端监听了 onTextChagne.
|
|
375
|
+
//所以如果
|
|
376
|
+
public void setOnChangeListener(boolean changeListener) {
|
|
377
|
+
if (changeListener) //需要监听文字的通知
|
|
378
|
+
{
|
|
379
|
+
if (mHasAddWatcher) //如果已经注册过了,直接退出。
|
|
380
|
+
{
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
//第一次才注册。
|
|
384
|
+
mTextWatcher = new TextWatcher() {
|
|
385
|
+
@Override
|
|
386
|
+
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
|
387
|
+
sRegrexValidBefore = s.toString();//在文本变化前,记录一下当前输入框的文本值.也就是说现在肯定是符合正则表达式的.
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
@Override
|
|
391
|
+
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
|
392
|
+
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
@Override
|
|
396
|
+
public void afterTextChanged(Editable s) {
|
|
397
|
+
HippyTextInput.this.layout(HippyTextInput.this.getLeft(), HippyTextInput.this.getTop(),
|
|
398
|
+
HippyTextInput.this.getRight(),
|
|
399
|
+
HippyTextInput.this.getBottom());
|
|
400
|
+
|
|
401
|
+
if (TextUtils.isEmpty((mValidator))) //如果没有正则匹配
|
|
402
|
+
{
|
|
403
|
+
//如果文本输入过,判断是否两次相同
|
|
404
|
+
if (mTextInputed && TextUtils.equals(s.toString(), mPreviousText)) {
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
//这里为什么不用sRegrexValidBefore,sRegrexValidBefore是每次有词汇变化就会被回调设置.
|
|
408
|
+
mPreviousText = s.toString();
|
|
409
|
+
mTextInputed = true;
|
|
410
|
+
if (!bUserSetValue) //如果是前端设置下来的值,不再需要回调给前端.
|
|
411
|
+
{
|
|
412
|
+
HippyMap hippyMap = new HippyMap();
|
|
413
|
+
hippyMap.pushString("text", s.toString());
|
|
414
|
+
mHippyContext.getModuleManager().getJavaScriptModule(EventDispatcher.class)
|
|
415
|
+
.receiveUIComponentEvent(getId(),
|
|
416
|
+
"onChangeText", hippyMap);
|
|
417
|
+
LogUtils.d("robinsli", "afterTextChanged 通知前端文本变化=" + s.toString());
|
|
418
|
+
}
|
|
419
|
+
} else //如果设置了正则表达式
|
|
420
|
+
{
|
|
421
|
+
try {
|
|
422
|
+
//如果当前的内容不匹配正则表达式
|
|
423
|
+
if (!s.toString().matches(mValidator) && !"".equals(s.toString())) {
|
|
424
|
+
LogUtils.d("robinsli", "afterTextChanged 不符合正则表达式,需要设置回去=" + s.toString());
|
|
425
|
+
//丢弃当前的内容,回退到上一次的值.上一次的值检查过,肯定是符合正则表达式的.
|
|
426
|
+
setText(sRegrexValidBefore);
|
|
427
|
+
//上一步的setText,将触发新一轮的beforeTextChanged,onTextChanged,afterTextChanged
|
|
428
|
+
//为了避免前端收到两次内容同样的通知.记录一下正则匹配设置回去的值.
|
|
429
|
+
sRegrexValidRepeat = sRegrexValidBefore;
|
|
430
|
+
setSelection(getText().toString().length()); // TODO这里不应该通知
|
|
431
|
+
mTextInputed = true;
|
|
432
|
+
} else {
|
|
433
|
+
//如果文本输入过,判断是否两次相同
|
|
434
|
+
if (mTextInputed && TextUtils.equals(s.toString(), mPreviousText)) {
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
mTextInputed = true;
|
|
438
|
+
mPreviousText = s.toString();
|
|
439
|
+
if (!bUserSetValue //如果是前端设置的一定不通知
|
|
440
|
+
&& (TextUtils.isEmpty(sRegrexValidRepeat) //如果没有,输入过无效的内容
|
|
441
|
+
|| !TextUtils.equals(sRegrexValidRepeat, mPreviousText) //如果本次输入的内容是上一次重复的蓉蓉
|
|
442
|
+
)) {
|
|
443
|
+
HippyMap hippyMap = new HippyMap();
|
|
444
|
+
hippyMap.pushString("text", s.toString());
|
|
445
|
+
mHippyContext.getModuleManager().getJavaScriptModule(EventDispatcher.class)
|
|
446
|
+
.receiveUIComponentEvent(getId(),
|
|
447
|
+
"onChangeText", hippyMap);
|
|
448
|
+
LogUtils.d("robinsli", "afterTextChanged 通知前端文本变化=" + s.toString());
|
|
449
|
+
sRegrexValidRepeat = "";
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
} catch (Throwable error) {
|
|
453
|
+
// 不知道外部的正则表达式,最好保护住
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
}
|
|
459
|
+
};
|
|
460
|
+
|
|
461
|
+
//注册。并标记
|
|
462
|
+
mHasAddWatcher = true;
|
|
463
|
+
addTextChangedListener(mTextWatcher);
|
|
464
|
+
|
|
465
|
+
} else //不需要需要监听文字的通知
|
|
466
|
+
{
|
|
467
|
+
mHasAddWatcher = false;
|
|
468
|
+
removeTextChangedListener(mTextWatcher);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
@Override
|
|
473
|
+
public void setBackgroundColor(int color) {
|
|
474
|
+
int paddingBottom = getPaddingBottom();
|
|
475
|
+
int paddingTop = getPaddingTop();
|
|
476
|
+
int paddingLeft = getPaddingLeft();
|
|
477
|
+
int paddingRight = getPaddingRight();
|
|
478
|
+
|
|
479
|
+
if (color == Color.TRANSPARENT && mReactBackgroundDrawable == null) {
|
|
480
|
+
// don't do anything, no need to allocate ReactBackgroundDrawable for transparent background
|
|
481
|
+
LogUtils.d("HippyTextInput",
|
|
482
|
+
"don't do anything, no need to allocate ReactBackgroundDrawable for transparent background");
|
|
483
|
+
} else {
|
|
484
|
+
getOrCreateReactViewBackground().setBackgroundColor(color);
|
|
485
|
+
}
|
|
486
|
+
// Android这个EditText控件默认带有内边距,设置背景时系统也可能会再把它默认的内边距给加上去。这里强制去掉内边距
|
|
487
|
+
setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
public void setBorderColor(int color, int position) {
|
|
491
|
+
getOrCreateReactViewBackground().setBorderColor(color, position);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
public void setBorderRadius(float borderRadius, int position) {
|
|
495
|
+
getOrCreateReactViewBackground().setBorderRadius(borderRadius, position);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
@Override
|
|
499
|
+
public void setBorderStyle(int borderStyle) {
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
@Override
|
|
503
|
+
public void setBorderWidth(float width, int position) {
|
|
504
|
+
getOrCreateReactViewBackground().setBorderWidth(width, position);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
private CommonBackgroundDrawable getOrCreateReactViewBackground() {
|
|
508
|
+
if (mReactBackgroundDrawable == null) {
|
|
509
|
+
mReactBackgroundDrawable = new CommonBackgroundDrawable();
|
|
510
|
+
Drawable backgroundDrawable = getBackground();
|
|
511
|
+
super.setBackgroundDrawable(
|
|
512
|
+
null); // required so that drawable callback is cleared before we add the
|
|
513
|
+
// drawable back as a part of LayerDrawable
|
|
514
|
+
if (backgroundDrawable == null) {
|
|
515
|
+
super.setBackgroundDrawable(mReactBackgroundDrawable);
|
|
516
|
+
} else {
|
|
517
|
+
LayerDrawable layerDrawable = new LayerDrawable(
|
|
518
|
+
new Drawable[]{mReactBackgroundDrawable, backgroundDrawable});
|
|
519
|
+
super.setBackgroundDrawable(layerDrawable);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
return mReactBackgroundDrawable;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
@Override
|
|
526
|
+
public NativeGestureDispatcher getGestureDispatcher() {
|
|
527
|
+
return null;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
@Override
|
|
531
|
+
public void setGestureDispatcher(NativeGestureDispatcher dispatcher) {
|
|
532
|
+
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
public void setOnEndEditingListener(boolean onEndEditingLIstener) {
|
|
537
|
+
if (onEndEditingLIstener) {
|
|
538
|
+
setOnEditorActionListener(this);
|
|
539
|
+
} else {
|
|
540
|
+
setOnEditorActionListener(null);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
@Override
|
|
545
|
+
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
|
|
546
|
+
if ((actionId & EditorInfo.IME_MASK_ACTION) > 0 || actionId == EditorInfo.IME_NULL) {
|
|
547
|
+
HippyMap hippyMap = new HippyMap();
|
|
548
|
+
hippyMap.pushString("text", getText().toString());
|
|
549
|
+
mHippyContext.getModuleManager().getJavaScriptModule(EventDispatcher.class)
|
|
550
|
+
.receiveUIComponentEvent(getId(), "onEndEditing", hippyMap);
|
|
551
|
+
}
|
|
552
|
+
return false;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
public void setBlurOrOnFocus(boolean blur) {
|
|
556
|
+
if (blur) {
|
|
557
|
+
setOnFocusChangeListener(this);
|
|
558
|
+
} else {
|
|
559
|
+
setOnFocusChangeListener(null);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
@Override
|
|
564
|
+
public void onFocusChange(View v, boolean hasFocus) {
|
|
565
|
+
|
|
566
|
+
HippyMap hippyMap = new HippyMap();
|
|
567
|
+
hippyMap.pushString("text", getText().toString());
|
|
568
|
+
if (hasFocus) {
|
|
569
|
+
mHippyContext.getModuleManager().getJavaScriptModule(EventDispatcher.class)
|
|
570
|
+
.receiveUIComponentEvent(getId(), "onFocus", hippyMap);
|
|
571
|
+
} else {
|
|
572
|
+
mHippyContext.getModuleManager().getJavaScriptModule(EventDispatcher.class)
|
|
573
|
+
.receiveUIComponentEvent(getId(), "onBlur", hippyMap);
|
|
574
|
+
// harryguo: 屏蔽这里的onEndEditing事件。理由:失去焦点时,就只发onBlur就够了。onEndEditing不可再发,否则和那个地方(哪个地方?键盘回车或点击软键盘send、search、next...时的)的onEditorAction重复
|
|
575
|
+
// mHippyContext.getModuleManager().getJavaScriptModule(EventDispatcher.class).receiveUIComponentEvent(getId(), "onEndEditing", hippyMap);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
|
|
580
|
+
@Override
|
|
581
|
+
protected void onSelectionChanged(int selStart, int selEnd) {
|
|
582
|
+
super.onSelectionChanged(selStart, selEnd);
|
|
583
|
+
if (mHasSetOnSelectListener) {
|
|
584
|
+
HippyMap selection = new HippyMap();
|
|
585
|
+
selection.pushInt("start", selStart);
|
|
586
|
+
selection.pushInt("end", selEnd);
|
|
587
|
+
HippyMap hippyMap = new HippyMap();
|
|
588
|
+
hippyMap.pushMap("selection", selection);
|
|
589
|
+
mHippyContext.getModuleManager().getJavaScriptModule(EventDispatcher.class)
|
|
590
|
+
.receiveUIComponentEvent(getId(), "onSelectionChange", hippyMap);
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
public HippyMap jsGetValue() {
|
|
595
|
+
HippyMap hippyMap = new HippyMap();
|
|
596
|
+
hippyMap.pushString("text", getText().toString());
|
|
597
|
+
return hippyMap;
|
|
598
|
+
// mHippyContext.getModuleManager().getJavaScriptModule(EventDispatcher.class)
|
|
599
|
+
// .receiveUIComponentEvent(getId(), "getValue", hippyMap);
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
public boolean bUserSetValue = false;
|
|
603
|
+
|
|
604
|
+
public void jsSetValue(String value, int pos) {
|
|
605
|
+
bUserSetValue = true;
|
|
606
|
+
setText(value);
|
|
607
|
+
if (value != null) {
|
|
608
|
+
if (pos < 0) {
|
|
609
|
+
pos = value.length();
|
|
610
|
+
}
|
|
611
|
+
if (pos >= value.length()) {
|
|
612
|
+
pos = value.length();
|
|
613
|
+
}
|
|
614
|
+
setSelection(pos);
|
|
615
|
+
}
|
|
616
|
+
bUserSetValue = false;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
public void setOnSelectListener(boolean change) {
|
|
620
|
+
mHasSetOnSelectListener = change;
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
@SuppressWarnings("JavaReflectionMemberAccess")
|
|
624
|
+
public void setCursorColor(int color) {
|
|
625
|
+
try {
|
|
626
|
+
Field field = TextView.class.getDeclaredField("mCursorDrawableRes");
|
|
627
|
+
field.setAccessible(true);
|
|
628
|
+
int drawableResId = field.getInt(this);
|
|
629
|
+
field = TextView.class.getDeclaredField("mEditor");
|
|
630
|
+
field.setAccessible(true);
|
|
631
|
+
Object editor = field.get(this);
|
|
632
|
+
Drawable drawable = null;
|
|
633
|
+
final int version = Build.VERSION.SDK_INT;
|
|
634
|
+
if (version >= 21) {
|
|
635
|
+
drawable = this.getContext().getDrawable(drawableResId);
|
|
636
|
+
} else if (version >= 16) {
|
|
637
|
+
drawable = this.getContext().getResources().getDrawable(drawableResId);
|
|
638
|
+
}
|
|
639
|
+
if (drawable == null) {
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
642
|
+
drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
|
|
643
|
+
assert editor != null;
|
|
644
|
+
Class<?> editorClass = editor
|
|
645
|
+
.getClass(); //有的ROM自己复写了,Editor类,所以之类里面没有mDrawableForCursor,这里需要遍历
|
|
646
|
+
while (editorClass != null) {
|
|
647
|
+
try {
|
|
648
|
+
if (version >= 28) {
|
|
649
|
+
field = editorClass.getDeclaredField("mDrawableForCursor");//mCursorDrawable
|
|
650
|
+
field.setAccessible(true);
|
|
651
|
+
field.set(editor, drawable);
|
|
652
|
+
} else {
|
|
653
|
+
Drawable[] drawables = {drawable, drawable};
|
|
654
|
+
field = editorClass.getDeclaredField("mCursorDrawable");//mCursorDrawable
|
|
655
|
+
field.setAccessible(true);
|
|
656
|
+
field.set(editor, drawables);
|
|
657
|
+
}
|
|
658
|
+
break;
|
|
659
|
+
} catch (Throwable e) {
|
|
660
|
+
LogUtils.d("HippyTextInput", "setCursorColor: " + e.getMessage());
|
|
661
|
+
}
|
|
662
|
+
editorClass = editorClass.getSuperclass(); //继续往上反射父亲
|
|
663
|
+
}
|
|
664
|
+
} catch (Throwable e) {
|
|
665
|
+
LogUtils.d("HippyTextInput", "setCursorColor: " + e.getMessage());
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
}
|