Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2210bdfb authored by Shu Chen's avatar Shu Chen
Browse files

Supports showing Ime shortcuts in the system shortcuts UI.

Bug: 273483670
Test: locally tested.
Change-Id: I49a59ab8688aaf193a79c610738a1db951f2bfdf
parent 6d543f9f
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -471,9 +471,22 @@ interface IWindowManager
     * Requests Keyboard Shortcuts from the displayed window.
     *
     * @param receiver The receiver to deliver the results to.
     * @param deviceId The deviceId of KeyEvent by which this request is triggered, or -1 if it's
     *                 not triggered by a KeyEvent.
     * @see #requestImeKeyboardShortcuts(IResultReceiver, int)
     */
    void requestAppKeyboardShortcuts(IResultReceiver receiver, int deviceId);

    /**
     * Requests Keyboard Shortcuts from currently selected IME.
     *
     * @param receiver The receiver to deliver the results to.
     * @param deviceId The deviceId of KeyEvent by which this request is triggered, or -1 if it's
     *                 not triggered by a KeyEvent.
     * @see #requestAppKeyboardShortcuts(IResultReceiver, int)
     */
    void requestImeKeyboardShortcuts(IResultReceiver receiver, int deviceId);

    /**
     * Retrieves the current stable insets from the primary display.
     */
+14 −1
Original line number Diff line number Diff line
@@ -1384,14 +1384,27 @@ public interface WindowManager extends ViewManager {
            "android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED";

    /**
     * Request for keyboard shortcuts to be retrieved asynchronously.
     * Request for app's keyboard shortcuts to be retrieved asynchronously.
     *
     * @param receiver The callback to be triggered when the result is ready.
     * @param deviceId The deviceId of KeyEvent by which this request is triggered, or -1 if it's
     *                 not triggered by a KeyEvent.
     *
     * @hide
     */
    public void requestAppKeyboardShortcuts(final KeyboardShortcutsReceiver receiver, int deviceId);

    /**
     * Request for ime's keyboard shortcuts to be retrieved asynchronously.
     *
     * @param receiver The callback to be triggered when the result is ready.
     * @param deviceId The deviceId of KeyEvent by which this request is triggered, or -1 if it's
     *                 not triggered by a KeyEvent.
     *
     * @hide
     */
    default void requestImeKeyboardShortcuts(KeyboardShortcutsReceiver receiver, int deviceId) {};

    /**
     * Return the touch region for the current IME window, or an empty region if there is none.
     *
+24 −2
Original line number Diff line number Diff line
@@ -215,7 +215,8 @@ public final class WindowManagerImpl implements WindowManager {
            @Override
            public void send(int resultCode, Bundle resultData) throws RemoteException {
                List<KeyboardShortcutGroup> result =
                        resultData.getParcelableArrayList(PARCEL_KEY_SHORTCUTS_ARRAY, android.view.KeyboardShortcutGroup.class);
                        resultData.getParcelableArrayList(PARCEL_KEY_SHORTCUTS_ARRAY,
                                android.view.KeyboardShortcutGroup.class);
                receiver.onKeyboardShortcutsReceived(result);
            }
        };
@@ -223,6 +224,27 @@ public final class WindowManagerImpl implements WindowManager {
            WindowManagerGlobal.getWindowManagerService()
                    .requestAppKeyboardShortcuts(resultReceiver, deviceId);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    @Override
    public void requestImeKeyboardShortcuts(
            final KeyboardShortcutsReceiver receiver, int deviceId) {
        IResultReceiver resultReceiver = new IResultReceiver.Stub() {
            @Override
            public void send(int resultCode, Bundle resultData) throws RemoteException {
                List<KeyboardShortcutGroup> result =
                        resultData.getParcelableArrayList(PARCEL_KEY_SHORTCUTS_ARRAY,
                                android.view.KeyboardShortcutGroup.class);
                receiver.onKeyboardShortcutsReceived(result);
            }
        };
        try {
            WindowManagerGlobal.getWindowManagerService()
                    .requestImeKeyboardShortcuts(resultReceiver, deviceId);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

+6 −0
Original line number Diff line number Diff line
@@ -3379,6 +3379,12 @@
      "group": "WM_DEBUG_REMOTE_ANIMATIONS",
      "at": "com\/android\/server\/wm\/RemoteAnimationController.java"
    },
    "975028389": {
      "message": "unable to call receiver for empty keyboard shortcuts",
      "level": "ERROR",
      "group": "WM_ERROR",
      "at": "com\/android\/server\/wm\/WindowManagerService.java"
    },
    "975275467": {
      "message": "Set animatingExit: reason=remove\/isAnimating win=%s",
      "level": "VERBOSE",
+40 −17
Original line number Diff line number Diff line
@@ -56,7 +56,6 @@ import android.view.View.AccessibilityDelegate;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.WindowManager.KeyboardShortcutsReceiver;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Button;
import android.widget.EditText;
@@ -337,6 +336,12 @@ public final class KeyboardShortcutListSearch {
        mSpecialCharacterNames.put(KeyEvent.KEYCODE_MUHENKAN, "無変換");
        mSpecialCharacterNames.put(KeyEvent.KEYCODE_HENKAN, "変換");
        mSpecialCharacterNames.put(KeyEvent.KEYCODE_KATAKANA_HIRAGANA, "かな");
        mSpecialCharacterNames.put(KeyEvent.KEYCODE_ALT_LEFT, "Alt");
        mSpecialCharacterNames.put(KeyEvent.KEYCODE_ALT_RIGHT, "Alt");
        mSpecialCharacterNames.put(KeyEvent.KEYCODE_CTRL_LEFT, "Ctrl");
        mSpecialCharacterNames.put(KeyEvent.KEYCODE_CTRL_RIGHT, "Ctrl");
        mSpecialCharacterNames.put(KeyEvent.KEYCODE_SHIFT_LEFT, "Shift");
        mSpecialCharacterNames.put(KeyEvent.KEYCODE_SHIFT_RIGHT, "Shift");

        mModifierNames.put(KeyEvent.META_META_ON, "Meta");
        mModifierNames.put(KeyEvent.META_CTRL_ON, "Ctrl");
@@ -411,28 +416,46 @@ public final class KeyboardShortcutListSearch {
        mKeyCharacterMap = mBackupKeyCharacterMap;
    }

    private boolean mAppShortcutsReceived;
    private boolean mImeShortcutsReceived;

    @VisibleForTesting
    void showKeyboardShortcuts(int deviceId) {
        retrieveKeyCharacterMap(deviceId);
        mWindowManager.requestAppKeyboardShortcuts(new KeyboardShortcutsReceiver() {
            @Override
            public void onKeyboardShortcutsReceived(
                    final List<KeyboardShortcutGroup> result) {
        mAppShortcutsReceived = false;
        mImeShortcutsReceived = false;
        mWindowManager.requestAppKeyboardShortcuts(result -> {
            // Add specific app shortcuts
            if (result.isEmpty()) {
                mKeySearchResultMap.put(SHORTCUT_SPECIFICAPP_INDEX, false);
            } else {
                    mSpecificAppGroup = reMapToKeyboardShortcutMultiMappingGroup(result);
                mSpecificAppGroup.addAll(reMapToKeyboardShortcutMultiMappingGroup(result));
                mKeySearchResultMap.put(SHORTCUT_SPECIFICAPP_INDEX, true);
            }
            mAppShortcutsReceived = true;
            if (mImeShortcutsReceived) {
                mergeAndShowKeyboardShortcutsGroups();
            }
        }, deviceId);
        mWindowManager.requestImeKeyboardShortcuts(result -> {
            // Add specific Ime shortcuts
            if (!result.isEmpty()) {
                mInputGroup.addAll(reMapToKeyboardShortcutMultiMappingGroup(result));
            }
            mImeShortcutsReceived = true;
            if (mAppShortcutsReceived) {
                mergeAndShowKeyboardShortcutsGroups();
            }
        }, deviceId);
    }

    private void mergeAndShowKeyboardShortcutsGroups() {
        mFullShortsGroup.add(SHORTCUT_SYSTEM_INDEX, mSystemGroup);
        mFullShortsGroup.add(SHORTCUT_INPUT_INDEX, mInputGroup);
        mFullShortsGroup.add(SHORTCUT_OPENAPPS_INDEX, mOpenAppsGroup);
        mFullShortsGroup.add(SHORTCUT_SPECIFICAPP_INDEX, mSpecificAppGroup);
        showKeyboardShortcutSearchList(mFullShortsGroup);
    }
        }, deviceId);
    }

    // The original data structure is only for 1-to-1 shortcut mapping, so remap the old
    // data structure to the new data structure for handling the N-to-1 key mapping and other
Loading