diff --git a/tests/sketch/AndroidManifest.xml b/tests/sketch/AndroidManifest.xml
index 1f4333c..c44b54e 100755
--- a/tests/sketch/AndroidManifest.xml
+++ b/tests/sketch/AndroidManifest.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008-2009 The Android Open Source Project
+<!-- Copyright (C) 2008 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.
@@ -14,12 +14,11 @@
      limitations under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="com.android.gesture.example"
+      package="com.android.gesture"
       android:versionCode="1"
       android:versionName="1.0.0">
-      <uses-permission android:name="android.permission.READ_CONTACTS" />
       <application android:icon="@drawable/icon" android:label="@string/app_name">
-        <activity android:name="com.android.gesture.example.GestureEntry"
+        <activity android:name="com.android.gesture.example.GestureEntryDemo"
                   android:label="@string/app_name">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -27,12 +26,5 @@
             </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/layout/demo.xml b/tests/sketch/res/layout/demo.xml
old mode 100644
new mode 100755
index 8c9161a..e516229
--- a/tests/sketch/res/layout/demo.xml
+++ b/tests/sketch/res/layout/demo.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- Copyright (C) 2008 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.
@@ -13,7 +13,6 @@
      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"
@@ -25,7 +24,7 @@
         android:drawSelectorOnTop="true"
         android:prompt="@string/recognition_result"/>
     
-    <com.android.gesture.GestureOverlay 
+    <com.android.gesture.GesturePad 
         android:id="@+id/drawingpad"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
diff --git a/tests/sketch/res/layout/gestureviewer.xml b/tests/sketch/res/layout/gestureviewer.xml
old mode 100644
new mode 100755
index 73d6a35..5302d34
--- a/tests/sketch/res/layout/gestureviewer.xml
+++ b/tests/sketch/res/layout/gestureviewer.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- Copyright (C) 2008 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.
@@ -13,7 +13,6 @@
      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"
@@ -26,7 +25,7 @@
         android:drawSelectorOnTop="true"
         android:prompt="@string/recognition_result"/>
     
-    <com.android.gesture.GestureOverlay 
+    <com.android.gesture.GesturePad 
         android:id="@+id/drawingpad"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
diff --git a/tests/sketch/res/layout/newgesture_dialog.xml b/tests/sketch/res/layout/newgesture_dialog.xml
old mode 100644
new mode 100755
index 91e7645..6e45d81
--- a/tests/sketch/res/layout/newgesture_dialog.xml
+++ b/tests/sketch/res/layout/newgesture_dialog.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- Copyright (C) 2008 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.
diff --git a/tests/sketch/res/layout/overlaydemo.xml b/tests/sketch/res/layout/overlaydemo.xml
deleted file mode 100644
index b6bbab3..0000000
--- a/tests/sketch/res/layout/overlaydemo.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-    <ListView
-      android:id="@+id/list" 
-      android:layout_width="fill_parent" 
-      android:layout_height="0dip"
-      android:layout_weight="1"/>
-</LinearLayout>
diff --git a/tests/sketch/res/values/strings.xml b/tests/sketch/res/values/strings.xml
index 42f14da..4c6aa20 100755
--- a/tests/sketch/res/values/strings.xml
+++ b/tests/sketch/res/values/strings.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- Copyright (C) 2008 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.
@@ -15,7 +15,6 @@
 -->
 <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>
diff --git a/tests/sketch/src/com/android/gesture/Gesture.java b/tests/sketch/src/com/android/gesture/Gesture.java
index a5e7a25..29c07ad 100755
--- a/tests/sketch/src/com/android/gesture/Gesture.java
+++ b/tests/sketch/src/com/android/gesture/Gesture.java
@@ -18,290 +18,343 @@
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
+import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Path;
+import android.graphics.PointF;
 import android.graphics.RectF;
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import com.android.gesture.recognizer.RecognitionUtil;
+
 import org.xmlpull.v1.XmlSerializer;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.StringTokenizer;
 
 /**
- * A gesture can have a single or multiple strokes
+ * A single stroke gesture.
  */
 
 public class Gesture implements Parcelable {
 
-    private static final long GESTURE_ID_BASE = System.currentTimeMillis();
-
-    private static final int BITMAP_RENDERING_WIDTH = 2;
-
-    private static final boolean BITMAP_RENDERING_ANTIALIAS = true;
-
-    private static final boolean BITMAP_RENDERING_DITHER = true;
-
-    private static int sGestureCount = 0;
-
-    private RectF mBoundingBox;
-
-    // the same as its instance ID
-    private long mGestureID;
-
-    private ArrayList<GestureStroke> mStrokes = new ArrayList<GestureStroke>();
+    private RectF mBBX;
+    private float mLength = 0;
+    private int mColor;
+    private float mWidth;
+    private ArrayList<PointF> mPtsBuffer = new ArrayList<PointF>();
+    private long mTimestamp = 0;
+    private long mID;
+    
+    private static final long systemStartupTime = System.currentTimeMillis();
+    private static int instanceCount = 0; 
 
     public Gesture() {
-        mGestureID = GESTURE_ID_BASE + sGestureCount++;
+        mID = systemStartupTime + instanceCount++;
     }
 
-    /**
-     * @return all the strokes of the gesture
-     */
-    public ArrayList<GestureStroke> getStrokes() {
-        return mStrokes;
+    public void setColor(int c) {
+        mColor = c;
+    }
+    
+    public void setStrokeWidth(float w) {
+        mWidth = w;
+    }
+    
+    public int getColor() {
+        return mColor;
+    }
+    
+    public float getStrokeWidth() {
+        return mWidth;
+    }
+  
+    public ArrayList<PointF> getPoints() {
+        return this.mPtsBuffer;
+    }
+  
+    public int numOfPoints() {
+        return this.mPtsBuffer.size();
     }
 
-    /**
-     * @return the number of strokes included by this gesture
-     */
-    public int getStrokesCount() {
-        return mStrokes.size();
-    }
-
-    /**
-     * Add a stroke to the gesture
-     * 
-     * @param stroke
-     */
-    public void addStroke(GestureStroke stroke) {
-        mStrokes.add(stroke);
-
-        if (mBoundingBox == null) {
-            mBoundingBox = new RectF(stroke.boundingBox);
-        } else {
-            mBoundingBox.union(stroke.boundingBox);
+    public void addPoint(float x, float y) {
+        mPtsBuffer.add(new PointF(x, y));
+        if (mBBX == null) {
+            mBBX = new RectF();
+            mBBX.top = y;
+            mBBX.left = x;
+            mBBX.right = x;
+            mBBX.bottom = y;
+            mLength = 0;
         }
+        else {
+            PointF lst = mPtsBuffer.get(mPtsBuffer.size()-2);
+            mLength += Math.sqrt(Math.pow(x-lst.x, 2)+Math.pow(y-lst.y, 2));
+            mBBX.union(x, y);
+        }
+        mTimestamp = System.currentTimeMillis();
     }
 
     /**
-     * Get the total length of the gesture. When there are multiple strokes in
-     * the gesture, this returns the sum of the lengths of all the strokes
-     * 
      * @return the length of the gesture
      */
     public float getLength() {
-        int len = 0;
-        ArrayList<GestureStroke> strokes = mStrokes;
-        int count = strokes.size();
-        for (int i = 0; i < count; i++) {
-            GestureStroke stroke = strokes.get(i);
-            len += stroke.length;
-        }
-        return len;
+        return this.mLength;
     }
-
-    /**
-     * @return the bounding box of the gesture
-     */
-    public RectF getBoundingBox() {
-        return mBoundingBox;
+  
+    public RectF getBBX() {
+        return mBBX;
     }
-
-    /**
-     * Set the id of the gesture
-     * 
-     * @param id
-     */
-    void setID(long id) {
-        mGestureID = id;
+  
+    public void setID(long id) {
+        mID = id;
     }
-
-    /**
-     * @return the id of the gesture
-     */
+    
     public long getID() {
-        return mGestureID;
+        return mID;
     }
-
+    
+    public long getTimeStamp() {
+        return mTimestamp;
+    }
+    
+    public void setTimestamp(long t) {
+  	    this.mTimestamp = t;
+    }
+    
     /**
      * draw the gesture
-     * 
      * @param canvas
      */
-    void draw(Canvas canvas, Paint paint) {
-        ArrayList<GestureStroke> strokes = mStrokes;
-        int count = strokes.size();
-        for (int i = 0; i < count; i++) {
-            GestureStroke stroke = strokes.get(i);
-            stroke.draw(canvas, paint);
-        }
-    }
-
-    /**
-     * Create a bitmap of the gesture with a transparent background
-     * 
-     * @param width width of the target bitmap
-     * @param height height of the target bitmap
-     * @param edge the edge
-     * @param numSample
-     * @param color
-     * @return the bitmap
-     */
-    public Bitmap toBitmap(int width, int height, int edge, int numSample, int color) {
-        RectF bbx = getBoundingBox();
-        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
-        Canvas canvas = new Canvas(bitmap);
-        canvas.translate(edge, edge);
+    public void draw(Canvas canvas) {
         Paint paint = new Paint();
-        paint.setAntiAlias(BITMAP_RENDERING_ANTIALIAS);
-        paint.setDither(BITMAP_RENDERING_DITHER);
-        paint.setColor(color);
+        paint.setAntiAlias(true);
+        paint.setDither(true);
+        paint.setColor(mColor);
         paint.setStyle(Paint.Style.STROKE);
         paint.setStrokeJoin(Paint.Join.ROUND);
         paint.setStrokeCap(Paint.Cap.ROUND);
-        paint.setStrokeWidth(BITMAP_RENDERING_WIDTH);
-        ArrayList<GestureStroke> strokes = mStrokes;
-        int count = strokes.size();
-        for (int i = 0; i < count; i++) {
-            GestureStroke stroke = strokes.get(i);
-            Path path = stroke.toPath(width - 2 * edge, height - 2 * edge, numSample);
-            canvas.drawPath(path, paint);
+        paint.setStrokeWidth(mWidth);
+        
+        Path path = null;
+        float mX = 0, mY = 0;
+        Iterator<PointF> it = mPtsBuffer.iterator();
+        while (it.hasNext()) {
+          PointF p = it.next();
+          float x = p.x;
+          float y = p.y;
+          if (path == null) {
+            path = new Path();
+            path.moveTo(x, y);
+            mX = x;
+            mY = y;
+          } else {
+            float dx = Math.abs(x - mX);
+            float dy = Math.abs(y - mY);
+            if (dx >= 3 || dy >= 3) {
+                path.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
+                mX = x;
+                mY = y;
+            }
+          }
         }
-
-        return bitmap;
+        
+        canvas.drawPath(path, paint);
     }
-
+    
     /**
-     * Create a bitmap of the gesture with a transparent background
-     * 
-     * @param width
-     * @param height
+     * convert the gesture to a Path
+     * @param width the width of the bounding box of the target path
+     * @param height the height of the bounding box of the target path
+     * @param numSample the num of points needed
+     * @return the path
+     */
+    public Path toPath(float width, float height, int numSample) {
+        float[] pts = RecognitionUtil.resample(this, numSample);
+        RectF rect = this.getBBX();
+        float scale = height / rect.height();
+        Matrix matrix = new Matrix();
+        matrix.setTranslate(-rect.left, -rect.top);
+        Matrix scalem = new Matrix();
+        scalem.setScale(scale, scale);
+        matrix.postConcat(scalem);
+        Matrix translate = new Matrix();
+        matrix.postConcat(translate);
+        matrix.mapPoints(pts);
+        
+        Path path = null;
+        float mX = 0, mY = 0;
+        for (int i=0; i<pts.length-1; i+=2) {
+          float x = pts[i];
+          float y = pts[i+1];
+          if (path == null) {
+            path = new Path();
+            path.moveTo(x, y);
+            mX = x;
+            mY = y;
+          } else {
+            float dx = Math.abs(x - mX);
+            float dy = Math.abs(y - mY);
+            if (dx >= 3 || dy >= 3) {
+                path.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
+                mX = x;
+                mY = y;
+            }
+          }
+        }
+        return path;
+    }
+  
+    /**
+     * get a bitmap thumbnail of the gesture with a transparent background
+     * @param w
+     * @param h
      * @param edge
-     * @param color
-     * @return the bitmap
+     * @param numSample
+     * @param foreground
+     * @return
      */
-    public Bitmap toBitmap(int width, int height, int edge, int color) {
-        RectF bbx = getBoundingBox();
-        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
-        Canvas canvas = new Canvas(bitmap);
-        canvas.translate(edge, edge);
+    public Bitmap toBitmap(int w, int h, 
+        int edge, int numSample) {
+        RectF bbx = this.getBBX();
+        Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
+        Path path = this.toPath(w - 2 * edge, h - 2 * edge, numSample);
+        Canvas c = new Canvas(bitmap);
+        //c.drawColor(background);
+        c.translate(edge, edge);
         Paint paint = new Paint();
-        paint.setAntiAlias(BITMAP_RENDERING_ANTIALIAS);
-        paint.setDither(BITMAP_RENDERING_DITHER);
-        paint.setColor(color);
+        paint.setAntiAlias(true);
+        paint.setDither(true);
+        paint.setColor(mColor);
         paint.setStyle(Paint.Style.STROKE);
         paint.setStrokeJoin(Paint.Join.ROUND);
         paint.setStrokeCap(Paint.Cap.ROUND);
-        paint.setStrokeWidth(BITMAP_RENDERING_WIDTH);
-        ArrayList<GestureStroke> strokes = mStrokes;
-        int count = strokes.size();
-        for (int i = 0; i < count; i++) {
-            GestureStroke stroke = strokes.get(i);
-            stroke.draw(canvas, paint);
-        }
-
+        paint.setStrokeWidth(2);
+        c.drawPath(path, paint);
         return bitmap;
     }
-
+    
     /**
-     * Save the gesture as XML
-     * 
+     * save the gesture as XML
      * @param namespace
      * @param serializer
      * @throws IOException
      */
-    void toXML(String namespace, XmlSerializer serializer) throws IOException {
-        serializer.startTag(namespace, GestureConstants.XML_TAG_GESTURE);
-        serializer.attribute(namespace, GestureConstants.XML_TAG_ID, Long.toString(mGestureID));
-        ArrayList<GestureStroke> strokes = mStrokes;
-        int count = strokes.size();
-        for (int i = 0; i < count; i++) {
-            GestureStroke stroke = strokes.get(i);
-            stroke.toXML(namespace, serializer);
+    public void toXML(String namespace, XmlSerializer serializer) throws IOException {
+        serializer.startTag(namespace, "stroke");
+        serializer.attribute(namespace, "timestamp", Long.toString(mTimestamp));
+        serializer.attribute(namespace, "id", Long.toString(mID));
+        serializer.attribute(namespace, "color", Integer.toString(mColor));
+        serializer.attribute(namespace, "width", Float.toString(mWidth));
+        Iterator it = this.mPtsBuffer.iterator();
+        String pts = "";
+        while (it.hasNext()) {
+        	PointF fp = (PointF)it.next();
+        	if (pts.length() > 0)
+        		pts += ",";
+        	pts += fp.x + "," + fp.y;
         }
-        serializer.endTag(namespace, GestureConstants.XML_TAG_GESTURE);
+        serializer.text(pts);
+        serializer.endTag(namespace, "stroke");
     }
-
-    /**
-     * Create the gesture from a string
-     * 
-     * @param str
-     */
+    
+    
     public void createFromString(String str) {
-        int startIndex = 0;
-        int endIndex;
-        while ((endIndex = str.indexOf(GestureConstants.STRING_GESTURE_DELIIMITER, startIndex + 1)) != -1) {
-            String token = str.substring(startIndex, endIndex);
-            if (startIndex > 0) { // stroke tokens
-                addStroke(GestureStroke.createFromString(token));
-            } else { // id token
-                mGestureID = Long.parseLong(token);
-            }
-            startIndex = endIndex + 1;
+        StringTokenizer st = new StringTokenizer(str, "#");
+        
+        String para = st.nextToken();
+        StringTokenizer innerst = new StringTokenizer(para, ",");
+        this.mBBX = new RectF();
+        this.mBBX.left = Float.parseFloat(innerst.nextToken());
+        this.mBBX.top = Float.parseFloat(innerst.nextToken());
+        this.mBBX.right = Float.parseFloat(innerst.nextToken());
+        this.mBBX.bottom = Float.parseFloat(innerst.nextToken());
+        
+        para = st.nextToken();
+        innerst = new StringTokenizer(para, ",");
+        while (innerst.hasMoreTokens()) {
+          String s = innerst.nextToken().trim();
+          if (s.length()==0)
+            break;
+          float x = Float.parseFloat(s);
+          float y = Float.parseFloat(innerst.nextToken());
+          this.mPtsBuffer.add(new PointF(x, y));
         }
+  
+        para = st.nextToken();
+        this.mColor = Integer.parseInt(para);
+        
+        para = st.nextToken();
+        this.mWidth = Float.parseFloat(para);
+        
+        para = st.nextToken();
+        this.mLength = Float.parseFloat(para);
+        
+        para = st.nextToken();
+        this.mTimestamp = Long.parseLong(para);
     }
-
-    /**
-     * Convert the gesture to string
-     */
+    
     @Override
     public String toString() {
-        StringBuilder str = new StringBuilder();
-        str.append(mGestureID);
-        ArrayList<GestureStroke> strokes = mStrokes;
-        int count = strokes.size();
-        for (int i = 0; i < count; i++) {
-            GestureStroke stroke = strokes.get(i);
-            str.append(GestureConstants.STRING_GESTURE_DELIIMITER);
-            str.append(stroke.toString());
+        String str = "";
+        
+        str += "#" + this.mBBX.left + "," + this.mBBX.top + "," +
+               this.mBBX.right + "," + this.mBBX.bottom;
+        
+        str += "#";
+        Iterator<PointF> it = this.mPtsBuffer.iterator();
+        while (it.hasNext()) {
+          PointF fp = it.next();
+          str += fp.x + "," + fp.y + ","; 
         }
 
-        return str.toString();
+        str += "#";
+        str += this.mColor;
+        
+        str += "#";
+        str += this.mWidth;
+        
+        str += "#";
+        str += this.mLength;
+        
+        str += "#";
+        str += this.mTimestamp;
+  
+        return str;
     }
-
-    public static final Parcelable.Creator<Gesture> CREATOR = new Parcelable.Creator<Gesture>() {
+    
+    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
         public Gesture createFromParcel(Parcel in) {
             String str = in.readString();
-            Gesture gesture = new Gesture();
-            gesture.createFromString(str);
-            return gesture;
+            Gesture stk = new Gesture();
+            stk.createFromString(str);
+            return stk;
         }
-
+    
         public Gesture[] newArray(int size) {
             return new Gesture[size];
         }
     };
-
-    /**
-     * Build a gesture from a byte array
-     * 
-     * @param bytes
-     * @return the gesture
-     */
-    static Gesture buildFromArray(byte[] bytes) {
+    
+    public static Gesture buildFromArray(byte[] bytes) {
         String str = new String(bytes);
-        Gesture gesture = new Gesture();
-        gesture.createFromString(str);
-        return gesture;
+        Gesture stk = new Gesture();
+        stk.createFromString(str);
+        return stk;
     }
-
-    /**
-     * Save a gesture to a byte array
-     * 
-     * @param stroke
-     * @return the byte array
-     */
-    static byte[] saveToArray(Gesture stroke) {
-        String str = stroke.toString();
+    
+    public static byte[] saveToArray(Gesture stk) {
+        String str = stk.toString();   
         return str.getBytes();
     }
-
+    
     public void writeToParcel(Parcel out, int flags) {
-        out.writeString(toString());
+        out.writeString(this.toString());
     }
-
+      
     public int describeContents() {
         return CONTENTS_FILE_DESCRIPTOR;
     }
diff --git a/tests/sketch/src/com/android/gesture/GestureActionListener.java b/tests/sketch/src/com/android/gesture/GestureActionListener.java
deleted file mode 100644
index 130ac19..0000000
--- a/tests/sketch/src/com/android/gesture/GestureActionListener.java
+++ /dev/null
@@ -1,22 +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;
-
-
-public interface GestureActionListener {
-    public void onGesturePerformed(GestureOverlay overlay, Gesture gesture);
-}
diff --git a/tests/sketch/src/com/android/gesture/GestureAdapter.java b/tests/sketch/src/com/android/gesture/GestureAdapter.java
deleted file mode 100644
index 3cf9b4c..0000000
--- a/tests/sketch/src/com/android/gesture/GestureAdapter.java
+++ /dev/null
@@ -1,124 +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;
-
-import android.graphics.Color;
-import android.view.MotionEvent;
-import android.view.View;
-
-import java.util.ArrayList;
-
-public class GestureAdapter implements GestureListener {
-
-    public static final int SINGLE_STROKE = 0;
-
-    public static final int MULTIPLE_STROKE = 1;
-
-    private static final float STROKE_LENGTH_THRESHOLD = 100;
-
-    private static final float SQUARENESS_THRESHOLD = 0.24f;
-
-    private static final int UNCERTAIN_GESTURE_COLOR = Color.argb(60, 255, 255, 0);
-
-    private boolean mIsGesturing = false;
-
-    private float mTotalLength;
-
-    private float mX, mY;
-
-    private View mModel;
-
-    private int mGestureType = SINGLE_STROKE;
-
-    private ArrayList<GestureActionListener> mActionListeners = new ArrayList<GestureActionListener>();
-
-    public GestureAdapter(View model) {
-        mModel = model;
-    }
-
-    public void setGestureType(int type) {
-        mGestureType = type;
-    }
-
-    public void onStartGesture(GestureOverlay overlay, MotionEvent event) {
-        if (mGestureType == MULTIPLE_STROKE) {
-            overlay.cancelFadingOut();
-        }
-        mX = event.getX();
-        mY = event.getY();
-        mTotalLength = 0;
-        mIsGesturing = false;
-        if (mGestureType == SINGLE_STROKE || overlay.getCurrentGesture() == null
-                || overlay.getCurrentGesture().getStrokesCount() == 0) {
-            overlay.setGestureColor(UNCERTAIN_GESTURE_COLOR);
-        }
-        mModel.dispatchTouchEvent(event);
-    }
-
-    public void onGesture(GestureOverlay overlay, MotionEvent event) {
-        if (mIsGesturing) {
-            return;
-        }
-        float x = event.getX();
-        float y = event.getY();
-        float dx = x - mX;
-        float dy = y - mY;
-        mTotalLength += (float)Math.sqrt(dx * dx + dy * dy);
-        mX = x;
-        mY = y;
-
-        if (mTotalLength > STROKE_LENGTH_THRESHOLD) {
-            OrientedBoundingBox bbx = GestureUtils.computeOrientedBBX(overlay.getCurrentStroke());
-            if (bbx.squareness > SQUARENESS_THRESHOLD) {
-                mIsGesturing = true;
-                overlay.setGestureColor(GestureOverlay.DEFAULT_GESTURE_COLOR);
-                event = MotionEvent.obtain(event.getDownTime(), System.currentTimeMillis(),
-                        MotionEvent.ACTION_UP, x, y, event.getPressure(), event.getSize(), event
-                                .getMetaState(), event.getXPrecision(), event.getYPrecision(),
-                        event.getDeviceId(), event.getEdgeFlags());
-            }
-        }
-        mModel.dispatchTouchEvent(event);
-    }
-
-    public void onFinishGesture(GestureOverlay overlay, MotionEvent event) {
-        if (mIsGesturing) {
-            overlay.clear(true);
-            ArrayList<GestureActionListener> listeners = mActionListeners;
-            int count = listeners.size();
-            for (int i = 0; i < count; i++) {
-                GestureActionListener listener = listeners.get(i);
-                listener.onGesturePerformed(overlay, overlay.getCurrentGesture());
-            }
-        } else {
-            mModel.dispatchTouchEvent(event);
-            overlay.clear(false);
-        }
-    }
-
-    public void addGestureActionListener(GestureActionListener listener) {
-        mActionListeners.add(listener);
-    }
-
-    public void removeGestureActionListener(GestureActionListener listener) {
-        mActionListeners.remove(listener);
-    }
-
-    public boolean isGesturing() {
-        return mIsGesturing;
-    }
-}
diff --git a/tests/sketch/src/com/android/gesture/GestureConstants.java b/tests/sketch/src/com/android/gesture/GestureConstants.java
deleted file mode 100644
index 0e17c8a..0000000
--- a/tests/sketch/src/com/android/gesture/GestureConstants.java
+++ /dev/null
@@ -1,31 +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 com.android.gesture;
-
-interface GestureConstants {
-    static final String XML_TAG_LIBRARY = "library";
-    static final String XML_TAG_ENTRY = "entry";
-    static final String XML_TAG_GESTURE = "gesture";
-    static final String XML_TAG_STROKE = "stroke";
-    static final String XML_TAG_ID = "id";
-    static final String XML_TAG_NAME = "name";
-    static final String STRING_GESTURE_DELIIMITER = "#";
-    static final String STRING_STROKE_DELIIMITER = ",";
-    static final int STROKE_STRING_BUFFER_SIZE = 1024;
-    static final int STROKE_POINT_BUFFER_SIZE = 100; // number of points
-    static final int IO_BUFFER_SIZE = 8 * 1024; // 8K
-}
diff --git a/tests/sketch/src/com/android/gesture/GestureLibrary.java b/tests/sketch/src/com/android/gesture/GestureLibrary.java
deleted file mode 100644
index 32c1ac4..0000000
--- a/tests/sketch/src/com/android/gesture/GestureLibrary.java
+++ /dev/null
@@ -1,332 +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;
-
-import android.util.Config;
-import android.util.Log;
-import android.util.Xml;
-import android.util.Xml.Encoding;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xmlpull.v1.XmlSerializer;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * GestureLibrary maintains gesture examples and makes predictions on a new
- * gesture
- */
-public class GestureLibrary {
-
-    public static final int SEQUENCE_INVARIANT = 1;
-
-    public static final int SEQUENCE_SENSITIVE = 2;
-
-    private int mSequenceType = SEQUENCE_SENSITIVE;
-
-    public static final int ORIENTATION_INVARIANT = 1;
-
-    public static final int ORIENTATION_SENSITIVE = 2;
-
-    private int mOrientationStyle = ORIENTATION_SENSITIVE;
-
-    private static final String LOGTAG = "GestureLibrary";
-
-    private static final String NAMESPACE = "";
-
-    private final String mGestureFileName;
-
-    private HashMap<String, ArrayList<Gesture>> mEntryName2gestures = new HashMap<String, ArrayList<Gesture>>();
-
-    private Learner mClassifier;
-
-    private boolean mChanged = false;
-
-    /**
-     * @param path where gesture data is stored
-     */
-    public GestureLibrary(String path) {
-        mGestureFileName = path;
-        mClassifier = new InstanceLearner();
-    }
-
-    /**
-     * Specify whether the gesture library will handle orientation sensitive
-     * gestures. Use ORIENTATION_INVARIANT or ORIENTATION_SENSITIVE
-     * 
-     * @param style
-     */
-    public void setOrientationStyle(int style) {
-        mOrientationStyle = style;
-    }
-
-    public int getOrientationStyle() {
-        return mOrientationStyle;
-    }
-
-    public void setGestureType(int type) {
-        mSequenceType = type;
-    }
-
-    public int getGestureType() {
-        return mSequenceType;
-    }
-
-    /**
-     * Get all the gesture entry names in the library
-     * 
-     * @return a set of strings
-     */
-    public Set<String> getGestureEntries() {
-        return mEntryName2gestures.keySet();
-    }
-
-    /**
-     * Recognize a gesture
-     * 
-     * @param gesture the query
-     * @return a list of predictions of possible entries for a given gesture
-     */
-    public ArrayList<Prediction> recognize(Gesture gesture) {
-        Instance instance = Instance.createInstance(this, gesture, null);
-        return mClassifier.classify(this, instance);
-    }
-
-    /**
-     * Add a gesture for the entry
-     * 
-     * @param entryName entry name
-     * @param gesture
-     */
-    public void addGesture(String entryName, Gesture gesture) {
-        if (Config.DEBUG) {
-            Log.v(LOGTAG, "Add an example for gesture: " + entryName);
-        }
-        ArrayList<Gesture> gestures = mEntryName2gestures.get(entryName);
-        if (gestures == null) {
-            gestures = new ArrayList<Gesture>();
-            mEntryName2gestures.put(entryName, gestures);
-        }
-        gestures.add(gesture);
-        mClassifier.addInstance(Instance.createInstance(this, gesture, entryName));
-        mChanged = true;
-    }
-
-    /**
-     * Remove a gesture from the library. If there are no more gestures for the
-     * given entry, the gesture entry will be removed.
-     * 
-     * @param entryName entry name
-     * @param gesture
-     */
-    public void removeGesture(String entryName, Gesture gesture) {
-        ArrayList<Gesture> gestures = mEntryName2gestures.get(entryName);
-        if (gestures == null) {
-            return;
-        }
-
-        gestures.remove(gesture);
-
-        // if there are no more samples, remove the entry automatically
-        if (gestures.isEmpty()) {
-            mEntryName2gestures.remove(entryName);
-        }
-
-        mClassifier.removeInstance(gesture.getID());
-
-        mChanged = true;
-    }
-
-    /**
-     * Remove a entry of gestures
-     * 
-     * @param entryName the entry name
-     */
-    public void removeEntireEntry(String entryName) {
-        mEntryName2gestures.remove(entryName);
-        mClassifier.removeInstances(entryName);
-        mChanged = true;
-    }
-
-    /**
-     * Get all the gestures of an entry
-     * 
-     * @param entryName
-     * @return the list of gestures that is under this name
-     */
-    @SuppressWarnings("unchecked")
-    public ArrayList<Gesture> getGestures(String entryName) {
-        ArrayList<Gesture> gestures = mEntryName2gestures.get(entryName);
-        if (gestures != null) {
-            return (ArrayList<Gesture>)gestures.clone();
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Save the gesture library
-     */
-    public void save() {
-        if (!mChanged)
-            return;
-
-        try {
-            File file = new File(mGestureFileName);
-            if (!file.getParentFile().exists()) {
-                file.getParentFile().mkdirs();
-            }
-            if (Config.DEBUG) {
-                Log.v(LOGTAG, "Save to " + mGestureFileName);
-            }
-            BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(
-                    mGestureFileName), GestureConstants.IO_BUFFER_SIZE);
-
-            PrintWriter writer = new PrintWriter(outputStream);
-            XmlSerializer serializer = Xml.newSerializer();
-            serializer.setOutput(writer);
-            serializer.startDocument(Encoding.ISO_8859_1.name(), null);
-            serializer.startTag(NAMESPACE, GestureConstants.XML_TAG_LIBRARY);
-            HashMap<String, ArrayList<Gesture>> maps = mEntryName2gestures;
-            Iterator<String> it = maps.keySet().iterator();
-            while (it.hasNext()) {
-                String key = it.next();
-                ArrayList<Gesture> examples = maps.get(key);
-                // save an entry
-                serializer.startTag(NAMESPACE, GestureConstants.XML_TAG_ENTRY);
-                serializer.attribute(NAMESPACE, GestureConstants.XML_TAG_NAME, key);
-                int count = examples.size();
-                for (int i = 0; i < count; i++) {
-                    Gesture gesture = examples.get(i);
-                    // save each gesture in the entry
-                    gesture.toXML(NAMESPACE, serializer);
-                }
-                serializer.endTag(NAMESPACE, GestureConstants.XML_TAG_ENTRY);
-            }
-            serializer.endTag(NAMESPACE, GestureConstants.XML_TAG_LIBRARY);
-            serializer.endDocument();
-            serializer.flush();
-            writer.close();
-            outputStream.close();
-            mChanged = false;
-        } catch (IOException ex) {
-            Log.d(LOGTAG, "Failed to save gestures:", ex);
-        }
-    }
-
-    /**
-     * Load the gesture library
-     */
-    public void load() {
-        File file = new File(mGestureFileName);
-        if (file.exists()) {
-            try {
-                if (Config.DEBUG) {
-                    Log.v(LOGTAG, "Load from " + mGestureFileName);
-                }
-                BufferedInputStream in = new BufferedInputStream(new FileInputStream(
-                        mGestureFileName), GestureConstants.IO_BUFFER_SIZE);
-                Xml.parse(in, Encoding.ISO_8859_1, new CompactInkHandler());
-                in.close();
-            } catch (SAXException ex) {
-                Log.d(LOGTAG, "Failed to load gestures:", ex);
-            } catch (IOException ex) {
-                Log.d(LOGTAG, "Failed to load gestures:", ex);
-            }
-        }
-    }
-
-    private class CompactInkHandler implements ContentHandler {
-        Gesture currentGesture = null;
-
-        StringBuilder buffer = new StringBuilder(GestureConstants.STROKE_STRING_BUFFER_SIZE);
-
-        String entryName;
-
-        ArrayList<Gesture> gestures;
-
-        CompactInkHandler() {
-        }
-
-        public void characters(char[] ch, int start, int length) {
-            buffer.append(ch, start, length);
-        }
-
-        public void endDocument() {
-        }
-
-        public void endElement(String uri, String localName, String qName) {
-            if (localName.equals(GestureConstants.XML_TAG_ENTRY)) {
-                mEntryName2gestures.put(entryName, gestures);
-                gestures = null;
-            } else if (localName.equals(GestureConstants.XML_TAG_GESTURE)) {
-                gestures.add(currentGesture);
-                mClassifier.addInstance(Instance.createInstance(GestureLibrary.this,
-                        currentGesture, entryName));
-                currentGesture = null;
-            } else if (localName.equals(GestureConstants.XML_TAG_STROKE)) {
-                currentGesture.addStroke(GestureStroke.createFromString(buffer.toString()));
-                buffer.setLength(0);
-            }
-        }
-
-        public void endPrefixMapping(String prefix) {
-        }
-
-        public void ignorableWhitespace(char[] ch, int start, int length) {
-        }
-
-        public void processingInstruction(String target, String data) {
-        }
-
-        public void setDocumentLocator(Locator locator) {
-        }
-
-        public void skippedEntity(String name) {
-        }
-
-        public void startDocument() {
-        }
-
-        public void startElement(String uri, String localName, String qName, Attributes attributes) {
-            if (localName.equals(GestureConstants.XML_TAG_ENTRY)) {
-                gestures = new ArrayList<Gesture>();
-                entryName = attributes.getValue(NAMESPACE, GestureConstants.XML_TAG_NAME);
-            } else if (localName.equals(GestureConstants.XML_TAG_GESTURE)) {
-                currentGesture = new Gesture();
-                currentGesture.setID(Long.parseLong(attributes.getValue(NAMESPACE,
-                        GestureConstants.XML_TAG_ID)));
-            }
-        }
-
-        public void startPrefixMapping(String prefix, String uri) {
-        }
-    }
-}
diff --git a/tests/sketch/src/com/android/gesture/GestureListener.java b/tests/sketch/src/com/android/gesture/GestureListener.java
index 9b50714..ebb4149 100755
--- a/tests/sketch/src/com/android/gesture/GestureListener.java
+++ b/tests/sketch/src/com/android/gesture/GestureListener.java
@@ -18,13 +18,8 @@
 
 import android.view.MotionEvent;
 
-/**
- * An interface for processing gesture events
- */
 public interface GestureListener {
-    public void onStartGesture(GestureOverlay overlay, MotionEvent event);
-
-    public void onGesture(GestureOverlay overlay, MotionEvent event);
-
-    public void onFinishGesture(GestureOverlay overlay, MotionEvent event);
+    public void onStartGesture(GesturePad pad, MotionEvent event);
+    public void onGesture(GesturePad pad, MotionEvent event);
+    public void onFinishGesture(GesturePad pad, MotionEvent event);
 }
diff --git a/tests/sketch/src/com/android/gesture/GestureOverlay.java b/tests/sketch/src/com/android/gesture/GestureOverlay.java
deleted file mode 100755
index 5cef8c8..0000000
--- a/tests/sketch/src/com/android/gesture/GestureOverlay.java
+++ /dev/null
@@ -1,340 +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;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.BlurMaskFilter;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.os.Handler;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import java.util.ArrayList;
-
-/**
- * A (transparent) overlay for gesture input that can be placed on top of other
- * widgets. The view can also be opaque.
- */
-
-public class GestureOverlay extends View {
-
-    static final float TOUCH_TOLERANCE = 3;
-
-    private static final int TRANSPARENT_BACKGROUND = Color.argb(0, 0, 0, 0);
-
-    private static final float FADING_ALPHA_CHANGE = 0.03f;
-
-    private static final long FADING_REFRESHING_RATE = 100;
-
-    private static final int GESTURE_STROKE_WIDTH = 12;
-
-    private static final boolean GESTURE_RENDERING_ANTIALIAS = true;
-
-    private static final int BLUR_MASK_RADIUS = 1;
-
-    public static final int DEFAULT_GESTURE_COLOR = Color.argb(255, 255, 255, 0);
-
-    // double buffering
-    private Paint mGesturePaint;
-
-    private Bitmap mBitmap; // with transparent background
-
-    private Canvas mBitmapCanvas;
-
-    // for rendering immediate ink feedback
-    private Path mPath;
-
-    private float mX;
-
-    private float mY;
-
-    // current gesture
-    private Gesture mCurrentGesture = null;
-
-    // gesture event handlers
-    ArrayList<GestureListener> mGestureListeners = new ArrayList<GestureListener>();
-
-    private ArrayList<GesturePoint> mPointBuffer = null;
-
-    // fading out effect
-    private boolean mIsFadingOut = false;
-
-    private float mFadingAlpha = 1;
-
-    private Handler mHandler = new Handler();
-    
-    private Paint mBitmapPaint = new Paint(Paint.DITHER_FLAG);
-
-    private Runnable mFadingOut = new Runnable() {
-        public void run() {
-            if (mIsFadingOut) {
-                mFadingAlpha -= FADING_ALPHA_CHANGE;
-                if (mFadingAlpha <= 0) {
-                    mIsFadingOut = false;
-                    mPath = null;
-                    mCurrentGesture = null;
-                    mBitmap.eraseColor(TRANSPARENT_BACKGROUND);
-                } else {
-                    mHandler.postDelayed(this, FADING_REFRESHING_RATE);
-                }
-                invalidate();
-            }
-        }
-    };
-
-    public GestureOverlay(Context context) {
-        super(context);
-        init();
-    }
-
-    public GestureOverlay(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        init();
-    }
-
-    public ArrayList<GesturePoint> getCurrentStroke() {
-        return mPointBuffer;
-    }
-
-    public Gesture getCurrentGesture() {
-        return mCurrentGesture;
-    }
-
-    /**
-     * Set Gesture color
-     * 
-     * @param color
-     */
-    public void setGestureColor(int color) {
-        mGesturePaint.setColor(color);
-        if (mCurrentGesture != null) {
-            mBitmap.eraseColor(TRANSPARENT_BACKGROUND);
-            mCurrentGesture.draw(mBitmapCanvas, mGesturePaint);
-        }
-    }
-
-    /**
-     * Set the gesture to be shown in the view
-     * 
-     * @param gesture
-     */
-    public void setCurrentGesture(Gesture gesture) {
-        if (mCurrentGesture != null) {
-            clear(false);
-        }
-
-        mCurrentGesture = gesture;
-
-        if (gesture != null) {
-            if (mBitmapCanvas != null) {
-                gesture.draw(mBitmapCanvas, mGesturePaint);
-                invalidate();
-            }
-        }
-    }
-
-    private void init() {
-        mGesturePaint = new Paint();
-        mGesturePaint.setAntiAlias(GESTURE_RENDERING_ANTIALIAS);
-        mGesturePaint.setColor(DEFAULT_GESTURE_COLOR);
-        mGesturePaint.setStyle(Paint.Style.STROKE);
-        mGesturePaint.setStrokeJoin(Paint.Join.ROUND);
-        mGesturePaint.setStrokeCap(Paint.Cap.ROUND);
-        mGesturePaint.setStrokeWidth(GESTURE_STROKE_WIDTH);
-        mGesturePaint
-                .setMaskFilter(new BlurMaskFilter(BLUR_MASK_RADIUS, BlurMaskFilter.Blur.NORMAL));
-
-        mPath = null;
-    }
-
-    @Override
-    protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
-        super.onSizeChanged(width, height, oldWidth, oldHeight);
-        if (width <= 0 || height <= 0) {
-            return;
-        }
-        int targetWidth = width > oldWidth ? width : oldWidth;
-        int targetHeight = height > oldHeight ? height : oldHeight;
-        mBitmap = Bitmap.createBitmap(targetWidth, targetHeight, Bitmap.Config.ARGB_8888);
-        mBitmapCanvas = new Canvas(mBitmap);
-        mBitmapCanvas.drawColor(TRANSPARENT_BACKGROUND);
-        if (mCurrentGesture != null) {
-            mCurrentGesture.draw(mBitmapCanvas, mGesturePaint);
-        }
-    }
-
-    public void addGestureListener(GestureListener listener) {
-        mGestureListeners.add(listener);
-    }
-
-    public void removeGestureListener(GestureListener listener) {
-        mGestureListeners.remove(listener);
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-
-        // draw double buffer
-        if (mIsFadingOut) {
-            mBitmapPaint.setAlpha((int) (255 * mFadingAlpha));
-            canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
-        } else {
-            mBitmapPaint.setAlpha(255);
-            canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
-        }
-
-        // draw the current stroke
-        if (mPath != null) {
-            canvas.drawPath(mPath, mGesturePaint);
-        }
-    }
-
-    /**
-     * Clear up the overlay
-     * 
-     * @param fadeOut whether the gesture on the overlay should fade out
-     *            gradually or disappear immediately
-     */
-    public void clear(boolean fadeOut) {
-        if (fadeOut) {
-            mFadingAlpha = 1;
-            mIsFadingOut = true;
-            mHandler.removeCallbacks(mFadingOut);
-            mHandler.postDelayed(mFadingOut, FADING_REFRESHING_RATE);
-        } else {
-            mPath = null;
-            mCurrentGesture = null;
-            if (mBitmap != null) {
-                mBitmap.eraseColor(TRANSPARENT_BACKGROUND);
-                invalidate();
-            }
-        }
-    }
-    
-    public void cancelFadingOut() {
-        mIsFadingOut = false;
-        mHandler.removeCallbacks(mFadingOut);
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent event) {
-
-        if (!isEnabled()) {
-            return true;
-        }
-
-        switch (event.getAction()) {
-            case MotionEvent.ACTION_DOWN:
-                touch_start(event);
-                invalidate();
-                break;
-            case MotionEvent.ACTION_MOVE:
-                touch_move(event);
-                invalidate();
-                break;
-            case MotionEvent.ACTION_UP:
-                touch_up(event);
-                invalidate();
-                break;
-        }
-
-        return true;
-    }
-
-    private void touch_start(MotionEvent event) {
-        // pass the event to handlers
-        ArrayList<GestureListener> listeners = mGestureListeners;
-        int count = listeners.size();
-        for (int i = 0; i < count; i++) {
-            GestureListener listener = listeners.get(i);
-            listener.onStartGesture(this, event);
-        }
-        
-        // if there is fading out going on, stop it.
-        if (mIsFadingOut) {
-            mIsFadingOut = false;
-            mHandler.removeCallbacks(mFadingOut);
-            mBitmap.eraseColor(TRANSPARENT_BACKGROUND);
-            mCurrentGesture = null;
-        }
-
-        float x = event.getX();
-        float y = event.getY();
-
-        mX = x;
-        mY = y;
-
-        if (mCurrentGesture == null) {
-            mCurrentGesture = new Gesture();
-        }
-
-        mPointBuffer = new ArrayList<GesturePoint>();
-        mPointBuffer.add(new GesturePoint(x, y, event.getEventTime()));
-
-        mPath = new Path();
-        mPath.moveTo(x, y);
-    }
-
-    private void touch_move(MotionEvent event) {
-        float x = event.getX();
-        float y = event.getY();
-
-        float dx = Math.abs(x - mX);
-        float dy = Math.abs(y - mY);
-        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
-            mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
-            mX = x;
-            mY = y;
-        }
-
-        mPointBuffer.add(new GesturePoint(x, y, event.getEventTime()));
-
-        // pass the event to handlers
-        ArrayList<GestureListener> listeners = mGestureListeners;
-        int count = listeners.size();
-        for (int i = 0; i < count; i++) {
-            GestureListener listener = listeners.get(i);
-            listener.onGesture(this, event);
-        }
-    }
-
-    private void touch_up(MotionEvent event) {
-        // add the stroke to the current gesture
-        mCurrentGesture.addStroke(new GestureStroke(mPointBuffer));
-        mPointBuffer = null;
-
-        // add the stroke to the double buffer
-        mGesturePaint.setDither(true);
-        mBitmapCanvas.drawPath(mPath, mGesturePaint);
-        mGesturePaint.setDither(false);
-        mPath = null;
-
-        // pass the event to handlers
-        ArrayList<GestureListener> listeners = mGestureListeners;
-        int count = listeners.size();
-        for (int i = 0; i < count; i++) {
-            GestureListener listener = listeners.get(i);
-            listener.onFinishGesture(this, event);
-        }
-    }
-
-}
diff --git a/tests/sketch/src/com/android/gesture/GesturePad.java b/tests/sketch/src/com/android/gesture/GesturePad.java
index 04dbe3a..45a09e6 100755
--- a/tests/sketch/src/com/android/gesture/GesturePad.java
+++ b/tests/sketch/src/com/android/gesture/GesturePad.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2009 Google Inc.
+ * Copyright (C) 2008 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.
@@ -18,67 +18,64 @@
 
 import android.content.Context;
 import android.graphics.Bitmap;
-import android.graphics.BlurMaskFilter;
 import android.graphics.Canvas;
 import android.graphics.Color;
+import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Path;
+import android.graphics.PointF;
 import android.os.Handler;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
 import android.view.View;
 import java.util.ArrayList;
-
+import java.util.Iterator;
 
 /**
- * A (transparent) view for gesture input that can be placed on top of other
- * widgets. The background of the view is customizable. 
- * 
- * @author liyang@google.com (Yang Li)
- *
+ * A view for rendering and processing gestures
  */
 
 public class GesturePad extends View {
 
-    private static final float TOUCH_TOLERANCE = 4;
-    public static final int DEFAULT_GESTURE_COLOR = Color.argb(255, 255, 255, 0);
+    public static final float TOUCH_TOLERANCE = 4;
+    public static final int default_foreground = Color.argb(255, 255, 255, 0);
+    private int         background = Color.argb(0, 0, 0, 0);
+    private int         foreground = default_foreground;
+    private int         uncertain_foreground = Color.argb(55, 255, 255, 0);
+    private Bitmap      mBitmap;
+    private Canvas      mCanvas;
+    private Path        mPath;
+    private Paint       mBitmapPaint;
+    private Paint       mPaint;
+    private Paint       mDebugPaint;
+    private float       mX, mY;
+    private boolean     mEnableInput = true; 
+    private boolean     mEnableRendering = true;
+    private boolean     mCacheGesture = true;
+    private Gesture       mCurrentGesture = null;
+    ArrayList<GestureListener> mGestureListeners = new ArrayList<GestureListener>();
+
+    private boolean     mShouldFadingOut = true;
+    private boolean     mIsFadingOut = false;
+    private float       mFadingAlpha = 1;
     
-    // double buffering 
-    private Paint mGesturePaint;
-    private Bitmap mBitmap; // with transparent background
-    private Canvas mBitmapCanvas;
-
-    // for rendering immediate ink feedback
-    private Path mPath;
-    private float mX;
-    private float mY;
-
-    // current gesture
-    private Gesture mCurrentGesture = null;
+    private boolean     reconstruct = false;
     
-    // gesture event handlers
-    ArrayList<GestureListener> mGestureListeners =
-                                new ArrayList<GestureListener>();
-    private ArrayList<GesturePoint> mPointBuffer = null;
-
-    // fading out effect
-    private boolean mIsFadingOut = false;
-    private float mFadingAlpha = 1;
+    private ArrayList<Path> debug = new ArrayList<Path>();
     private Handler mHandler = new Handler();
+    
     private Runnable mFadingOut = new Runnable() {
-        public void run() {
-            mFadingAlpha -= 0.03f;
-            if (mFadingAlpha <= 0) {
-                mIsFadingOut = false;
-                mPath = null;
-                mCurrentGesture = null;
-                mBitmap.eraseColor(Color.argb(0, 0, 0, 0));
-            } else {
-                mHandler.postDelayed(this, 100);
-            }
-            invalidate();
-        }
-    };
+      public void run() {
+          mFadingAlpha -= 0.03f;
+          if (mFadingAlpha <= 0) {
+              mIsFadingOut = false;
+              mPath.reset();
+          } else {
+              mHandler.postDelayed(this, 100);
+          }
+          invalidate();
+      }
+   };
 
     public GesturePad(Context context) {
         super(context);
@@ -90,76 +87,82 @@
         init();
     }
     
-    public ArrayList<GesturePoint> getCurrentStroke() {
-        return this.mPointBuffer;
+    public boolean isEnableRendering() {
+        return this.mEnableRendering;
     }
     
     public Gesture getCurrentGesture() {
         return mCurrentGesture;
     }
     
-    /**
-     * Set Gesture color
-     * @param c
-     */
-    public void setGestureColor(int c) {
-        this.mGesturePaint.setColor(c);
-        if (mCurrentGesture != null) {
-            mBitmap.eraseColor(Color.argb(0, 0, 0, 0));
-            mCurrentGesture.draw(mBitmapCanvas, mGesturePaint);
-        }
+    public Paint getPaint() {
+        return mPaint;
     }
     
-    /**
-     * Set the gesture to be shown in the view
-     * @param gesture
-     */
-    public void setCurrentGesture(Gesture gesture) {
-        if (this.mCurrentGesture != null) {
-            clear(false);
-        }
-        
-        this.mCurrentGesture = gesture;
-        
-        if (this.mCurrentGesture != null) {
-            if (mBitmapCanvas != null) {
-                this.mCurrentGesture.draw(mBitmapCanvas, mGesturePaint);
-                this.invalidate();
-            }
-        }
+    public void setColor(int c) {
+        this.foreground = c;
+    }
+    
+    public void setFadingAlpha(float f) {
+        mFadingAlpha = f;
+    }
+    
+    public void setCurrentGesture(Gesture stk) {
+        this.mCurrentGesture = stk;
+        reconstruct = true;
     }
     
     private void init() {
-        mGesturePaint = new Paint();
-        mGesturePaint.setAntiAlias(true);
-        mGesturePaint.setDither(true);
-        mGesturePaint.setColor(DEFAULT_GESTURE_COLOR);
-        mGesturePaint.setStyle(Paint.Style.STROKE);
-        mGesturePaint.setStrokeJoin(Paint.Join.ROUND);
-        mGesturePaint.setStrokeCap(Paint.Cap.ROUND);
-        mGesturePaint.setStrokeWidth(12);
-        mGesturePaint.setMaskFilter(
-            new BlurMaskFilter(1, BlurMaskFilter.Blur.NORMAL));
+        mDebugPaint = new Paint();
+        mDebugPaint.setColor(Color.WHITE);
+        mDebugPaint.setStrokeWidth(4);
+        mDebugPaint.setAntiAlias(true);
+        mDebugPaint.setStyle(Paint.Style.STROKE);
         
-        mPath = null;
+        mPaint = new Paint();
+        mPaint.setAntiAlias(true);
+        mPaint.setDither(true);
+        mPaint.setColor(foreground);
+        mPaint.setStyle(Paint.Style.STROKE);
+        mPaint.setStrokeJoin(Paint.Join.ROUND);
+        mPaint.setStrokeCap(Paint.Cap.ROUND);
+        mPaint.setStrokeWidth(12);
+        
+        mBitmapPaint = new Paint(Paint.DITHER_FLAG);
+        mPath = new Path();
+        
+        reconstruct = false;
     }
+
+    public void cacheGesture(boolean b) {
+        mCacheGesture = b;
+    }
+      
+    public void enableRendering(boolean b) {
+        mEnableRendering = b;
+    }
+  
     
     @Override
     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
         // TODO Auto-generated method stub
         super.onSizeChanged(w, h, oldw, oldh);
-        if (w <= 0 || h <= 0) {
+        
+        if (w <=0 || h <=0)
             return;
+        
+        int width = w>oldw? w : oldw;
+        int height = h>oldh? h : oldh;
+        Bitmap newBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+        mCanvas = new Canvas(newBitmap);
+        
+        if (mBitmap != null) {
+            mCanvas.drawColor(background);
+            mCanvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
+            mCanvas.drawPath(mPath, mPaint);
         }
-        int width = w > oldw? w : oldw;
-        int height = h > oldh? h : oldh;
-        mBitmap = Bitmap.createBitmap(
-            width, height, Bitmap.Config.ARGB_8888);
-        mBitmapCanvas = new Canvas(mBitmap);
-        mBitmapCanvas.drawColor(Color.argb(0, 0, 0, 0));
-        if (mCurrentGesture != null) {
-            mCurrentGesture.draw(mBitmapCanvas, mGesturePaint);
-        }
+        
+        mBitmap = newBitmap;
     }
 
     public void addGestureListener(GestureListener l) {
@@ -172,50 +175,111 @@
   
     @Override
     protected void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-
-        // draw double buffer
-        Paint paint = new Paint(Paint.DITHER_FLAG);
+        canvas.drawColor(background);
+        
+        if (mCacheGesture)
+            canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
+        
         if (mIsFadingOut) {
-            paint.setAlpha((int)(255 * mFadingAlpha));
-            canvas.drawBitmap(mBitmap, 0, 0, paint);
+            int color = foreground;
+            int alpha = (int)(Color.alpha(color) * mFadingAlpha);
+            mPaint.setColor(Color.argb(alpha, 
+                Color.red(color), 
+                Color.green(color), 
+                Color.blue(color)));
+        } else if (mEnableRendering == false) {
+            mPaint.setColor(uncertain_foreground);
         } else {
-            canvas.drawBitmap(mBitmap, 0, 0, paint);
+            mPaint.setColor(foreground);
         }
         
-        // draw the current stroke
-        if (mPath != null) {
-            canvas.drawPath(mPath, mGesturePaint);
+        if (reconstruct) {
+            
+            if (this.mCurrentGesture != null) {
+                float xedge = 30;
+                float yedge = 30;
+                float w = this.getWidth() - 2 * xedge;
+                float h = this.getHeight() - 2 * yedge;
+                float sx =  w / this.mCurrentGesture.getBBX().width();
+                float sy = h / mCurrentGesture.getBBX().height();
+                float scale = sx>sy?sy:sx;
+                convertFromStroke(mCurrentGesture);
+                Matrix matrix = new Matrix();
+                matrix.preTranslate(-mCurrentGesture.getBBX().centerX(), -mCurrentGesture.getBBX().centerY());
+                matrix.postScale(scale, scale);
+                matrix.postTranslate(this.getWidth()/2, this.getHeight()/2);
+                this.mPath.transform(matrix);
+            } else {
+                mPath.reset();
+            }
+            
+            reconstruct = false;
+        }
+        
+        canvas.drawPath(mPath, mPaint);
+        
+        Iterator<Path> it = debug.iterator();
+        while (it.hasNext()) {
+            Path path = it.next();
+            canvas.drawPath(path, mDebugPaint);
         }
     }
-
-    /**
-     * Clear up the gesture pad
-     * @param fadeOut whether the gesture on the pad should fade out gradually
-     * or disappear immediately
-     */
-    public void clear(boolean fadeOut) {
-        if (fadeOut) {
-            mFadingAlpha = 1;
-            mIsFadingOut = true;
-            mHandler.removeCallbacks(mFadingOut);
-            mHandler.postDelayed(mFadingOut, 100);
-        } else {
-            mPath = null;
-            this.mCurrentGesture = null;
-            if (mBitmap != null) {
-                mBitmap.eraseColor(Color.argb(0, 0, 0, 0));
-                this.invalidate();
+    
+    public void clearDebugPath() {
+        debug.clear();
+    }
+    
+    public void addDebugPath(Path path) {
+        debug.add(path);
+    }
+    
+    public void addDebugPath(ArrayList<Path> paths) {
+        debug.addAll(paths);
+    }
+    
+    public void clear() {
+        mPath = new Path();
+        this.mCurrentGesture = null;
+        mCanvas.drawColor(background);
+        this.invalidate();
+    }
+    
+    private void convertFromStroke(Gesture stk) {
+        mPath = null;
+        Iterator it = stk.getPoints().iterator();
+        while (it.hasNext()) {
+            PointF p = (PointF) it.next();
+            if (mPath == null) {
+                mPath = new Path();
+                mPath.moveTo(p.x, p.y);
+                mX = p.x;
+                mY = p.y;
+            } else {
+                float dx = Math.abs(p.x - mX);
+                float dy = Math.abs(p.y - mY);
+                if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
+                    mPath.quadTo(mX, mY, (p.x + mX)/2, (p.y + mY)/2);
+                    mX = p.x;
+                    mY = p.y;
+                }
             }
         }
+        mPath.lineTo(mX, mY);
+    }
+    
+    public void setEnableInput(boolean b) {
+        mEnableInput = b;
+    }
+    
+    public boolean isEnableInput() {
+        return mEnableInput;
     }
     
     @Override
     public boolean onTouchEvent(MotionEvent event) {
       
-        if(this.isEnabled() == false) { 
+        if(mEnableInput == false) 
             return true;
-        }
         
         switch (event.getAction()) {
             case MotionEvent.ACTION_DOWN:
@@ -231,41 +295,28 @@
                 invalidate();
                 break;
         }
-        
         return true;
     }
     
     private void touch_start(MotionEvent event) {
-        // if there is fading-out effect, stop it.
-        if (mIsFadingOut) {
-            mIsFadingOut = false;
-            mHandler.removeCallbacks(mFadingOut);
-            mBitmap.eraseColor(Color.argb(0, 0, 0, 0));
-            this.mCurrentGesture = null;
-        }
+        mIsFadingOut = false;
+        mHandler.removeCallbacks(mFadingOut);
       
         float x = event.getX();
         float y = event.getY();
 
+        mCurrentGesture = new Gesture();
+        mCurrentGesture.addPoint(x, y);
+        
+        mPath.reset();
+        mPath.moveTo(x, y);
         mX = x;
         mY = y;
         
-        // pass the event to handlers
-        int count = mGestureListeners.size();
-        for (int i = 0; i < count; i++) {
-            GestureListener listener = mGestureListeners.get(i);
-            listener.onStartGesture(this, event);
+        Iterator<GestureListener> it = mGestureListeners.iterator();
+        while (it.hasNext()) {
+            it.next().onStartGesture(this, event);
         }
-
-        if (mCurrentGesture == null) {
-            mCurrentGesture = new Gesture();
-        }
-        
-        mPointBuffer = new ArrayList<GesturePoint>();
-        mPointBuffer.add(new GesturePoint(x, y, event.getEventTime()));
-
-        mPath = new Path();
-        mPath.moveTo(x, y);
     }
     
     private void touch_move(MotionEvent event) {
@@ -280,32 +331,41 @@
             mY = y;
         }
         
-        mPointBuffer.add(new GesturePoint(x, y, event.getEventTime()));
-
-        // pass the event to handlers
-        int count = mGestureListeners.size();
-        for (int i = 0; i < count; i++) {
-            GestureListener listener = mGestureListeners.get(i);
-            listener.onGesture(this, event);
+        mCurrentGesture.addPoint(x, y);
+        
+        Iterator<GestureListener> it = mGestureListeners.iterator();
+        while (it.hasNext()) {
+            it.next().onGesture(this, event);
         }
     }
-
+    
+    public void setFadingOut(boolean b) {
+        mShouldFadingOut = b;
+        mIsFadingOut = false;
+    }
+    
+    public boolean shouldFadingOut() {
+        return mShouldFadingOut;
+    }
     
     private void touch_up(MotionEvent event) {
-        // add the stroke to the current gesture
-        mCurrentGesture.addStroke(new GestureStroke(mPointBuffer));
-        mPointBuffer = null;
-
-        // add the stroke to the double buffer
-        mBitmapCanvas.drawPath(mPath, mGesturePaint);
-        mPath = null;
+        mPath.lineTo(mX, mY);
         
-        // pass the event to handlers
-        int count = mGestureListeners.size();
-        for (int i = 0; i < count; i++) {
-            GestureListener listener = mGestureListeners.get(i);
-            listener.onFinishGesture(this, event);
+        if (mCacheGesture)
+            mCanvas.drawPath(mPath, mPaint);
+        
+        // kill this so we don't double draw
+        if (shouldFadingOut()) {
+            mFadingAlpha = 1;
+            mIsFadingOut = true;
+            mHandler.removeCallbacks(mFadingOut);
+            mHandler.postDelayed(mFadingOut, 100);
+        }
+        
+        Iterator<GestureListener> it = mGestureListeners.iterator();
+        while (it.hasNext()) {
+            it.next().onFinishGesture(this, event);
         }
     }
-    
+
 }
diff --git a/tests/sketch/src/com/android/gesture/GesturePoint.java b/tests/sketch/src/com/android/gesture/GesturePoint.java
deleted file mode 100644
index d06eff47..0000000
--- a/tests/sketch/src/com/android/gesture/GesturePoint.java
+++ /dev/null
@@ -1,35 +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;
-
-/**
- * A timed point of a gesture stroke
- */
-
-public class GesturePoint {
-    public final float xpos;
-
-    public final float ypos;
-
-    public final long timestamp;
-
-    public GesturePoint(float x, float y, long t) {
-        xpos = x;
-        ypos = y;
-        timestamp = t;
-    }
-}
diff --git a/tests/sketch/src/com/android/gesture/GestureProcessor.java b/tests/sketch/src/com/android/gesture/GestureProcessor.java
deleted file mode 100644
index feddead..0000000
--- a/tests/sketch/src/com/android/gesture/GestureProcessor.java
+++ /dev/null
@@ -1,128 +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;
-
-import android.graphics.Color;
-import android.view.MotionEvent;
-import android.view.View;
-
-import java.util.ArrayList;
-
-public class GestureProcessor implements GestureListener {
-
-    public static final int SINGLE_STROKE = 0;
-
-    public static final int MULTIPLE_STROKE = 1;
-
-    private static final float STROKE_LENGTH_THRESHOLD = 100;
-
-    private static final float SQUARENESS_THRESHOLD = 0.24f;
-
-    private static final int UNCERTAIN_GESTURE_COLOR = Color.argb(60, 255, 255, 0);
-
-    private boolean mIsGesturing = false;
-
-    private float mTotalLength;
-
-    private float mX, mY;
-
-    private View mModel;
-
-    private int mGestureType = SINGLE_STROKE;
-
-    private ArrayList<GestureActionListener> mActionListeners = new ArrayList<GestureActionListener>();
-
-    public GestureProcessor(View model) {
-        mModel = model;
-    }
-
-    /**
-     * 
-     * @param type SINGLE_STROKE or MULTIPLE_STROKE
-     */
-    public void setGestureType(int type) {
-        mGestureType = type;
-    }
-
-    public void onStartGesture(GestureOverlay overlay, MotionEvent event) {
-        if (mGestureType == MULTIPLE_STROKE) {
-            overlay.cancelFadingOut();
-        }
-        mX = event.getX();
-        mY = event.getY();
-        mTotalLength = 0;
-        mIsGesturing = false;
-        if (mGestureType == SINGLE_STROKE || overlay.getCurrentGesture() == null
-                || overlay.getCurrentGesture().getStrokesCount() == 0) {
-            overlay.setGestureColor(UNCERTAIN_GESTURE_COLOR);
-        }
-        mModel.dispatchTouchEvent(event);
-    }
-
-    public void onGesture(GestureOverlay overlay, MotionEvent event) {
-        if (mIsGesturing) {
-            return;
-        }
-        float x = event.getX();
-        float y = event.getY();
-        float dx = x - mX;
-        float dy = y - mY;
-        mTotalLength += (float)Math.sqrt(dx * dx + dy * dy);
-        mX = x;
-        mY = y;
-
-        if (mTotalLength > STROKE_LENGTH_THRESHOLD) {
-            OrientedBoundingBox bbx = GestureUtils.computeOrientedBBX(overlay.getCurrentStroke());
-            if (bbx.squareness > SQUARENESS_THRESHOLD) {
-                mIsGesturing = true;
-                overlay.setGestureColor(GestureOverlay.DEFAULT_GESTURE_COLOR);
-                event = MotionEvent.obtain(event.getDownTime(), System.currentTimeMillis(),
-                        MotionEvent.ACTION_UP, x, y, event.getPressure(), event.getSize(), event
-                                .getMetaState(), event.getXPrecision(), event.getYPrecision(),
-                        event.getDeviceId(), event.getEdgeFlags());
-            }
-        }
-        mModel.dispatchTouchEvent(event);
-    }
-
-    public void onFinishGesture(GestureOverlay overlay, MotionEvent event) {
-        if (mIsGesturing) {
-            overlay.clear(true);
-            ArrayList<GestureActionListener> listeners = mActionListeners;
-            int count = listeners.size();
-            for (int i = 0; i < count; i++) {
-                GestureActionListener listener = listeners.get(i);
-                listener.onGesturePerformed(overlay, overlay.getCurrentGesture());
-            }
-        } else {
-            mModel.dispatchTouchEvent(event);
-            overlay.clear(false);
-        }
-    }
-
-    public void addGestureActionListener(GestureActionListener listener) {
-        mActionListeners.add(listener);
-    }
-
-    public void removeGestureActionListener(GestureActionListener listener) {
-        mActionListeners.remove(listener);
-    }
-
-    public boolean isGesturing() {
-        return mIsGesturing;
-    }
-}
diff --git a/tests/sketch/src/com/android/gesture/GestureStroke.java b/tests/sketch/src/com/android/gesture/GestureStroke.java
deleted file mode 100644
index b1081e5..0000000
--- a/tests/sketch/src/com/android/gesture/GestureStroke.java
+++ /dev/null
@@ -1,244 +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;
-
-import android.graphics.Canvas;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.RectF;
-
-import org.xmlpull.v1.XmlSerializer;
-
-import java.io.IOException;
-import java.util.ArrayList;
-
-/**
- * A gesture stroke started on a touch down and ended on a touch up.
- */
-public class GestureStroke {
-    public final RectF boundingBox;
-
-    public final float length;
-
-    public final float[] xPoints;
-
-    public final float[] yPoints;
-
-    public final long[] timestamps;
-
-    private Path mCachedPath;
-
-    /**
-     * Construct a gesture stroke from a list of gesture points
-     * 
-     * @param pts
-     */
-    public GestureStroke(ArrayList<GesturePoint> pts) {
-        xPoints = new float[pts.size()];
-        yPoints = new float[pts.size()];
-        timestamps = new long[pts.size()];
-
-        RectF bx = null;
-        float len = 0;
-        int index = 0;
-        int count = pts.size();
-        float[] xpts = xPoints;
-        float[] ypts = yPoints;
-        long[] times = timestamps;
-
-        for (int i = 0; i < count; i++) {
-            GesturePoint p = pts.get(i);
-            xpts[index] = p.xpos;
-            ypts[index] = p.ypos;
-            times[index] = p.timestamp;
-
-            if (bx == null) {
-                bx = new RectF();
-                bx.top = p.ypos;
-                bx.left = p.xpos;
-                bx.right = p.xpos;
-                bx.bottom = p.ypos;
-                len = 0;
-            } else {
-                len += Math.sqrt(Math.pow(p.xpos - xpts[index - 1], 2)
-                        + Math.pow(p.ypos - ypts[index - 1], 2));
-                bx.union(p.xpos, p.ypos);
-            }
-            index++;
-        }
-
-        boundingBox = bx;
-        length = len;
-    }
-
-    /**
-     * Draw the gesture with a given canvas and paint
-     * 
-     * @param canvas
-     */
-    void draw(Canvas canvas, Paint paint) {
-        if (mCachedPath == null) {
-            float[] xpts = xPoints;
-            float[] ypts = yPoints;
-            int count = xpts.length;
-            Path path = null;
-            float mX = 0, mY = 0;
-            for (int i = 0; i < count; i++) {
-                float x = xpts[i];
-                float y = ypts[i];
-                if (path == null) {
-                    path = new Path();
-                    path.moveTo(x, y);
-                    mX = x;
-                    mY = y;
-                } else {
-                    float dx = Math.abs(x - mX);
-                    float dy = Math.abs(y - mY);
-                    if (dx >= 3 || dy >= 3) {
-                        path.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
-                        mX = x;
-                        mY = y;
-                    }
-                }
-            }
-
-            mCachedPath = path;
-        }
-
-        canvas.drawPath(mCachedPath, paint);
-    }
-
-    /**
-     * Convert the stroke to a Path based on the number of points
-     * 
-     * @param width the width of the bounding box of the target path
-     * @param height the height of the bounding box of the target path
-     * @param numSample the number of points needed
-     * @return the path
-     */
-    public Path toPath(float width, float height, int numSample) {
-        float[] pts = GestureUtils.sequentialFeaturize(this, numSample);
-        RectF rect = boundingBox;
-        float scale = height / rect.height();
-        Matrix matrix = new Matrix();
-        matrix.setTranslate(-rect.left, -rect.top);
-        Matrix scaleMatrix = new Matrix();
-        scaleMatrix.setScale(scale, scale);
-        matrix.postConcat(scaleMatrix);
-        Matrix translate = new Matrix();
-        matrix.postConcat(translate);
-        matrix.mapPoints(pts);
-
-        Path path = null;
-        float mX = 0;
-        float mY = 0;
-        int count = pts.length;
-        for (int i = 0; i < count; i += 2) {
-            float x = pts[i];
-            float y = pts[i + 1];
-            if (path == null) {
-                path = new Path();
-                path.moveTo(x, y);
-                mX = x;
-                mY = y;
-            } else {
-                float dx = Math.abs(x - mX);
-                float dy = Math.abs(y - mY);
-                if (dx >= GestureOverlay.TOUCH_TOLERANCE || dy >= GestureOverlay.TOUCH_TOLERANCE) {
-                    path.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
-                    mX = x;
-                    mY = y;
-                }
-            }
-        }
-        return path;
-    }
-
-    /**
-     * Save the gesture stroke as XML
-     * 
-     * @param namespace
-     * @param serializer
-     * @throws IOException
-     */
-    void toXML(String namespace, XmlSerializer serializer) throws IOException {
-        serializer.startTag(namespace, GestureConstants.XML_TAG_STROKE);
-        serializer.text(toString());
-        serializer.endTag(namespace, GestureConstants.XML_TAG_STROKE);
-    }
-
-    /**
-     * Create a gesture stroke from a string
-     * 
-     * @param str
-     * @return the gesture stroke
-     */
-    public static GestureStroke createFromString(String str) {
-        ArrayList<GesturePoint> points = new ArrayList<GesturePoint>(
-                GestureConstants.STROKE_POINT_BUFFER_SIZE);
-        int endIndex;
-        int startIndex = 0;
-        while ((endIndex = str.indexOf(GestureConstants.STRING_STROKE_DELIIMITER, startIndex + 1)) != -1) {
-
-            // parse x
-            String token = str.substring(startIndex, endIndex);
-            float x = Float.parseFloat(token);
-            startIndex = endIndex + 1;
-
-            // parse y
-            endIndex = str.indexOf(GestureConstants.STRING_STROKE_DELIIMITER, startIndex + 1);
-            token = str.substring(startIndex, endIndex);
-            float y = Float.parseFloat(token);
-            startIndex = endIndex + 1;
-
-            // parse t
-            endIndex = str.indexOf(GestureConstants.STRING_STROKE_DELIIMITER, startIndex + 1);
-            token = str.substring(startIndex, endIndex);
-            long time = Long.parseLong(token);
-            startIndex = endIndex + 1;
-
-            points.add(new GesturePoint(x, y, time));
-        }
-        return new GestureStroke(points);
-    }
-
-    /**
-     * Convert the stroke to string
-     */
-    @Override
-    public String toString() {
-        StringBuilder str = new StringBuilder(GestureConstants.STROKE_STRING_BUFFER_SIZE);
-        float[] xpts = xPoints;
-        float[] ypts = yPoints;
-        long[] times = timestamps;
-        int count = xpts.length;
-        for (int i = 0; i < count; i++) {
-            str.append(xpts[i] + GestureConstants.STRING_STROKE_DELIIMITER + ypts[i]
-                    + GestureConstants.STRING_STROKE_DELIIMITER + times[i]
-                    + GestureConstants.STRING_STROKE_DELIIMITER);
-        }
-        return str.toString();
-    }
-
-    /**
-     * Invalidate the cached path that is used for rendering the stroke
-     */
-    public void invalidate() {
-        mCachedPath = null;
-    }
-}
diff --git a/tests/sketch/src/com/android/gesture/GestureUtils.java b/tests/sketch/src/com/android/gesture/GestureUtils.java
deleted file mode 100755
index 7c3237a..0000000
--- a/tests/sketch/src/com/android/gesture/GestureUtils.java
+++ /dev/null
@@ -1,358 +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;
-
-import android.graphics.RectF;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-
-public class GestureUtils {
-
-    private static final int SEQUENCE_SAMPLE_SIZE = 16;
-
-    protected static float[] spatialFeaturize(Gesture gesture, int sampleSize) {
-        float[] sample = new float[sampleSize * sampleSize];
-        Arrays.fill(sample, 0);
-
-        RectF rect = gesture.getBoundingBox();
-        float sx = sampleSize / rect.width();
-        float sy = sampleSize / rect.height();
-        float scale = sx < sy ? sx : sy;
-        android.graphics.Matrix trans = new android.graphics.Matrix();
-        trans.setScale(scale, scale);
-        android.graphics.Matrix translate1 = new android.graphics.Matrix();
-        translate1.setTranslate(-rect.centerX(), -rect.centerY());
-        trans.preConcat(translate1);
-        android.graphics.Matrix translate2 = new android.graphics.Matrix();
-        translate2.setTranslate(sampleSize / 2, sampleSize / 2);
-        trans.postConcat(translate2);
-
-        ArrayList<GestureStroke> strokes = gesture.getStrokes();
-        int count = strokes.size();
-        int size;
-        for (int index = 0; index < count; index++) {
-            GestureStroke stroke = strokes.get(index);
-            float[] pts = sequentialFeaturize(stroke, SEQUENCE_SAMPLE_SIZE);
-            trans.mapPoints(pts);
-
-            size = pts.length;
-            for (int i = 0; i < size; i += 2) {
-                float x = pts[i];
-                int xFloor = (int) Math.floor(x);
-                int xCeiling = (int) Math.ceil(x);
-                float y = pts[i + 1];
-                int yFloor = (int) Math.floor(y);
-                int yCeiling = (int) Math.ceil(y);
-
-                if (yFloor >= 0 && yFloor < sampleSize && xFloor >= 0 && xFloor < sampleSize) {
-                    int pos = yFloor * sampleSize + xFloor;
-                    float value = (1 - x + xFloor) * (1 - y + yFloor);
-                    if (sample[pos] < value) {
-                        sample[pos] = value;
-                    }
-                }
-
-                if (yFloor >= 0 && yFloor < sampleSize && xCeiling >= 0 && xCeiling < sampleSize) {
-                    int pos = yFloor * sampleSize + xCeiling;
-                    float value = (1 - xCeiling + x) * (1 - y + yFloor);
-                    if (sample[pos] < value) {
-                        sample[pos] = value;
-                    }
-                }
-
-                if (yCeiling >= 0 && yCeiling < sampleSize && xFloor >= 0 && xFloor < sampleSize) {
-                    int pos = yCeiling * sampleSize + xFloor;
-                    float value = (1 - x + xFloor) * (1 - yCeiling + y);
-                    if (sample[pos] < value) {
-                        sample[pos] = value;
-                    }
-
-                }
-
-                if (yCeiling >= 0 && yCeiling < sampleSize && xCeiling >= 0
-                        && xCeiling < sampleSize) {
-                    int pos = yCeiling * sampleSize + xCeiling;
-                    float value = (1 - xCeiling + x) * (1 - yCeiling + y);
-                    if (sample[pos] < value) {
-                        sample[pos] = value;
-                    }
-                }
-            }
-        }
-
-        return sample;
-    }
-
-    /**
-     * Featurize a stroke into a vector of a given number of elements
-     * 
-     * @param stroke
-     * @param sampleSize
-     * @return a float array
-     */
-    protected static float[] sequentialFeaturize(GestureStroke stroke, int sampleSize) {
-        final float increment = stroke.length / (sampleSize - 1);
-        int vectorLength = sampleSize * 2;
-        float[] vector = new float[vectorLength];
-        float distanceSoFar = 0;
-        float[] xpts = stroke.xPoints;
-        float[] ypts = stroke.yPoints;
-        float lstPointX = xpts[0];
-        float lstPointY = ypts[0];
-        int index = 0;
-        float currentPointX = Float.MIN_VALUE;
-        float currentPointY = Float.MIN_VALUE;
-        vector[index] = lstPointX;
-        index++;
-        vector[index] = lstPointY;
-        index++;
-        int i = 0;
-        int count = xpts.length;
-        while (i < count) {
-            if (currentPointX == Float.MIN_VALUE) {
-                i++;
-                if (i >= count) {
-                    break;
-                }
-                currentPointX = xpts[i];
-                currentPointY = ypts[i];
-            }
-            float deltaX = currentPointX - lstPointX;
-            float deltaY = currentPointY - lstPointY;
-            float distance = (float) Math.sqrt(deltaX * deltaX + deltaY * deltaY);
-            if (distanceSoFar + distance >= increment) {
-                float ratio = (increment - distanceSoFar) / distance;
-                float nx = lstPointX + ratio * deltaX;
-                float ny = lstPointY + ratio * deltaY;
-                vector[index] = nx;
-                index++;
-                vector[index] = ny;
-                index++;
-                lstPointX = nx;
-                lstPointY = ny;
-                distanceSoFar = 0;
-            } else {
-                lstPointX = currentPointX;
-                lstPointY = currentPointY;
-                currentPointX = Float.MIN_VALUE;
-                currentPointY = Float.MIN_VALUE;
-                distanceSoFar += distance;
-            }
-        }
-
-        for (i = index; i < vectorLength; i += 2) {
-            vector[i] = lstPointX;
-            vector[i + 1] = lstPointY;
-        }
-        return vector;
-    }
-
-    /**
-     * Calculate the centroid 
-     * 
-     * @param points
-     * @return the centroid
-     */
-    public static float[] computeCentroid(float[] points) {
-        float centerX = 0;
-        float centerY = 0;
-        int count = points.length;
-        for (int i = 0; i < count; i++) {
-            centerX += points[i];
-            i++;
-            centerY += points[i];
-        }
-        float[] center = new float[2];
-        center[0] = 2 * centerX / count;
-        center[1] = 2 * centerY / count;
-
-        return center;
-    }
-
-    /**
-     * calculate the variance-covariance matrix, treat each point as a sample
-     * 
-     * @param points
-     * @return the covariance matrix
-     */
-    protected static double[][] computeCoVariance(float[] points) {
-        double[][] array = new double[2][2];
-        array[0][0] = 0;
-        array[0][1] = 0;
-        array[1][0] = 0;
-        array[1][1] = 0;
-        int count = points.length;
-        for (int i = 0; i < count; i++) {
-            float x = points[i];
-            i++;
-            float y = points[i];
-            array[0][0] += x * x;
-            array[0][1] += x * y;
-            array[1][0] = array[0][1];
-            array[1][1] += y * y;
-        }
-        array[0][0] /= (count / 2);
-        array[0][1] /= (count / 2);
-        array[1][0] /= (count / 2);
-        array[1][1] /= (count / 2);
-
-        return array;
-    }
-
-    public static float computeTotalLength(float[] points) {
-        float sum = 0;
-        int count = points.length - 4;
-        for (int i = 0; i < count; i += 2) {
-            float dx = points[i + 2] - points[i];
-            float dy = points[i + 3] - points[i + 1];
-            sum += Math.sqrt(dx * dx + dy * dy);
-        }
-        return sum;
-    }
-
-    public static double computeStraightness(float[] points) {
-        float totalLen = computeTotalLength(points);
-        float dx = points[2] - points[0];
-        float dy = points[3] - points[1];
-        return Math.sqrt(dx * dx + dy * dy) / totalLen;
-    }
-
-    public static double computeStraightness(float[] points, float totalLen) {
-        float dx = points[2] - points[0];
-        float dy = points[3] - points[1];
-        return Math.sqrt(dx * dx + dy * dy) / totalLen;
-    }
-
-    /**
-     * Calculate the squared Euclidean distance between two vectors
-     * 
-     * @param vector1
-     * @param vector2
-     * @return the distance
-     */
-    protected static double euclideanDistance(float[] vector1, float[] vector2) {
-        double squaredDistance = 0;
-        int size = vector1.length;
-        for (int i = 0; i < size; i++) {
-            float difference = vector1[i] - vector2[i];
-            squaredDistance += difference * difference;
-        }
-        return squaredDistance / size;
-    }
-
-    /**
-     * Calculate the cosine distance between two instances
-     * 
-     * @param in1
-     * @param in2
-     * @return the distance between 0 and Math.PI
-     */
-    protected static double cosineDistance(Instance in1, Instance in2) {
-        float sum = 0;
-        float[] vector1 = in1.vector;
-        float[] vector2 = in2.vector;
-        int len = vector1.length;
-        for (int i = 0; i < len; i++) {
-            sum += vector1[i] * vector2[i];
-        }
-        return Math.acos(sum / (in1.magnitude * in2.magnitude));
-    }
-
-    public static OrientedBoundingBox computeOrientedBBX(ArrayList<GesturePoint> pts) {
-        GestureStroke stroke = new GestureStroke(pts);
-        float[] points = sequentialFeaturize(stroke, SEQUENCE_SAMPLE_SIZE);
-        return computeOrientedBBX(points);
-    }
-
-    public static OrientedBoundingBox computeOrientedBBX(float[] points) {
-        float[] meanVector = computeCentroid(points);
-        return computeOrientedBBX(points, meanVector);
-    }
-
-    public static OrientedBoundingBox computeOrientedBBX(float[] points, float[] centroid) {
-
-        android.graphics.Matrix tr = new android.graphics.Matrix();
-        tr.setTranslate(-centroid[0], -centroid[1]);
-        tr.mapPoints(points);
-
-        double[][] array = computeCoVariance(points);
-        double[] targetVector = computeOrientation(array);
-
-        float angle;
-        if (targetVector[0] == 0 && targetVector[1] == 0) {
-            angle = -90;
-        } else { // -PI<alpha<PI
-            angle = (float) Math.atan2(targetVector[1], targetVector[0]);
-            angle = (float) (180 * angle / Math.PI);
-            android.graphics.Matrix trans = new android.graphics.Matrix();
-            trans.setRotate(-angle);
-            trans.mapPoints(points);
-        }
-
-        float minx = Float.MAX_VALUE;
-        float miny = Float.MAX_VALUE;
-        float maxx = Float.MIN_VALUE;
-        float maxy = Float.MIN_VALUE;
-        int count = points.length;
-        for (int i = 0; i < count; i++) {
-            if (points[i] < minx) {
-                minx = points[i];
-            }
-            if (points[i] > maxx) {
-                maxx = points[i];
-            }
-            i++;
-            if (points[i] < miny) {
-                miny = points[i];
-            }
-            if (points[i] > maxy) {
-                maxy = points[i];
-            }
-        }
-
-        OrientedBoundingBox bbx = new OrientedBoundingBox(angle, centroid[0], centroid[1], maxx
-                - minx, maxy - miny);
-        return bbx;
-    }
-
-    private static double[] computeOrientation(double[][] covarianceMatrix) {
-        double[] targetVector = new double[2];
-        if (covarianceMatrix[0][1] == 0 || covarianceMatrix[1][0] == 0) {
-            targetVector[0] = 1;
-            targetVector[1] = 0;
-        }
-
-        // lamda^2 + a * lamda + b = 0
-        double a = -covarianceMatrix[0][0] - covarianceMatrix[1][1];
-        double b = covarianceMatrix[0][0] * covarianceMatrix[1][1] - covarianceMatrix[0][1]
-                * covarianceMatrix[1][0];
-        double value = a / 2;
-        double rightside = Math.sqrt(Math.pow(value, 2) - b);
-        double lambda1 = -value + rightside;
-        double lambda2 = -value - rightside;
-        if (lambda1 == lambda2) {
-            targetVector[0] = 0;
-            targetVector[1] = 0;
-        } else {
-            double lambda = lambda1 > lambda2 ? lambda1 : lambda2;
-            targetVector[0] = 1;
-            targetVector[1] = (lambda - covarianceMatrix[0][0]) / covarianceMatrix[0][1];
-        }
-        return targetVector;
-    }
-}
diff --git a/tests/sketch/src/com/android/gesture/Instance.java b/tests/sketch/src/com/android/gesture/Instance.java
deleted file mode 100755
index 4eb10f9..0000000
--- a/tests/sketch/src/com/android/gesture/Instance.java
+++ /dev/null
@@ -1,106 +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;
-
-/**
- * An instance represents a sample if the label is available or a query if the
- * label is null.
- */
-public class Instance {
-
-    private static final int SEQUENCE_SAMPLE_SIZE = 16;
-
-    private static final int PATCH_SAMPLE_SIZE = 8;
-
-    private final static float[] ORIENTATIONS = {
-            0, 45, 90, 135, 180, -0, -45, -90, -135, -180
-    };
-
-    // the feature vector
-    public final float[] vector;
-
-    // the label can be null
-    public final String label;
-
-    // the length of the vector
-    public final float magnitude;
-
-    // the id of the instance
-    public final long instanceID;
-
-    private Instance(long id, float[] sample, String sampleName) {
-        instanceID = id;
-        vector = sample;
-        label = sampleName;
-        float sum = 0;
-        int size = sample.length;
-        for (int i = 0; i < size; i++) {
-            sum += sample[i] * sample[i];
-        }
-        magnitude = (float) Math.sqrt(sum);
-    }
-
-    /**
-     * create a learning instance for a single stroke gesture
-     * 
-     * @param gesture
-     * @param label
-     * @return the instance
-     */
-    public static Instance createInstance(GestureLibrary gesturelib, Gesture gesture, String label) {
-        float[] pts;
-        if (gesturelib.getGestureType() == GestureLibrary.SEQUENCE_SENSITIVE) {
-            pts = sequenceSampler(gesturelib, gesture);
-        } else {
-            pts = spatialSampler(gesture);
-        }
-        return new Instance(gesture.getID(), pts, label);
-    }
-
-    private static float[] spatialSampler(Gesture gesture) {
-        float[] pts = GestureUtils.spatialFeaturize(gesture, PATCH_SAMPLE_SIZE);
-        return pts;
-    }
-
-    private static float[] sequenceSampler(GestureLibrary gesturelib, Gesture gesture) {
-        float[] pts = GestureUtils.sequentialFeaturize(gesture.getStrokes().get(0),
-                SEQUENCE_SAMPLE_SIZE);
-        float[] center = GestureUtils.computeCentroid(pts);
-        float orientation = (float) Math.atan2(pts[1] - center[1], pts[0] - center[0]);
-        orientation *= 180 / Math.PI;
-
-        float adjustment = -orientation;
-        if (gesturelib.getOrientationStyle() == GestureLibrary.ORIENTATION_SENSITIVE) {
-            int count = ORIENTATIONS.length;
-            for (int i = 0; i < count; i++) {
-                float delta = ORIENTATIONS[i] - orientation;
-                if (Math.abs(delta) < Math.abs(adjustment)) {
-                    adjustment = delta;
-                }
-            }
-        }
-
-        android.graphics.Matrix m = new android.graphics.Matrix();
-        m.setTranslate(-center[0], -center[1]);
-        android.graphics.Matrix rotation = new android.graphics.Matrix();
-        rotation.setRotate(adjustment);
-        m.postConcat(rotation);
-        m.mapPoints(pts);
-        return pts;
-    }
-
-}
diff --git a/tests/sketch/src/com/android/gesture/InstanceLearner.java b/tests/sketch/src/com/android/gesture/InstanceLearner.java
deleted file mode 100644
index 3bd875b..0000000
--- a/tests/sketch/src/com/android/gesture/InstanceLearner.java
+++ /dev/null
@@ -1,105 +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;
-
-import android.util.Config;
-import android.util.Log;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.TreeMap;
-
-/**
- * An implementation of an instance-based learner
- */
-
-class InstanceLearner extends Learner {
-
-    private static final String LOGTAG = "InstanceLearner";
-
-    @Override
-    ArrayList<Prediction> classify(GestureLibrary lib, Instance instance) {
-        ArrayList<Prediction> predictions = new ArrayList<Prediction>();
-        ArrayList<Instance> instances = getInstances();
-        int count = instances.size();
-        TreeMap<String, Double> label2score = new TreeMap<String, Double>();
-        for (int i = 0; i < count; i++) {
-            Instance sample = instances.get(i);
-            if (sample.vector.length != instance.vector.length) {
-                continue;
-            }
-            double distance;
-            if (lib.getGestureType() == GestureLibrary.SEQUENCE_SENSITIVE) {
-                distance = GestureUtils.cosineDistance(sample, instance);
-            } else {
-                distance = GestureUtils.euclideanDistance(sample.vector, instance.vector);
-            }
-            double weight;
-            if (distance == 0) {
-                weight = Double.MAX_VALUE;
-            } else {
-                weight = 1 / distance;
-            }
-            Double score = label2score.get(sample.label);
-            if (score == null || weight > score) {
-                label2score.put(sample.label, weight);
-            }
-        }
-
-        double sum = 0;
-        Iterator<String> lableIterator = label2score.keySet().iterator();
-        while (lableIterator.hasNext()) {
-            String name = lableIterator.next();
-            double score = label2score.get(name);
-            sum += score;
-            predictions.add(new Prediction(name, score));
-        }
-
-        // normalize
-        Iterator<Prediction> predictionIterator = predictions.iterator();
-        while (predictionIterator.hasNext()) {
-            Prediction name = predictionIterator.next();
-            name.predictionScore /= sum;
-        }
-
-        Collections.sort(predictions, new Comparator<Prediction>() {
-            public int compare(Prediction object1, Prediction object2) {
-                double score1 = object1.predictionScore;
-                double score2 = object2.predictionScore;
-                if (score1 > score2) {
-                    return -1;
-                } else if (score1 < score2) {
-                    return 1;
-                } else {
-                    return 0;
-                }
-            }
-        });
-
-        if (Config.DEBUG) {
-            predictionIterator = predictions.iterator();
-            while (predictionIterator.hasNext()) {
-                Prediction name = predictionIterator.next();
-                Log.v(LOGTAG, "prediction [" + name.gestureName + " = " + name.predictionScore + "]");
-            }
-        }
-
-        return predictions;
-    }
-}
diff --git a/tests/sketch/src/com/android/gesture/Learner.java b/tests/sketch/src/com/android/gesture/Learner.java
deleted file mode 100755
index 63f3156..0000000
--- a/tests/sketch/src/com/android/gesture/Learner.java
+++ /dev/null
@@ -1,82 +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;
-
-import java.util.ArrayList;
-
-/**
- * The abstract class of a gesture learner
- */
-abstract class Learner {
-
-    private final ArrayList<Instance> mInstances = new ArrayList<Instance>();
-
-    /**
-     * Add an instance to the learner
-     * 
-     * @param instance
-     */
-    void addInstance(Instance instance) {
-        mInstances.add(instance);
-    }
-
-    /**
-     * Retrieve all the instances
-     * 
-     * @return instances
-     */
-    ArrayList<Instance> getInstances() {
-        return mInstances;
-    }
-
-    /**
-     * Remove an instance based on its id
-     * 
-     * @param id
-     */
-    void removeInstance(long id) {
-        ArrayList<Instance> instances = mInstances;
-        int count = instances.size();
-        for (int i = 0; i < count; i++) {
-            Instance instance = instances.get(i);
-            if (id == instance.instanceID) {
-                instances.remove(instance);
-                return;
-            }
-        }
-    }
-
-    /**
-     * Remove all the instances of a category
-     * 
-     * @param name the category name
-     */
-    void removeInstances(String name) {
-        ArrayList<Instance> toDelete = new ArrayList<Instance>();
-        ArrayList<Instance> instances = mInstances;
-        int count = instances.size();
-        for (int i = 0; i < count; i++) {
-            Instance instance = instances.get(i);
-            if (instance.label.equals(name)) {
-                toDelete.add(instance);
-            }
-        }
-        mInstances.removeAll(toDelete);
-    }
-
-    abstract ArrayList<Prediction> classify(GestureLibrary library, Instance instance);
-}
diff --git a/tests/sketch/src/com/android/gesture/OrientedBoundingBox.java b/tests/sketch/src/com/android/gesture/OrientedBoundingBox.java
deleted file mode 100644
index fe1984c..0000000
--- a/tests/sketch/src/com/android/gesture/OrientedBoundingBox.java
+++ /dev/null
@@ -1,81 +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;
-
-import android.graphics.Matrix;
-import android.graphics.Path;
-
-/**
- * An oriented bounding box
- */
-public class OrientedBoundingBox {
-
-    public final float squareness;
-
-    public final float width;
-    public final float height;
-
-    public final float orientation; // -PI<alpha<PI
-
-    public final float centerX;
-    public final float centerY;
-
-    OrientedBoundingBox(float angle, float cx, float cy, float w, float h) {
-        orientation = angle;
-        width = w;
-        height = h;
-        centerX = cx;
-        centerY = cy;
-        float ratio = w / h;
-        if (ratio > 1) {
-            squareness = 1 / ratio;
-        } else {
-            squareness = ratio;
-        }
-    }
-
-    public Path toPath() {
-        Path path = new Path();
-        float[] point = new float[2];
-        point[0] = -width / 2;
-        point[1] = height / 2;
-        Matrix matrix = new Matrix();
-        matrix.setRotate(orientation);
-        matrix.postTranslate(centerX, centerY);
-        matrix.mapPoints(point);
-        path.moveTo(point[0], point[1]);
-
-        point[0] = -width / 2;
-        point[1] = -height / 2;
-        matrix.mapPoints(point);
-        path.lineTo(point[0], point[1]);
-
-        point[0] = width / 2;
-        point[1] = -height / 2;
-        matrix.mapPoints(point);
-        path.lineTo(point[0], point[1]);
-
-        point[0] = width / 2;
-        point[1] = height / 2;
-        matrix.mapPoints(point);
-        path.lineTo(point[0], point[1]);
-
-        path.close();
-
-        return path;
-    }
-}
diff --git a/tests/sketch/src/com/android/gesture/Prediction.java b/tests/sketch/src/com/android/gesture/Prediction.java
deleted file mode 100755
index 60cca8b..0000000
--- a/tests/sketch/src/com/android/gesture/Prediction.java
+++ /dev/null
@@ -1,33 +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;
-
-public class Prediction {
-    public final String gestureName;
-
-    public double predictionScore;
-
-    Prediction(String label, double score) {
-        gestureName = label;
-        predictionScore = score;
-    }
-
-    @Override
-    public String toString() {
-        return gestureName;
-    }
-}
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 50d349a..0000000
--- a/tests/sketch/src/com/android/gesture/example/ContactListGestureOverlay.java
+++ /dev/null
@@ -1,122 +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.os.Environment;
-import android.provider.Contacts.People;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.widget.AdapterView;
-import android.widget.ListView;
-
-import com.android.gesture.Gesture;
-import com.android.gesture.GestureActionListener;
-import com.android.gesture.GestureProcessor;
-import com.android.gesture.GestureLibrary;
-import com.android.gesture.GestureOverlay;
-import com.android.gesture.Prediction;
-
-import java.io.File;
-import java.util.ArrayList;
-
-public class ContactListGestureOverlay extends Activity {
-
-    static final String GESTURE_FILE_NAME = Environment.getExternalStorageDirectory().getAbsolutePath()
-            + File.separator + "gestureOverlay.xml";
-
-    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 GestureOverlay mOverlay;
-
-    private ContactAdapter mContactAdapter;
-
-    private GestureProcessor mGestureProcessor;
-
-    private GestureLibrary mLibrary;
-
-    private ListView mContactList;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
-        setContentView(R.layout.overlaydemo);
-
-        setProgressBarIndeterminateVisibility(true);
-
-        // load the gesture library
-        mLibrary = new GestureLibrary(GESTURE_FILE_NAME);
-        mLibrary.load();
-
-        // load the contact list
-        mContactList = (ListView)this.findViewById(R.id.list);
-        registerForContextMenu(mContactList);
-        mContactList.setTextFilterEnabled(true);
-        mContactList.setVerticalScrollBarEnabled(true);
-        mContactList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
-            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
-                if (!mGestureProcessor.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);
-
-        setProgressBarIndeterminateVisibility(false);
-
-        // add a gesture overlay on top of the ListView
-        mOverlay = new GestureOverlay(this);
-        mGestureProcessor = new GestureProcessor(mContactList);
-        mGestureProcessor.addGestureActionListener(new GestureActionListener() {
-            public void onGesturePerformed(GestureOverlay overlay, Gesture gesture) {
-                ArrayList<Prediction> predictions = mLibrary.recognize(gesture);
-                if (!predictions.isEmpty()) {
-                    int index = mContactAdapter.search(predictions.get(0).gestureName);
-                    if (index != -1) {
-                        mContactList.setSelection(index);
-                    }
-                }
-            }
-        });
-        mOverlay.addGestureListener(mGestureProcessor);
-        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
-                ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
-        this.addContentView(mOverlay, params);
-    }
-}
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 6a54b49..0000000
--- a/tests/sketch/src/com/android/gesture/example/GestureEntry.java
+++ /dev/null
@@ -1,209 +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.view.View.OnClickListener;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.Spinner;
-import android.widget.AdapterView.OnItemSelectedListener;
-
-import com.android.gesture.Gesture;
-import com.android.gesture.GestureLibrary;
-import com.android.gesture.GestureListener;
-import com.android.gesture.GestureOverlay;
-import com.android.gesture.Prediction;
-
-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 + "gestureEntry.xml";
-
-    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 GestureOverlay mGesturePad;
-
-    private Spinner mRecognitionResult;
-
-    private GestureLibrary mGestureLibrary;
-
-    private boolean mChangedByRecognizer = false;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.demo);
-
-        // init the gesture library
-        mGestureLibrary = new GestureLibrary(GESTURE_FILE_NAME);
-        mGestureLibrary.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) {
-                    mGestureLibrary.addGesture(parent.getSelectedItem().toString(), mGesturePad
-                            .getCurrentGesture());
-                } else {
-                    mChangedByRecognizer = false;
-                }
-            }
-
-            public void onNothingSelected(AdapterView<?> parent) {
-
-            }
-
-        });
-
-        // create the area for drawing a gesture
-        mGesturePad = (GestureOverlay) findViewById(R.id.drawingpad);
-        mGesturePad.setBackgroundColor(Color.BLACK);
-        mGesturePad.addGestureListener(new GestureListener() {
-            public void onFinishGesture(GestureOverlay pad, MotionEvent event) {
-                recognize(pad.getCurrentGesture());
-                pad.clear(true);
-            }
-
-            public void onGesture(GestureOverlay pad, MotionEvent event) {
-            }
-
-            public void onStartGesture(GestureOverlay pad, MotionEvent event) {
-            }
-        });
-
-        if (savedInstanceState != null) {
-            Gesture g = (Gesture) savedInstanceState.getParcelable(PARCEL_KEY);
-            if (g != null) {
-                mGesturePad.setCurrentGesture(g);
-            }
-        }
-    }
-
-    @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) {
-                            mGestureLibrary.addGesture(text, mGesturePad.getCurrentGesture());
-                        }
-                    }
-                }).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.getCurrentGesture() != 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) {
-        mGestureLibrary.load();
-        mGesturePad.clear(false);
-    }
-
-    @Override
-    protected void onPause() {
-        super.onPause();
-        mGestureLibrary.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.getCurrentGesture();
-        if (gesture != null) {
-            outState.putParcelable(PARCEL_KEY, gesture);
-        }
-        mGestureLibrary.save();
-    }
-
-    private void recognize(Gesture ink) {
-        mChangedByRecognizer = true;
-        ArrayList<Prediction> predictions = mGestureLibrary.recognize(ink);
-        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/GestureEntryDemo.java b/tests/sketch/src/com/android/gesture/example/GestureEntryDemo.java
old mode 100644
new mode 100755
index 52a2ba8..8fee21a
--- a/tests/sketch/src/com/android/gesture/example/GestureEntryDemo.java
+++ b/tests/sketch/src/com/android/gesture/example/GestureEntryDemo.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2008 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.
@@ -21,34 +21,29 @@
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.graphics.Color;
 import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
-import android.view.View.OnClickListener;
 import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
-import android.widget.Button;
 import android.widget.EditText;
 import android.widget.Spinner;
 import android.widget.AdapterView.OnItemSelectedListener;
 
 import com.android.gesture.Gesture;
-import com.android.gesture.GestureLibrary;
+import com.android.gesture.GestureLib;
 import com.android.gesture.GestureListener;
 import com.android.gesture.GesturePad;
-import com.android.gesture.Prediction;
+import com.android.gesture.R;
+import com.android.gesture.recognizer.Prediction;
 
 import java.util.ArrayList;
 
 /**
  * The demo shows how to construct a gesture-based user interface on Android.
- * 
- * @author liyang@google.com (Yang Li)
- *
  */
 
 public class GestureEntryDemo extends Activity {
@@ -57,35 +52,31 @@
     private static final int NEW_ID = Menu.FIRST;
     private static final int VIEW_ID = Menu.FIRST + 1;
 
-    private GesturePad mGesturePad;
-    private Spinner mRecognitionResult;
-    private GestureLibrary mGestureLibrary;
-    private boolean mChangedByRecognizer = false;
+    GesturePad  mView;
+    Spinner     mResult;
+    GestureLib  mRecognizer;
+    boolean     mChangedByRecognizer = false;
     
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.demo);
         
-        // init the gesture library
-        mGestureLibrary = new GestureLibrary(
-            "/sdcard/gestureentry/gestures.xml");
-        mGestureLibrary.load();
+        // init the recognizer
+        mRecognizer = new GestureLib("/sdcard/gestureentry");
+        mRecognizer.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() {
+        mResult = (Spinner) findViewById(R.id.spinner);
+        mResult.setOnItemSelectedListener(new OnItemSelectedListener() {
 
-            public void onItemSelected(
-                AdapterView<?> parent, View view, int position, long id) {
+            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                 // TODO Auto-generated method stub
                 // correct the recognition result by adding the new example
                 if (mChangedByRecognizer == false) {
-                    mGestureLibrary.addGesture(
-                        parent.getSelectedItem().toString(), 
-                        mGesturePad.getCurrentGesture());
+                    mRecognizer.addGesture(parent.getSelectedItem().toString(), 
+                      mView.getCurrentGesture());
                 } else {
                     mChangedByRecognizer = false;
                 }
@@ -99,35 +90,28 @@
         });
         
         // create the area for drawing a gesture
-        mGesturePad = (GesturePad)this.findViewById(R.id.drawingpad);
-        mGesturePad.setBackgroundColor(Color.BLACK);
-        mGesturePad.addGestureListener(new GestureListener() {
-            public void onFinishGesture(GesturePad pad, MotionEvent event) {
+        mView = (GesturePad)this.findViewById(R.id.drawingpad);
+        mView.cacheGesture(false);
+        mView.setFadingOut(false);
+        mView.addGestureListener(new GestureListener() {
+            public void onFinishGesture(GesturePad patch, MotionEvent event) {
                 // TODO Auto-generated method stub
-                recognize(pad.getCurrentGesture());
+                recognize(patch.getCurrentGesture());
             }
-            public void onGesture(GesturePad pad, MotionEvent event) {
+            public void onGesture(GesturePad patch, MotionEvent event) {
               // TODO Auto-generated method stub
+              
             }
-            public void onStartGesture(GesturePad pad, MotionEvent event) {
-                // TODO Auto-generated method stub
+            public void onStartGesture(GesturePad patch, MotionEvent event) {
+              // TODO Auto-generated method stub
+              
             }
         });
         
-        Button clear = (Button)this.findViewById(R.id.clear);
-        clear.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                // TODO Auto-generated method stub
-                mGesturePad.clear(false);
-                mGesturePad.invalidate();
-            }
-        });
         
         if (savedInstanceState != null) {
-            Gesture g = (Gesture)savedInstanceState.getParcelable("gesture");
-            if (g != null) {
-                mGesturePad.setCurrentGesture(g);
-            }
+            mView.setCurrentGesture(
+                (Gesture)savedInstanceState.getParcelable("gesture"));
         }
     }
     
@@ -145,12 +129,10 @@
                 public void onClick(DialogInterface dialog, int whichButton) {
                     /* User clicked OK so do some stuff */
                     EditText edittext =
-                      (EditText)((AlertDialog)dialog).findViewById(
-                          R.id.gesturename_edit);
+                      (EditText)((AlertDialog)dialog).findViewById(R.id.gesturename_edit);
                     String text = edittext.getText().toString().trim();
                     if (text.length() > 0) {
-                        mGestureLibrary.addGesture(
-                            text, mGesturePad.getCurrentGesture());
+                        mRecognizer.addGesture(text, mView.getCurrentGesture());
                     }
                 }
             })
@@ -182,7 +164,7 @@
         switch (item.getItemId()) {
             case NEW_ID:
                 // if there has been a gesture on the canvas
-                if (mGesturePad.getCurrentGesture() != null) {
+                if (mView.getCurrentGesture() != null) {
                     showDialog(DIALOG_NEW_ENTRY);
                 }
                 break;
@@ -198,17 +180,16 @@
     
     
     @Override
-    protected void onActivityResult(
-        int requestCode, int resultCode, Intent data) {
-        mGestureLibrary.load();
-        mGesturePad.clear(false);
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        mRecognizer.load();
+        mView.clear();
     }
     
     @Override
     protected void onPause() {
         // TODO Auto-generated method stub
         super.onPause();
-        mGestureLibrary.save();
+        mRecognizer.save();
     }
     
     
@@ -222,20 +203,18 @@
     protected void onSaveInstanceState(Bundle outState) {
         // TODO Auto-generated method stub
         super.onSaveInstanceState(outState);
-        Gesture gesture = mGesturePad.getCurrentGesture();
-        if (gesture != null)
-            outState.putParcelable("gesture", gesture);
-        mGestureLibrary.save();
+        outState.putParcelable("gesture", mView.getCurrentGesture());
+        mRecognizer.save();
     }
 
     public void recognize(Gesture ink) {
         mChangedByRecognizer = true;
-        ArrayList<Prediction> predictions = mGestureLibrary.recognize(ink);
-        ArrayAdapter<Prediction> adapter = new ArrayAdapter<Prediction>(this, 
+        ArrayList<Prediction> predictions = mRecognizer.recognize(ink);
+        ArrayAdapter adapter = new ArrayAdapter(this, 
                     android.R.layout.simple_spinner_item, predictions);
         adapter.setDropDownViewResource(
                     android.R.layout.simple_spinner_dropdown_item);
-        mRecognitionResult.setAdapter(adapter);
+        mResult.setAdapter(adapter);
     }
 
 }
diff --git a/tests/sketch/src/com/android/gesture/example/GestureLibViewer.java b/tests/sketch/src/com/android/gesture/example/GestureLibViewer.java
old mode 100644
new mode 100755
index ca54110..7ae7fc5
--- a/tests/sketch/src/com/android/gesture/example/GestureLibViewer.java
+++ b/tests/sketch/src/com/android/gesture/example/GestureLibViewer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008-2009 The Android Open Source Project
+ * Copyright (C) 2008 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.
@@ -17,6 +17,8 @@
 package com.android.gesture.example;
 
 import android.app.Activity;
+import android.graphics.Matrix;
+import android.graphics.Path;
 import android.os.Bundle;
 import android.view.KeyEvent;
 import android.view.View;
@@ -28,156 +30,228 @@
 import android.widget.AdapterView.OnItemSelectedListener;
 
 import com.android.gesture.Gesture;
-import com.android.gesture.GestureLibrary;
-import com.android.gesture.GestureOverlay;
+import com.android.gesture.GestureLib;
+import com.android.gesture.GesturePad;
+import com.android.gesture.R;
+import com.android.gesture.recognizer.Instance;
 
 import java.util.ArrayList;
 import java.util.Collections;
 
 /**
- * GestureLibViewer gives an example on how to browse existing gestures and
+ * GestureLibViewer is for viewing existing gestures and 
  * removing unwanted gestures.
  */
 
-public class GestureLibViewer extends Activity {
-
-    private GestureOverlay mGesturePad;
-
-    private Spinner mGestureCategory;
-
-    private GestureLibrary mGesureLibrary;
-
-    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);
-            mGesureLibrary.removeGesture(name, gesture);
-
-            mGestures = mGesureLibrary.getGestures(name);
-
-            if (mGestures == null) {
-                // delete the entire entry
-                mCurrentGestureIndex = 0;
-                ArrayList<String> list = new ArrayList<String>();
-                list.addAll(mGesureLibrary.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.setCurrentGesture(gesture);
-                mGesturePad.invalidate();
-            }
-        }
-    }
+public class GestureLibViewer  extends Activity {
+  
+    GesturePad          mView;
+    Spinner             mResult;
+    GestureLib          mRecognizer;
+    ArrayList<Gesture>  mSamples;
+    int                 mCurrentGestureIndex;
     
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.gestureviewer);
+        
+        // create the area for drawing a glyph
+        mView = (GesturePad)this.findViewById(R.id.drawingpad);
+        mView.cacheGesture(false);
+        mView.setFadingOut(false);
+        mView.setEnableInput(false);
+        
+        // init the recognizer
+        mRecognizer = new GestureLib("/sdcard/gestureentry");
+        mRecognizer.load();
 
-        // create the area for drawing a gesture
-        mGesturePad = (GestureOverlay) findViewById(R.id.drawingpad);
-        mGesturePad.setEnabled(false);
-
-        // init the gesture library
-        mGesureLibrary = new GestureLibrary(GestureEntry.GESTURE_FILE_NAME);
-        mGesureLibrary.load();
-
-        mGestureCategory = (Spinner) findViewById(R.id.spinner);
+        mResult = (Spinner) findViewById(R.id.spinner);
         ArrayList<String> list = new ArrayList<String>();
-        if (!mGesureLibrary.getGestureEntries().isEmpty()) {
-            list.addAll(mGesureLibrary.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 = mGesureLibrary.getGestures(list.get(0));
+        list.addAll(mRecognizer.getLabels());
+        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);
+        mResult.setAdapter(adapter);
+        mSamples = mRecognizer.getGestures(list.get(0));
+        if (mSamples.isEmpty() == false) {
             mCurrentGestureIndex = 0;
-            Gesture gesture = mGestures.get(mCurrentGestureIndex);
-            mGesturePad.setCurrentGesture(gesture);
+            Gesture gesture = mSamples.get(mCurrentGestureIndex);
+            mView.setCurrentGesture(gesture);
+            mView.clearDebugPath();
+            mView.addDebugPath(
+                toPath(mRecognizer.getClassifier().getInstance(gesture.getID())));
         }
-
-        mGestureCategory.setOnItemSelectedListener(new OnItemSelectedListener() {
+        
+        mResult.setOnItemSelectedListener(new OnItemSelectedListener() {
             public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-                mGestures = mGesureLibrary.getGestures((String) mGestureCategory.getSelectedItem());
-                if (!mGestures.isEmpty()) {
+                // TODO Auto-generated method stub
+                mSamples = mRecognizer.getGestures(
+                    (String)mResult.getSelectedItem());
+                if (mSamples.isEmpty() == false) {
                     mCurrentGestureIndex = 0;
-                    Gesture gesture = mGestures.get(mCurrentGestureIndex);
-                    mGesturePad.setCurrentGesture(gesture);
+                    Gesture gesture = mSamples.get(mCurrentGestureIndex);
+                    mView.setCurrentGesture(gesture);
+                    mView.clearDebugPath();
+                    mView.addDebugPath(
+                        toPath(mRecognizer.getClassifier().getInstance(gesture.getID())));
                 }
-                mGesturePad.invalidate();
+                mView.invalidate();
             }
-
+  
             public void onNothingSelected(AdapterView<?> parent) {
+              // TODO Auto-generated method stub
+              
             }
-
+          
         });
-
-        Button remove = (Button) findViewById(R.id.remove);
-        remove.setOnClickListener(new RemoveGestureListener());
-
-        Button next = (Button) findViewById(R.id.next);
+        
+        Button remove = (Button)this.findViewById(R.id.remove);
+        remove.setOnClickListener(new OnClickListener() {
+            public void onClick(View v) {
+                // TODO Auto-generated method stub
+                if (mSamples.isEmpty())
+                    return;
+                
+                String name = (String)mResult.getSelectedItem();
+                Gesture gesture = mSamples.get(mCurrentGestureIndex);
+                mRecognizer.removeGesture(name, gesture);
+                
+                mSamples = mRecognizer.getGestures(name);
+                
+                if (mSamples == null) {
+                    // delete the entire entry
+                    mCurrentGestureIndex = 0;
+                    ArrayList<String> list = new ArrayList<String>();
+                    list.addAll(mRecognizer.getLabels());
+                    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);
+                    mResult.setAdapter(adapter);
+                } else {
+                    if (mCurrentGestureIndex > mSamples.size()-1) {
+                        mCurrentGestureIndex--;
+                    }
+                    gesture = mSamples.get(mCurrentGestureIndex);
+                    mView.setCurrentGesture(gesture);
+                    mView.clearDebugPath();
+                    mView.addDebugPath(
+                        toPath(mRecognizer.getClassifier().getInstance(gesture.getID())));
+                    mView.invalidate();
+                }
+            }
+        });
+        
+        Button next = (Button)this.findViewById(R.id.next);
         next.setOnClickListener(new OnClickListener() {
             public void onClick(View v) {
-                if (mCurrentGestureIndex >= mGestures.size() - 1) {
+                // TODO Auto-generated method stub
+                if (mCurrentGestureIndex >= mSamples.size()-1)
                     return;
-                }
+                
                 mCurrentGestureIndex++;
-                Gesture gesture = mGestures.get(mCurrentGestureIndex);
-                mGesturePad.setCurrentGesture(gesture);
-                mGesturePad.invalidate();
+                Gesture gesture = mSamples.get(mCurrentGestureIndex);
+                mView.setCurrentGesture(gesture);
+                mView.clearDebugPath();
+                mView.addDebugPath(
+                    toPath(mRecognizer.getClassifier().getInstance(gesture.getID())));
+                mView.invalidate();
             }
         });
 
-        Button previous = (Button) findViewById(R.id.previous);
+        Button previous = (Button)this.findViewById(R.id.previous);
         previous.setOnClickListener(new OnClickListener() {
             public void onClick(View v) {
-                if (mCurrentGestureIndex >= 1 && !mGestures.isEmpty()) {
+                // TODO Auto-generated method stub
+                if (mCurrentGestureIndex >= 1 &&
+                    mSamples.isEmpty() == false) {
                     mCurrentGestureIndex--;
-                    Gesture gesture = mGestures.get(mCurrentGestureIndex);
-                    mGesturePad.setCurrentGesture(gesture);
-                    mGesturePad.invalidate();
+                    Gesture gesture = mSamples.get(mCurrentGestureIndex);
+                    mView.setCurrentGesture(gesture);
+                    mView.clearDebugPath();
+                    mView.addDebugPath(
+                        toPath(mRecognizer.getClassifier().getInstance(gesture.getID())));
+                    mView.invalidate();
                 }
             }
         });
     }
-
+    
+    public static ArrayList<Path> toPath(Instance instance) {
+        ArrayList<Path> paths = new ArrayList();
+        Path path = null;
+        float minx = 0, miny = 0;
+        float mX = 0, mY = 0;
+        for (int i=0; i<instance.vector.length; i+=2) {
+            float x = instance.vector[i];
+            float y = instance.vector[i+1];
+            if (x < minx)
+                minx = x;
+            if (y < miny)
+                miny = y;
+            if (path == null) {
+              path = new Path();
+              path.moveTo(x, y);
+              mX = x;
+              mY = y;
+            } else {
+              float dx = Math.abs(x - mX);
+              float dy = Math.abs(y - mY);
+              if (dx >= 3 || dy >= 3) {
+                  path.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
+                  mX = x;
+                  mY = y;
+              }
+            }
+        }
+        Matrix matrix = new Matrix();
+        matrix.setTranslate(-minx + 10, -miny + 10);
+        path.transform(matrix);
+        paths.add(path);
+        
+        path = new Path();
+        path.moveTo(instance.vector[0]-5, instance.vector[1]-5);
+        path.lineTo(instance.vector[0]-5, instance.vector[1]+5);
+        path.lineTo(instance.vector[0]+5, instance.vector[1]+5);
+        path.lineTo(instance.vector[0]+5, instance.vector[1]-5);
+        path.close();
+        path.transform(matrix);
+        paths.add(path);
+        
+        return paths;
+    }
+    
     @Override
     public boolean onKeyUp(int keyCode, KeyEvent event) {
-        if (keyCode == KeyEvent.KEYCODE_BACK) {
-            mGesureLibrary.save();
-            setResult(RESULT_OK);
-            finish();
-            return true;
-        } else {
-            return false;
-        }
+      // TODO Auto-generated method stub
+      if (keyCode == KeyEvent.KEYCODE_BACK) {
+          mRecognizer.save();
+          this.setResult(RESULT_OK);
+          finish();
+          return true;
+      }
+      else
+        return false;
     }
-
+    
     @Override
     protected void onPause() {
+        // TODO Auto-generated method stub
         super.onPause();
-        mGesureLibrary.save();
+        mRecognizer.save();
     }
 
     @Override
     protected void onSaveInstanceState(Bundle outState) {
+        // TODO Auto-generated method stub
         super.onSaveInstanceState(outState);
-        mGesureLibrary.save();
+        mRecognizer.save();
     }
 }
