diff options
author | Karl Rosaen <> | 2009-04-29 13:43:27 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-04-29 13:43:27 -0700 |
commit | df3e5971c1200960243ed96bff5fca85faa634af (patch) | |
tree | 9f1bcf38beb5e4dff1351db237c00a305ad676a4 /src/com/android/launcher/Launcher.java | |
parent | 74a15c0db0445d1df7b82ee46c65e260dd72dee8 (diff) | |
parent | 71b0594a6fc7339281add91d2ac61b181f89a2af (diff) | |
download | android_packages_apps_Trebuchet-df3e5971c1200960243ed96bff5fca85faa634af.tar.gz android_packages_apps_Trebuchet-df3e5971c1200960243ed96bff5fca85faa634af.tar.bz2 android_packages_apps_Trebuchet-df3e5971c1200960243ed96bff5fca85faa634af.zip |
am 71b0594: Merge branch \'readonly-p4-donut\' into donut
Merge commit '71b0594a6fc7339281add91d2ac61b181f89a2af'
* commit '71b0594a6fc7339281add91d2ac61b181f89a2af':
AI 147564: Merge back from search branch to donut. Notes:
Diffstat (limited to 'src/com/android/launcher/Launcher.java')
-rw-r--r-- | src/com/android/launcher/Launcher.java | 218 |
1 files changed, 129 insertions, 89 deletions
diff --git a/src/com/android/launcher/Launcher.java b/src/com/android/launcher/Launcher.java index 7dd341819..3bf96aae8 100644 --- a/src/com/android/launcher/Launcher.java +++ b/src/com/android/launcher/Launcher.java @@ -20,6 +20,7 @@ import android.app.Activity; import android.app.AlertDialog; import android.app.Application; import android.app.Dialog; +import android.app.IWallpaperService; import android.app.SearchManager; import android.app.StatusBarManager; import android.content.ActivityNotFoundException; @@ -35,26 +36,24 @@ import android.content.Intent.ShortcutIconResource; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; -import android.content.res.Resources; import android.content.res.Configuration; +import android.content.res.Resources; import android.database.ContentObserver; import android.graphics.Bitmap; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.TransitionDrawable; -import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Looper; +import android.os.Message; import android.os.MessageQueue; import android.os.Parcelable; import android.os.RemoteException; import android.os.ServiceManager; -import android.os.Message; -import android.provider.*; -import android.telephony.PhoneNumberUtils; +import android.provider.LiveFolders; import android.text.Selection; import android.text.SpannableStringBuilder; import android.text.TextUtils; @@ -71,11 +70,11 @@ import android.view.ViewGroup; import android.view.View.OnLongClickListener; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; -import android.widget.TextView; -import android.widget.Toast; import android.widget.GridView; +import android.widget.ListView; import android.widget.SlidingDrawer; -import android.app.IWallpaperService; +import android.widget.TextView; +import android.widget.Toast; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; @@ -168,7 +167,6 @@ public final class Launcher extends Activity implements View.OnClickListener, On private final BroadcastReceiver mApplicationsReceiver = new ApplicationsIntentReceiver(); private final ContentObserver mObserver = new FavoritesChangeObserver(); - private final ContentObserver mAppWidgetResetObserver = new AppWidgetResetObserver(); private LayoutInflater mInflater; @@ -353,6 +351,9 @@ public final class Launcher extends Activity implements View.OnClickListener, On if (mRestoring) { startLoaders(); } + + // Make sure that the search gadget (if any) is in its normal place. + stopSearch(false); } @Override @@ -387,45 +388,29 @@ public final class Launcher extends Activity implements View.OnClickListener, On boolean gotKey = TextKeyListener.getInstance().onKeyDown(mWorkspace, mDefaultKeySsb, keyCode, event); if (gotKey && mDefaultKeySsb != null && mDefaultKeySsb.length() > 0) { - // something usable has been typed - dispatch it now. - final String str = mDefaultKeySsb.toString(); - - boolean isDialable = true; - final int count = str.length(); - for (int i = 0; i < count; i++) { - if (!PhoneNumberUtils.isReallyDialable(str.charAt(i))) { - isDialable = false; - break; - } - } - Intent intent; - if (isDialable) { - intent = new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", str, null)); - } else { - intent = new Intent(Contacts.Intents.UI.FILTER_CONTACTS_ACTION); - intent.putExtra(Contacts.Intents.UI.FILTER_TEXT_EXTRA_KEY, str); - } - - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); - - try { - startActivity(intent); - } catch (android.content.ActivityNotFoundException ex) { - // Oh well... no one knows how to filter/dial. Life goes on. - } - - mDefaultKeySsb.clear(); - mDefaultKeySsb.clearSpans(); - Selection.setSelection(mDefaultKeySsb, 0); - - return true; + // something usable has been typed - start a search + // the typed text will be retrieved and cleared by + // showSearchDialog() + // If there are multiple keystrokes before the search dialog takes focus, + // onSearchRequested() will be called for every keystroke, + // but it is idempotent, so it's fine. + return onSearchRequested(); } } return handled; } + private String getTypedText() { + return mDefaultKeySsb.toString(); + } + + private void clearTypedText() { + mDefaultKeySsb.clear(); + mDefaultKeySsb.clearSpans(); + Selection.setSelection(mDefaultKeySsb, 0); + } + /** * Restores the previous state, if it exists. * @@ -495,7 +480,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On drawer.setOnDrawerCloseListener(drawerManager); drawer.setOnDrawerScrollListener(drawerManager); - grid.setTextFilterEnabled(true); + grid.setTextFilterEnabled(false); grid.setDragger(dragLayer); grid.setLauncher(this); @@ -827,7 +812,6 @@ public final class Launcher extends Activity implements View.OnClickListener, On sModel.abortLoaders(); getContentResolver().unregisterContentObserver(mObserver); - getContentResolver().unregisterContentObserver(mAppWidgetResetObserver); unregisterReceiver(mApplicationsReceiver); } @@ -840,13 +824,76 @@ public final class Launcher extends Activity implements View.OnClickListener, On @Override public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData, boolean globalSearch) { + + closeDrawer(false); + + // 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 {@link Activity.startSearch()} for the arguments. + */ + public 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(); + clearTypedText(); + } if (appSearchData == null) { appSearchData = new Bundle(); appSearchData.putString(SearchManager.SOURCE, "launcher-search"); } - super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch); + + 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(true); + } + }); + } + + searchManager.startSearch(initialQuery, selectInitialQuery, getComponentName(), + appSearchData, globalSearch); } + /** + * Cancel search dialog if it is open. + * + * @param animate Whether to animate the search gadget (if any) when restoring it + * to its original position. + */ + public void stopSearch(boolean animate) { + // Close search dialog + SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); + if (searchManager.isVisible()) { + 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 (mDesktopLocked) return false; @@ -905,15 +952,16 @@ public final class Launcher extends Activity implements View.OnClickListener, On return super.onOptionsItemSelected(item); } + + /** + * Indicates that we want global search for this activity by setting the globalSearch + * argument for {@link #startSearch} to true. + */ @Override public boolean onSearchRequested() { - if (mWorkspace.snapToSearch()) { - closeDrawer(true); // search widget: get drawer out of the way - return true; - } else { - return super.onSearchRequested(); // no search widget: use system search UI - } + startSearch(null, false, null, true); + return true; } private void addItems() { @@ -975,6 +1023,8 @@ public final class Launcher extends Activity implements View.OnClickListener, On 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); } @@ -1158,7 +1208,6 @@ public final class Launcher extends Activity implements View.OnClickListener, On private void registerContentObservers() { ContentResolver resolver = getContentResolver(); resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true, mObserver); - resolver.registerContentObserver(LauncherProvider.CONTENT_APPWIDGET_RESET_URI, true, mAppWidgetResetObserver); } @Override @@ -1224,16 +1273,6 @@ public final class Launcher extends Activity implements View.OnClickListener, On sModel.loadUserItems(false, this, false, false); } - /** - * When reset, we handle by calling {@link AppWidgetHost#startListening()} - * to make sure our callbacks are set correctly. - */ - private void onAppWidgetReset() { - if (mAppWidgetHost != null) { - mAppWidgetHost.startListening(); - } - } - void onDesktopItemsLoaded() { if (mDestroyed) return; bindDesktopItems(); @@ -1250,8 +1289,6 @@ public final class Launcher extends Activity implements View.OnClickListener, On return; } - mAllAppsGrid.setAdapter(drawerAdapter); - final Workspace workspace = mWorkspace; int count = workspace.getChildCount(); for (int i = 0; i < count; i++) { @@ -1275,7 +1312,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On mBinder.mTerminate = true; } - mBinder = new DesktopBinder(this, shortcuts, appWidgets); + mBinder = new DesktopBinder(this, shortcuts, appWidgets, drawerAdapter); mBinder.startBindingItems(); } @@ -1317,6 +1354,9 @@ public final class Launcher extends Activity implements View.OnClickListener, On 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); @@ -1329,7 +1369,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On if (end >= count) { finishBindDesktopItems(); - binder.startBindingAppWidgetsWhenIdle(); + binder.startBindingDrawer(); } else { binder.obtainMessage(DesktopBinder.MESSAGE_BIND_ITEMS, i, count).sendToTarget(); } @@ -1376,6 +1416,12 @@ public final class Launcher extends Activity implements View.OnClickListener, On mDrawer.unlock(); } + private void bindDrawer(Launcher.DesktopBinder binder, + ApplicationsAdapter drawerAdapter) { + mAllAppsGrid.setAdapter(drawerAdapter); + binder.startBindingAppWidgetsWhenIdle(); + } + private void bindAppWidgets(Launcher.DesktopBinder binder, LinkedList<LauncherAppWidgetInfo> appWidgets) { @@ -1386,14 +1432,10 @@ public final class Launcher extends Activity implements View.OnClickListener, On final LauncherAppWidgetInfo item = appWidgets.removeFirst(); final int appWidgetId = item.appWidgetId; - final AppWidgetProviderInfo appWidgetInfo = - mAppWidgetManager.getAppWidgetInfo(appWidgetId); + final AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId); item.hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo); - if (LOGD) { - d(LOG_TAG, String.format("about to setAppWidget for id=%d, info=%s", - appWidgetId, appWidgetInfo)); - } + if (LOGD) d(LOG_TAG, String.format("about to setAppWidget for id=%d, info=%s", appWidgetId, appWidgetInfo)); item.hostView.setAppWidget(appWidgetId, appWidgetInfo); item.hostView.setTag(item); @@ -1891,21 +1933,6 @@ public final class Launcher extends Activity implements View.OnClickListener, On } /** - * Receives notifications when the {@link AppWidgetHost} has been reset, - * usually only when the {@link LauncherProvider} database is first created. - */ - private class AppWidgetResetObserver extends ContentObserver { - public AppWidgetResetObserver() { - super(new Handler()); - } - - @Override - public void onChange(boolean selfChange) { - onAppWidgetReset(); - } - } - - /** * Receives intents from other applications to change the wallpaper. */ private static class WallpaperIntentReceiver extends BroadcastReceiver { @@ -1996,21 +2023,25 @@ public final class Launcher extends Activity implements View.OnClickListener, On private static class DesktopBinder extends Handler implements MessageQueue.IdleHandler { static final int MESSAGE_BIND_ITEMS = 0x1; static final int MESSAGE_BIND_APPWIDGETS = 0x2; + static final int MESSAGE_BIND_DRAWER = 0x3; // Number of items to bind in every pass static final int ITEMS_COUNT = 6; private final ArrayList<ItemInfo> mShortcuts; private final LinkedList<LauncherAppWidgetInfo> mAppWidgets; + private final ApplicationsAdapter mDrawerAdapter; private final WeakReference<Launcher> mLauncher; - public volatile boolean mTerminate = false; + public boolean mTerminate = false; DesktopBinder(Launcher launcher, ArrayList<ItemInfo> shortcuts, - ArrayList<LauncherAppWidgetInfo> appWidgets) { + ArrayList<LauncherAppWidgetInfo> appWidgets, + ApplicationsAdapter drawerAdapter) { mLauncher = new WeakReference<Launcher>(launcher); mShortcuts = shortcuts; + mDrawerAdapter = drawerAdapter; // Sort widgets so active workspace is bound first final int currentScreen = launcher.mWorkspace.getCurrentScreen(); @@ -2030,6 +2061,10 @@ public final class Launcher extends Activity implements View.OnClickListener, On public void startBindingItems() { obtainMessage(MESSAGE_BIND_ITEMS, 0, mShortcuts.size()).sendToTarget(); } + + public void startBindingDrawer() { + obtainMessage(MESSAGE_BIND_DRAWER).sendToTarget(); + } public void startBindingAppWidgetsWhenIdle() { // Ask for notification when message queue becomes idle @@ -2059,6 +2094,10 @@ public final class Launcher extends Activity implements View.OnClickListener, On launcher.bindItems(this, mShortcuts, msg.arg1, msg.arg2); break; } + case MESSAGE_BIND_DRAWER: { + launcher.bindDrawer(this, mDrawerAdapter); + break; + } case MESSAGE_BIND_APPWIDGETS: { launcher.bindAppWidgets(this, mAppWidgets); break; @@ -2067,3 +2106,4 @@ public final class Launcher extends Activity implements View.OnClickListener, On } } } + |