From f642aa2a44e63aa105bbc6aec59f9bee261986ef Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Mon, 8 Jun 2009 22:36:10 -0700 Subject: [PATCH] Removes gestures from ListView. --- .../android/gesture/LetterRecognizer.java | 279 ---------------- .../android/gesture/LetterRecognizers.java | 65 ---- core/java/android/widget/AbsListView.java | 303 ------------------ core/res/res/raw/latin_lowercase | Bin 28496 -> 0 bytes core/res/res/values/attrs.xml | 10 - core/res/res/values/public.xml | 1 - tests/sketch/Android.mk | 8 - tests/sketch/AndroidManifest.xml | 45 --- tests/sketch/res/drawable/icon.png | Bin 3180 -> 0 bytes tests/sketch/res/layout/demo.xml | 35 -- tests/sketch/res/layout/gestureviewer.xml | 59 ---- tests/sketch/res/layout/newgesture_dialog.xml | 34 -- tests/sketch/res/layout/overlaydemo.xml | 27 -- tests/sketch/res/values/strings.xml | 29 -- .../gesture/example/ContactAdapter.java | 100 ------ .../android/gesture/example/ContactItem.java | 34 -- .../example/ContactListGestureOverlay.java | 108 ------- .../android/gesture/example/GestureEntry.java | 211 ------------ .../gesture/example/GestureLibViewer.java | 184 ----------- tests/sketch/tools/Converter.java | 225 ------------- 20 files changed, 1757 deletions(-) delete mode 100644 core/java/android/gesture/LetterRecognizer.java delete mode 100644 core/java/android/gesture/LetterRecognizers.java delete mode 100644 core/res/res/raw/latin_lowercase delete mode 100644 tests/sketch/Android.mk delete mode 100755 tests/sketch/AndroidManifest.xml delete mode 100755 tests/sketch/res/drawable/icon.png delete mode 100755 tests/sketch/res/layout/demo.xml delete mode 100755 tests/sketch/res/layout/gestureviewer.xml delete mode 100755 tests/sketch/res/layout/newgesture_dialog.xml delete mode 100644 tests/sketch/res/layout/overlaydemo.xml delete mode 100755 tests/sketch/res/values/strings.xml delete mode 100644 tests/sketch/src/com/android/gesture/example/ContactAdapter.java delete mode 100644 tests/sketch/src/com/android/gesture/example/ContactItem.java delete mode 100644 tests/sketch/src/com/android/gesture/example/ContactListGestureOverlay.java delete mode 100644 tests/sketch/src/com/android/gesture/example/GestureEntry.java delete mode 100755 tests/sketch/src/com/android/gesture/example/GestureLibViewer.java delete mode 100644 tests/sketch/tools/Converter.java diff --git a/core/java/android/gesture/LetterRecognizer.java b/core/java/android/gesture/LetterRecognizer.java deleted file mode 100644 index 580fc26191f75..0000000000000 --- a/core/java/android/gesture/LetterRecognizer.java +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Copyright (C) 2009 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 android.gesture; - -import android.content.Context; -import android.content.res.Resources; -import android.util.Log; - -import java.io.BufferedInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; - -import static android.gesture.GestureConstants.LOG_TAG; - -public class LetterRecognizer { - static final String GESTURE_FILE_NAME = "letters.gestures"; - - private final static int ADJUST_RANGE = 3; - - private SigmoidUnit[] mHiddenLayer; - private SigmoidUnit[] mOutputLayer; - - private final String[] mClasses; - - private final int mPatchSize; - - private GestureLibrary mGestureStore; - - private final Comparator mComparator = new PredictionComparator(); - - private static class SigmoidUnit { - final float[] mWeights; - - SigmoidUnit(float[] weights) { - mWeights = weights; - } - - private float compute(float[] inputs) { - float sum = 0; - - final int count = inputs.length; - final float[] weights = mWeights; - - for (int i = 0; i < count; i++) { - sum += inputs[i] * weights[i]; - } - sum += weights[weights.length - 1]; - - return 1.0f / (float) (1 + Math.exp(-sum)); - } - } - - private LetterRecognizer(int numOfInput, int numOfHidden, String[] classes) { - mPatchSize = (int) Math.sqrt(numOfInput); - mHiddenLayer = new SigmoidUnit[numOfHidden]; - mClasses = classes; - mOutputLayer = new SigmoidUnit[classes.length]; - } - - public ArrayList recognize(Gesture gesture) { - return recognize(gesture, null); - } - - public ArrayList recognize(Gesture gesture, ArrayList predictions) { - float[] query = GestureUtilities.spatialSampling(gesture, mPatchSize); - predictions = classify(query, predictions); - adjustPrediction(gesture, predictions); - return predictions; - } - - private ArrayList classify(float[] vector, ArrayList predictions) { - if (predictions == null) { - predictions = new ArrayList(); - } else { - predictions.clear(); - } - - final float[] intermediateOutput = compute(mHiddenLayer, vector); - final float[] output = compute(mOutputLayer, intermediateOutput); - - double sum = 0; - - final String[] classes = mClasses; - final int count = classes.length; - - for (int i = 0; i < count; i++) { - double score = output[i]; - sum += score; - predictions.add(new Prediction(classes[i], score)); - } - - for (int i = 0; i < count; i++) { - predictions.get(i).score /= sum; - } - - Collections.sort(predictions, mComparator); - - return predictions; - } - - private float[] compute(SigmoidUnit[] layer, float[] input) { - final float[] output = new float[layer.length]; - final int count = layer.length; - - for (int i = 0; i < count; i++) { - output[i] = layer[i].compute(input); - } - - return output; - } - - static LetterRecognizer createFromResource(Context context, int resourceID) { - final Resources resources = context.getResources(); - final InputStream stream = resources.openRawResource(resourceID); - return createFromStream(stream); - } - - static LetterRecognizer createFromStream(InputStream stream) { - DataInputStream in = null; - LetterRecognizer classifier = null; - - try { - in = new DataInputStream(new BufferedInputStream(stream, - GestureConstants.IO_BUFFER_SIZE)); - - final int version = in.readShort(); - - switch (version) { - case 1: - classifier = readV1(in); - break; - default: - Log.d(LOG_TAG, "Couldn't load handwriting data: version " + version + - " not supported"); - break; - } - - } catch (IOException e) { - Log.d(LOG_TAG, "Failed to load handwriting data:", e); - } finally { - GestureUtilities.closeStream(in); - } - - return classifier; - } - - private static LetterRecognizer readV1(DataInputStream in) throws IOException { - - final int iCount = in.readInt(); - final int hCount = in.readInt(); - final int oCount = in.readInt(); - - final String[] classes = new String[oCount]; - for (int i = 0; i < classes.length; i++) { - classes[i] = in.readUTF(); - } - - final LetterRecognizer classifier = new LetterRecognizer(iCount, hCount, classes); - final SigmoidUnit[] hiddenLayer = new SigmoidUnit[hCount]; - final SigmoidUnit[] outputLayer = new SigmoidUnit[oCount]; - - for (int i = 0; i < hCount; i++) { - final float[] weights = new float[iCount + 1]; - for (int j = 0; j <= iCount; j++) { - weights[j] = in.readFloat(); - } - hiddenLayer[i] = new SigmoidUnit(weights); - } - - for (int i = 0; i < oCount; i++) { - final float[] weights = new float[hCount + 1]; - for (int j = 0; j <= hCount; j++) { - weights[j] = in.readFloat(); - } - outputLayer[i] = new SigmoidUnit(weights); - } - - classifier.mHiddenLayer = hiddenLayer; - classifier.mOutputLayer = outputLayer; - - return classifier; - } - - /** - * TODO: Publish this API once we figure out where we should save the personalized - * gestures, and how to do so across all apps - * - * @hide - */ - public boolean save() { - if (mGestureStore != null) { - return mGestureStore.save(); - } - return false; - } - - /** - * TODO: Publish this API once we figure out where we should save the personalized - * gestures, and how to do so across all apps - * - * @hide - */ - public void setPersonalizationEnabled(boolean enabled) { - if (enabled) { - mGestureStore = GestureLibraries.fromFile(GESTURE_FILE_NAME); - mGestureStore.setSequenceType(GestureStore.SEQUENCE_INVARIANT); - mGestureStore.load(); - } else { - mGestureStore = null; - } - } - - /** - * TODO: Publish this API once we figure out where we should save the personalized - * gestures, and how to do so across all apps - * - * @hide - */ - public void addExample(String letter, Gesture example) { - if (mGestureStore != null) { - mGestureStore.addGesture(letter, example); - } - } - - private void adjustPrediction(Gesture query, ArrayList predictions) { - if (mGestureStore != null) { - final ArrayList results = mGestureStore.recognize(query); - final HashMap topNList = new HashMap(); - - for (int j = 0; j < ADJUST_RANGE; j++) { - Prediction prediction = predictions.remove(0); - topNList.put(prediction.name, prediction); - } - - final int count = results.size(); - for (int j = count - 1; j >= 0 && !topNList.isEmpty(); j--) { - final Prediction item = results.get(j); - final Prediction original = topNList.get(item.name); - if (original != null) { - predictions.add(0, original); - topNList.remove(item.name); - } - } - } - } - - private static class PredictionComparator implements Comparator { - public int compare(Prediction object1, Prediction object2) { - double score1 = object1.score; - double score2 = object2.score; - if (score1 > score2) { - return -1; - } else if (score1 < score2) { - return 1; - } else { - return 0; - } - } - } -} diff --git a/core/java/android/gesture/LetterRecognizers.java b/core/java/android/gesture/LetterRecognizers.java deleted file mode 100644 index e3f45a0308e13..0000000000000 --- a/core/java/android/gesture/LetterRecognizers.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2009 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 android.gesture; - -import android.content.Context; -import android.util.Log; -import static android.gesture.GestureConstants.LOG_TAG; -import static android.gesture.LetterRecognizer.*; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; - -public final class LetterRecognizers { - public final static int RECOGNIZER_LATIN_LOWERCASE = 0; - - private LetterRecognizers() { - } - - public static LetterRecognizer fromType(Context context, int type) { - switch (type) { - case RECOGNIZER_LATIN_LOWERCASE: { - return createFromResource(context, com.android.internal.R.raw.latin_lowercase); - } - } - return null; - } - - public static LetterRecognizer fromResource(Context context, int resourceId) { - return createFromResource(context, resourceId); - } - - public static LetterRecognizer fromFile(String path) { - return fromFile(new File(path)); - } - - public static LetterRecognizer fromFile(File file) { - try { - return createFromStream(new FileInputStream(file)); - } catch (FileNotFoundException e) { - Log.d(LOG_TAG, "Failed to load handwriting data from file " + file, e); - } - return null; - } - - public static LetterRecognizer fromStream(InputStream stream) { - return createFromStream(stream); - } -} diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index c0fa64f445a96..23a38db02736a 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -41,18 +41,12 @@ import android.view.ViewConfiguration; import android.view.ViewDebug; import android.view.ViewGroup; import android.view.ViewTreeObserver; -import android.view.KeyCharacterMap; import android.view.inputmethod.BaseInputConnection; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputConnectionWrapper; import android.view.inputmethod.InputMethodManager; import android.view.ContextMenu.ContextMenuInfo; -import android.gesture.GestureOverlayView; -import android.gesture.Gesture; -import android.gesture.LetterRecognizer; -import android.gesture.Prediction; -import android.gesture.LetterRecognizers; import com.android.internal.R; @@ -73,7 +67,6 @@ import java.util.List; * @attr ref android.R.styleable#AbsListView_cacheColorHint * @attr ref android.R.styleable#AbsListView_fastScrollEnabled * @attr ref android.R.styleable#AbsListView_smoothScrollbar - * @attr ref android.R.styleable#AbsListView_gestures */ public abstract class AbsListView extends AdapterView implements TextWatcher, ViewTreeObserver.OnGlobalLayoutListener, Filter.FilterListener, @@ -101,31 +94,6 @@ public abstract class AbsListView extends AdapterView implements Te */ public static final int TRANSCRIPT_MODE_ALWAYS_SCROLL = 2; - /** - * Disables gestures. - * - * @see #setGestures(int) - * @see #GESTURES_JUMP - * @see #GESTURES_FILTER - */ - public static final int GESTURES_NONE = 0; - /** - * When a letter gesture is recognized the list jumps to a matching position. - * - * @see #setGestures(int) - * @see #GESTURES_NONE - * @see #GESTURES_FILTER - */ - public static final int GESTURES_JUMP = 1; - /** - * When a letter gesture is recognized the letter is added to the filter. - * - * @see #setGestures(int) - * @see #GESTURES_NONE - * @see #GESTURES_JUMP - */ - public static final int GESTURES_FILTER = 2; - /** * Indicates that we are not in the middle of a touch gesture */ @@ -461,18 +429,6 @@ public abstract class AbsListView extends AdapterView implements Te */ private FastScroller mFastScroller; - /** - * Indicates the type of gestures to use: GESTURES_NONE, GESTURES_FILTER or GESTURES_NONE - */ - private int mGestures; - - // Used to implement the gestures overlay - private GestureOverlayView mGesturesOverlay; - private PopupWindow mGesturesPopup; - private ViewTreeObserver.OnGlobalLayoutListener mGesturesLayoutListener; - private boolean mGlobalLayoutListenerAddedGestures; - private boolean mInstallGesturesOverlay; - private boolean mGlobalLayoutListenerAddedFilter; private int mTouchSlop; @@ -583,9 +539,6 @@ public abstract class AbsListView extends AdapterView implements Te boolean smoothScrollbar = a.getBoolean(R.styleable.AbsListView_smoothScrollbar, true); setSmoothScrollbarEnabled(smoothScrollbar); - int gestures = a.getInt(R.styleable.AbsListView_gestures, GESTURES_NONE); - setGestures(gestures); - a.recycle(); } @@ -600,160 +553,6 @@ public abstract class AbsListView extends AdapterView implements Te mDensityScale = getContext().getResources().getDisplayMetrics().density; } - /** - *

Sets the type of gestures to use with this list. When gestures are enabled, - * that is if the gestures parameter is not {@link #GESTURES_NONE}, - * the user can draw characters on top of this view. When a character is - * recognized and matches a known character, the list will either:

- *
    - *
  • Jump to the appropriate position ({@link #GESTURES_JUMP})
  • - *
  • Add the character to the current filter ({@link #GESTURES_FILTER})
  • - *
- *

Using {@link #GESTURES_JUMP} requires {@link #isFastScrollEnabled()} to - * be true. Using {@link #GESTURES_FILTER} requires {@link #isTextFilterEnabled()} - * to be true.

- * - * @param gestures The type of gestures to enable for this list: - * {@link #GESTURES_NONE}, {@link #GESTURES_JUMP} or {@link #GESTURES_FILTER} - * - * @see #GESTURES_NONE - * @see #GESTURES_JUMP - * @see #GESTURES_FILTER - * @see #getGestures() - */ - public void setGestures(int gestures) { - switch (gestures) { - case GESTURES_JUMP: - if (!mFastScrollEnabled) { - throw new IllegalStateException("Jump gestures can only be used with " - + "fast scroll enabled"); - } - break; - case GESTURES_FILTER: - if (!mTextFilterEnabled) { - throw new IllegalStateException("Filter gestures can only be used with " - + "text filtering enabled"); - } - break; - } - - final int oldGestures = mGestures; - mGestures = gestures; - - // Install overlay later - if (oldGestures == GESTURES_NONE && gestures != GESTURES_NONE) { - mInstallGesturesOverlay = true; - // Uninstall overlay - } else if (oldGestures != GESTURES_NONE && gestures == GESTURES_NONE) { - uninstallGesturesOverlay(); - } - } - - /** - * Indicates what gestures are enabled on this view. - * - * @return {@link #GESTURES_NONE}, {@link #GESTURES_JUMP} or {@link #GESTURES_FILTER} - * - * @see #GESTURES_NONE - * @see #GESTURES_JUMP - * @see #GESTURES_FILTER - * @see #setGestures(int) - */ - @ViewDebug.ExportedProperty(mapping = { - @ViewDebug.IntToString(from = GESTURES_NONE, to = "NONE"), - @ViewDebug.IntToString(from = GESTURES_JUMP, to = "JUMP"), - @ViewDebug.IntToString(from = GESTURES_FILTER, to = "FILTER") - }) - public int getGestures() { - return mGestures; - } - - private void dismissGesturesPopup() { - if (mGesturesPopup != null) { - mGesturesPopup.dismiss(); - } - } - - private void showGesturesPopup() { - // Make sure we have a window before showing the popup - if (getWindowVisibility() == View.VISIBLE) { - installGesturesOverlay(); - positionGesturesPopup(); - } - } - - private void positionGesturesPopup() { - final int[] xy = new int[2]; - getLocationOnScreen(xy); - if (!mGesturesPopup.isShowing()) { - mGesturesPopup.showAtLocation(this, Gravity.LEFT | Gravity.TOP, xy[0], xy[1]); - } else { - mGesturesPopup.update(xy[0], xy[1], -1, -1); - } - } - - private void installGesturesOverlay() { - mInstallGesturesOverlay = false; - - if (mGesturesPopup == null) { - final Context c = getContext(); - final LayoutInflater layoutInflater = (LayoutInflater) - c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - mGesturesOverlay = (GestureOverlayView) - layoutInflater.inflate(R.layout.list_gestures_overlay, null); - - final PopupWindow p = new PopupWindow(c); - p.setFocusable(false); - p.setTouchable(false); - p.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); - p.setContentView(mGesturesOverlay); - p.setWidth(getWidth()); - p.setHeight(getHeight()); - p.setBackgroundDrawable(null); - - if (mGesturesLayoutListener == null) { - mGesturesLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { - public void onGlobalLayout() { - if (isShown()) { - showGesturesPopup(); - } else if (mGesturesPopup.isShowing()) { - dismissGesturesPopup(); - } - } - }; - } - getViewTreeObserver().addOnGlobalLayoutListener(mGesturesLayoutListener); - mGlobalLayoutListenerAddedGestures = true; - - mGesturesPopup = p; - - mGesturesOverlay.removeAllOnGestureListeners(); - mGesturesOverlay.setGestureStrokeType(GestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE); - mGesturesOverlay.addOnGesturePerformedListener(new GesturesProcessor()); - } - } - - private void uninstallGesturesOverlay() { - dismissGesturesPopup(); - mGesturesPopup = null; - if (mGesturesLayoutListener != null) { - getViewTreeObserver().removeGlobalOnLayoutListener(mGesturesLayoutListener); - } - } - - @Override - public boolean dispatchTouchEvent(MotionEvent ev) { - if (mGestures != GESTURES_NONE) { - if ((ev.getAction() != MotionEvent.ACTION_DOWN || mFastScroller == null || - !mFastScroller.isPointInside(ev.getX(), ev.getY())) && - mGesturesPopup.isShowing()) { - mGesturesOverlay.dispatchTouchEvent(ev); - } - } - - return super.dispatchTouchEvent(ev); - } - /** * Enables fast scrolling by letting the user quickly scroll through lists by * dragging the fast scroll thumb. The adapter attached to the list may want @@ -1037,7 +836,6 @@ public abstract class AbsListView extends AdapterView implements Te * about having leaked the window. */ dismissPopup(); - dismissGesturesPopup(); Parcelable superState = super.onSaveInstanceState(); @@ -1325,11 +1123,6 @@ public abstract class AbsListView extends AdapterView implements Te if (mFiltered && visible && mPopup != null && mPopup.isShowing()) { positionPopup(); } - - if (mGestures != GESTURES_NONE && visible && mGesturesPopup != null && - mGesturesPopup.isShowing()) { - positionGesturesPopup(); - } } return changed; @@ -1544,13 +1337,6 @@ public abstract class AbsListView extends AdapterView implements Te if (mFastScroller != null) { mFastScroller.onSizeChanged(w, h, oldw, oldh); } - - if (mInstallGesturesOverlay) { - installGesturesOverlay(); - positionGesturesPopup(); - } else if (mGesturesPopup != null && mGesturesPopup.isShowing()) { - mGesturesPopup.update(w, h); - } } /** @@ -1737,10 +1523,6 @@ public abstract class AbsListView extends AdapterView implements Te if (mTextFilterEnabled && mPopup != null && !mGlobalLayoutListenerAddedFilter) { treeObserver.addOnGlobalLayoutListener(this); } - if (mGestures != GESTURES_NONE && mGesturesPopup != null && - !mGlobalLayoutListenerAddedGestures) { - treeObserver.addOnGlobalLayoutListener(mGesturesLayoutListener); - } } } @@ -1755,10 +1537,6 @@ public abstract class AbsListView extends AdapterView implements Te treeObserver.removeGlobalOnLayoutListener(this); mGlobalLayoutListenerAddedFilter = false; } - if (mGesturesLayoutListener != null && mGesturesPopup != null) { - mGlobalLayoutListenerAddedGestures = false; - treeObserver.removeGlobalOnLayoutListener(mGesturesLayoutListener); - } } } @@ -1773,7 +1551,6 @@ public abstract class AbsListView extends AdapterView implements Te removeCallbacks(mFlingRunnable); // Always hide the type filter dismissPopup(); - dismissGesturesPopup(); if (touchMode == TOUCH_MODE_OFF) { // Remember the last selected element @@ -1784,9 +1561,6 @@ public abstract class AbsListView extends AdapterView implements Te // Show the type filter only if a filter is in effect showPopup(); } - if (mGestures != GESTURES_NONE) { - showGesturesPopup(); - } // If we changed touch mode since the last time we had focus if (touchMode != mLastTouchMode && mLastTouchMode != TOUCH_MODE_UNKNOWN) { @@ -1907,8 +1681,6 @@ public abstract class AbsListView extends AdapterView implements Te final int longPressPosition, final long longPressId) { boolean handled = false; - dismissGesturesPopup(); - if (mOnItemLongClickListener != null) { handled = mOnItemLongClickListener.onItemLongClick(AbsListView.this, child, longPressPosition, longPressId); @@ -3829,79 +3601,4 @@ public abstract class AbsListView extends AdapterView implements Te } } } - - private class GesturesProcessor implements GestureOverlayView.OnGesturePerformedListener { - - private static final double SCORE_THRESHOLD = 0.1; - - private LetterRecognizer mRecognizer; - private ArrayList mPredictions; - private final KeyCharacterMap mKeyMap; - private final char[] mHolder; - - GesturesProcessor() { - mRecognizer = LetterRecognizers.fromType(getContext(), - LetterRecognizers.RECOGNIZER_LATIN_LOWERCASE); - if (mRecognizer == null) { - setGestures(GESTURES_NONE); - } - if (mGestures == GESTURES_FILTER) { - mKeyMap = KeyCharacterMap.load(KeyCharacterMap.BUILT_IN_KEYBOARD); - mHolder = new char[1]; - } else { - mKeyMap = null; - mHolder = null; - } - } - - public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { - mPredictions = mRecognizer.recognize(gesture, mPredictions); - if (!mPredictions.isEmpty()) { - final Prediction prediction = mPredictions.get(0); - if (prediction.score > SCORE_THRESHOLD) { - switch (mGestures) { - case GESTURES_JUMP: - processJump(prediction); - break; - case GESTURES_FILTER: - processFilter(prediction); - break; - } - } - } - } - - private void processJump(Prediction prediction) { - final Object[] sections = mFastScroller.getSections(); - if (sections != null) { - final String name = prediction.name; - final int count = sections.length; - - int index = -1; - for (int i = 0; i < count; i++) { - if (name.equalsIgnoreCase((String) sections[i])) { - index = i; - break; - } - } - - if (index != -1) { - final SectionIndexer indexer = mFastScroller.getSectionIndexer(); - final int position = indexer.getPositionForSection(index); - setSelection(position); - } - } - } - - private void processFilter(Prediction prediction) { - mHolder[0] = prediction.name.charAt(0); - final KeyEvent[] events = mKeyMap.getEvents(mHolder); - if (events != null) { - for (KeyEvent event : events) { - sendToTextFilter(event.getKeyCode(), event.getRepeatCount(), - event); - } - } - } - } } diff --git a/core/res/res/raw/latin_lowercase b/core/res/res/raw/latin_lowercase deleted file mode 100644 index 443d5f8ecfebcde147680bab06ba416a0e1c3736..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28496 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 diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 6a9ca83326852..f5ff01c64d9c4 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -1381,16 +1381,6 @@ will use only the number of items in the adapter and the number of items visible on screen to determine the scrollbar's properties. --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/sketch/res/drawable/icon.png b/tests/sketch/res/drawable/icon.png deleted file mode 100755 index 75024841d327c4fbaefef7c8e9c8d0e892895f93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3180 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 S`hb-H0000 - - - - - - - - - diff --git a/tests/sketch/res/layout/gestureviewer.xml b/tests/sketch/res/layout/gestureviewer.xml deleted file mode 100755 index e4cca524c836b..0000000000000 --- a/tests/sketch/res/layout/gestureviewer.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - -