1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-05 22:20:24 -08:00

Work around one Android bug and document another

* etc/PROBLEMS (Runtime problems specific to Android): Document
deficiency of "Android Keyboard (AOSP)."

* java/org/gnu/emacs/EmacsView.java (showOnScreenKeyboard):
Revert yesterday's change.

* java/org/gnu/emacs/EmacsWindow.java (toggleOnScreenKeyboard):
Sync with the UI thread after displaying the on-screen keyboard.
This commit is contained in:
Po Lu 2024-05-23 17:46:48 +08:00
parent 64cced2c37
commit e96e4906c8
3 changed files with 37 additions and 13 deletions

View file

@ -777,15 +777,6 @@ public final class EmacsView extends ViewGroup
imManager.showSoftInput (this, 0);
isCurrentlyTextEditor = true;
/* The OS text editing widget unconditionally reports the current
values of the selection to the input method after calls to
showSoftInput, which is redundant if inputConnection exists but
is now relied upon in such circumstances by the OS's default
input method, and must therefore be faithfully reproduced on our
part. */
if (inputConnection != null)
EmacsNative.requestSelectionUpdate (window.handle);
}
public void

View file

@ -20,12 +20,16 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
package org.gnu.emacs;
import java.lang.IllegalStateException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import android.app.Activity;
import android.content.ClipData;
@ -1620,23 +1624,38 @@ public final class EmacsWindow extends EmacsHandleObject
public void
toggleOnScreenKeyboard (final boolean on)
{
FutureTask<Void> task;
/* Even though InputMethodManager functions are thread safe,
`showOnScreenKeyboard' etc must be called from the UI thread in
order to avoid deadlocks if the calls happen in tandem with a
call to a synchronizing function within
`onCreateInputConnection'. */
EmacsService.SERVICE.runOnUiThread (new Runnable () {
task = new FutureTask<Void> (new Callable<Void> () {
@Override
public void
run ()
public Void
call ()
{
if (on)
view.showOnScreenKeyboard ();
else
view.hideOnScreenKeyboard ();
return null;
}
});
/* Block Lisp until this request to display the on-screen keyboard
is registered by the UI thread, or updates arising from a
redisplay that are reported between the two events will be liable
to run afoul of the IMM's cache of selection positions and never
reach the input method, if it is currently hidden, as input
methods receive outdated selection information reported during
the previous call to `onCreateInputConnection' when first
displayed.
Chances are this is a long-standing bug in the system. */
EmacsService.<Void>syncRunnable (task);
}
public String