From 9d5601e9013c5ec9a7ac75db16f4a0a8218b02bf Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Wed, 31 Aug 2011 15:26:32 +0900 Subject: Rename PopupCharactersParser to MoreKeySpecParser Also renames PopupPanel to MoreKeysPanel Change-Id: I37209a5a8fe7dbba1eef03e3be88ba5253653926 --- java/src/com/android/inputmethod/keyboard/Key.java | 50 ++--- .../com/android/inputmethod/keyboard/Keyboard.java | 6 +- .../android/inputmethod/keyboard/KeyboardView.java | 10 +- .../inputmethod/keyboard/LatinKeyboardView.java | 104 +++++----- .../android/inputmethod/keyboard/MiniKeyboard.java | 22 +- .../inputmethod/keyboard/MiniKeyboardView.java | 8 +- .../inputmethod/keyboard/MoreKeysPanel.java | 59 ++++++ .../inputmethod/keyboard/PointerTracker.java | 22 +- .../android/inputmethod/keyboard/PopupPanel.java | 54 ----- .../inputmethod/keyboard/internal/KeyStyles.java | 4 +- .../keyboard/internal/KeyboardBuilder.java | 10 +- .../keyboard/internal/KeyboardParams.java | 2 +- .../keyboard/internal/MoreKeySpecParser.java | 230 +++++++++++++++++++++ .../keyboard/internal/PopupCharactersParser.java | 230 --------------------- 14 files changed, 409 insertions(+), 402 deletions(-) create mode 100644 java/src/com/android/inputmethod/keyboard/MoreKeysPanel.java delete mode 100644 java/src/com/android/inputmethod/keyboard/PopupPanel.java create mode 100644 java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java delete mode 100644 java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java (limited to 'java/src') diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java index 8baf3f7d1..b919bcfc4 100644 --- a/java/src/com/android/inputmethod/keyboard/Key.java +++ b/java/src/com/android/inputmethod/keyboard/Key.java @@ -30,7 +30,7 @@ import com.android.inputmethod.keyboard.internal.KeyboardBuilder; import com.android.inputmethod.keyboard.internal.KeyboardBuilder.ParseException; import com.android.inputmethod.keyboard.internal.KeyboardIconsSet; import com.android.inputmethod.keyboard.internal.KeyboardParams; -import com.android.inputmethod.keyboard.internal.PopupCharactersParser; +import com.android.inputmethod.keyboard.internal.MoreKeySpecParser; import com.android.inputmethod.keyboard.internal.Row; import com.android.inputmethod.latin.R; @@ -90,10 +90,10 @@ public class Key { public final int mY; /** Text to output when pressed. This can be multiple characters, like ".com" */ public final CharSequence mOutputText; - /** Popup characters */ - public final CharSequence[] mPopupCharacters; - /** Popup keyboard maximum column number */ - public final int mMaxMiniKeyboardColumn; + /** More keys */ + public final CharSequence[] mMoreKeys; + /** More keys maximum column number */ + public final int mMaxMoreKeysColumn; /** * Flags that specify the anchoring to edges of the keyboard for detecting touch events @@ -192,22 +192,22 @@ public class Key { } } - private static int getCode(Resources res, KeyboardParams params, String popupSpec) { + private static int getCode(Resources res, KeyboardParams params, String moreKeySpec) { return getRtlParenthesisCode( - PopupCharactersParser.getCode(res, popupSpec), params.mIsRtlKeyboard); + MoreKeySpecParser.getCode(res, moreKeySpec), params.mIsRtlKeyboard); } - private static Drawable getIcon(KeyboardParams params, String popupSpec) { - return params.mIconsSet.getIcon(PopupCharactersParser.getIconId(popupSpec)); + private static Drawable getIcon(KeyboardParams params, String moreKeySpec) { + return params.mIconsSet.getIcon(MoreKeySpecParser.getIconId(moreKeySpec)); } /** - * This constructor is being used only for key in popup mini keyboard. + * This constructor is being used only for key in more keys keyboard. */ - public Key(Resources res, KeyboardParams params, String popupSpec, + public Key(Resources res, KeyboardParams params, String moreKeySpec, int x, int y, int width, int height, int edgeFlags) { - this(params, PopupCharactersParser.getLabel(popupSpec), null, getIcon(params, popupSpec), - getCode(res, params, popupSpec), PopupCharactersParser.getOutputText(popupSpec), + this(params, MoreKeySpecParser.getLabel(moreKeySpec), null, getIcon(params, moreKeySpec), + getCode(res, params, moreKeySpec), MoreKeySpecParser.getOutputText(moreKeySpec), x, y, width, height, edgeFlags); } @@ -227,8 +227,8 @@ public class Key { mFunctional = false; mSticky = false; mRepeatable = false; - mPopupCharacters = null; - mMaxMiniKeyboardColumn = 0; + mMoreKeys = null; + mMaxMoreKeysColumn = 0; mLabel = label; mOutputText = outputText; mCode = code; @@ -312,19 +312,19 @@ public class Key { mY = y; mWidth = keyWidth - mHorizontalGap; - final CharSequence[] popupCharacters = style.getTextArray( - keyAttr, R.styleable.Keyboard_Key_popupCharacters); - // In Arabic symbol layouts, we'd like to keep digits in popup characters regardless of - // config_digit_popup_characters_enabled. + final CharSequence[] moreKeys = style.getTextArray( + keyAttr, R.styleable.Keyboard_Key_moreKeys); + // In Arabic symbol layouts, we'd like to keep digits in more keys regardless of + // config_digit_more_keys_enabled. if (params.mId.isAlphabetKeyboard() && !res.getBoolean( - R.bool.config_digit_popup_characters_enabled)) { - mPopupCharacters = PopupCharactersParser.filterOut( - res, popupCharacters, PopupCharactersParser.DIGIT_FILTER); + R.bool.config_digit_more_keys_enabled)) { + mMoreKeys = MoreKeySpecParser.filterOut( + res, moreKeys, MoreKeySpecParser.DIGIT_FILTER); } else { - mPopupCharacters = popupCharacters; + mMoreKeys = moreKeys; } - mMaxMiniKeyboardColumn = style.getInt(keyboardAttr, - R.styleable.Keyboard_Key_maxMiniKeyboardColumn, + mMaxMoreKeysColumn = style.getInt(keyboardAttr, + R.styleable.Keyboard_Key_maxMoreKeysColumn, params.mMaxMiniKeyboardColumn); mRepeatable = style.getBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable, false); diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java index 5dabb93ec..3a8a1d4b8 100644 --- a/java/src/com/android/inputmethod/keyboard/Keyboard.java +++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java @@ -101,8 +101,8 @@ public class Keyboard { public final int mMostCommonKeyWidth; - /** Popup keyboard template */ - public final int mPopupTemplateId; + /** More keys keyboard template */ + public final int mMoreKeysTemplate; /** Maximum column for mini keyboard */ public final int mMaxMiniKeyboardColumn; @@ -130,7 +130,7 @@ public class Keyboard { mWidth = params.mWidth; mMostCommonKeyWidth = params.mMostCommonKeyWidth; mIsRtlKeyboard = params.mIsRtlKeyboard; - mPopupTemplateId = params.mPopupTemplateId; + mMoreKeysTemplate = params.mMoreKeysTemplate; mMaxMiniKeyboardColumn = params.mMaxMiniKeyboardColumn; mDefaultRowHeight = params.mDefaultRowHeight; diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java index 4c5c2bc10..ceadc919c 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java @@ -79,7 +79,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { // XML attributes protected final float mVerticalCorrection; - protected final int mPopupLayout; + protected final int mMoreKeysLayout; private final float mBackgroundDimAmount; // HORIZONTAL ELLIPSIS "...", character for popup hint. @@ -343,7 +343,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { } mVerticalCorrection = a.getDimensionPixelOffset( R.styleable.KeyboardView_verticalCorrection, 0); - mPopupLayout = a.getResourceId(R.styleable.KeyboardView_popupLayout, 0); + mMoreKeysLayout = a.getResourceId(R.styleable.KeyboardView_moreKeysLayout, 0); mBackgroundDimAmount = a.getFloat(R.styleable.KeyboardView_backgroundDimAmount, 0.5f); a.recycle(); @@ -679,7 +679,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { } // Draw popup hint "..." at the bottom right corner of the key. - if ((key.hasPopupHint() && key.mPopupCharacters != null && key.mPopupCharacters.length > 0) + if ((key.hasPopupHint() && key.mMoreKeys != null && key.mMoreKeys.length > 0) || key.needsSpecialPopupHint()) { paint.setTextSize(params.mKeyHintLetterSize); paint.setColor(params.mKeyHintLabelColor); @@ -880,7 +880,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { // Set the preview background state previewText.getBackground().setState( - key.mPopupCharacters != null ? LONG_PRESSABLE_STATE_SET : EMPTY_STATE_SET); + key.mMoreKeys != null ? LONG_PRESSABLE_STATE_SET : EMPTY_STATE_SET); previewText.setTextColor(params.mPreviewTextColor); FrameLayoutCompatUtils.placeViewAt( previewText, previewX, previewY, previewWidth, previewHeight); @@ -928,7 +928,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { } @Override - public boolean dismissPopupPanel() { + public boolean dismissMoreKeysPanel() { return false; } diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java index 1e7ec9ead..777bae3b0 100644 --- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java @@ -64,11 +64,11 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke private final int mKeyRepeatInterval; // Mini keyboard - private PopupWindow mPopupWindow; - private PopupPanel mPopupPanel; - private int mPopupPanelPointerTrackerId; - private final WeakHashMap mPopupPanelCache = - new WeakHashMap(); + private PopupWindow mMoreKeysWindow; + private MoreKeysPanel mMoreKeysPanel; + private int mMoreKeysPanelPointerTrackerId; + private final WeakHashMap mMoreKeysPanelCache = + new WeakHashMap(); /** Listener for {@link KeyboardActionListener}. */ private KeyboardActionListener mKeyboardActionListener; @@ -297,7 +297,7 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke mKeyDetector.setProximityThreshold(keyboard.mMostCommonKeyWidth); PointerTracker.setKeyDetector(mKeyDetector); mTouchScreenRegulator.setKeyboard(keyboard); - mPopupPanelCache.clear(); + mMoreKeysPanelCache.clear(); } /** @@ -333,12 +333,12 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke private boolean openMiniKeyboardIfRequired(int keyIndex, PointerTracker tracker) { // Check if we have a popup layout specified first. - if (mPopupLayout == 0) { + if (mMoreKeysLayout == 0) { return false; } // Check if we are already displaying popup panel. - if (mPopupPanel != null) + if (mMoreKeysPanel != null) return false; final Key parentKey = tracker.getKey(keyIndex); if (parentKey == null) @@ -353,12 +353,12 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke mKeyboardActionListener.onCodeInput(Keyboard.CODE_CAPSLOCK, null, 0, 0); } - // This default implementation returns a popup mini keyboard panel. - protected PopupPanel onCreatePopupPanel(Key parentKey) { - if (parentKey.mPopupCharacters == null) + // This default implementation returns a more keys panel. + protected MoreKeysPanel onCreateMoreKeysPanel(Key parentKey) { + if (parentKey.mMoreKeys == null) return null; - final View container = LayoutInflater.from(getContext()).inflate(mPopupLayout, null); + final View container = LayoutInflater.from(getContext()).inflate(mMoreKeysLayout, null); if (container == null) throw new NullPointerException(); @@ -366,7 +366,7 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke (MiniKeyboardView)container.findViewById(R.id.mini_keyboard_view); final Keyboard parentKeyboard = getKeyboard(); final Keyboard miniKeyboard = new MiniKeyboard.Builder( - this, parentKeyboard.mPopupTemplateId, parentKey, parentKeyboard).build(); + this, parentKeyboard.mMoreKeysTemplate, parentKey, parentKeyboard).build(); miniKeyboardView.setKeyboard(miniKeyboard); container.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); @@ -375,7 +375,7 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke @Override protected boolean needsToDimKeyboard() { - return mPopupPanel != null; + return mMoreKeysPanel != null; } public void setSpacebarTextFadeFactor(float fadeFactor, LatinKeyboard oldKeyboard) { @@ -417,10 +417,10 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke tracker.onLongPressed(); return true; } else { - return openPopupPanel(parentKey, tracker); + return openMoreKeysPanel(parentKey, tracker); } } else { - return openPopupPanel(parentKey, tracker); + return openMoreKeysPanel(parentKey, tracker); } } @@ -431,34 +431,35 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke return true; } - private boolean openPopupPanel(Key parentKey, PointerTracker tracker) { - PopupPanel popupPanel = mPopupPanelCache.get(parentKey); - if (popupPanel == null) { - popupPanel = onCreatePopupPanel(parentKey); - if (popupPanel == null) + private boolean openMoreKeysPanel(Key parentKey, PointerTracker tracker) { + MoreKeysPanel moreKeysPanel = mMoreKeysPanelCache.get(parentKey); + if (moreKeysPanel == null) { + moreKeysPanel = onCreateMoreKeysPanel(parentKey); + if (moreKeysPanel == null) return false; - mPopupPanelCache.put(parentKey, popupPanel); + mMoreKeysPanelCache.put(parentKey, moreKeysPanel); } - if (mPopupWindow == null) { - mPopupWindow = new PopupWindow(getContext()); - mPopupWindow.setBackgroundDrawable(null); - mPopupWindow.setAnimationStyle(R.style.MiniKeyboardAnimation); + if (mMoreKeysWindow == null) { + mMoreKeysWindow = new PopupWindow(getContext()); + mMoreKeysWindow.setBackgroundDrawable(null); + mMoreKeysWindow.setAnimationStyle(R.style.MiniKeyboardAnimation); // Allow popup window to be drawn off the screen. - mPopupWindow.setClippingEnabled(false); + mMoreKeysWindow.setClippingEnabled(false); } - mPopupPanel = popupPanel; - mPopupPanelPointerTrackerId = tracker.mPointerId; + mMoreKeysPanel = moreKeysPanel; + mMoreKeysPanelPointerTrackerId = tracker.mPointerId; final Keyboard keyboard = getKeyboard(); - popupPanel.setShifted(keyboard.isShiftedOrShiftLocked()); + moreKeysPanel.setShifted(keyboard.isShiftedOrShiftLocked()); final int pointX = (mConfigShowMiniKeyboardAtTouchedPoint) ? tracker.getLastX() : parentKey.mX + parentKey.mWidth / 2; final int pointY = parentKey.mY - keyboard.mVerticalGap; - popupPanel.showPopupPanel( - this, this, pointX, pointY, mPopupWindow, getKeyboardActionListener()); - final int translatedX = popupPanel.translateX(tracker.getLastX()); - final int translatedY = popupPanel.translateY(tracker.getLastY()); - tracker.onShowPopupPanel(translatedX, translatedY, SystemClock.uptimeMillis(), popupPanel); + moreKeysPanel.showMoreKeysPanel( + this, this, pointX, pointY, mMoreKeysWindow, getKeyboardActionListener()); + final int translatedX = moreKeysPanel.translateX(tracker.getLastX()); + final int translatedY = moreKeysPanel.translateY(tracker.getLastY()); + tracker.onShowMoreKeysPanel( + translatedX, translatedY, SystemClock.uptimeMillis(), moreKeysPanel); invalidateAllKeys(); return true; @@ -469,7 +470,7 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke } public boolean isInSlidingKeyInput() { - if (mPopupPanel != null) { + if (mMoreKeysPanel != null) { return true; } else { return PointerTracker.isAnyInSlidingKeyInput(); @@ -504,7 +505,7 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke } // Gesture detector must be enabled only when mini-keyboard is not on the screen. - if (mPopupPanel == null && mGestureDetector != null + if (mMoreKeysPanel == null && mGestureDetector != null && mGestureDetector.onTouchEvent(me)) { PointerTracker.dismissAllKeyPreviews(); mKeyTimerHandler.cancelKeyTimers(); @@ -515,9 +516,9 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke final int index = me.getActionIndex(); final int id = me.getPointerId(index); final int x, y; - if (mPopupPanel != null && id == mPopupPanelPointerTrackerId) { - x = mPopupPanel.translateX((int)me.getX(index)); - y = mPopupPanel.translateY((int)me.getY(index)); + if (mMoreKeysPanel != null && id == mMoreKeysPanelPointerTrackerId) { + x = mMoreKeysPanel.translateX((int)me.getX(index)); + y = mMoreKeysPanel.translateY((int)me.getY(index)); } else { x = (int)me.getX(index); y = (int)me.getY(index); @@ -569,9 +570,10 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke for (int i = 0; i < pointerCount; i++) { final PointerTracker tracker = getPointerTracker(me.getPointerId(i)); final int px, py; - if (mPopupPanel != null && tracker.mPointerId == mPopupPanelPointerTrackerId) { - px = mPopupPanel.translateX((int)me.getX(i)); - py = mPopupPanel.translateY((int)me.getY(i)); + if (mMoreKeysPanel != null + && tracker.mPointerId == mMoreKeysPanelPointerTrackerId) { + px = mMoreKeysPanel.translateX((int)me.getX(i)); + py = mMoreKeysPanel.translateY((int)me.getY(i)); } else { px = (int)me.getX(i); py = (int)me.getY(i); @@ -608,16 +610,16 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke @Override public void closing() { super.closing(); - dismissPopupPanel(); - mPopupPanelCache.clear(); + dismissMoreKeysPanel(); + mMoreKeysPanelCache.clear(); } @Override - public boolean dismissPopupPanel() { - if (mPopupWindow != null && mPopupWindow.isShowing()) { - mPopupWindow.dismiss(); - mPopupPanel = null; - mPopupPanelPointerTrackerId = -1; + public boolean dismissMoreKeysPanel() { + if (mMoreKeysWindow != null && mMoreKeysWindow.isShowing()) { + mMoreKeysWindow.dismiss(); + mMoreKeysPanel = null; + mMoreKeysPanelPointerTrackerId = -1; invalidateAllKeys(); return true; } @@ -625,7 +627,7 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke } public boolean handleBack() { - return dismissPopupPanel(); + return dismissMoreKeysPanel(); } @Override diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java index 6119fa232..da91b62d9 100644 --- a/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java +++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboard.java @@ -20,7 +20,7 @@ import android.graphics.Paint; import com.android.inputmethod.keyboard.internal.KeyboardBuilder; import com.android.inputmethod.keyboard.internal.KeyboardParams; -import com.android.inputmethod.keyboard.internal.PopupCharactersParser; +import com.android.inputmethod.keyboard.internal.MoreKeySpecParser; import com.android.inputmethod.latin.R; public class MiniKeyboard extends Keyboard { @@ -36,7 +36,7 @@ public class MiniKeyboard extends Keyboard { } public static class Builder extends KeyboardBuilder { - private final CharSequence[] mPopupCharacters; + private final CharSequence[] mMoreKeys; public static class MiniKeyboardParams extends KeyboardParams { /* package */int mTopRowAdjustment; @@ -224,22 +224,22 @@ public class MiniKeyboard extends Keyboard { // mParams.mVerticalGap = parentKeyboard.mVerticalGap; mParams.mIsRtlKeyboard = parentKeyboard.mIsRtlKeyboard; - mPopupCharacters = parentKey.mPopupCharacters; + mMoreKeys = parentKey.mMoreKeys; - final int keyWidth = getMaxKeyWidth(view, mPopupCharacters, mParams.mDefaultKeyWidth); - mParams.setParameters(mPopupCharacters.length, parentKey.mMaxMiniKeyboardColumn, + final int keyWidth = getMaxKeyWidth(view, mMoreKeys, mParams.mDefaultKeyWidth); + mParams.setParameters(mMoreKeys.length, parentKey.mMaxMoreKeysColumn, keyWidth, parentKeyboard.mDefaultRowHeight, parentKey.mX + (mParams.mDefaultKeyWidth - keyWidth) / 2, view.getMeasuredWidth()); } - private static int getMaxKeyWidth(KeyboardView view, CharSequence[] popupCharacters, + private static int getMaxKeyWidth(KeyboardView view, CharSequence[] moreKeys, int minKeyWidth) { final int padding = (int) view.getContext().getResources() .getDimension(R.dimen.mini_keyboard_key_horizontal_padding); Paint paint = null; int maxWidth = minKeyWidth; - for (CharSequence popupSpec : popupCharacters) { - final CharSequence label = PopupCharactersParser.getLabel(popupSpec.toString()); + for (CharSequence moreKeySpec : moreKeys) { + final CharSequence label = MoreKeySpecParser.getLabel(moreKeySpec.toString()); // If the label is single letter, minKeyWidth is enough to hold // the label. if (label != null && label.length() > 1) { @@ -259,10 +259,10 @@ public class MiniKeyboard extends Keyboard { @Override public MiniKeyboard build() { final MiniKeyboardParams params = mParams; - for (int n = 0; n < mPopupCharacters.length; n++) { - final String popupSpec = mPopupCharacters[n].toString(); + for (int n = 0; n < mMoreKeys.length; n++) { + final String moreKeySpec = mMoreKeys[n].toString(); final int row = n / params.mNumColumns; - final Key key = new Key(mResources, params, popupSpec, params.getX(n, row), + final Key key = new Key(mResources, params, moreKeySpec, params.getX(n, row), params.getY(row), params.mDefaultKeyWidth, params.mDefaultRowHeight, params.getRowFlags(row)); params.onAddKey(key); diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboardView.java index 065970f62..db7cc51ca 100644 --- a/java/src/com/android/inputmethod/keyboard/MiniKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardView.java @@ -34,7 +34,7 @@ import java.util.List; * A view that renders a virtual {@link MiniKeyboard}. It handles rendering of keys and detecting * key presses and touch movements. */ -public class MiniKeyboardView extends KeyboardView implements PopupPanel { +public class MiniKeyboardView extends KeyboardView implements MoreKeysPanel { private final int[] mCoordinates = new int[2]; private final KeyDetector mKeyDetector; @@ -204,7 +204,7 @@ public class MiniKeyboardView extends KeyboardView implements PopupPanel { } @Override - public void showPopupPanel(View parentView, Controller controller, int pointX, int pointY, + public void showMoreKeysPanel(View parentView, Controller controller, int pointX, int pointY, PopupWindow window, KeyboardActionListener listener) { mController = controller; mListener = listener; @@ -240,8 +240,8 @@ public class MiniKeyboardView extends KeyboardView implements PopupPanel { } @Override - public boolean dismissPopupPanel() { - return mController.dismissPopupPanel(); + public boolean dismissMoreKeysPanel() { + return mController.dismissMoreKeysPanel(); } @Override diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysPanel.java b/java/src/com/android/inputmethod/keyboard/MoreKeysPanel.java new file mode 100644 index 000000000..6314a99db --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/MoreKeysPanel.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard; + +import android.view.View; +import android.widget.PopupWindow; + +public interface MoreKeysPanel extends PointerTracker.KeyEventHandler { + public interface Controller { + public boolean dismissMoreKeysPanel(); + } + + public void setShifted(boolean shifted); + + /** + * Show more keys panel. + * + * @param parentView the parent view of this more keys panel + * @param controller the controller that can dismiss this more keys panel + * @param pointX x coordinate of this more keys panel + * @param pointY y coordinate of this more keys panel + * @param window PopupWindow to be used to show this more keys panel + * @param listener the listener that will receive keyboard action from this more keys panel. + */ + public void showMoreKeysPanel(View parentView, Controller controller, int pointX, int pointY, + PopupWindow window, KeyboardActionListener listener); + + /** + * Translate X-coordinate of touch event to the local X-coordinate of this + * {@link MoreKeysPanel}. + * + * @param x the global X-coordinate + * @return the local X-coordinate to this {@link MoreKeysPanel} + */ + public int translateX(int x); + + /** + * Translate Y-coordinate of touch event to the local Y-coordinate of this + * {@link MoreKeysPanel}. + * + * @param y the global Y-coordinate + * @return the local Y-coordinate to this {@link MoreKeysPanel} + */ + public int translateY(int y); +} diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index 7ae62200d..d4f580d21 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -63,7 +63,7 @@ public class PointerTracker { public TimerProxy getTimerProxy(); } - public interface DrawingProxy extends PopupPanel.Controller { + public interface DrawingProxy extends MoreKeysPanel.Controller { public void invalidateKey(Key key); public TextView inflateKeyPreviewText(); public void showKeyPreview(int keyIndex, PointerTracker tracker); @@ -123,8 +123,8 @@ public class PointerTracker { // true if event is already translated to a key action. private boolean mKeyAlreadyProcessed; - // true if this pointer has been long-pressed and is showing a popup panel. - private boolean mIsShowingPopupPanel; + // true if this pointer has been long-pressed and is showing a more keys panel. + private boolean mIsShowingMoreKeysPanel; // true if this pointer is repeatable key private boolean mIsRepeatableKey; @@ -572,9 +572,9 @@ public class PointerTracker { } final int keyIndex = onUpKey(keyX, keyY, eventTime); setReleasedKeyGraphics(keyIndex); - if (mIsShowingPopupPanel) { - mDrawingProxy.dismissPopupPanel(); - mIsShowingPopupPanel = false; + if (mIsShowingMoreKeysPanel) { + mDrawingProxy.dismissMoreKeysPanel(); + mIsShowingMoreKeysPanel = false; } if (mKeyAlreadyProcessed) return; @@ -583,10 +583,10 @@ public class PointerTracker { } } - public void onShowPopupPanel(int x, int y, long eventTime, KeyEventHandler handler) { + public void onShowMoreKeysPanel(int x, int y, long eventTime, KeyEventHandler handler) { onLongPressed(); onDownEvent(x, y, eventTime, handler); - mIsShowingPopupPanel = true; + mIsShowingMoreKeysPanel = true; } public void onLongPressed() { @@ -615,9 +615,9 @@ public class PointerTracker { mDrawingProxy.cancelShowKeyPreview(this); setReleasedKeyGraphics(mKeyIndex); mIsInSlidingKeyInput = false; - if (mIsShowingPopupPanel) { - mDrawingProxy.dismissPopupPanel(); - mIsShowingPopupPanel = false; + if (mIsShowingMoreKeysPanel) { + mDrawingProxy.dismissMoreKeysPanel(); + mIsShowingMoreKeysPanel = false; } } diff --git a/java/src/com/android/inputmethod/keyboard/PopupPanel.java b/java/src/com/android/inputmethod/keyboard/PopupPanel.java deleted file mode 100644 index 5e51fd54a..000000000 --- a/java/src/com/android/inputmethod/keyboard/PopupPanel.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.inputmethod.keyboard; - -import android.view.View; -import android.widget.PopupWindow; - -public interface PopupPanel extends PointerTracker.KeyEventHandler { - public interface Controller { - public boolean dismissPopupPanel(); - } - - public void setShifted(boolean shifted); - - /** - * Show popup panel. - * @param parentView the parent view of this popup panel - * @param controller the controller that can dismiss this popup panel - * @param pointX x coordinate of this popup panel - * @param pointY y coordinate of this popup panel - * @param window PopupWindow to be used to show this popup panel - * @param listener the listener that will receive keyboard action from this popup panel. - */ - public void showPopupPanel(View parentView, Controller controller, int pointX, int pointY, - PopupWindow window, KeyboardActionListener listener); - - /** - * Translate X-coordinate of touch event to the local X-coordinate of this PopupPanel. - * @param x the global X-coordinate - * @return the local X-coordinate to this PopupPanel - */ - public int translateX(int x); - - /** - * Translate Y-coordinate of touch event to the local Y-coordinate of this PopupPanel. - * @param y the global Y-coordinate - * @return the local Y-coordinate to this PopupPanel - */ - public int translateY(int y); -} diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java index 66dde0512..6d78e8533 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStyles.java @@ -166,12 +166,12 @@ public class KeyStyles { readText(keyAttr, R.styleable.Keyboard_Key_keyLabel); readText(keyAttr, R.styleable.Keyboard_Key_keyOutputText); readText(keyAttr, R.styleable.Keyboard_Key_keyHintLabel); - readTextArray(keyAttr, R.styleable.Keyboard_Key_popupCharacters); + readTextArray(keyAttr, R.styleable.Keyboard_Key_moreKeys); readFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelOption); readInt(keyAttr, R.styleable.Keyboard_Key_keyIcon); readInt(keyAttr, R.styleable.Keyboard_Key_keyIconPreview); readInt(keyAttr, R.styleable.Keyboard_Key_keyIconShifted); - readInt(keyAttr, R.styleable.Keyboard_Key_maxMiniKeyboardColumn); + readInt(keyAttr, R.styleable.Keyboard_Key_maxMoreKeysColumn); readBoolean(keyAttr, R.styleable.Keyboard_Key_isFunctional); readBoolean(keyAttr, R.styleable.Keyboard_Key_isSticky); readBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable); diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java index 5c76facec..c605debab 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java @@ -255,10 +255,10 @@ public class KeyboardBuilder { mParams.mIsRtlKeyboard = keyboardAttr.getBoolean( R.styleable.Keyboard_isRtlKeyboard, false); - mParams.mPopupTemplateId = keyboardAttr.getResourceId( - R.styleable.Keyboard_popupTemplate, 0); + mParams.mMoreKeysTemplate = keyboardAttr.getResourceId( + R.styleable.Keyboard_moreKeysTemplate, 0); mParams.mMaxMiniKeyboardColumn = keyAttr.getInt( - R.styleable.Keyboard_Key_maxMiniKeyboardColumn, 5); + R.styleable.Keyboard_Key_maxMoreKeysColumn, 5); mParams.mIconsSet.loadIcons(keyboardAttr); } finally { @@ -365,9 +365,9 @@ public class KeyboardBuilder { checkEndTag(TAG_KEY, parser); } else { Key key = new Key(mResources, mParams, row, mCurrentX, mCurrentY, parser, mKeyStyles); - if (DEBUG) Log.d(TAG, String.format("<%s%s keyLabel=%s code=%d popupCharacters=%s />", + if (DEBUG) Log.d(TAG, String.format("<%s%s keyLabel=%s code=%d moreKeys=%s />", TAG_KEY, (key.isEnabled() ? "" : " disabled"), key.mLabel, key.mCode, - Arrays.toString(key.mPopupCharacters))); + Arrays.toString(key.mMoreKeys))); checkEndTag(TAG_KEY, parser); mParams.onAddKey(key); endKey(key); diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java index e748dbb94..4432ee121 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java @@ -49,7 +49,7 @@ public class KeyboardParams { public int mVerticalGap; public boolean mIsRtlKeyboard; - public int mPopupTemplateId; + public int mMoreKeysTemplate; public int mMaxMiniKeyboardColumn; public int GRID_WIDTH; diff --git a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java new file mode 100644 index 000000000..a490b0ad6 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java @@ -0,0 +1,230 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.content.res.Resources; +import android.text.TextUtils; +import android.util.Log; + +import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.latin.R; + +import java.util.ArrayList; + +/** + * String parser of moreKeys attribute of Key. + * The string is comma separated texts each of which represents one "more key". + * Each "more key" specification is one of the following: + * - A single letter (Letter) + * - Label optionally followed by keyOutputText or code (keyLabel|keyOutputText). + * - Icon followed by keyOutputText or code (@icon/icon_number|@integer/key_code) + * Special character, comma ',' backslash '\', and bar '|' can be escaped by '\' + * character. + * Note that the character '@' and '\' are also parsed by XML parser and CSV parser as well. + * See {@link KeyboardIconsSet} about icon_number. + */ +public class MoreKeySpecParser { + private static final String TAG = MoreKeySpecParser.class.getSimpleName(); + + private static final char ESCAPE = '\\'; + private static final String LABEL_END = "|"; + private static final String PREFIX_AT = "@"; + private static final String PREFIX_ICON = PREFIX_AT + "icon/"; + private static final String PREFIX_CODE = PREFIX_AT + "integer/"; + + private MoreKeySpecParser() { + // Intentional empty constructor for utility class. + } + + private static boolean hasIcon(String moreKeySpec) { + if (moreKeySpec.startsWith(PREFIX_ICON)) { + final int end = indexOfLabelEnd(moreKeySpec, 0); + if (end > 0) + return true; + throw new MoreKeySpecParserError("outputText or code not specified: " + moreKeySpec); + } + return false; + } + + private static boolean hasCode(String moreKeySpec) { + final int end = indexOfLabelEnd(moreKeySpec, 0); + if (end > 0 && end + 1 < moreKeySpec.length() + && moreKeySpec.substring(end + 1).startsWith(PREFIX_CODE)) { + return true; + } + return false; + } + + private static String parseEscape(String text) { + if (text.indexOf(ESCAPE) < 0) + return text; + final int length = text.length(); + final StringBuilder sb = new StringBuilder(); + for (int pos = 0; pos < length; pos++) { + final char c = text.charAt(pos); + if (c == ESCAPE && pos + 1 < length) { + sb.append(text.charAt(++pos)); + } else { + sb.append(c); + } + } + return sb.toString(); + } + + private static int indexOfLabelEnd(String moreKeySpec, int start) { + if (moreKeySpec.indexOf(ESCAPE, start) < 0) { + final int end = moreKeySpec.indexOf(LABEL_END, start); + if (end == 0) + throw new MoreKeySpecParserError(LABEL_END + " at " + start + ": " + moreKeySpec); + return end; + } + final int length = moreKeySpec.length(); + for (int pos = start; pos < length; pos++) { + final char c = moreKeySpec.charAt(pos); + if (c == ESCAPE && pos + 1 < length) { + pos++; + } else if (moreKeySpec.startsWith(LABEL_END, pos)) { + return pos; + } + } + return -1; + } + + public static String getLabel(String moreKeySpec) { + if (hasIcon(moreKeySpec)) + return null; + final int end = indexOfLabelEnd(moreKeySpec, 0); + final String label = (end > 0) ? parseEscape(moreKeySpec.substring(0, end)) + : parseEscape(moreKeySpec); + if (TextUtils.isEmpty(label)) + throw new MoreKeySpecParserError("Empty label: " + moreKeySpec); + return label; + } + + public static String getOutputText(String moreKeySpec) { + if (hasCode(moreKeySpec)) + return null; + final int end = indexOfLabelEnd(moreKeySpec, 0); + if (end > 0) { + if (indexOfLabelEnd(moreKeySpec, end + 1) >= 0) + throw new MoreKeySpecParserError("Multiple " + LABEL_END + ": " + + moreKeySpec); + final String outputText = parseEscape(moreKeySpec.substring(end + LABEL_END.length())); + if (!TextUtils.isEmpty(outputText)) + return outputText; + throw new MoreKeySpecParserError("Empty outputText: " + moreKeySpec); + } + final String label = getLabel(moreKeySpec); + if (label == null) + throw new MoreKeySpecParserError("Empty label: " + moreKeySpec); + // Code is automatically generated for one letter label. See {@link getCode()}. + if (label.length() == 1) + return null; + return label; + } + + public static int getCode(Resources res, String moreKeySpec) { + if (hasCode(moreKeySpec)) { + final int end = indexOfLabelEnd(moreKeySpec, 0); + if (indexOfLabelEnd(moreKeySpec, end + 1) >= 0) + throw new MoreKeySpecParserError("Multiple " + LABEL_END + ": " + moreKeySpec); + final int resId = getResourceId(res, + moreKeySpec.substring(end + LABEL_END.length() + PREFIX_AT.length())); + final int code = res.getInteger(resId); + return code; + } + if (indexOfLabelEnd(moreKeySpec, 0) > 0) + return Keyboard.CODE_DUMMY; + final String label = getLabel(moreKeySpec); + // Code is automatically generated for one letter label. + if (label != null && label.length() == 1) + return label.charAt(0); + return Keyboard.CODE_DUMMY; + } + + public static int getIconId(String moreKeySpec) { + if (hasIcon(moreKeySpec)) { + int end = moreKeySpec.indexOf(LABEL_END, PREFIX_ICON.length() + 1); + final String iconId = moreKeySpec.substring(PREFIX_ICON.length(), end); + try { + return Integer.valueOf(iconId); + } catch (NumberFormatException e) { + Log.w(TAG, "illegal icon id specified: " + iconId); + return KeyboardIconsSet.ICON_UNDEFINED; + } + } + return KeyboardIconsSet.ICON_UNDEFINED; + } + + private static int getResourceId(Resources res, String name) { + String packageName = res.getResourcePackageName(R.string.english_ime_name); + int resId = res.getIdentifier(name, null, packageName); + if (resId == 0) + throw new MoreKeySpecParserError("Unknown resource: " + name); + return resId; + } + + @SuppressWarnings("serial") + public static class MoreKeySpecParserError extends RuntimeException { + public MoreKeySpecParserError(String message) { + super(message); + } + } + + public interface CodeFilter { + public boolean shouldFilterOut(int code); + } + + public static final CodeFilter DIGIT_FILTER = new CodeFilter() { + @Override + public boolean shouldFilterOut(int code) { + return Character.isDigit(code); + } + }; + + public static CharSequence[] filterOut(Resources res, CharSequence[] moreKeys, + CodeFilter filter) { + if (moreKeys == null || moreKeys.length < 1) { + return null; + } + if (moreKeys.length == 1 + && filter.shouldFilterOut(getCode(res, moreKeys[0].toString()))) { + return null; + } + ArrayList filtered = null; + for (int i = 0; i < moreKeys.length; i++) { + final CharSequence moreKeySpec = moreKeys[i]; + if (filter.shouldFilterOut(getCode(res, moreKeySpec.toString()))) { + if (filtered == null) { + filtered = new ArrayList(); + for (int j = 0; j < i; j++) { + filtered.add(moreKeys[j]); + } + } + } else if (filtered != null) { + filtered.add(moreKeySpec); + } + } + if (filtered == null) { + return moreKeys; + } + if (filtered.size() == 0) { + return null; + } + return filtered.toArray(new CharSequence[filtered.size()]); + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java b/java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java deleted file mode 100644 index 7c5abe32a..000000000 --- a/java/src/com/android/inputmethod/keyboard/internal/PopupCharactersParser.java +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.android.inputmethod.keyboard.internal; - -import android.content.res.Resources; -import android.text.TextUtils; -import android.util.Log; - -import com.android.inputmethod.keyboard.Keyboard; -import com.android.inputmethod.latin.R; - -import java.util.ArrayList; - -/** - * String parser of popupCharacters attribute of Key. - * The string is comma separated texts each of which represents one popup key. - * Each popup key text is one of the following: - * - A single letter (Letter) - * - Label optionally followed by keyOutputText or code (keyLabel|keyOutputText). - * - Icon followed by keyOutputText or code (@icon/icon_number|@integer/key_code) - * Special character, comma ',' backslash '\', and bar '|' can be escaped by '\' - * character. - * Note that the character '@' and '\' are also parsed by XML parser and CSV parser as well. - * See {@link KeyboardIconsSet} about icon_number. - */ -public class PopupCharactersParser { - private static final String TAG = PopupCharactersParser.class.getSimpleName(); - - private static final char ESCAPE = '\\'; - private static final String LABEL_END = "|"; - private static final String PREFIX_AT = "@"; - private static final String PREFIX_ICON = PREFIX_AT + "icon/"; - private static final String PREFIX_CODE = PREFIX_AT + "integer/"; - - private PopupCharactersParser() { - // Intentional empty constructor for utility class. - } - - private static boolean hasIcon(String popupSpec) { - if (popupSpec.startsWith(PREFIX_ICON)) { - final int end = indexOfLabelEnd(popupSpec, 0); - if (end > 0) - return true; - throw new PopupCharactersParserError("outputText or code not specified: " + popupSpec); - } - return false; - } - - private static boolean hasCode(String popupSpec) { - final int end = indexOfLabelEnd(popupSpec, 0); - if (end > 0 && end + 1 < popupSpec.length() - && popupSpec.substring(end + 1).startsWith(PREFIX_CODE)) { - return true; - } - return false; - } - - private static String parseEscape(String text) { - if (text.indexOf(ESCAPE) < 0) - return text; - final int length = text.length(); - final StringBuilder sb = new StringBuilder(); - for (int pos = 0; pos < length; pos++) { - final char c = text.charAt(pos); - if (c == ESCAPE && pos + 1 < length) { - sb.append(text.charAt(++pos)); - } else { - sb.append(c); - } - } - return sb.toString(); - } - - private static int indexOfLabelEnd(String popupSpec, int start) { - if (popupSpec.indexOf(ESCAPE, start) < 0) { - final int end = popupSpec.indexOf(LABEL_END, start); - if (end == 0) - throw new PopupCharactersParserError(LABEL_END + " at " + start + ": " + popupSpec); - return end; - } - final int length = popupSpec.length(); - for (int pos = start; pos < length; pos++) { - final char c = popupSpec.charAt(pos); - if (c == ESCAPE && pos + 1 < length) { - pos++; - } else if (popupSpec.startsWith(LABEL_END, pos)) { - return pos; - } - } - return -1; - } - - public static String getLabel(String popupSpec) { - if (hasIcon(popupSpec)) - return null; - final int end = indexOfLabelEnd(popupSpec, 0); - final String label = (end > 0) ? parseEscape(popupSpec.substring(0, end)) - : parseEscape(popupSpec); - if (TextUtils.isEmpty(label)) - throw new PopupCharactersParserError("Empty label: " + popupSpec); - return label; - } - - public static String getOutputText(String popupSpec) { - if (hasCode(popupSpec)) - return null; - final int end = indexOfLabelEnd(popupSpec, 0); - if (end > 0) { - if (indexOfLabelEnd(popupSpec, end + 1) >= 0) - throw new PopupCharactersParserError("Multiple " + LABEL_END + ": " - + popupSpec); - final String outputText = parseEscape(popupSpec.substring(end + LABEL_END.length())); - if (!TextUtils.isEmpty(outputText)) - return outputText; - throw new PopupCharactersParserError("Empty outputText: " + popupSpec); - } - final String label = getLabel(popupSpec); - if (label == null) - throw new PopupCharactersParserError("Empty label: " + popupSpec); - // Code is automatically generated for one letter label. See {@link getCode()}. - if (label.length() == 1) - return null; - return label; - } - - public static int getCode(Resources res, String popupSpec) { - if (hasCode(popupSpec)) { - final int end = indexOfLabelEnd(popupSpec, 0); - if (indexOfLabelEnd(popupSpec, end + 1) >= 0) - throw new PopupCharactersParserError("Multiple " + LABEL_END + ": " + popupSpec); - final int resId = getResourceId(res, - popupSpec.substring(end + LABEL_END.length() + PREFIX_AT.length())); - final int code = res.getInteger(resId); - return code; - } - if (indexOfLabelEnd(popupSpec, 0) > 0) - return Keyboard.CODE_DUMMY; - final String label = getLabel(popupSpec); - // Code is automatically generated for one letter label. - if (label != null && label.length() == 1) - return label.charAt(0); - return Keyboard.CODE_DUMMY; - } - - public static int getIconId(String popupSpec) { - if (hasIcon(popupSpec)) { - int end = popupSpec.indexOf(LABEL_END, PREFIX_ICON.length() + 1); - final String iconId = popupSpec.substring(PREFIX_ICON.length(), end); - try { - return Integer.valueOf(iconId); - } catch (NumberFormatException e) { - Log.w(TAG, "illegal icon id specified: " + iconId); - return KeyboardIconsSet.ICON_UNDEFINED; - } - } - return KeyboardIconsSet.ICON_UNDEFINED; - } - - private static int getResourceId(Resources res, String name) { - String packageName = res.getResourcePackageName(R.string.english_ime_name); - int resId = res.getIdentifier(name, null, packageName); - if (resId == 0) - throw new PopupCharactersParserError("Unknown resource: " + name); - return resId; - } - - @SuppressWarnings("serial") - public static class PopupCharactersParserError extends RuntimeException { - public PopupCharactersParserError(String message) { - super(message); - } - } - - public interface CodeFilter { - public boolean shouldFilterOut(int code); - } - - public static final CodeFilter DIGIT_FILTER = new CodeFilter() { - @Override - public boolean shouldFilterOut(int code) { - return Character.isDigit(code); - } - }; - - public static CharSequence[] filterOut(Resources res, CharSequence[] popupCharacters, - CodeFilter filter) { - if (popupCharacters == null || popupCharacters.length < 1) { - return null; - } - if (popupCharacters.length == 1 - && filter.shouldFilterOut(getCode(res, popupCharacters[0].toString()))) { - return null; - } - ArrayList filtered = null; - for (int i = 0; i < popupCharacters.length; i++) { - final CharSequence popupSpec = popupCharacters[i]; - if (filter.shouldFilterOut(getCode(res, popupSpec.toString()))) { - if (filtered == null) { - filtered = new ArrayList(); - for (int j = 0; j < i; j++) { - filtered.add(popupCharacters[j]); - } - } - } else if (filtered != null) { - filtered.add(popupSpec); - } - } - if (filtered == null) { - return popupCharacters; - } - if (filtered.size() == 0) { - return null; - } - return filtered.toArray(new CharSequence[filtered.size()]); - } -} -- cgit v1.2.3-83-g751a