am f642aa2a: Removes gestures from ListView.

Merge commit 'f642aa2a44e63aa105bbc6aec59f9bee261986ef'

* commit 'f642aa2a44e63aa105bbc6aec59f9bee261986ef':
  Removes gestures from ListView.
diff --git a/core/java/android/gesture/LetterRecognizer.java b/core/java/android/gesture/LetterRecognizer.java
deleted file mode 100644
index 580fc26..0000000
--- 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<Prediction> 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<Prediction> recognize(Gesture gesture) {
-        return recognize(gesture, null);
-    }
-
-    public ArrayList<Prediction> recognize(Gesture gesture, ArrayList<Prediction> predictions) {
-        float[] query = GestureUtilities.spatialSampling(gesture, mPatchSize);
-        predictions = classify(query, predictions);
-        adjustPrediction(gesture, predictions);
-        return predictions;
-    }
-
-    private ArrayList<Prediction> classify(float[] vector, ArrayList<Prediction> predictions) {
-        if (predictions == null) {
-            predictions = new ArrayList<Prediction>();
-        } 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<Prediction> predictions) {
-        if (mGestureStore != null) {
-            final ArrayList<Prediction> results = mGestureStore.recognize(query);
-            final HashMap<String, Prediction> topNList = new HashMap<String, Prediction>();
-
-            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<Prediction> {
-        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 e3f45a0..0000000
--- 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 c0fa64f..23a38db 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -41,18 +41,12 @@
 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 @@
  * @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<ListAdapter> implements TextWatcher,
         ViewTreeObserver.OnGlobalLayoutListener, Filter.FilterListener,
@@ -102,31 +95,6 @@
     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
      */
     static final int TOUCH_MODE_REST = -1;
@@ -461,18 +429,6 @@
      */
     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 @@
         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();
     }
 
@@ -601,160 +554,6 @@
     }
 
     /**
-     * <p>Sets the type of gestures to use with this list. When gestures are enabled,
-     * that is if the <code>gestures</code> 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:</p>
-     * <ul>
-     * <li>Jump to the appropriate position ({@link #GESTURES_JUMP})</li>
-     * <li>Add the character to the current filter ({@link #GESTURES_FILTER})</li>
-     * </ul>
-     * <p>Using {@link #GESTURES_JUMP} requires {@link #isFastScrollEnabled()} to
-     * be true. Using {@link #GESTURES_FILTER} requires {@link #isTextFilterEnabled()}
-     * to be true.</p>
-     *
-     * @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
      * to implement {@link SectionIndexer} if it wishes to display alphabet preview and
@@ -1037,7 +836,6 @@
          * about having leaked the window.
          */
         dismissPopup();
-        dismissGesturesPopup();
 
         Parcelable superState = super.onSaveInstanceState();
 
@@ -1325,11 +1123,6 @@
             if (mFiltered && visible && mPopup != null && mPopup.isShowing()) {
                 positionPopup();
             }
-
-            if (mGestures != GESTURES_NONE && visible && mGesturesPopup != null &&
-                    mGesturesPopup.isShowing()) {
-                positionGesturesPopup();
-            }
         }
 
         return changed;
@@ -1544,13 +1337,6 @@
         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 @@
             if (mTextFilterEnabled && mPopup != null && !mGlobalLayoutListenerAddedFilter) {
                 treeObserver.addOnGlobalLayoutListener(this);
             }
-            if (mGestures != GESTURES_NONE && mGesturesPopup != null &&
-                    !mGlobalLayoutListenerAddedGestures) {
-                treeObserver.addOnGlobalLayoutListener(mGesturesLayoutListener);
-            }
         }
     }
 
@@ -1755,10 +1537,6 @@
                 treeObserver.removeGlobalOnLayoutListener(this);
                 mGlobalLayoutListenerAddedFilter = false;
             }
-            if (mGesturesLayoutListener != null && mGesturesPopup != null) {
-                mGlobalLayoutListenerAddedGestures = false;
-                treeObserver.removeGlobalOnLayoutListener(mGesturesLayoutListener);
-            }
         }
     }
 
@@ -1773,7 +1551,6 @@
             removeCallbacks(mFlingRunnable);
             // Always hide the type filter
             dismissPopup();
-            dismissGesturesPopup();
 
             if (touchMode == TOUCH_MODE_OFF) {
                 // Remember the last selected element
@@ -1784,9 +1561,6 @@
                 // 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 @@
             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 @@
             }
         }
     }
-
-    private class GesturesProcessor implements GestureOverlayView.OnGesturePerformedListener {
-
-        private static final double SCORE_THRESHOLD = 0.1;
-
-        private LetterRecognizer mRecognizer;
-        private ArrayList<Prediction> 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 443d5f8..0000000
--- a/core/res/res/raw/latin_lowercase
+++ /dev/null
Binary files differ
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 7a16036..4db53a6 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. -->
         <attr name="smoothScrollbar" format="boolean" />
-        <!-- Defines the type of gesture to enable for the widget. -->
-        <attr name="gestures">
-            <!-- No gesture -->
-            <enum name="none" value="0" />
-            <!-- Gestures jump to a specific position in the content. This requires
-                  fast scroll to be enabled. -->
-            <enum name="jump" value="1" />
-            <!-- Gestures filter the content. This requires text filtering to be enabled. -->
-            <enum name="filter" value="2" />
-        </attr>
     </declare-styleable>
     <declare-styleable name="AbsSpinner">
         <!-- Reference to an array resource that will populate the Spinner.  For static content,
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 4af0467..d05508b 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1106,7 +1106,6 @@
   <public type="attr" name="uncertainGestureColor" />
   <public type="attr" name="fadeOffset" />
   <public type="attr" name="fadeDuration" />
-  <public type="attr" name="gestures" />
   <public type="attr" name="gestureStrokeType" />
   <public type="attr" name="gestureStrokeLengthThreshold" />
   <public type="attr" name="gestureStrokeSquarenessThreshold" />
diff --git a/tests/sketch/Android.mk b/tests/sketch/Android.mk
deleted file mode 100644
index 814e370..0000000
--- a/tests/sketch/Android.mk
+++ /dev/null
@@ -1,8 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_PACKAGE_NAME := Sketch
-
-include $(BUILD_PACKAGE)
diff --git a/tests/sketch/AndroidManifest.xml b/tests/sketch/AndroidManifest.xml
deleted file mode 100755
index b8a13f6..0000000
--- a/tests/sketch/AndroidManifest.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008-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.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.gesture.example">
-
-    <uses-permission android:name="android.permission.READ_CONTACTS" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-
-    <application android:icon="@drawable/icon" android:label="@string/app_name">
-
-        <activity
-            android:name="com.android.gesture.example.GestureEntry"
-            android:label="@string/app_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-
-        <activity android:name="com.android.gesture.example.GestureLibViewer"/>
-
-        <activity
-            android:name="com.android.gesture.example.ContactListGestureOverlay"
-            android:label="@string/overlay_name">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-
-    </application>
-</manifest> 
diff --git a/tests/sketch/res/drawable/icon.png b/tests/sketch/res/drawable/icon.png
deleted file mode 100755
index 75024841..0000000
--- a/tests/sketch/res/drawable/icon.png
+++ /dev/null
Binary files differ
diff --git a/tests/sketch/res/layout/demo.xml b/tests/sketch/res/layout/demo.xml
deleted file mode 100755
index c3a78cf..0000000
--- a/tests/sketch/res/layout/demo.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent">
-
-    <Spinner 
-        android:id="@+id/spinner"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:drawSelectorOnTop="true"
-        android:prompt="@string/recognition_result"/>
-    
-    <android.gesture.GestureOverlayView 
-        android:id="@+id/drawingpad"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_weight="1" />
-    
-</LinearLayout>
diff --git a/tests/sketch/res/layout/gestureviewer.xml b/tests/sketch/res/layout/gestureviewer.xml
deleted file mode 100755
index e4cca52..0000000
--- a/tests/sketch/res/layout/gestureviewer.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent">
-    
-    <Spinner 
-        android:id="@+id/spinner"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:drawSelectorOnTop="true"
-        android:prompt="@string/recognition_result"/>
-    
-    <android.gesture.GestureOverlayView
-        android:id="@+id/drawingpad"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_weight="1" />
-
-    <LinearLayout 
-        android:orientation="horizontal"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content">        
-       <Button 
-          android:id="@+id/previous"
-          android:text="@string/previous"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:layout_weight="1"/>
-       <Button 
-          android:id="@+id/remove"
-          android:text="@string/remove"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:layout_weight="1"/>
-       <Button 
-          android:id="@+id/next"
-          android:text="@string/next"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:layout_weight="1"/>
-    </LinearLayout>
-    
-</LinearLayout>
diff --git a/tests/sketch/res/layout/newgesture_dialog.xml b/tests/sketch/res/layout/newgesture_dialog.xml
deleted file mode 100755
index 91e7645..0000000
--- a/tests/sketch/res/layout/newgesture_dialog.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical">
-            
-    <EditText
-        android:id="@+id/gesturename_edit"
-        android:layout_height="wrap_content"
-        android:layout_width="fill_parent"
-        android:layout_marginLeft="20dip"
-        android:layout_marginRight="20dip"
-        android:scrollHorizontally="true"
-        android:autoText="false"
-        android:capitalize="none"
-        android:gravity="fill_horizontal"
-        android:textAppearance="?android:attr/textAppearanceMedium" />
-        
-</LinearLayout>
diff --git a/tests/sketch/res/layout/overlaydemo.xml b/tests/sketch/res/layout/overlaydemo.xml
deleted file mode 100644
index 4d5a657..0000000
--- a/tests/sketch/res/layout/overlaydemo.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<android.gesture.GestureOverlayView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/overlay"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent">
-
-    <ListView
-        android:id="@+id/list"
-        android:layout_width="fill_parent"
-        android:layout_height="fill_parent" />
-
-</android.gesture.GestureOverlayView>
diff --git a/tests/sketch/res/values/strings.xml b/tests/sketch/res/values/strings.xml
deleted file mode 100755
index 42f14da..0000000
--- a/tests/sketch/res/values/strings.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<resources>
-    <string name="app_name">Gesture Demo</string>
-    <string name="overlay_name">Overlay Demo</string>  
-    <string name="recognition_result">Recognition Result</string>
-    <string name="clear">Clear</string>
-    <string name="newgesture">Add</string>
-    <string name="viewgesture">View</string>
-    <string name="newgesture_dialog_ok">OK</string>
-    <string name="newgesture_dialog_cancel">Cancel</string>
-    <string name="newgesture_text_entry">Gesture Name</string>
-    <string name="previous">Previous</string>
-    <string name="remove">Remove</string>
-    <string name="next">Next</string>
-</resources>
diff --git a/tests/sketch/src/com/android/gesture/example/ContactAdapter.java b/tests/sketch/src/com/android/gesture/example/ContactAdapter.java
deleted file mode 100644
index 008a972..0000000
--- a/tests/sketch/src/com/android/gesture/example/ContactAdapter.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2008-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 com.android.gesture.example;
-
-import android.app.Activity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.TextView;
-
-import java.util.ArrayList;
-
-class ContactAdapter extends ArrayAdapter<ContactItem> {
-
-    private LayoutInflater mInflater;
-
-    public ContactAdapter(Activity activity, ArrayList<ContactItem> contacts) {
-        super(activity, 0, contacts);
-        mInflater = activity.getLayoutInflater();
-    }
-
-    @Override
-    public ContactItem getItem(int position) {
-        return super.getItem(position);
-    }
-
-    @Override
-    public long getItemId(int position) {
-        return getItem(position).itemID;
-    }
-
-    @Override
-    public View getView(int position, View convertView, ViewGroup parent) {
-        final ContactItem info = getItem(position);
-
-        View view = convertView;
-        if (view == null) {
-            view = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
-            view.setTag(view.findViewById(android.R.id.text1));
-        }
-
-        final TextView textView = (TextView)view.getTag();
-        textView.setText(info.toString());
-
-        return view;
-    }
-
-    public int search(String query) {
-        if (query != null && query.length() > 0) {
-            int start = 0;
-            int end = getCount() - 1;
-            int index = binarySearch(query, start, end);
-            for (index = index - 1; index >= 0; index--) {
-                String str = getItem(index).toString().toLowerCase();
-                if (!str.startsWith(query)) {
-                    return index + 1;
-                }
-                if (index == 0) {
-                    return 0;
-                }
-            }
-            return -1;
-        } else {
-            return -1;
-        }
-    }
-
-    private int binarySearch(String prefix, int start, int end) {
-        if (start > end) {
-            return -1;
-        }
-        int mid = (start + end) / 2;
-        String str = getItem(mid).toString().toLowerCase();
-        if (prefix.compareTo(str) <= 0) {
-            if (str.startsWith(prefix)) {
-                return mid;
-            } else {
-                return binarySearch(prefix, start, mid - 1);
-            }
-        } else {
-            return binarySearch(prefix, mid + 1, end);
-        }
-    }
-
-}
diff --git a/tests/sketch/src/com/android/gesture/example/ContactItem.java b/tests/sketch/src/com/android/gesture/example/ContactItem.java
deleted file mode 100644
index 557c4d9..0000000
--- a/tests/sketch/src/com/android/gesture/example/ContactItem.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2008-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 com.android.gesture.example;
-
-
-class ContactItem {
-    final String itemName;
-
-    final long itemID;
-
-    public ContactItem(long id, String name) {
-        itemID = id;
-        itemName = name;
-    }
-
-    @Override
-    public String toString() {
-        return itemName;
-    }
-}
diff --git a/tests/sketch/src/com/android/gesture/example/ContactListGestureOverlay.java b/tests/sketch/src/com/android/gesture/example/ContactListGestureOverlay.java
deleted file mode 100644
index 7865a5c..0000000
--- a/tests/sketch/src/com/android/gesture/example/ContactListGestureOverlay.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2008-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 com.android.gesture.example;
-
-import android.app.Activity;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.Intent;
-import android.database.Cursor;
-import android.os.Bundle;
-import android.provider.Contacts.People;
-import android.util.Log;
-import android.view.View;
-import android.view.Window;
-import android.widget.AdapterView;
-import android.widget.ListView;
-
-import android.gesture.Gesture;
-import android.gesture.GestureOverlayView;
-import android.gesture.LetterRecognizer;
-import android.gesture.Prediction;
-import android.gesture.LetterRecognizers;
-
-import java.util.ArrayList;
-
-public class ContactListGestureOverlay extends Activity {
-    private static final String LOG_TAG = "ContactListGestureOverlay";
-    private static final String SORT_ORDER = People.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
-    private static final String[] CONTACTS_PROJECTION = new String[] {
-            People._ID, // 0
-            People.DISPLAY_NAME, // 1
-    };
-
-    private ContactAdapter mContactAdapter;
-
-    private ListView mContactList;
-    private LetterRecognizer mRecognizer;
-    private GestureOverlayView mOverlay;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
-        setContentView(R.layout.overlaydemo);
-
-        // create a letter recognizer
-        mRecognizer = LetterRecognizers.fromType(this,
-                LetterRecognizers.RECOGNIZER_LATIN_LOWERCASE);
-        mOverlay = (GestureOverlayView) findViewById(R.id.overlay);
-
-        // load the contact list
-        mContactList = (ListView) findViewById(R.id.list);
-        registerForContextMenu(mContactList);
-        mContactList.setTextFilterEnabled(true);
-        mContactList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
-            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
-                if (!mOverlay.isGesturing()) {
-                    Intent intent = new Intent(Intent.ACTION_VIEW, ContentUris.withAppendedId(
-                            People.CONTENT_URI, id));
-                    startActivity(intent);
-                }
-            }
-        });
-
-        ContentResolver resolver = getContentResolver();
-        Cursor cursor = resolver.query(People.CONTENT_URI, CONTACTS_PROJECTION, null, null,
-                SORT_ORDER);
-        ArrayList<ContactItem> list = new ArrayList<ContactItem>();
-        while (cursor.moveToNext()) {
-            list.add(new ContactItem(cursor.getLong(0), cursor.getString(1)));
-        }
-        mContactAdapter = new ContactAdapter(this, list);
-        mContactList.setAdapter(mContactAdapter);
-
-        mOverlay.setGestureStrokeType(GestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE);
-        mOverlay.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {
-            public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
-                ArrayList<Prediction> predictions = mRecognizer.recognize(gesture);
-                if (!predictions.isEmpty()) {
-                    Log.v(LOG_TAG, "1st Prediction : " + predictions.get(0).name +
-                            " @" + predictions.get(0).score);
-                    Log.v(LOG_TAG, "2nd Prediction : " + predictions.get(1).name +
-                            " @" + predictions.get(1).score);
-                    Log.v(LOG_TAG, "3rd Prediction : " + predictions.get(2).name +
-                            " @" + predictions.get(2).score);
-                    int index = mContactAdapter.search(predictions.get(0).name);
-                    if (index != -1) {
-                        mContactList.setSelection(index);
-                    }
-                }
-            }
-        });
-    }
-}
diff --git a/tests/sketch/src/com/android/gesture/example/GestureEntry.java b/tests/sketch/src/com/android/gesture/example/GestureEntry.java
deleted file mode 100644
index 8dbec99..0000000
--- a/tests/sketch/src/com/android/gesture/example/GestureEntry.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (C) 2008-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 com.android.gesture.example;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.graphics.Color;
-import android.os.Bundle;
-import android.os.Environment;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.EditText;
-import android.widget.Spinner;
-import android.widget.AdapterView.OnItemSelectedListener;
-import android.gesture.Gesture;
-
-import android.gesture.GestureOverlayView;
-import android.gesture.Prediction;
-import android.gesture.GestureLibraries;
-import android.gesture.GestureLibrary;
-
-import java.io.File;
-import java.util.ArrayList;
-
-public class GestureEntry extends Activity {
-
-    private static final String PARCEL_KEY = "gesture";
-
-    static final String GESTURE_FILE_NAME =
-            Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator +
-                    "demo_library.gestures";
-
-    private static final int DIALOG_NEW_ENTRY = 1;
-
-    private static final int NEW_ID = Menu.FIRST;
-
-    private static final int VIEW_ID = Menu.FIRST + 1;
-
-    private GestureOverlayView mGesturePad;
-
-    private Spinner mRecognitionResult;
-
-    private GestureLibrary mGestureStore;
-
-    private boolean mChangedByRecognizer = false;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.demo);
-
-        // init the gesture library
-        mGestureStore = GestureLibraries.fromFile(GESTURE_FILE_NAME);
-        mGestureStore.load();
-
-        // create the spinner for showing the recognition results
-        // the spinner also allows a user to correct a prediction
-        mRecognitionResult = (Spinner) findViewById(R.id.spinner);
-        mRecognitionResult.setOnItemSelectedListener(new OnItemSelectedListener() {
-
-            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-                // correct the recognition result by adding the new example
-                if (!mChangedByRecognizer) {
-                    mGestureStore.addGesture(parent.getSelectedItem().toString(), mGesturePad
-                            .getGesture());
-                } else {
-                    mChangedByRecognizer = false;
-                }
-            }
-
-            public void onNothingSelected(AdapterView<?> parent) {
-
-            }
-
-        });
-
-        // create the area for drawing a gesture
-        mGesturePad = (GestureOverlayView) findViewById(R.id.drawingpad);
-        mGesturePad.setBackgroundColor(Color.BLACK);
-        mGesturePad.addOnGestureListener(new GestureOverlayView.OnGestureListener() {
-            public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {
-                recognize(overlay.getGesture());
-            }
-
-            public void onGesture(GestureOverlayView overlay, MotionEvent event) {
-            }
-
-            public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) {
-                overlay.clear(false);
-            }
-
-            public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) {
-            }
-        });
-
-        if (savedInstanceState != null) {
-            Gesture gesture = (Gesture) savedInstanceState.getParcelable(PARCEL_KEY);
-            if (gesture != null) {
-                mGesturePad.setGesture(gesture);
-            }
-        }
-    }
-
-    @Override
-    protected Dialog onCreateDialog(int id) {
-        LayoutInflater factory = LayoutInflater.from(this);
-        final View textEntryView = factory.inflate(R.layout.newgesture_dialog, null);
-        return new AlertDialog.Builder(GestureEntry.this).setTitle(
-                R.string.newgesture_text_entry).setView(textEntryView).setPositiveButton(
-                R.string.newgesture_dialog_ok, new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                        EditText edittext = (EditText) ((AlertDialog) dialog)
-                                .findViewById(R.id.gesturename_edit);
-                        String text = edittext.getText().toString().trim();
-                        if (text.length() > 0) {
-                            mGestureStore.addGesture(text, mGesturePad.getGesture());
-                        }
-                    }
-                }).setNegativeButton(R.string.newgesture_dialog_cancel,
-                new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                    }
-                }).create();
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        super.onCreateOptionsMenu(menu);
-        menu.add(0, NEW_ID, 0, R.string.newgesture).setShortcut('0', 'n').setIcon(
-                android.R.drawable.ic_menu_add);
-        menu.add(0, VIEW_ID, 0, R.string.viewgesture).setShortcut('1', 'v').setIcon(
-                android.R.drawable.ic_menu_view);
-        return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-            case NEW_ID:
-                if (mGesturePad.getGesture() != null) {
-                    showDialog(DIALOG_NEW_ENTRY);
-                }
-                break;
-
-            case VIEW_ID:
-                startActivityForResult(new Intent(this, GestureLibViewer.class), VIEW_ID);
-                break;
-        }
-
-        return super.onOptionsItemSelected(item);
-    }
-
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        mGestureStore.load();
-        mGesturePad.clear(false);
-    }
-
-    @Override
-    protected void onPause() {
-        super.onPause();
-        mGestureStore.save();
-    }
-
-    @Override
-    protected void onPrepareDialog(int id, Dialog dialog) {
-        super.onPrepareDialog(id, dialog);
-    }
-
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        Gesture gesture = mGesturePad.getGesture();
-        if (gesture != null) {
-            outState.putParcelable(PARCEL_KEY, gesture);
-        }
-        mGestureStore.save();
-    }
-
-    private void recognize(Gesture gesture) {
-        mChangedByRecognizer = true;
-        ArrayList<Prediction> predictions = mGestureStore.recognize(gesture);
-        ArrayAdapter<Prediction> adapter = new ArrayAdapter<Prediction>(this,
-                android.R.layout.simple_spinner_item, predictions);
-        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
-        mRecognitionResult.setAdapter(adapter);
-    }
-
-}
diff --git a/tests/sketch/src/com/android/gesture/example/GestureLibViewer.java b/tests/sketch/src/com/android/gesture/example/GestureLibViewer.java
deleted file mode 100755
index f5bf683..0000000
--- a/tests/sketch/src/com/android/gesture/example/GestureLibViewer.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2008-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 com.android.gesture.example;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.Spinner;
-import android.widget.AdapterView.OnItemSelectedListener;
-import android.gesture.Gesture;
-
-import android.gesture.GestureOverlayView;
-import android.gesture.GestureLibraries;
-import android.gesture.GestureLibrary;
-
-import java.util.ArrayList;
-import java.util.Collections;
-
-/**
- * GestureLibViewer gives an example on how to browse existing gestures and
- * removing unwanted gestures.
- */
-
-public class GestureLibViewer extends Activity {
-
-    private GestureOverlayView mGesturePad;
-
-    private Spinner mGestureCategory;
-
-    private GestureLibrary mGesureStore;
-
-    private ArrayList<Gesture> mGestures;
-
-    private int mCurrentGestureIndex;
-
-    private class RemoveGestureListener implements OnClickListener {
-        public void onClick(View v) {
-            if (mGestures.isEmpty()) {
-                return;
-            }
-
-            String name = (String) mGestureCategory.getSelectedItem();
-            Gesture gesture = mGestures.get(mCurrentGestureIndex);
-            mGesureStore.removeGesture(name, gesture);
-
-            mGestures = mGesureStore.getGestures(name);
-
-            if (mGestures == null) {
-                // delete the entire entry
-                mCurrentGestureIndex = 0;
-                ArrayList<String> list = new ArrayList<String>();
-                list.addAll(mGesureStore.getGestureEntries());
-                Collections.sort(list);
-                ArrayAdapter<String> adapter = new ArrayAdapter<String>(GestureLibViewer.this,
-                        android.R.layout.simple_spinner_item, list);
-                adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
-                mGestureCategory.setAdapter(adapter);
-            } else {
-                if (mCurrentGestureIndex > mGestures.size() - 1) {
-                    mCurrentGestureIndex--;
-                }
-                gesture = mGestures.get(mCurrentGestureIndex);
-                mGesturePad.setGesture(gesture);
-                mGesturePad.invalidate();
-            }
-        }
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.gestureviewer);
-
-        // create the area for drawing a gesture
-        mGesturePad = (GestureOverlayView) findViewById(R.id.drawingpad);
-        mGesturePad.setEnabled(false);
-
-        // init the gesture library
-        mGesureStore = GestureLibraries.fromFile(GestureEntry.GESTURE_FILE_NAME);
-        mGesureStore.load();
-
-        mGestureCategory = (Spinner) findViewById(R.id.spinner);
-        ArrayList<String> list = new ArrayList<String>();
-        if (!mGesureStore.getGestureEntries().isEmpty()) {
-            list.addAll(mGesureStore.getGestureEntries());
-            Collections.sort(list);
-            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
-                    android.R.layout.simple_spinner_item, list);
-            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
-            mGestureCategory.setAdapter(adapter);
-            mGestures = mGesureStore.getGestures(list.get(0));
-            mCurrentGestureIndex = 0;
-            Gesture gesture = mGestures.get(mCurrentGestureIndex);
-            mGesturePad.setGesture(gesture);
-        }
-
-        mGestureCategory.setOnItemSelectedListener(new OnItemSelectedListener() {
-            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-                mGestures = mGesureStore.getGestures((String) mGestureCategory.getSelectedItem());
-                if (!mGestures.isEmpty()) {
-                    mCurrentGestureIndex = 0;
-                    Gesture gesture = mGestures.get(mCurrentGestureIndex);
-                    mGesturePad.setGesture(gesture);
-                }
-                mGesturePad.invalidate();
-            }
-
-            public void onNothingSelected(AdapterView<?> parent) {
-            }
-
-        });
-
-        Button remove = (Button) findViewById(R.id.remove);
-        remove.setOnClickListener(new RemoveGestureListener());
-
-        Button next = (Button) findViewById(R.id.next);
-        next.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                if (mCurrentGestureIndex >= mGestures.size() - 1) {
-                    return;
-                }
-                mCurrentGestureIndex++;
-                Gesture gesture = mGestures.get(mCurrentGestureIndex);
-                mGesturePad.setGesture(gesture);
-                mGesturePad.invalidate();
-            }
-        });
-
-        Button previous = (Button) findViewById(R.id.previous);
-        previous.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                if (mCurrentGestureIndex >= 1 && !mGestures.isEmpty()) {
-                    mCurrentGestureIndex--;
-                    Gesture gesture = mGestures.get(mCurrentGestureIndex);
-                    mGesturePad.setGesture(gesture);
-                    mGesturePad.invalidate();
-                }
-            }
-        });
-    }
-
-    @Override
-    public boolean onKeyUp(int keyCode, KeyEvent event) {
-        if (keyCode == KeyEvent.KEYCODE_BACK) {
-            mGesureStore.save();
-            setResult(RESULT_OK);
-            finish();
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    @Override
-    protected void onPause() {
-        super.onPause();
-        mGesureStore.save();
-    }
-
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        mGesureStore.save();
-    }
-}
diff --git a/tests/sketch/tools/Converter.java b/tests/sketch/tools/Converter.java
deleted file mode 100644
index 5db2769..0000000
--- a/tests/sketch/tools/Converter.java
+++ /dev/null
@@ -1,225 +0,0 @@
-import java.io.File;
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.Closeable;
-import java.io.DataOutputStream;
-import java.io.FileOutputStream;
-import java.io.DataInputStream;
-import java.io.FileInputStream;
-import java.io.BufferedInputStream;
-
-/**
- * Converts text-based letter stores to binary-based stores.
- */
-public class Converter {
-    private final File mFile;
-    private static final short VERSION_NUMBER = 1;
-
-    Converter(File file) {
-        mFile = file;
-    }
-
-    private void convert() {
-        boolean read = false;
-
-        String[] classes = null;
-        int iCount = 0;
-        int hCount = 0;
-        int oCount = 0;
-        float[][] iWeights = null;
-        float[][] oWeights = null;
-        
-        BufferedReader reader = null;
-
-        try {
-            reader = new BufferedReader(new FileReader(mFile));
-
-            long start = System.nanoTime();
-
-            String line = reader.readLine();
-            int startIndex = 0;
-            int endIndex;
-            endIndex = line.indexOf(" ", startIndex);
-            iCount = Integer.parseInt(line.substring(startIndex, endIndex));
-
-            startIndex = endIndex + 1;
-            endIndex = line.indexOf(" ", startIndex);
-            hCount = Integer.parseInt(line.substring(startIndex, endIndex));
-
-            startIndex = endIndex + 1;
-            endIndex = line.length();
-            oCount = Integer.parseInt(line.substring(startIndex, endIndex));
-
-            classes = new String[oCount];
-            line = reader.readLine();
-            startIndex = 0;
-
-            for (int i = 0; i < oCount; i++) {
-                endIndex = line.indexOf(" ", startIndex);
-                classes[i] = line.substring(startIndex, endIndex);
-                startIndex = endIndex + 1;
-            }
-
-            iWeights = new float[hCount][];
-            for (int i = 0; i < hCount; i++) {
-                iWeights[i] = new float[iCount + 1];
-                line = reader.readLine();
-                startIndex = 0;
-                for (int j = 0; j <= iCount; j++) {
-                    endIndex = line.indexOf(" ", startIndex);
-                    iWeights[i][j] = Float.parseFloat(line.substring(startIndex, endIndex));
-                    startIndex = endIndex + 1;
-                }
-            }
-
-            oWeights = new float[oCount][];
-            for (int i = 0; i < oCount; i++) {
-                oWeights[i] = new float[hCount + 1];
-                line = reader.readLine();
-                startIndex = 0;
-                for (int j = 0; j <= hCount; j++) {
-                    endIndex = line.indexOf(" ", startIndex);
-                    oWeights[i][j] = Float.parseFloat(line.substring(startIndex, endIndex));
-                    startIndex = endIndex + 1;
-                }
-            }
-
-            long end = System.nanoTime();
-            System.out.println("time to read text file = " +
-                    ((end - start) / 1000.0f / 1000.0f) + " ms");
-
-            read = true;
-        } catch (FileNotFoundException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            close(reader);
-        }
-
-        if (read) {
-            boolean wrote = false;
-            DataOutputStream out = null;
-
-            try {
-                out = new DataOutputStream(new FileOutputStream(mFile));
-
-                out.writeShort(VERSION_NUMBER);
-                out.writeInt(iCount);
-                out.writeInt(hCount);
-                out.writeInt(oCount);
-
-                for (String aClass : classes) {
-                    out.writeUTF(aClass);
-                }
-
-                for (float[] weights : iWeights) {
-                    for (float weight : weights) {
-                        out.writeFloat(weight);
-                    }
-                }
-
-                for (float[] weights : oWeights) {
-                    for (float weight : weights) {
-                        out.writeFloat(weight);
-                    }
-                }
-
-                out.flush();
-
-                wrote = true;
-            } catch (FileNotFoundException e) {
-                e.printStackTrace();
-            } catch (IOException e) {
-                e.printStackTrace();
-            } finally {
-                close(out);
-            }
-
-            if (wrote) {
-                DataInputStream in = null;
-
-                try {
-                    in = new DataInputStream(new BufferedInputStream(new FileInputStream(mFile)));
-
-                    long start = System.nanoTime();
-
-                    in.readShort();
-                    iCount = in.readInt();
-                    hCount = in.readInt();
-                    oCount = in.readInt();
-
-                    classes = new String[oCount];
-                    for (int i = 0; i < classes.length; i++) {
-                        classes[i] = in.readUTF();
-                    }
-
-                    iWeights = new float[hCount][];
-                    for (int i = 0; i < iWeights.length; i++) {
-                        iWeights[i] = new float[iCount];
-                        for (int j = 0; j < iCount; j++) {
-                            iWeights[i][j] = in.readFloat();
-                        }
-                    }
-
-                    oWeights = new float[oCount][];
-                    for (int i = 0; i < oWeights.length; i++) {
-                        oWeights[i] = new float[hCount];
-                        for (int j = 0; j < hCount; j++) {
-                            oWeights[i][j] = in.readFloat();
-                        }
-                    }
-
-                    long end = System.nanoTime();
-                    System.out.println("time to read binary file = " +
-                            ((end - start) / 1000.0f / 1000.0f) + " ms");
-
-                } catch (FileNotFoundException e) {
-                    e.printStackTrace();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                } finally {
-                    close(in);
-                }
-            }
-        }
-    }
-
-    private static void close(Closeable reader) {
-        if (reader != null) {
-            try {
-                reader.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-    }
-
-    public static void main(String[] args) {
-        String fileName = args[0];
-        if (fileName != null) {
-            File file = new File(fileName);
-            if (!file.exists()) {
-                printHelp(fileName);
-            } else {
-                new Converter(file).convert();
-            }
-        } else {
-            printHelp(null);
-        }
-    }
-
-    private static void printHelp(String name) {
-        if (name == null) {
-            System.out.println("You must specify the name of the file to convert:");
-        } else {
-            System.out.println("The specified file does not exist: " + name);
-        }
-        System.out.println("java Converter [filename]");
-        System.out.println("");
-        System.out.println("\t[filename]\tPath to the file to convert. The file is replaced by "
-                + "the conversion result.");
-    }
-}
\ No newline at end of file