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

Commit 7129b374 authored by Yohei Yukawa's avatar Yohei Yukawa
Browse files

Reenable pre-N style hard keyboard layout settings

This CL logically reverts Settings app changes for Bug 25752812, which
aimed to improve UX by tightly integrating physical keyboard layout
with input method subtype.

What went wrong is that the concept of input method subtype is not
widely accepted by the ecosystem actually.  Until we figoure out any
other better way here, let's revert back to the good old way that
enables users to specify multiple keyboard layouts per physical
keyboard device, not one layout per one input method subtype.

Note that we cannot simply revert the CL that originally introduced
the new flow [1] because it was indeed a huge CL that also touched IME
settings, which we want to continue using.  In that sense, this CL is
a kind of re-implementation of the previous style on top of the recent
language settings flow.

Note also that a fix [2] fox Bug 25062009 was also ported from
previous InputMethodAndLanguageSetting to
KeyboardLayoutPickerFragment.

 [1]: I728d7ee185827ed328c16cb7abce244557a26518
      976bb3f4
 [2]: I4483dfc89afc8d148b2cfa7c6a5f66d2a02f712a
      17b63198

Fix: 66498367
Test: make -j RunSettingsRoboTests
Test: Manually done with two Bluetooth keyboards
Change-Id: I7a2ed6dd39dcd8207d3d94e12cd01d5d67ba4bb5
parent 799c2545
Loading
Loading
Loading
Loading
+0 −4
Original line number Original line Diff line number Diff line
@@ -4177,10 +4177,6 @@
    <string name="keyboard_shortcuts_helper">Keyboard shortcuts helper</string>
    <string name="keyboard_shortcuts_helper">Keyboard shortcuts helper</string>
    <!-- Summary text for the 'keyboard shortcuts helper' dialog. [CHAR LIMIT=100] -->
    <!-- Summary text for the 'keyboard shortcuts helper' dialog. [CHAR LIMIT=100] -->
    <string name="keyboard_shortcuts_helper_summary">Display available shortcuts</string>
    <string name="keyboard_shortcuts_helper_summary">Display available shortcuts</string>
    <!--
        Format string for a physical device in the form: InputMethodSubtype - InputMethodEditor.
        e.g. English (US) - X Keyboard -->
    <string name="physical_device_title" translatable="false"><xliff:g id="input_method_editor" example="X Keyboard">%1$s</xliff:g> - <xliff:g id="input_method_subtype" example="English (US)">%2$s</xliff:g></string>
    <!-- Summary text for keyboards when no layout has been selected. [CHAR LIMIT=35] -->
    <!-- Summary text for keyboards when no layout has been selected. [CHAR LIMIT=35] -->
    <string name="default_keyboard_layout">Default</string>
    <string name="default_keyboard_layout">Default</string>
+43 −45
Original line number Original line Diff line number Diff line
@@ -16,43 +16,31 @@


package com.android.settings.inputmethod;
package com.android.settings.inputmethod;


import android.annotation.Nullable;
import android.content.Context;
import android.app.Activity;
import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputManager;
import android.hardware.input.InputManager;
import android.hardware.input.InputManager.InputDeviceListener;
import android.hardware.input.InputManager.InputDeviceListener;
import android.hardware.input.KeyboardLayout;
import android.hardware.input.KeyboardLayout;
import android.os.Bundle;
import android.os.Bundle;
import android.support.v7.preference.CheckBoxPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.support.v7.preference.PreferenceScreen;
import android.view.InputDevice;
import android.view.InputDevice;


import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodSubtype;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.Preconditions;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.inputmethod.PhysicalKeyboardFragment.KeyboardInfoPreference;


import java.util.Arrays;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashMap;
import java.util.Map;
import java.util.Map;


public final class KeyboardLayoutPickerFragment extends SettingsPreferenceFragment
public class KeyboardLayoutPickerFragment extends SettingsPreferenceFragment
        implements InputDeviceListener {
        implements InputDeviceListener {

    private InputDeviceIdentifier mInputDeviceIdentifier;
    private InputDeviceIdentifier mInputDeviceIdentifier;
    private int mInputDeviceId = -1;
    private int mInputDeviceId = -1;
    private InputManager mIm;
    private InputManager mIm;
    private InputMethodInfo mImi;
    @Nullable
    private InputMethodSubtype mSubtype;
    private KeyboardLayout[] mKeyboardLayouts;
    private KeyboardLayout[] mKeyboardLayouts;
    private Map<Preference, KeyboardLayout> mPreferenceMap = new HashMap<>();
    private HashMap<CheckBoxPreference, KeyboardLayout> mPreferenceMap = new HashMap<>();

    // TODO: Make these constants public API for b/25752827


    /**
    /**
     * Intent extra: The input device descriptor of the keyboard whose keyboard
     * Intent extra: The input device descriptor of the keyboard whose keyboard
@@ -60,16 +48,6 @@ public final class KeyboardLayoutPickerFragment extends SettingsPreferenceFragme
     */
     */
    public static final String EXTRA_INPUT_DEVICE_IDENTIFIER = "input_device_identifier";
    public static final String EXTRA_INPUT_DEVICE_IDENTIFIER = "input_device_identifier";


    /**
     * Intent extra: The associated {@link InputMethodInfo}.
     */
    public static final String EXTRA_INPUT_METHOD_INFO = "input_method_info";

    /**
     * Intent extra: The associated {@link InputMethodSubtype}.
     */
    public static final String EXTRA_INPUT_METHOD_SUBTYPE = "input_method_subtype";

    @Override
    @Override
    public int getMetricsCategory() {
    public int getMetricsCategory() {
        return MetricsEvent.INPUTMETHOD_KEYBOARD;
        return MetricsEvent.INPUTMETHOD_KEYBOARD;
@@ -78,18 +56,14 @@ public final class KeyboardLayoutPickerFragment extends SettingsPreferenceFragme
    @Override
    @Override
    public void onCreate(Bundle icicle) {
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        super.onCreate(icicle);
        Activity activity = Preconditions.checkNotNull(getActivity());


        mInputDeviceIdentifier = activity.getIntent().getParcelableExtra(
        mInputDeviceIdentifier = getActivity().getIntent().getParcelableExtra(
                EXTRA_INPUT_DEVICE_IDENTIFIER);
                EXTRA_INPUT_DEVICE_IDENTIFIER);
        mImi = activity.getIntent().getParcelableExtra(EXTRA_INPUT_METHOD_INFO);
        if (mInputDeviceIdentifier == null) {
        mSubtype = activity.getIntent().getParcelableExtra(EXTRA_INPUT_METHOD_SUBTYPE);
            getActivity().finish();

        if (mInputDeviceIdentifier == null || mImi == null) {
            activity.finish();
        }
        }


        mIm = activity.getSystemService(InputManager.class);
        mIm = (InputManager) getSystemService(Context.INPUT_SERVICE);
        mKeyboardLayouts = mIm.getKeyboardLayoutsForInputDevice(mInputDeviceIdentifier);
        mKeyboardLayouts = mIm.getKeyboardLayoutsForInputDevice(mInputDeviceIdentifier);
        Arrays.sort(mKeyboardLayouts);
        Arrays.sort(mKeyboardLayouts);
        setPreferenceScreen(createPreferenceHierarchy());
        setPreferenceScreen(createPreferenceHierarchy());
@@ -108,6 +82,8 @@ public final class KeyboardLayoutPickerFragment extends SettingsPreferenceFragme
            return;
            return;
        }
        }
        mInputDeviceId = inputDevice.getId();
        mInputDeviceId = inputDevice.getId();

        updateCheckedState();
    }
    }


    @Override
    @Override
@@ -120,21 +96,34 @@ public final class KeyboardLayoutPickerFragment extends SettingsPreferenceFragme


    @Override
    @Override
    public boolean onPreferenceTreeClick(Preference preference) {
    public boolean onPreferenceTreeClick(Preference preference) {
        KeyboardLayout layout = mPreferenceMap.get(preference);
        if (preference instanceof CheckBoxPreference) {
            CheckBoxPreference checkboxPref = (CheckBoxPreference)preference;
            KeyboardLayout layout = mPreferenceMap.get(checkboxPref);
            if (layout != null) {
            if (layout != null) {
            mIm.setKeyboardLayoutForInputDevice(mInputDeviceIdentifier, mImi, mSubtype,
                boolean checked = checkboxPref.isChecked();
                if (checked) {
                    mIm.addKeyboardLayoutForInputDevice(mInputDeviceIdentifier,
                            layout.getDescriptor());
                            layout.getDescriptor());
            getActivity().finish();
                } else {
                    mIm.removeKeyboardLayoutForInputDevice(mInputDeviceIdentifier,
                            layout.getDescriptor());
                }
                return true;
                return true;
            }
            }
        }
        return super.onPreferenceTreeClick(preference);
        return super.onPreferenceTreeClick(preference);
    }
    }


    @Override
    @Override
    public void onInputDeviceAdded(int deviceId) {}
    public void onInputDeviceAdded(int deviceId) {
    }


    @Override
    @Override
    public void onInputDeviceChanged(int deviceId) {}
    public void onInputDeviceChanged(int deviceId) {
        if (mInputDeviceId >= 0 && deviceId == mInputDeviceId) {
            updateCheckedState();
        }
    }


    @Override
    @Override
    public void onInputDeviceRemoved(int deviceId) {
    public void onInputDeviceRemoved(int deviceId) {
@@ -147,14 +136,23 @@ public final class KeyboardLayoutPickerFragment extends SettingsPreferenceFragme
        PreferenceScreen root = getPreferenceManager().createPreferenceScreen(getActivity());
        PreferenceScreen root = getPreferenceManager().createPreferenceScreen(getActivity());


        for (KeyboardLayout layout : mKeyboardLayouts) {
        for (KeyboardLayout layout : mKeyboardLayouts) {
            Preference pref = new Preference(getPrefContext());
            CheckBoxPreference pref = new CheckBoxPreference(getPrefContext());
            pref.setTitle(layout.getLabel());
            pref.setTitle(layout.getLabel());
            pref.setSummary(layout.getCollection());
            pref.setSummary(layout.getCollection());
            root.addPreference(pref);
            root.addPreference(pref);
            mPreferenceMap.put(pref, layout);
            mPreferenceMap.put(pref, layout);
        }
        }

        root.setTitle(KeyboardInfoPreference.getDisplayName(getContext(), mImi, mSubtype));
        return root;
        return root;
    }
    }

    private void updateCheckedState() {
        String[] enabledKeyboardLayouts = mIm.getEnabledKeyboardLayoutsForInputDevice(
                mInputDeviceIdentifier);
        Arrays.sort(enabledKeyboardLayouts);

        for (Map.Entry<CheckBoxPreference, KeyboardLayout> entry : mPreferenceMap.entrySet()) {
            entry.getKey().setChecked(Arrays.binarySearch(enabledKeyboardLayouts,
                    entry.getValue().getDescriptor()) >= 0);
        }
    }
}
}