Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
weixin_43355755
engine
提交
b4d4e30c
E
engine
项目概览
weixin_43355755
/
engine
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
engine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
b4d4e30c
编写于
11月 20, 2020
作者:
G
Greg Spencer
提交者:
GitHub
11月 20, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix double delete on backspace on Android (#22626)
上级
b502fcb9
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
5 addition
and
167 deletion
+5
-167
shell/platform/android/io/flutter/plugin/editing/InputConnectionAdaptor.java
...oid/io/flutter/plugin/editing/InputConnectionAdaptor.java
+1
-15
shell/platform/android/test/io/flutter/plugin/editing/InputConnectionAdaptorTest.java
...io/flutter/plugin/editing/InputConnectionAdaptorTest.java
+4
-152
未找到文件。
shell/platform/android/io/flutter/plugin/editing/InputConnectionAdaptor.java
浏览文件 @
b4d4e30c
...
...
@@ -296,21 +296,7 @@ class InputConnectionAdaptor extends BaseInputConnection
}
if
(
event
.
getAction
()
==
KeyEvent
.
ACTION_DOWN
)
{
if
(
event
.
getKeyCode
()
==
KeyEvent
.
KEYCODE_DEL
)
{
int
selStart
=
clampIndexToEditable
(
Selection
.
getSelectionStart
(
mEditable
),
mEditable
);
int
selEnd
=
clampIndexToEditable
(
Selection
.
getSelectionEnd
(
mEditable
),
mEditable
);
if
(
selStart
==
selEnd
&&
selStart
>
0
)
{
// Extend selection to left of the last character
selStart
=
flutterTextUtils
.
getOffsetBefore
(
mEditable
,
selStart
);
}
if
(
selEnd
>
selStart
)
{
// Delete the selection.
Selection
.
setSelection
(
mEditable
,
selStart
);
mEditable
.
delete
(
selStart
,
selEnd
);
return
true
;
}
return
false
;
}
else
if
(
event
.
getKeyCode
()
==
KeyEvent
.
KEYCODE_DPAD_LEFT
)
{
if
(
event
.
getKeyCode
()
==
KeyEvent
.
KEYCODE_DPAD_LEFT
)
{
int
selStart
=
Selection
.
getSelectionStart
(
mEditable
);
int
selEnd
=
Selection
.
getSelectionEnd
(
mEditable
);
if
(
selStart
==
selEnd
&&
!
event
.
isShiftPressed
())
{
...
...
shell/platform/android/test/io/flutter/plugin/editing/InputConnectionAdaptorTest.java
浏览文件 @
b4d4e30c
...
...
@@ -1029,166 +1029,18 @@ public class InputConnectionAdaptorTest {
}
@Test
public
void
testSendKeyEvent_delKey
DeletesBackwar
d
()
{
public
void
testSendKeyEvent_delKey
NotConsume
d
()
{
int
selStart
=
29
;
ListenableEditingState
editable
=
sampleEditable
(
selStart
,
selStart
,
SAMPLE_RTL_TEXT
);
InputConnectionAdaptor
adaptor
=
sampleInputConnectionAdaptor
(
editable
);
KeyEvent
downKeyDown
=
new
KeyEvent
(
KeyEvent
.
ACTION_DOWN
,
KeyEvent
.
KEYCODE_DEL
);
for
(
int
i
=
0
;
i
<
9
;
i
++)
{
for
(
int
i
=
0
;
i
<
10
;
i
++)
{
boolean
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
}
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
19
);
for
(
int
i
=
0
;
i
<
9
;
i
++)
{
boolean
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
}
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
10
);
}
@Test
public
void
testSendKeyEvent_delKeyDeletesBackwardComplexEmojis
()
{
int
selStart
=
75
;
ListenableEditingState
editable
=
sampleEditable
(
selStart
,
selStart
,
SAMPLE_EMOJI_TEXT
);
InputConnectionAdaptor
adaptor
=
sampleInputConnectionAdaptor
(
editable
);
KeyEvent
downKeyDown
=
new
KeyEvent
(
KeyEvent
.
ACTION_DOWN
,
KeyEvent
.
KEYCODE_DEL
);
boolean
didConsume
;
// Normal Character
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
74
);
// Non-Spacing Mark
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
73
);
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
72
);
// Keycap
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
69
);
// Keycap with invalid base
adaptor
.
setSelection
(
68
,
68
);
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
66
);
adaptor
.
setSelection
(
67
,
67
);
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
66
);
// Zero Width Joiner
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
55
);
// Zero Width Joiner with invalid base
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
53
);
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
52
);
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
51
);
// ----- Start Emoji Tag Sequence with invalid base testing ----
// Delete base tag
adaptor
.
setSelection
(
39
,
39
);
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
37
);
// Delete the sequence
adaptor
.
setSelection
(
49
,
49
);
for
(
int
i
=
0
;
i
<
6
;
i
++)
{
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertFalse
(
didConsume
);
}
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
37
);
// ----- End Emoji Tag Sequence with invalid base testing ----
// Emoji Tag Sequence
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
23
);
// Variation Selector with invalid base
adaptor
.
setSelection
(
22
,
22
);
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
21
);
adaptor
.
setSelection
(
22
,
22
);
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
21
);
// Variation Selector
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
19
);
// Emoji Modifier
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
16
);
// Emoji Modifier with invalid base
adaptor
.
setSelection
(
14
,
14
);
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
13
);
adaptor
.
setSelection
(
14
,
14
);
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
13
);
// Line Feed
adaptor
.
setSelection
(
12
,
12
);
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
11
);
// Carriage Return
adaptor
.
setSelection
(
12
,
12
);
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
11
);
// Carriage Return and Line Feed
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
9
);
// Regional Indicator Symbol odd
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
7
);
// Regional Indicator Symbol even
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
3
);
// Simple Emoji
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
1
);
// First CodePoint
didConsume
=
adaptor
.
sendKeyEvent
(
downKeyDown
);
assertTrue
(
didConsume
);
assertEquals
(
Selection
.
getSelectionStart
(
editable
),
0
);
assertEquals
(
29
,
Selection
.
getSelectionStart
(
editable
));
}
@Test
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录