diff options
author | Vova Mshanetskiy <vovams163@gmail.com> | 2019-05-31 16:25:14 +0300 |
---|---|---|
committer | Vova Mshanetskiy <vovams163@gmail.com> | 2019-06-05 18:21:35 +0300 |
commit | 1ade5ea41ab80e49e92fe46e0c44f76ee2e5e7fb (patch) | |
tree | 5f8c9203875d6138bfd9df5ecb67af7332b8bac1 /src/network | |
parent | e5f2be256fb3bb07a98693cb90a4d7e8bc63c508 (diff) |
QAndroidInputContext: Improve compatibility with virtual keyboards
This commit improves QAndroidInputContext's conformance to Android's
InputConnection interface and/or consistency of it's behavior with
Android's native EditText control.
* Composing region is now completely independent from cursor and
selection, as required by InputConnection documentation. Also, Qt will
now never clear composing region (i.e. call finishComposingText())
without receiving a command to do so from the keyboard. This is
important for the following reasons:
- Some keyboards misbehave if we change composing region without
receiving a command from them. Notably, Samsung Keyboard does
(QTBUG-68822).
- Due to asynchronous nature of interaction between QAndroidInputContext
and the keyboard, when user drags cursor handle quickly, the keyboard
may call setComposingRegion() to mark a word, which is no longer under
the cursor. This was causing text corruption (QTBUG-43156,
QTBUG-59958). Also SwiftKey makes such calls when user presses Enter
key (QTBUG-57819).
- For similar reasons selecting a word with a double-tap could cause
text corruption. The keyboard may call setComposingRegion() in
response to the first tap after the second tap has been processed and
the word has already been already selected.
This is achieved by keeping track of start and end of composing region
independently from the editor. Whenever possible (i.e. when there is no
selection and the cursor is inside composing region), the composing text
is represented as preedit text inside editor. And whenever that is
imposible, the editor is told to commit, but QAndroidInputContext keeps
information about composing region internally to be able to correctly
interract with the keyboard.
* deleteSurroundingText() has been re-written to work correctly when
there are selection and/or composing region. Some keyboards (e.g Ginger
Keyboard) do call deleteSurroundingText() when there is non-empty
composing region.
* All operations are now performed inside a batch edit (i.e.
QAndroidInputContext now calls beginBatchEdit() and endBatchEdit() on
itself) to ensure that an intermediate state is never reported to the
keyboard, whenever an operation requires more than one
QInputMethodEvent. BatchEditLock helper class was added to call
begin/endBatchEdit() in RAII style. m_blockUpdateSelection has been
removed because m_batchEditNestingLevel is now used instead of it.
* Selection start and end positions are now reported to the keyboard so
that start <= end. Some keyboards can not handle start > end.
* getTextBefore/AfterCursor() now exclude selected text from their
return values. While Android docs say "text before/after cursor", what
they really mean is "text before/after selection" because "the cursor
and the selection are one and the same thing". Some keyboards (e.g.
Gboard) were behaving incorrectly when selected text was being returned.
* getExtractedText() now tries to obtain and return the whole text from
the editor. This is to fix compatibility with some buggy keyboards
(e.g. Samsung Keyboard, Minuum) that ignore startOffset field and
assume that selectionStart and selectionEnd are absolute values. Then
they issue commands with wrong indexes in some cases.
Fixes: QTBUG-43156
Fixes: QTBUG-59958
Fixes: QTBUG-57819
Fixes: QTBUG-68822
Change-Id: I7e71f3bcfbb2c32248d653a4197293db03579a79
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
Diffstat (limited to 'src/network')
0 files changed, 0 insertions, 0 deletions