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

Commit e46c5f30 authored by Jeff Brown's avatar Jeff Brown
Browse files

Add new settings UI to select keyboard layout.

Bug: 6110399
Change-Id: Ib2758bdcdd6b271be402f46c56d41619dc7aecb9
parent c2584bff
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -396,6 +396,19 @@
                android:resource="@id/language_settings" />
        </activity>

        <activity android:name="Settings$KeyboardLayoutPickerActivity"
                android:label="@string/keyboard_layout_picker_title"
                android:clearTaskOnLaunch="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                android:value="com.android.settings.inputmethod.KeyboardLayoutPicker" />
            <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
                android:resource="@id/language_settings" />
        </activity>

        <!-- Keep compatibility with old shortcuts. -->
        <activity-alias android:name="LanguageSettings"
                android:label="@string/language_keyboard_settings_title"
+6 −0
Original line number Diff line number Diff line
@@ -2614,6 +2614,12 @@
    <!-- On Language & input settings screen, setting summary.  Setting for mouse pointer speed. [CHAR LIMIT=35] -->
    <string name="pointer_speed">Pointer speed</string>

    <!-- Keyboard Layout Picker --> <skip />
    <!-- Title for the keyboard layout picker activity. [CHAR LIMIT=35] -->
    <string name="keyboard_layout_picker_title">Choose keyboard layout</string>
    <!-- String to show when no keyboard layouts are available. [CHAR LIMIT=60] -->
    <string name="keyboard_layout_picker_empty_text">No keyboard layouts are available.</string>

    <!-- User dictionary settings --><skip />
    <!-- User dictionary settings, The titlebar text of the User dictionary settings screen. -->
    <string name="user_dict_settings_titlebar">User dictionary</string>
+7 −0
Original line number Diff line number Diff line
@@ -36,27 +36,34 @@
        <PreferenceScreen android:key="current_input_method"
                android:title="@string/current_input_method" />
    </PreferenceCategory>

    <PreferenceCategory
            android:key="hard_keyboard"
            android:title="@string/builtin_keyboard_settings_title"
            android:persistent="false">
        <!-- Additional preference screens are inserted here programmatically
             with low order values to set the key map of each attached keyboard. -->

        <CheckBoxPreference
                android:key="auto_replace"
                android:title="@string/auto_replace"
                android:summaryOn="@string/auto_replace_summary"
                android:summaryOff="@string/auto_replace_summary"
                android:order="1000"
                android:persistent="false"/>
        <CheckBoxPreference
                android:key="auto_caps"
                android:title="@string/auto_caps"
                android:summaryOn="@string/auto_caps_summary"
                android:summaryOff="@string/auto_caps_summary"
                android:order="1001"
                android:persistent="false"/>
        <CheckBoxPreference
                android:key="auto_punctuate"
                android:title="@string/auto_punctuate"
                android:summaryOn="@string/auto_punctuate_summary"
                android:summaryOff="@string/auto_punctuate_summary"
                android:order="1002"
                android:persistent="false"/>
    </PreferenceCategory>

+1 −0
Original line number Diff line number Diff line
@@ -609,6 +609,7 @@ public class Settings extends PreferenceActivity implements ButtonBarHandler {
    public static class WifiSettingsActivity extends Settings { /* empty */ }
    public static class WifiP2pSettingsActivity extends Settings { /* empty */ }
    public static class InputMethodAndLanguageSettingsActivity extends Settings { /* empty */ }
    public static class KeyboardLayoutPickerActivity extends Settings { /* empty */ }
    public static class InputMethodAndSubtypeEnablerActivity extends Settings { /* empty */ }
    public static class SpellCheckersSettingsActivity extends Settings { /* empty */ }
    public static class LocalePickerActivity extends Settings { /* empty */ }
+106 −47
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.settings.inputmethod;

import com.android.settings.R;
import com.android.settings.Settings.KeyboardLayoutPickerActivity;
import com.android.settings.Settings.SpellCheckersSettingsActivity;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
@@ -29,6 +30,8 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.database.ContentObserver;
import android.hardware.input.InputManager;
import android.hardware.input.InputManager.KeyboardLayout;
import android.os.Bundle;
import android.os.Handler;
import android.preference.CheckBoxPreference;
@@ -40,11 +43,15 @@ import android.preference.PreferenceScreen;
import android.provider.Settings;
import android.provider.Settings.System;
import android.text.TextUtils;
import android.view.InputDevice;
import android.view.KeyCharacterMap;
import android.view.KeyCharacterMap.UnavailableException;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;

@@ -68,11 +75,13 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment

    private int mDefaultInputMethodSelectorVisibility = 0;
    private ListPreference mShowInputMethodSelectorPref;
    private PreferenceCategory mKeyboardSettingsCategory;
    private PreferenceCategory mHardKeyboardCategory;
    private Preference mLanguagePref;
    private ArrayList<InputMethodPreference> mInputMethodPreferenceList =
    private final ArrayList<InputMethodPreference> mInputMethodPreferenceList =
            new ArrayList<InputMethodPreference>();
    private boolean mHaveHardKeyboard;
    private PreferenceCategory mHardKeyboardCategory;
    private final ArrayList<PreferenceScreen> mHardKeyboardPreferenceList =
            new ArrayList<PreferenceScreen>();
    private InputMethodManager mImm;
    private List<InputMethodInfo> mImis;
    private boolean mIsOnlyImeSettings;
@@ -108,18 +117,55 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment

        new VoiceInputOutputSettings(this).onCreate();

        // Hard keyboard
        final Configuration config = getResources().getConfiguration();
        mHaveHardKeyboard = (config.keyboard == Configuration.KEYBOARD_QWERTY);
        // Get references to dynamically constructed categories.
        mHardKeyboardCategory = (PreferenceCategory)findPreference("hard_keyboard");
        mKeyboardSettingsCategory = (PreferenceCategory)findPreference(
                "keyboard_settings_category");

        // IME
        // Filter out irrelevant features if invoked from IME settings button.
        mIsOnlyImeSettings = Settings.ACTION_INPUT_METHOD_SETTINGS.equals(
                getActivity().getIntent().getAction());
        getActivity().getIntent().setAction(null);
        if (mIsOnlyImeSettings) {
            getPreferenceScreen().removeAll();
            getPreferenceScreen().addPreference(mHardKeyboardCategory);
            if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
                getPreferenceScreen().addPreference(mShowInputMethodSelectorPref);
            }
            getPreferenceScreen().addPreference(mKeyboardSettingsCategory);
        }

        // Build IME preference category.
        mImm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        mImis = mImm.getInputMethodList();
        createImePreferenceHierarchy((PreferenceGroup)findPreference("keyboard_settings_category"));

        mKeyboardSettingsCategory.removeAll();
        if (!mIsOnlyImeSettings) {
            final PreferenceScreen currentIme = new PreferenceScreen(getActivity(), null);
            currentIme.setKey(KEY_CURRENT_INPUT_METHOD);
            currentIme.setTitle(getResources().getString(R.string.current_input_method));
            mKeyboardSettingsCategory.addPreference(currentIme);
        }

        mInputMethodPreferenceList.clear();
        final int N = (mImis == null ? 0 : mImis.size());
        for (int i = 0; i < N; ++i) {
            final InputMethodInfo imi = mImis.get(i);
            final InputMethodPreference pref = getInputMethodPreference(imi, N);
            mInputMethodPreferenceList.add(pref);
        }

        if (!mInputMethodPreferenceList.isEmpty()) {
            Collections.sort(mInputMethodPreferenceList);
            for (int i = 0; i < N; ++i) {
                mKeyboardSettingsCategory.addPreference(mInputMethodPreferenceList.get(i));
            }
        }

        // Build hard keyboard preference category.
        updateHardKeyboards();

        // Spell Checker
        final Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setClass(getActivity(), SpellCheckersSettingsActivity.class);
        final SpellCheckersPreference scp = ((SpellCheckersPreference)findPreference(
@@ -189,7 +235,7 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
        }

        // Hard keyboard
        if (mHaveHardKeyboard) {
        if (!mHardKeyboardPreferenceList.isEmpty()) {
            for (int i = 0; i < sHardKeyboardKeys.length; ++i) {
                CheckBoxPreference chkPref = (CheckBoxPreference)
                        mHardKeyboardCategory.findPreference(sHardKeyboardKeys[i]);
@@ -198,6 +244,8 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
            }
        }

        updateHardKeyboards();

        // IME
        InputMethodAndSubtypeUtil.loadInputMethodSubtypeList(
                this, getContentResolver(), mImis, null);
@@ -211,7 +259,7 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
            mShowInputMethodSelectorPref.setOnPreferenceChangeListener(null);
        }
        InputMethodAndSubtypeUtil.saveInputMethodSubtypeList(
                this, getContentResolver(), mImis, mHaveHardKeyboard);
                this, getContentResolver(), mImis, !mHardKeyboardPreferenceList.isEmpty());
    }

    @Override
@@ -230,7 +278,7 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
            }
        } else if (preference instanceof CheckBoxPreference) {
            final CheckBoxPreference chkPref = (CheckBoxPreference) preference;
            if (mHaveHardKeyboard) {
            if (!mHardKeyboardPreferenceList.isEmpty()) {
                for (int i = 0; i < sHardKeyboardKeys.length; ++i) {
                    if (chkPref == mHardKeyboardCategory.findPreference(sHardKeyboardKeys[i])) {
                        System.putInt(getContentResolver(), sSystemSettingNames[i],
@@ -315,46 +363,57 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
        return pref;
    }

    private void createImePreferenceHierarchy(PreferenceGroup root) {
        final Preference hardKeyPref = findPreference("hard_keyboard");
        if (mIsOnlyImeSettings) {
            getPreferenceScreen().removeAll();
            if (hardKeyPref != null && mHaveHardKeyboard) {
                getPreferenceScreen().addPreference(hardKeyPref);
            }
            if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
                getPreferenceScreen().addPreference(mShowInputMethodSelectorPref);
    private void updateHardKeyboards() {
        mHardKeyboardPreferenceList.clear();
        if (getResources().getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY) {
            final InputManager im =
                    (InputManager)getActivity().getSystemService(Context.INPUT_SERVICE);

            final int[] devices = InputDevice.getDeviceIds();
            for (int i = 0; i < devices.length; i++) {
                InputDevice device = InputDevice.getDevice(devices[i]);
                if (device != null
                        && (device.getSources() & InputDevice.SOURCE_KEYBOARD) != 0
                        && device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) {
                    final String inputDeviceDescriptor = device.getDescriptor();
                    final String keyboardLayoutDescriptor =
                            im.getInputDeviceKeyboardLayoutDescriptor(inputDeviceDescriptor);
                    final KeyboardLayout keyboardLayout = keyboardLayoutDescriptor != null ?
                            im.getKeyboardLayout(keyboardLayoutDescriptor) : null;

                    final Intent intent = new Intent(Intent.ACTION_MAIN);
                    intent.setClass(getActivity(), KeyboardLayoutPickerActivity.class);
                    intent.putExtra(KeyboardLayoutPicker.EXTRA_INPUT_DEVICE_DESCRIPTOR,
                            inputDeviceDescriptor);

                    final PreferenceScreen pref = new PreferenceScreen(getActivity(), null);
                    pref.setTitle(device.getName());
                    if (keyboardLayout != null) {
                        pref.setSummary(keyboardLayout.getLabel());
                    }
            getPreferenceScreen().addPreference(root);
                    pref.setIntent(intent);
                    mHardKeyboardPreferenceList.add(pref);
                }
        if (hardKeyPref != null) {
            if (mHaveHardKeyboard) {
                mHardKeyboardCategory = (PreferenceCategory) hardKeyPref;
            } else {
                getPreferenceScreen().removePreference(hardKeyPref);
            }
        }
        root.removeAll();
        mInputMethodPreferenceList.clear();

        if (!mIsOnlyImeSettings) {
            // Current IME selection
            final PreferenceScreen currentIme = new PreferenceScreen(getActivity(), null);
            currentIme.setKey(KEY_CURRENT_INPUT_METHOD);
            currentIme.setTitle(getResources().getString(R.string.current_input_method));
            root.addPreference(currentIme);
        if (!mHardKeyboardPreferenceList.isEmpty()) {
            for (int i = mHardKeyboardCategory.getPreferenceCount(); i-- > 0; ) {
                final Preference pref = mHardKeyboardCategory.getPreference(i);
                if (pref.getOrder() < 1000) {
                    mHardKeyboardCategory.removePreference(pref);
                }

        final int N = (mImis == null ? 0 : mImis.size());
        for (int i = 0; i < N; ++i) {
            final InputMethodInfo imi = mImis.get(i);
            final InputMethodPreference pref = getInputMethodPreference(imi, N);
            mInputMethodPreferenceList.add(pref);
            }

        Collections.sort(mInputMethodPreferenceList);
        for (int i = 0; i < N; ++i) {
            root.addPreference(mInputMethodPreferenceList.get(i));
            Collections.sort(mHardKeyboardPreferenceList);
            final int count = mHardKeyboardPreferenceList.size();
            for (int i = 0; i < count; i++) {
                final Preference pref = mHardKeyboardPreferenceList.get(i);
                pref.setOrder(i);
                mHardKeyboardCategory.addPreference(pref);
            }
        } else {
            getPreferenceScreen().removePreference(mHardKeyboardCategory);
        }
    }

Loading