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

Commit 29a4b1ac authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka Committed by Android (Google) Code Review
Browse files

Merge "Reload keyboard after SoftInputWindow size changed"

parents 5d7f9da9 e896d31b
Loading
Loading
Loading
Loading
+5 −9
Original line number Diff line number Diff line
@@ -151,16 +151,11 @@ public class Keyboard {
     * @param context the application or service context
     * @param xmlLayoutResId the resource file that contains the keyboard layout and keys.
     * @param id keyboard identifier
     * @param width keyboard width
     */
    public Keyboard(Context context, int xmlLayoutResId, KeyboardId id) {
        this(context, xmlLayoutResId, id,
                context.getResources().getDisplayMetrics().widthPixels,
                context.getResources().getDisplayMetrics().heightPixels);
    }

    private Keyboard(Context context, int xmlLayoutResId, KeyboardId id, int width,
            int height) {
        Resources res = context.getResources();
    public Keyboard(Context context, int xmlLayoutResId, KeyboardId id, int width) {
        final Resources res = context.getResources();
        GRID_WIDTH = res.getInteger(R.integer.config_keyboard_grid_width);
        GRID_HEIGHT = res.getInteger(R.integer.config_keyboard_grid_height);
        GRID_SIZE = GRID_WIDTH * GRID_HEIGHT;
@@ -168,7 +163,8 @@ public class Keyboard {
        final int horizontalEdgesPadding = (int)res.getDimension(
                R.dimen.keyboard_horizontal_edges_padding);
        mDisplayWidth = width - horizontalEdgesPadding * 2;
        mDisplayHeight = height;
        // TODO: Adjust the height by referring to the height of area available for drawing as well.
        mDisplayHeight = res.getDisplayMetrics().heightPixels;

        mDefaultHorizontalGap = 0;
        setKeyWidth(mDisplayWidth / 10);
+24 −4
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ public class KeyboardId {

    public final Locale mLocale;
    public final int mOrientation;
    public final int mWidth;
    public final int mMode;
    public final int mXmlId;
    public final int mColorScheme;
@@ -49,17 +50,20 @@ public class KeyboardId {
    public final boolean mHasVoiceKey;
    public final int mImeAction;
    public final boolean mEnableShiftLock;

    public final String mXmlName;
    public final EditorInfo mAttribute;

    private final int mHashCode;

    public KeyboardId(String xmlName, int xmlId, int colorScheme, Locale locale, int orientation,
            int mode, EditorInfo attribute, boolean hasSettingsKey, boolean voiceKeyEnabled,
            boolean hasVoiceKey, boolean enableShiftLock) {
            int width, int mode, EditorInfo attribute, boolean hasSettingsKey,
            boolean voiceKeyEnabled, boolean hasVoiceKey, boolean enableShiftLock) {
        final int inputType = (attribute != null) ? attribute.inputType : 0;
        final int imeOptions = (attribute != null) ? attribute.imeOptions : 0;
        this.mLocale = locale;
        this.mOrientation = orientation;
        this.mWidth = width;
        this.mMode = mode;
        this.mXmlId = xmlId;
        this.mColorScheme = colorScheme;
@@ -73,11 +77,14 @@ public class KeyboardId {
        this.mImeAction = imeOptions & (
                EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION);
        this.mEnableShiftLock = enableShiftLock;

        this.mXmlName = xmlName;
        this.mAttribute = attribute;

        this.mHashCode = Arrays.hashCode(new Object[] {
                locale,
                orientation,
                width,
                mode,
                xmlId,
                colorScheme,
@@ -90,6 +97,18 @@ public class KeyboardId {
        });
    }

    public KeyboardId cloneWithNewLayout(String xmlName, int xmlId) {
        return new KeyboardId(xmlName, xmlId, mColorScheme, mLocale, mOrientation, mWidth, mMode,
                mAttribute, mHasSettingsKey, mVoiceKeyEnabled, mHasVoiceKey, mEnableShiftLock);
    }

    public KeyboardId cloneWithNewGeometry(int width) {
        if (mWidth == width)
            return this;
        return new KeyboardId(mXmlName, mXmlId, mColorScheme, mLocale, mOrientation, width, mMode,
                mAttribute, mHasSettingsKey, mVoiceKeyEnabled, mHasVoiceKey, mEnableShiftLock);
    }

    public int getXmlId() {
        return mXmlId;
    }
@@ -118,6 +137,7 @@ public class KeyboardId {
    boolean equals(KeyboardId other) {
        return other.mLocale.equals(this.mLocale)
            && other.mOrientation == this.mOrientation
            && other.mWidth == this.mWidth
            && other.mMode == this.mMode
            && other.mXmlId == this.mXmlId
            && other.mColorScheme == this.mColorScheme
@@ -136,10 +156,10 @@ public class KeyboardId {

    @Override
    public String toString() {
        return String.format("[%s.xml %s %s %s imeAction=%s %s%s%s%s%s%s]",
        return String.format("[%s.xml %s %s%d %s %s %s%s%s%s%s%s]",
                mXmlName,
                mLocale,
                (mOrientation == 1 ? "port" : "land"),
                (mOrientation == 1 ? "port" : "land"), mWidth,
                modeName(mMode),
                EditorInfoCompatUtils.imeOptionsName(mImeAction),
                (mPasswordInput ? " passwordInput" : ""),
+43 −36
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ import java.util.Locale;

public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceChangeListener {
    private static final String TAG = "KeyboardSwitcher";
    private static final boolean DEBUG = false;
    private static final boolean DEBUG_CACHE = false;
    public static final boolean DEBUG_STATE = false;

    private static String sConfigDefaultKeyboardThemeId;
@@ -99,6 +99,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
    private static final int DEFAULT_SETTINGS_KEY_MODE = SETTINGS_KEY_MODE_AUTO;

    private int mLayoutId;
    private int mKeyboardWidth;

    private static final KeyboardSwitcher sInstance = new KeyboardSwitcher();

@@ -151,17 +152,39 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
        // Update the settings key state because number of enabled IMEs could have been changed
        mSettingsKeyEnabledInSettings = getSettingsKeyMode(mPrefs, mInputMethodService);
        final KeyboardId id = getKeyboardId(attribute, isSymbols);
        makeSymbolsKeyboardIds(id.mMode, attribute);
        mCurrentId = id;
        final Resources res = mInputMethodService.getResources();
        mInputView.setKeyPreviewPopupEnabled(Settings.Values.isKeyPreviewPopupEnabled(mPrefs, res),
                Settings.Values.getKeyPreviewPopupDismissDelay(mPrefs, res));

        // Note: This comment is only applied for phone number keyboard layout.
        // On non-xlarge device, "@integer/key_switch_alpha_symbol" key code is used to switch
        // between "phone keyboard" and "phone symbols keyboard".  But on xlarge device,
        // "@integer/key_shift" key code is used for that purpose in order to properly display
        // "more" and "locked more" key labels.  To achieve these behavior, we should initialize
        // mSymbolsId and mSymbolsShiftedId to "phone keyboard" and "phone symbols keyboard"
        // respectively here for xlarge device's layout switching.
        mSymbolsId = makeSiblingKeyboardId(id, R.xml.kbd_symbols, R.xml.kbd_phone);
        mSymbolsShiftedId = makeSiblingKeyboardId(
                id, R.xml.kbd_symbols_shift, R.xml.kbd_phone_symbols);

        setKeyboard(getKeyboard(id));
    }

    public void onSizeChanged() {
        final int width = mInputMethodService.getWindow().getWindow().getDecorView().getWidth();
        if (width == 0)
            return;
        mKeyboardWidth = width;
        // Set keyboard with new width.
        final KeyboardId newId = mCurrentId.cloneWithNewGeometry(width);
        setKeyboard(getKeyboard(newId));
    }

    private void setKeyboard(final Keyboard newKeyboard) {
        final Keyboard oldKeyboard = mInputView.getKeyboard();
        mInputView.setKeyboard(newKeyboard);
        mCurrentId = newKeyboard.mId;
        final Resources res = mInputMethodService.getResources();
        mInputView.setKeyPreviewPopupEnabled(
                Settings.Values.isKeyPreviewPopupEnabled(mPrefs, res),
                Settings.Values.getKeyPreviewPopupDismissDelay(mPrefs, res));
        final boolean localeChanged = (oldKeyboard == null)
                || !newKeyboard.mId.mLocale.equals(oldKeyboard.mId.mLocale);
        mInputMethodService.mHandler.startDisplayLanguageOnSpacebar(localeChanged);
@@ -175,19 +198,19 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
            final Locale savedLocale = Utils.setSystemLocale(res,
                    mSubtypeSwitcher.getInputLocale());

            keyboard = new LatinKeyboard(mInputMethodService, id);
            keyboard = new LatinKeyboard(mInputMethodService, id, id.mWidth);

            if (id.mEnableShiftLock) {
                keyboard.enableShiftLock();
            }

            mKeyboardCache.put(id, new SoftReference<LatinKeyboard>(keyboard));
            if (DEBUG)
            if (DEBUG_CACHE)
                Log.d(TAG, "keyboard cache size=" + mKeyboardCache.size() + ": "
                        + ((ref == null) ? "LOAD" : "GCed") + " id=" + id);

            Utils.setSystemLocale(res, savedLocale);
        } else if (DEBUG) {
        } else if (DEBUG_CACHE) {
            Log.d(TAG, "keyboard cache size=" + mKeyboardCache.size() + ": HIT  id=" + id);
        }

@@ -244,33 +267,19 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
        final boolean hasSettingsKey = hasSettingsKey(attribute);
        final Resources res = mInputMethodService.getResources();
        final int orientation = res.getConfiguration().orientation;
        if (mKeyboardWidth == 0)
            mKeyboardWidth = res.getDisplayMetrics().widthPixels;
        final Locale locale = mSubtypeSwitcher.getInputLocale();
        return new KeyboardId(
                res.getResourceEntryName(xmlId), xmlId, charColorId, locale, orientation, mode,
                attribute, hasSettingsKey, mVoiceKeyEnabled, hasVoiceKey, enableShiftLock);
                res.getResourceEntryName(xmlId), xmlId, charColorId, locale, orientation,
                mKeyboardWidth, mode, attribute, hasSettingsKey, mVoiceKeyEnabled, hasVoiceKey,
                enableShiftLock);
    }

    private void makeSymbolsKeyboardIds(final int mode, EditorInfo attribute) {
        final Locale locale = mSubtypeSwitcher.getInputLocale();
        final Resources res = mInputMethodService.getResources();
        final int orientation = res.getConfiguration().orientation;
        final int colorScheme = getColorScheme();
        final boolean hasVoiceKey = mVoiceKeyEnabled && !mVoiceButtonOnPrimary;
        final boolean hasSettingsKey = hasSettingsKey(attribute);
        // Note: This comment is only applied for phone number keyboard layout.
        // On non-xlarge device, "@integer/key_switch_alpha_symbol" key code is used to switch
        // between "phone keyboard" and "phone symbols keyboard".  But on xlarge device,
        // "@integer/key_shift" key code is used for that purpose in order to properly display
        // "more" and "locked more" key labels.  To achieve these behavior, we should initialize
        // mSymbolsId and mSymbolsShiftedId to "phone keyboard" and "phone symbols keyboard"
        // respectively here for xlarge device's layout switching.
        int xmlId = mode == KeyboardId.MODE_PHONE ? R.xml.kbd_phone : R.xml.kbd_symbols;
        final String xmlName = res.getResourceEntryName(xmlId);
        mSymbolsId = new KeyboardId(xmlName, xmlId, colorScheme, locale, orientation, mode,
                attribute, hasSettingsKey, mVoiceKeyEnabled, hasVoiceKey, false);
        xmlId = mode == KeyboardId.MODE_PHONE ? R.xml.kbd_phone_symbols : R.xml.kbd_symbols_shift;
        mSymbolsShiftedId = new KeyboardId(xmlName, xmlId, colorScheme, locale, orientation, mode,
                attribute, hasSettingsKey, mVoiceKeyEnabled, hasVoiceKey, false);
    private KeyboardId makeSiblingKeyboardId(KeyboardId base, int alphabet, int phone) {
        final int xmlId = base.mMode == KeyboardId.MODE_PHONE ? phone : alphabet;
        final String xmlName = mInputMethodService.getResources().getResourceEntryName(xmlId);
        return base.cloneWithNewLayout(xmlName, xmlId);
    }

    public int getKeyboardMode() {
@@ -561,14 +570,12 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
            return;
        final LatinKeyboard keyboard;
        if (mCurrentId.equals(mSymbolsId) || !mCurrentId.equals(mSymbolsShiftedId)) {
            mCurrentId = mSymbolsShiftedId;
            keyboard = getKeyboard(mCurrentId);
            keyboard = getKeyboard(mSymbolsShiftedId);
            // Symbol shifted keyboard has an ALT key that has a caps lock style indicator. To
            // enable the indicator, we need to call setShiftLocked(true).
            keyboard.setShiftLocked(true);
        } else {
            mCurrentId = mSymbolsId;
            keyboard = getKeyboard(mCurrentId);
            keyboard = getKeyboard(mSymbolsId);
            // Symbol keyboard has an ALT key that has a caps lock style indicator. To disable the
            // indicator, we need to call setShiftLocked(false).
            keyboard.setShiftLocked(false);
+6 −0
Original line number Diff line number Diff line
@@ -462,6 +462,12 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
        return mKeyboardActionListener;
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        // TODO: Should notify InputMethodService instead?
        KeyboardSwitcher.getInstance().onSizeChanged();
    }

    /**
     * Attaches a keyboard to this view. The keyboard can be switched at any time and the
     * view will re-layout itself to accommodate the keyboard.
+2 −2
Original line number Diff line number Diff line
@@ -88,8 +88,8 @@ public class LatinKeyboard extends Keyboard {
    private static final String SMALL_TEXT_SIZE_OF_LANGUAGE_ON_SPACEBAR = "small";
    private static final String MEDIUM_TEXT_SIZE_OF_LANGUAGE_ON_SPACEBAR = "medium";

    public LatinKeyboard(Context context, KeyboardId id) {
        super(context, id.getXmlId(), id);
    public LatinKeyboard(Context context, KeyboardId id, int width) {
        super(context, id.getXmlId(), id, width);
        final Resources res = context.getResources();
        mContext = context;

Loading