Get rid of the built-in search widget in Launcher2

Uses the widget from packages/apps/QuickSearchBox instead.

Change-Id: I85d64defe155c0cad97fafef6a3db62c6cab504a
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index aa6b7ce..f07810d 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -110,9 +110,6 @@
 
     static final String EXTRA_SHORTCUT_DUPLICATE = "duplicate";
 
-    static final String EXTRA_CUSTOM_WIDGET = "custom_widget";
-    static final String SEARCH_WIDGET = "search_widget";
-
     static final int SCREEN_COUNT = 5;
     static final int DEFAULT_SCREEN = 2;
     static final int NUMBER_CELLS_X = 4;
@@ -180,8 +177,6 @@
 
     private SpannableStringBuilder mDefaultKeySsb = null;
 
-    private boolean mIsNewIntent;
-
     private boolean mWorkspaceLoading = true;
 
     private boolean mRestoring;
@@ -406,21 +401,6 @@
             mModel.startLoader(this, true);
             mRestoring = false;
         }
-
-        // If this was a new intent (i.e., the mIsNewIntent flag got set to true by
-        // onNewIntent), then close the search dialog if needed, because it probably
-        // came from the user pressing 'home' (rather than, for example, pressing 'back').
-        if (mIsNewIntent) {
-            // Post to a handler so that this happens after the search dialog tries to open
-            // itself again.
-            mWorkspace.post(new Runnable() {
-                public void run() {
-                    stopSearch();
-                }
-            });
-        }
-
-        mIsNewIntent = false;
     }
 
     @Override
@@ -841,11 +821,6 @@
             // also will cancel mWaitingForResult.
             closeSystemDialogs();
 
-            // Set this flag so that onResume knows to close the search dialog if it's open,
-            // because this was a new intent (thus a press of 'home' or some such) rather than
-            // for example onResume being called when the user pressed the 'back' button.
-            mIsNewIntent = true;
-
             boolean alreadyOnHome = ((intent.getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT)
                         != Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
             boolean allAppsVisible = isAllAppsVisible();
@@ -947,26 +922,6 @@
 
         closeAllApps(true);
 
-        // Slide the search widget to the top, if it's on the current screen,
-        // otherwise show the search dialog immediately.
-        Search searchWidget = mWorkspace.findSearchWidgetOnCurrentScreen();
-        if (searchWidget == null) {
-            showSearchDialog(initialQuery, selectInitialQuery, appSearchData, globalSearch);
-        } else {
-            searchWidget.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
-            // show the currently typed text in the search widget while sliding
-            searchWidget.setQuery(getTypedText());
-        }
-    }
-
-    /**
-     * Show the search dialog immediately, without changing the search widget.
-     *
-     * @see Activity#startSearch(String, boolean, android.os.Bundle, boolean)
-     */
-    void showSearchDialog(String initialQuery, boolean selectInitialQuery,
-            Bundle appSearchData, boolean globalSearch) {
-
         if (initialQuery == null) {
             // Use any text typed in the launcher as the initial query
             initialQuery = getTypedText();
@@ -979,37 +934,10 @@
 
         final SearchManager searchManager =
                 (SearchManager) getSystemService(Context.SEARCH_SERVICE);
-
-        final Search searchWidget = mWorkspace.findSearchWidgetOnCurrentScreen();
-        if (searchWidget != null) {
-            // This gets called when the user leaves the search dialog to go back to
-            // the Launcher.
-            searchManager.setOnCancelListener(new SearchManager.OnCancelListener() {
-                public void onCancel() {
-                    searchManager.setOnCancelListener(null);
-                    stopSearch();
-                }
-            });
-        }
-
         searchManager.startSearch(initialQuery, selectInitialQuery, getComponentName(),
             appSearchData, globalSearch);
     }
 
-    /**
-     * Cancel search dialog if it is open.
-     */
-    void stopSearch() {
-        // Close search dialog
-        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
-        searchManager.stopSearch();
-        // Restore search widget to its normal position
-        Search searchWidget = mWorkspace.findSearchWidgetOnCurrentScreen();
-        if (searchWidget != null) {
-            searchWidget.stopSearch(false);
-        }
-    }
-
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         if (isWorkspaceLocked()) {
@@ -1094,51 +1022,21 @@
     void addAppWidget(Intent data) {
         // TODO: catch bad widget exception when sent
         int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
+        AppWidgetProviderInfo appWidget = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
 
-        String customWidget = data.getStringExtra(EXTRA_CUSTOM_WIDGET);
-        if (SEARCH_WIDGET.equals(customWidget)) {
-            // We don't need this any more, since this isn't a real app widget.
-            mAppWidgetHost.deleteAppWidgetId(appWidgetId);
-            // add the search widget
-            addSearch();
+        if (appWidget.configure != null) {
+            // Launch over to configure widget, if needed
+            Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
+            intent.setComponent(appWidget.configure);
+            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
+
+            startActivityForResult(intent, REQUEST_CREATE_APPWIDGET);
         } else {
-            AppWidgetProviderInfo appWidget = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
-
-            if (appWidget.configure != null) {
-                // Launch over to configure widget, if needed
-                Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
-                intent.setComponent(appWidget.configure);
-                intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
-
-                startActivityForResult(intent, REQUEST_CREATE_APPWIDGET);
-            } else {
-                // Otherwise just add it
-                onActivityResult(REQUEST_CREATE_APPWIDGET, Activity.RESULT_OK, data);
-            }
+            // Otherwise just add it
+            onActivityResult(REQUEST_CREATE_APPWIDGET, Activity.RESULT_OK, data);
         }
     }
 
-    void addSearch() {
-        final Widget info = Widget.makeSearch();
-        final CellLayout.CellInfo cellInfo = mAddItemCellInfo;
-
-        final int[] xy = mCellCoordinates;
-        final int spanX = info.spanX;
-        final int spanY = info.spanY;
-
-        if (!findSlot(cellInfo, xy, spanX, spanY)) return;
-
-        LauncherModel.addItemToDatabase(this, info, LauncherSettings.Favorites.CONTAINER_DESKTOP,
-        mWorkspace.getCurrentScreen(), xy[0], xy[1], false);
-
-        final View view = mInflater.inflate(info.layoutResource, null);
-        view.setTag(info);
-        Search search = (Search) view.findViewById(R.id.widget_search);
-        search.setLauncher(this);
-
-        mWorkspace.addInCurrentScreen(view, xy[0], xy[1], info.spanX, spanY);
-    }
-
     void processShortcut(Intent intent, int requestCodeApplication, int requestCodeShortcut) {
         // Handle case where user selected "Applications"
         String applicationName = getResources().getString(R.string.group_applications);
@@ -1937,22 +1835,6 @@
 
                     Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
                     pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
-                    // add the search widget
-                    ArrayList<AppWidgetProviderInfo> customInfo =
-                            new ArrayList<AppWidgetProviderInfo>();
-                    AppWidgetProviderInfo info = new AppWidgetProviderInfo();
-                    info.provider = new ComponentName(getPackageName(), "XXX.YYY");
-                    info.label = getString(R.string.group_search);
-                    info.icon = R.drawable.ic_search_widget;
-                    customInfo.add(info);
-                    pickIntent.putParcelableArrayListExtra(
-                            AppWidgetManager.EXTRA_CUSTOM_INFO, customInfo);
-                    ArrayList<Bundle> customExtras = new ArrayList<Bundle>();
-                    Bundle b = new Bundle();
-                    b.putString(EXTRA_CUSTOM_WIDGET, SEARCH_WIDGET);
-                    customExtras.add(b);
-                    pickIntent.putParcelableArrayListExtra(
-                            AppWidgetManager.EXTRA_CUSTOM_EXTRAS, customExtras);
                     // start the pick activity
                     startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET);
                     break;
@@ -2097,19 +1979,6 @@
                     workspace.addInScreen(newLiveFolder, item.screen, item.cellX, item.cellY, 1, 1,
                             false);
                     break;
-                case LauncherSettings.Favorites.ITEM_TYPE_WIDGET_SEARCH:
-                    final int screen = workspace.getCurrentScreen();
-                    final View view = mInflater.inflate(R.layout.widget_search,
-                            (ViewGroup) workspace.getChildAt(screen), false);
-
-                    Search search = (Search) view.findViewById(R.id.widget_search);
-                    search.setLauncher(this);
-
-                    final Widget widget = (Widget) item;
-                    view.setTag(widget);
-
-                    workspace.addWidget(view, widget, false);
-                    break;
             }
         }
 
@@ -2230,7 +2099,6 @@
     public void dumpState() {
         Log.d(TAG, "BEGIN launcher2 dump state for launcher " + this);
         Log.d(TAG, "mSavedState=" + mSavedState);
-        Log.d(TAG, "mIsNewIntent=" + mIsNewIntent);
         Log.d(TAG, "mWorkspaceLoading=" + mWorkspaceLoading);
         Log.d(TAG, "mRestoring=" + mRestoring);
         Log.d(TAG, "mWaitingForResult=" + mWaitingForResult);
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index 97fa554..cafb9fa 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -651,7 +651,6 @@
 
                     ApplicationInfo info;
                     String intentDescription;
-                    Widget widgetInfo;
                     LauncherAppWidgetInfo appWidgetInfo;
                     int container;
                     long id;
@@ -770,25 +769,6 @@
                                 mFolders.put(liveFolderInfo.id, liveFolderInfo);
                                 break;
 
-                            case LauncherSettings.Favorites.ITEM_TYPE_WIDGET_SEARCH:
-                                widgetInfo = Widget.makeSearch();
-
-                                container = c.getInt(containerIndex);
-                                if (container != LauncherSettings.Favorites.CONTAINER_DESKTOP) {
-                                    Log.e(TAG, "Widget found where container "
-                                            + "!= CONTAINER_DESKTOP  ignoring!");
-                                    continue;
-                                }
-
-                                widgetInfo.id = c.getLong(idIndex);
-                                widgetInfo.screen = c.getInt(screenIndex);
-                                widgetInfo.container = container;
-                                widgetInfo.cellX = c.getInt(cellXIndex);
-                                widgetInfo.cellY = c.getInt(cellYIndex);
-
-                                mItems.add(widgetInfo);
-                                break;
-
                             case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET:
                                 // Read all Launcher-specific widget details
                                 int appWidgetId = c.getInt(appWidgetIdIndex);
diff --git a/src/com/android/launcher2/LauncherProvider.java b/src/com/android/launcher2/LauncherProvider.java
index c3ceefd..47d8991 100644
--- a/src/com/android/launcher2/LauncherProvider.java
+++ b/src/com/android/launcher2/LauncherProvider.java
@@ -58,7 +58,7 @@
 
     private static final String DATABASE_NAME = "launcher.db";
     
-    private static final int DATABASE_VERSION = 6;
+    private static final int DATABASE_VERSION = 7;
 
     static final String AUTHORITY = "com.android.launcher2.settings";
     
@@ -382,7 +382,13 @@
                     version = 6;
                 }
             }
-            
+
+            if (version < 7) {
+                // Version 7 gets rid of the special search widget.
+                convertWidgets(db);
+                version = 7;
+            }
+
             if (version != DATABASE_VERSION) {
                 Log.w(TAG, "Destroying all old data.");
                 db.execSQL("DROP TABLE IF EXISTS " + TABLE_FAVORITES);
@@ -466,6 +472,7 @@
             final int[] bindSources = new int[] {
                     Favorites.ITEM_TYPE_WIDGET_CLOCK,
                     Favorites.ITEM_TYPE_WIDGET_PHOTO_FRAME,
+                    Favorites.ITEM_TYPE_WIDGET_SEARCH,
             };
             
             final ArrayList<ComponentName> bindTargets = new ArrayList<ComponentName>();
@@ -473,7 +480,9 @@
                     "com.android.alarmclock.AnalogAppWidgetProvider"));
             bindTargets.add(new ComponentName("com.android.camera",
                     "com.android.camera.PhotoAppWidgetProvider"));
-            
+            bindTargets.add(new ComponentName("com.android.quicksearchbox",
+                    "com.android.quicksearchbox.SearchWidgetProvider"));
+
             final String selectWhere = buildOrWhereString(Favorites.ITEM_TYPE, bindSources);
             
             Cursor c = null;
@@ -482,7 +491,7 @@
             db.beginTransaction();
             try {
                 // Select and iterate through each matching widget
-                c = db.query(TABLE_FAVORITES, new String[] { Favorites._ID },
+                c = db.query(TABLE_FAVORITES, new String[] { Favorites._ID, Favorites.ITEM_TYPE },
                         selectWhere, null, null, null, null);
                 
                 if (LOGD) Log.d(TAG, "found upgrade cursor count=" + c.getCount());
@@ -490,7 +499,8 @@
                 final ContentValues values = new ContentValues();
                 while (c != null && c.moveToNext()) {
                     long favoriteId = c.getLong(0);
-                    
+                    int favoriteType = c.getInt(1);
+
                     // Allocate and update database with new appWidgetId
                     try {
                         int appWidgetId = mAppWidgetHost.allocateAppWidgetId();
@@ -499,13 +509,18 @@
                             Log.d(TAG, "allocated appWidgetId=" + appWidgetId
                                     + " for favoriteId=" + favoriteId);
                         }
-                        
                         values.clear();
-                        values.put(LauncherSettings.Favorites.APPWIDGET_ID, appWidgetId);
-                        
+                        values.put(Favorites.ITEM_TYPE, Favorites.ITEM_TYPE_APPWIDGET);
+                        values.put(Favorites.APPWIDGET_ID, appWidgetId);
+
                         // Original widgets might not have valid spans when upgrading
-                        values.put(LauncherSettings.Favorites.SPANX, 2);
-                        values.put(LauncherSettings.Favorites.SPANY, 2);
+                        if (favoriteType == Favorites.ITEM_TYPE_WIDGET_SEARCH) {
+                            values.put(LauncherSettings.Favorites.SPANX, 4);
+                            values.put(LauncherSettings.Favorites.SPANY, 1);
+                        } else {
+                            values.put(LauncherSettings.Favorites.SPANX, 2);
+                            values.put(LauncherSettings.Favorites.SPANY, 2);
+                        }
 
                         String updateWhere = Favorites._ID + "=" + favoriteId;
                         db.update(TABLE_FAVORITES, values, updateWhere, null);
@@ -646,13 +661,9 @@
         }
 
         private boolean addSearchWidget(SQLiteDatabase db, ContentValues values) {
-            // Add a search box
-            values.put(Favorites.ITEM_TYPE, Favorites.ITEM_TYPE_WIDGET_SEARCH);
-            values.put(Favorites.SPANX, 4);
-            values.put(Favorites.SPANY, 1);
-            db.insert(TABLE_FAVORITES, null, values);
-
-            return true;
+            ComponentName cn = new ComponentName("com.android.quicksearchbox",
+                    "com.android.quicksearchbox.SearchWidgetProvider");
+            return addAppWidget(db, values, cn, 4, 1);
         }
 
         private boolean addClockWidget(SQLiteDatabase db, ContentValues values) {
@@ -698,7 +709,13 @@
             }
             
             ComponentName cn = new ComponentName(packageName, className);
-            
+            int spanX = a.getInt(R.styleable.Favorite_spanX, 0);
+            int spanY = a.getInt(R.styleable.Favorite_spanY, 0);
+            return addAppWidget(db, values, cn, spanX, spanY);
+        }
+
+        private boolean addAppWidget(SQLiteDatabase db, ContentValues values, ComponentName cn,
+                int spanX, int spanY) {
             boolean allocatedAppWidgets = false;
             final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(mContext);
 
@@ -706,8 +723,8 @@
                 int appWidgetId = mAppWidgetHost.allocateAppWidgetId();
                 
                 values.put(Favorites.ITEM_TYPE, Favorites.ITEM_TYPE_APPWIDGET);
-                values.put(Favorites.SPANX, a.getString(R.styleable.Favorite_spanX));
-                values.put(Favorites.SPANY, a.getString(R.styleable.Favorite_spanY));
+                values.put(Favorites.SPANX, spanX);
+                values.put(Favorites.SPANY, spanY);
                 values.put(Favorites.APPWIDGET_ID, appWidgetId);
                 db.insert(TABLE_FAVORITES, null, values);
 
diff --git a/src/com/android/launcher2/Search.java b/src/com/android/launcher2/Search.java
deleted file mode 100644
index 283042d..0000000
--- a/src/com/android/launcher2/Search.java
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * 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.
- * 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.launcher2;
-
-import android.app.Activity;
-import android.content.ActivityNotFoundException;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.res.Configuration;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnKeyListener;
-import android.view.View.OnLongClickListener;
-import android.view.animation.AccelerateDecelerateInterpolator;
-import android.view.animation.Animation;
-import android.view.animation.Interpolator;
-import android.view.animation.Transformation;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.ImageButton;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-public class Search extends LinearLayout 
-        implements OnClickListener, OnKeyListener, OnLongClickListener {
-
-    // Speed at which the widget slides up/down, in pixels/ms.
-    private static final float ANIMATION_VELOCITY = 1.0f;
-
-    /** The distance in dips between the optical top of the widget and the top if its bounds */
-    private static final float WIDGET_TOP_OFFSET = 9;
-
-    
-    private final String TAG = "Launcher.SearchWidget";
-
-    private Launcher mLauncher;
-
-    private TextView mSearchText;
-    private ImageButton mVoiceButton;
-
-    /** The animation that morphs the search widget to the search dialog. */
-    private Animation mMorphAnimation;
-
-    /** The animation that morphs the search widget back to its normal position. */
-    private Animation mUnmorphAnimation;
-
-    // These four are passed to Launcher.startSearch() when the search widget
-    // has finished morphing. They are instance variables to make it possible to update
-    // them while the widget is morphing.
-    private String mInitialQuery;
-    private boolean mSelectInitialQuery;    
-    private Bundle mAppSearchData;
-    private boolean mGlobalSearch;
-
-    // For voice searching
-    private Intent mVoiceSearchIntent;
-    
-    private int mWidgetTopOffset;
-
-    /**
-     * Used to inflate the Workspace from XML.
-     *
-     * @param context The application's context.
-     * @param attrs The attributes set containing the Workspace's customization values.
-     */
-    public Search(Context context, AttributeSet attrs) {
-        super(context, attrs);
-
-        final float scale = context.getResources().getDisplayMetrics().density;
-        mWidgetTopOffset = Math.round(WIDGET_TOP_OFFSET * scale);
-        
-        Interpolator interpolator = new AccelerateDecelerateInterpolator();
-
-        mMorphAnimation = new ToParentOriginAnimation();
-        // no need to apply transformation before the animation starts,
-        // since the gadget is already in its normal place.
-        mMorphAnimation.setFillBefore(false);
-        // stay in the top position after the animation finishes
-        mMorphAnimation.setFillAfter(true);
-        mMorphAnimation.setInterpolator(interpolator);
-        mMorphAnimation.setAnimationListener(new Animation.AnimationListener() {
-            // The amount of time before the animation ends to show the search dialog.
-            private static final long TIME_BEFORE_ANIMATION_END = 80;
-            
-            // The runnable which we'll pass to our handler to show the search dialog.
-            private final Runnable mShowSearchDialogRunnable = new Runnable() {
-                public void run() {
-                    showSearchDialog();
-                }
-            };
-            
-            public void onAnimationEnd(Animation animation) { }
-            public void onAnimationRepeat(Animation animation) { }
-            public void onAnimationStart(Animation animation) {
-                // Make the search dialog show up ideally *just* as the animation reaches
-                // the top, to aid the illusion that the widget becomes the search dialog.
-                // Otherwise, there is a short delay when the widget reaches the top before
-                // the search dialog shows. We do this roughly 80ms before the animation ends.
-                getHandler().postDelayed(
-                        mShowSearchDialogRunnable,
-                        Math.max(mMorphAnimation.getDuration() - TIME_BEFORE_ANIMATION_END, 0));
-            }
-        });
-
-        mUnmorphAnimation = new FromParentOriginAnimation();
-        // stay in the top position until the animation starts
-        mUnmorphAnimation.setFillBefore(true);
-        // no need to apply transformation after the animation finishes,
-        // since the gadget is now back in its normal place.
-        mUnmorphAnimation.setFillAfter(false);
-        mUnmorphAnimation.setInterpolator(interpolator);
-        mUnmorphAnimation.setAnimationListener(new Animation.AnimationListener(){
-            public void onAnimationEnd(Animation animation) {
-                clearAnimation();
-            }
-            public void onAnimationRepeat(Animation animation) { }
-            public void onAnimationStart(Animation animation) { }
-        });
-        
-        mVoiceSearchIntent = new Intent(android.speech.RecognizerIntent.ACTION_WEB_SEARCH);
-        mVoiceSearchIntent.putExtra(android.speech.RecognizerIntent.EXTRA_LANGUAGE_MODEL,
-                android.speech.RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
-    }
-
-    /**
-     * Implements OnClickListener.
-     */
-    public void onClick(View v) {
-        if (v == mVoiceButton) {
-            startVoiceSearch();
-        } else {
-            mLauncher.onSearchRequested();
-        }
-    }
-
-    private void startVoiceSearch() {
-        try {
-            getContext().startActivity(mVoiceSearchIntent);
-        } catch (ActivityNotFoundException ex) {
-            // Should not happen, since we check the availability of
-            // voice search before showing the button. But just in case...
-            Log.w(TAG, "Could not find voice search activity");
-        }
-    }
-
-    /**
-     * Sets the query text. The query field is not editable, instead we forward
-     * the key events to the launcher, which keeps track of the text, 
-     * calls setQuery() to show it, and gives it to the search dialog.
-     */
-    public void setQuery(String query) {
-        mSearchText.setText(query, TextView.BufferType.NORMAL);
-    }
-
-    /**
-     * Morph the search gadget to the search dialog.
-     * See {@link Activity#startSearch()} for the arguments.
-     */
-    public void startSearch(String initialQuery, boolean selectInitialQuery, 
-            Bundle appSearchData, boolean globalSearch) {
-        mInitialQuery = initialQuery;
-        mSelectInitialQuery = selectInitialQuery;
-        mAppSearchData = appSearchData;
-        mGlobalSearch = globalSearch;
-        
-        if (isAtTop()) {
-            showSearchDialog();
-        } else {
-            // Call up the keyboard before we actually call the search dialog so that it
-            // (hopefully) animates in at about the same time as the widget animation, and
-            // so that it becomes available as soon as possible. Only do this if a hard
-            // keyboard is not currently available.
-            if (getContext().getResources().getConfiguration().hardKeyboardHidden ==
-                    Configuration.HARDKEYBOARDHIDDEN_YES) {
-                InputMethodManager inputManager = (InputMethodManager)
-                        getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
-                inputManager.showSoftInputUnchecked(0, null);
-            }
-            
-            // Start the animation, unless it has already started.
-            if (getAnimation() != mMorphAnimation) {
-                mMorphAnimation.setDuration(getAnimationDuration());
-                startAnimation(mMorphAnimation);
-            }
-        }
-    }
-
-    /**
-     * Shows the system search dialog immediately, without any animation.
-     */
-    private void showSearchDialog() {
-        mLauncher.showSearchDialog(
-                mInitialQuery, mSelectInitialQuery, mAppSearchData, mGlobalSearch);
-    }
-
-    /**
-     * Restore the search gadget to its normal position.
-     * 
-     * @param animate Whether to animate the movement of the gadget.
-     */
-    public void stopSearch(boolean animate) {
-        setQuery("");
-        
-        // Only restore if we are not already restored.
-        if (getAnimation() == mMorphAnimation) {
-            if (animate && !isAtTop()) {
-                mUnmorphAnimation.setDuration(getAnimationDuration());
-                startAnimation(mUnmorphAnimation);
-            } else {
-                clearAnimation();
-            }
-        }
-    }
-
-    private boolean isAtTop() {
-        return getWidgetTop() == 0;
-    }
-
-    private int getAnimationDuration() {
-        return (int) (getWidgetTop() / ANIMATION_VELOCITY);
-    }
-
-    /**
-     * Modify clearAnimation() to invalidate the parent. This works around
-     * an issue where the region where the end of the animation placed the view
-     * was not redrawn after clearing the animation.
-     */
-    @Override
-    public void clearAnimation() {
-        Animation animation = getAnimation();
-        if (animation != null) {
-            super.clearAnimation();
-            if (animation.hasEnded() 
-                    && animation.getFillAfter()
-                    && animation.willChangeBounds()) {
-                View parent = (View) getParent();
-                if (parent != null) parent.invalidate();
-            } else {
-                invalidate();
-            }
-        }
-    }
-    
-    public boolean onKey(View v, int keyCode, KeyEvent event) {
-        if (!event.isSystem() && 
-                (keyCode != KeyEvent.KEYCODE_DPAD_UP) &&
-                (keyCode != KeyEvent.KEYCODE_DPAD_DOWN) &&
-                (keyCode != KeyEvent.KEYCODE_DPAD_LEFT) &&
-                (keyCode != KeyEvent.KEYCODE_DPAD_RIGHT) &&
-                (keyCode != KeyEvent.KEYCODE_DPAD_CENTER)) {
-            // Forward key events to Launcher, which will forward text 
-            // to search dialog
-            switch (event.getAction()) {
-                case KeyEvent.ACTION_DOWN:
-                    return mLauncher.onKeyDown(keyCode, event);
-                case KeyEvent.ACTION_MULTIPLE:
-                    return mLauncher.onKeyMultiple(keyCode, event.getRepeatCount(), event);
-                case KeyEvent.ACTION_UP:
-                    return mLauncher.onKeyUp(keyCode, event);
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Implements OnLongClickListener to pass long clicks on child views 
-     * to the widget. This makes it possible to pick up the widget by long
-     * clicking on the text field or a button.
-     */
-    public boolean onLongClick(View v) {
-        return performLongClick();
-    }
-
-    @Override
-    protected void onFinishInflate() {
-        super.onFinishInflate();
-
-        mSearchText = (TextView) findViewById(R.id.search_src_text);
-        mVoiceButton = (ImageButton) findViewById(R.id.search_voice_btn);
-        
-        mSearchText.setOnKeyListener(this);
-
-        mSearchText.setOnClickListener(this);
-        mVoiceButton.setOnClickListener(this);
-        setOnClickListener(this);        
-
-        mSearchText.setOnLongClickListener(this);
-        mVoiceButton.setOnLongClickListener(this);
-
-        // Set the placeholder text to be the Google logo within the search widget.
-        Drawable googlePlaceholder =
-                getContext().getResources().getDrawable(R.drawable.placeholder_google);
-        mSearchText.setCompoundDrawablesWithIntrinsicBounds(googlePlaceholder, null, null, null);
-
-        configureVoiceSearchButton();
-    }
-    
-    @Override
-    public void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-    }
-
-    /**
-     * If appropriate &amp; available, configure voice search
-     * 
-     * Note:  Because the home screen search widget is always web search, we only check for
-     * getVoiceSearchLaunchWebSearch() modes.  We don't support the alternate form of app-specific
-     * voice search.
-     */
-    private void configureVoiceSearchButton() {
-        // Enable the voice search button if there is an activity that can handle it
-        PackageManager pm = getContext().getPackageManager();
-        ResolveInfo ri = pm.resolveActivity(mVoiceSearchIntent,
-                PackageManager.MATCH_DEFAULT_ONLY);
-        boolean voiceSearchVisible = ri != null;
-
-        // finally, set visible state of voice search button, as appropriate
-        mVoiceButton.setVisibility(voiceSearchVisible ? View.VISIBLE : View.GONE);
-    }
-    
-    /**
-     * Sets the {@link Launcher} that this gadget will call on to display the search dialog. 
-     */
-    public void setLauncher(Launcher launcher) {
-        mLauncher = launcher;
-    }
-        
-    /** 
-     * Moves the view to the top left corner of its parent.
-     */
-    private class ToParentOriginAnimation extends Animation {
-        @Override
-        protected void applyTransformation(float interpolatedTime, Transformation t) {
-            float dx = -getLeft() * interpolatedTime;
-            float dy = -getWidgetTop() * interpolatedTime;
-            t.getMatrix().setTranslate(dx, dy);
-        }
-    }
-
-    /** 
-     * Moves the view from the top left corner of its parent.
-     */
-    private class FromParentOriginAnimation extends Animation {
-        @Override
-        protected void applyTransformation(float interpolatedTime, Transformation t) {
-            float dx = -getLeft() * (1.0f - interpolatedTime);
-            float dy = -getWidgetTop() * (1.0f - interpolatedTime);
-            t.getMatrix().setTranslate(dx, dy);
-        }
-    }
-
-    /**
-     * The widget is centered vertically within it's 4x1 slot. This is accomplished by nesting
-     * the actual widget inside another view. For animation purposes, we care about the top of the
-     * actual widget rather than it's container. This method return the top of the actual widget.
-     */
-    private int getWidgetTop() {
-        return getTop() + getChildAt(0).getTop() + mWidgetTopOffset;
-    }
-}
diff --git a/src/com/android/launcher2/Widget.java b/src/com/android/launcher2/Widget.java
deleted file mode 100644
index 348acee..0000000
--- a/src/com/android/launcher2/Widget.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.
- * 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.launcher2;
-
-import android.content.ContentValues;
-import android.graphics.Bitmap;
-
-/**
- * Represents one instance of a Launcher widget, such as search.
- */
-class Widget extends ItemInfo {
-    int layoutResource;
-
-    static Widget makeSearch() {
-        Widget w = new Widget();
-        w.itemType = LauncherSettings.Favorites.ITEM_TYPE_WIDGET_SEARCH;
-        w.spanX = 4;
-        w.spanY = 1;
-        w.layoutResource = R.layout.widget_search;
-        return w;
-    }
-}
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index f1ee817..927bd4c 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -332,16 +332,6 @@
         }
     }
 
-    void addWidget(View view, Widget widget) {
-        addInScreen(view, widget.screen, widget.cellX, widget.cellY, widget.spanX,
-                widget.spanY, false);
-    }
-
-    void addWidget(View view, Widget widget, boolean insert) {
-        addInScreen(view, widget.screen, widget.cellX, widget.cellY, widget.spanX,
-                widget.spanY, insert);
-    }
-
     CellLayout.CellInfo findAllVacantCells(boolean[] occupied) {
         CellLayout group = (CellLayout) getChildAt(mCurrentScreen);
         if (group != null) {
@@ -856,8 +846,7 @@
         View child = cellInfo.cell;
         
         // Make sure the drag was started by a long press as opposed to a long click.
-        // Note that Search takes focus when clicked rather than entering touch mode
-        if (!child.isInTouchMode() && !(child instanceof Search)) {
+        if (!child.isInTouchMode()) {
             return;
         }
         
@@ -1123,29 +1112,6 @@
         return result;
     }
 
-    /**
-     * Find a search widget on the given screen
-     */
-    private Search findSearchWidget(CellLayout screen) {
-        final int count = screen.getChildCount();
-        for (int i = 0; i < count; i++) {
-            View v = screen.getChildAt(i);
-            if (v instanceof Search) {
-                return (Search) v;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Gets the first search widget on the current screen, if there is one.
-     * Returns <code>null</code> otherwise.
-     */
-    public Search findSearchWidgetOnCurrentScreen() {
-        CellLayout currentScreen = (CellLayout)getChildAt(mCurrentScreen);
-        return findSearchWidget(currentScreen);
-    }
-
     public Folder getFolderForTag(Object tag) {
         int screenCount = getChildCount();
         for (int screen = 0; screen < screenCount; screen++) {