From cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2b Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Mon, 8 Jun 2009 15:52:54 -0700 Subject: [PATCH] Fix locked workspace in Home. A dialog can be dismissed without being cancelled. This change simply adds a dismiss listener to the Add dialog in Home to make sure the workspace is properly unlocked when the dialog is dismissed. --- src/com/android/launcher/Launcher.java | 199 +++++++++++++------------ 1 file changed, 102 insertions(+), 97 deletions(-) diff --git a/src/com/android/launcher/Launcher.java b/src/com/android/launcher/Launcher.java index 5754975657..b4437d41d8 100644 --- a/src/com/android/launcher/Launcher.java +++ b/src/com/android/launcher/Launcher.java @@ -118,10 +118,10 @@ public final class Launcher extends Activity implements View.OnClickListener, On static final int SCREEN_COUNT = 3; static final int DEFAULT_SCREN = 1; static final int NUMBER_CELLS_X = 4; - static final int NUMBER_CELLS_Y = 4; + static final int NUMBER_CELLS_Y = 4; private static final int DIALOG_CREATE_SHORTCUT = 1; - static final int DIALOG_RENAME_FOLDER = 2; + static final int DIALOG_RENAME_FOLDER = 2; private static final String PREFERENCES = "launcher"; private static final String KEY_LOCALE = "locale"; @@ -171,12 +171,12 @@ public final class Launcher extends Activity implements View.OnClickListener, On private DragLayer mDragLayer; private Workspace mWorkspace; - + private AppWidgetManager mAppWidgetManager; private LauncherAppWidgetHost mAppWidgetHost; - + static final int APPWIDGET_HOST_ID = 1024; - + private CellLayout.CellInfo mAddItemCellInfo; private CellLayout.CellInfo mMenuAddInfo; private final int[] mCellCoordinates = new int[2]; @@ -201,17 +201,17 @@ public final class Launcher extends Activity implements View.OnClickListener, On private Bundle mSavedInstanceState; private DesktopBinder mBinder; - + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mInflater = getLayoutInflater(); - + mAppWidgetManager = AppWidgetManager.getInstance(this); - + mAppWidgetHost = new LauncherAppWidgetHost(this, APPWIDGET_HOST_ID); mAppWidgetHost.startListening(); - + if (PROFILE_STARTUP) { android.os.Debug.startMethodTracing("/sdcard/launcher"); } @@ -240,7 +240,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On mDefaultKeySsb = new SpannableStringBuilder(); Selection.setSelection(mDefaultKeySsb, 0); } - + private void checkForLocaleChange() { final SharedPreferences preferences = getSharedPreferences(PREFERENCES, MODE_PRIVATE); final Configuration configuration = getResources().getConfiguration(); @@ -304,10 +304,10 @@ public final class Launcher extends Activity implements View.OnClickListener, On protected void onActivityResult(int requestCode, int resultCode, Intent data) { // The pattern used here is that a user PICKs a specific application, // which, depending on the target, might need to CREATE the actual target. - + // For example, the user would PICK_SHORTCUT for "Music playlist", and we // launch over to the Music app to actually CREATE_SHORTCUT. - + if (resultCode == RESULT_OK && mAddItemCellInfo != null) { switch (requestCode) { case REQUEST_PICK_APPLICATION: @@ -358,16 +358,16 @@ public final class Launcher extends Activity implements View.OnClickListener, On @Override protected void onPause() { super.onPause(); - closeDrawer(false); + closeDrawer(false); } - + @Override public Object onRetainNonConfigurationInstance() { // Flag any binder to stop early before switching if (mBinder != null) { mBinder.mTerminate = true; } - + if (PROFILE_ROTATE) { android.os.Debug.startMethodTracing("/sdcard/launcher-rotate"); } @@ -388,7 +388,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On keyCode, event); if (gotKey && mDefaultKeySsb != null && mDefaultKeySsb.length() > 0) { // something usable has been typed - start a search - // the typed text will be retrieved and cleared by + // 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, @@ -554,15 +554,15 @@ public final class Launcher extends Activity implements View.OnClickListener, On } catch (NameNotFoundException e) { Log.e(LOG_TAG, "Couldn't find ActivityInfo for selected application", e); } - + if (activityInfo != null) { ApplicationInfo itemInfo = new ApplicationInfo(); - + itemInfo.title = activityInfo.loadLabel(packageManager); if (itemInfo.title == null) { itemInfo.title = activityInfo.name; } - + itemInfo.setActivity(component, Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); itemInfo.icon = activityInfo.loadIcon(packageManager); @@ -571,7 +571,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On mWorkspace.addApplicationShortcut(itemInfo, cellInfo, insertAtFirst); } } - + /** * Add a shortcut to the workspace. * @@ -583,7 +583,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On boolean insertAtFirst) { cellInfo.screen = mWorkspace.getCurrentScreen(); if (!findSingleSlot(cellInfo)) return; - + final ApplicationInfo info = addShortcut(this, data, cellInfo, false); if (!mRestoring) { @@ -596,7 +596,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On } } - + /** * Add a widget to the workspace. * @@ -608,15 +608,15 @@ public final class Launcher extends Activity implements View.OnClickListener, On Bundle extras = data.getExtras(); int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); - + d(LOG_TAG, "dumping extras content="+extras.toString()); - + AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId); - + // Calculate the grid spans needed to fit this widget CellLayout layout = (CellLayout) mWorkspace.getChildAt(cellInfo.screen); int[] spans = layout.rectToCell(appWidgetInfo.minWidth, appWidgetInfo.minHeight); - + // Try finding open space on Launcher screen final int[] xy = mCellCoordinates; if (!findSlot(cellInfo, xy, spans[0], spans[1])) return; @@ -625,31 +625,31 @@ public final class Launcher extends Activity implements View.OnClickListener, On LauncherAppWidgetInfo launcherInfo = new LauncherAppWidgetInfo(appWidgetId); launcherInfo.spanX = spans[0]; launcherInfo.spanY = spans[1]; - + LauncherModel.addItemToDatabase(this, launcherInfo, LauncherSettings.Favorites.CONTAINER_DESKTOP, mWorkspace.getCurrentScreen(), xy[0], xy[1], false); if (!mRestoring) { sModel.addDesktopAppWidget(launcherInfo); - + // Perform actual inflation because we're live launcherInfo.hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo); - + launcherInfo.hostView.setAppWidget(appWidgetId, appWidgetInfo); launcherInfo.hostView.setTag(launcherInfo); - + mWorkspace.addInCurrentScreen(launcherInfo.hostView, xy[0], xy[1], launcherInfo.spanX, launcherInfo.spanY, insertAtFirst); } else if (sModel.isDesktopLoaded()) { sModel.addDesktopAppWidget(launcherInfo); } } - + public LauncherAppWidgetHost getAppWidgetHost() { return mAppWidgetHost; } - + static ApplicationInfo addShortcut(Context context, Intent data, CellLayout.CellInfo cellInfo, boolean notify) { @@ -798,7 +798,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On mDestroyed = true; super.onDestroy(); - + try { mAppWidgetHost.stopListening(); } catch (NullPointerException ex) { @@ -823,11 +823,11 @@ public final class Launcher extends Activity implements View.OnClickListener, On } @Override - public void startSearch(String initialQuery, boolean selectInitialQuery, + 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(); @@ -839,15 +839,15 @@ public final class Launcher extends Activity implements View.OnClickListener, On 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, + 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(); @@ -857,7 +857,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On appSearchData = new Bundle(); appSearchData.putString(SearchManager.SOURCE, "launcher-search"); } - + final SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); @@ -869,12 +869,12 @@ public final class Launcher extends Activity implements View.OnClickListener, On public void onCancel() { searchManager.setOnCancelListener(null); stopSearch(); - } + } }); } - + searchManager.startSearch(initialQuery, selectInitialQuery, getComponentName(), - appSearchData, globalSearch); + appSearchData, globalSearch); } /** @@ -892,7 +892,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On searchWidget.stopSearch(false); } } - + @Override public boolean onCreateOptionsMenu(Menu menu) { if (mDesktopLocked) return false; @@ -951,7 +951,7 @@ 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. @@ -959,7 +959,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On @Override public boolean onSearchRequested() { - startSearch(null, false, null, true); + startSearch(null, false, null, true); return true; } @@ -972,7 +972,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On mWorkspace.removeShortcutsForPackage(packageName); } } - + private void updateShortcutsForPackage(String packageName) { if (packageName != null && packageName.length() > 0) { mWorkspace.updateShortcutsForPackage(packageName); @@ -1005,26 +1005,26 @@ public final class Launcher extends Activity implements View.OnClickListener, On } } } - + 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; - + sModel.addDesktopItem(info); 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); } @@ -1032,11 +1032,11 @@ public final class Launcher extends Activity implements View.OnClickListener, On // Handle case where user selected "Applications" String applicationName = getResources().getString(R.string.group_applications); String shortcutName = intent.getStringExtra(Intent.EXTRA_SHORTCUT_NAME); - + if (applicationName != null && applicationName.equals(shortcutName)) { Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); - + Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY); pickIntent.putExtra(Intent.EXTRA_INTENT, mainIntent); startActivityForResult(pickIntent, REQUEST_PICK_APPLICATION); @@ -1049,7 +1049,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On // Handle case where user selected "Folder" String folderName = getResources().getString(R.string.group_folder); String shortcutName = intent.getStringExtra(Intent.EXTRA_SHORTCUT_NAME); - + if (folderName != null && folderName.equals(shortcutName)) { addFolder(!mDesktopLocked); } else { @@ -1077,7 +1077,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On mWorkspace.addInCurrentScreen(newFolder, cellInfo.cellX, cellInfo.cellY, 1, 1, insertAtFirst); } - + private void completeAddLiveFolder(Intent data, CellLayout.CellInfo cellInfo, boolean insertAtFirst) { cellInfo.screen = mWorkspace.getCurrentScreen(); @@ -1214,11 +1214,11 @@ public final class Launcher extends Activity implements View.OnClickListener, On if (event.getAction() == KeyEvent.ACTION_DOWN) { switch (event.getKeyCode()) { case KeyEvent.KEYCODE_BACK: - mWorkspace.dispatchKeyEvent(event); + mWorkspace.dispatchKeyEvent(event); if (mDrawer.isOpened()) { closeDrawer(); } else { - closeFolder(); + closeFolder(); } return true; case KeyEvent.KEYCODE_HOME: @@ -1276,7 +1276,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On if (mDestroyed) return; bindDesktopItems(); } - + /** * Refreshes the shortcuts shown on the workspace. */ @@ -1293,7 +1293,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On for (int i = 0; i < count; i++) { ((ViewGroup) workspace.getChildAt(i)).removeAllViewsInLayout(); } - + if (DEBUG_USER_INTERFACE) { android.widget.Button finishButton = new android.widget.Button(this); finishButton.setText("Finish"); @@ -1305,12 +1305,12 @@ public final class Launcher extends Activity implements View.OnClickListener, On } }); } - + // Flag any old binder to terminate early if (mBinder != null) { mBinder.mTerminate = true; } - + mBinder = new DesktopBinder(this, shortcuts, appWidgets, drawerAdapter); mBinder.startBindingItems(); } @@ -1352,13 +1352,13 @@ public final class Launcher extends Activity implements View.OnClickListener, On 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, !desktopLocked); break; } @@ -1414,34 +1414,34 @@ public final class Launcher extends Activity implements View.OnClickListener, On mDesktopLocked = false; mDrawer.unlock(); } - + private void bindDrawer(Launcher.DesktopBinder binder, ApplicationsAdapter drawerAdapter) { mAllAppsGrid.setAdapter(drawerAdapter); binder.startBindingAppWidgetsWhenIdle(); } - + private void bindAppWidgets(Launcher.DesktopBinder binder, LinkedList appWidgets) { - + final Workspace workspace = mWorkspace; final boolean desktopLocked = mDesktopLocked; if (!appWidgets.isEmpty()) { final LauncherAppWidgetInfo item = appWidgets.removeFirst(); - + final int appWidgetId = item.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)); - + item.hostView.setAppWidget(appWidgetId, appWidgetInfo); item.hostView.setTag(item); - + workspace.addInScreen(item.hostView, item.screen, item.cellX, item.cellY, item.spanX, item.spanY, !desktopLocked); - + workspace.requestLayout(); } @@ -1652,7 +1652,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On EditText input = (EditText) dialog.findViewById(R.id.folder_name); final CharSequence text = mFolderInfo.title; input.setText(text); - input.setSelection(0, text.length()); + input.setSelection(0, text.length()); break; } } @@ -1744,22 +1744,23 @@ public final class Launcher extends Activity implements View.OnClickListener, On * appropriate activity. */ private class CreateShortcut implements DialogInterface.OnClickListener, - DialogInterface.OnCancelListener { + DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { private AddAdapter mAdapter; Dialog createDialog() { mWaitingForResult = true; - + mAdapter = new AddAdapter(Launcher.this); - + final AlertDialog.Builder builder = new AlertDialog.Builder(Launcher.this); builder.setTitle(getString(R.string.menu_item_add_item)); builder.setAdapter(mAdapter, this); - + builder.setInverseBackgroundForced(true); AlertDialog dialog = builder.create(); dialog.setOnCancelListener(this); + dialog.setOnDismissListener(this); return dialog; } @@ -1769,6 +1770,10 @@ public final class Launcher extends Activity implements View.OnClickListener, On cleanup(); } + public void onDismiss(DialogInterface dialog) { + mWorkspace.unlock(); + } + private void cleanup() { mWorkspace.unlock(); dismissDialog(DIALOG_CREATE_SHORTCUT); @@ -1780,36 +1785,36 @@ public final class Launcher extends Activity implements View.OnClickListener, On public void onClick(DialogInterface dialog, int which) { Resources res = getResources(); cleanup(); - + switch (which) { case AddAdapter.ITEM_SHORTCUT: { // Insert extra item to handle picking application Bundle bundle = new Bundle(); - + ArrayList shortcutNames = new ArrayList(); shortcutNames.add(res.getString(R.string.group_applications)); bundle.putStringArrayList(Intent.EXTRA_SHORTCUT_NAME, shortcutNames); - + ArrayList shortcutIcons = new ArrayList(); shortcutIcons.add(ShortcutIconResource.fromContext(Launcher.this, R.drawable.ic_launcher_application)); bundle.putParcelableArrayList(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, shortcutIcons); - + Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY); pickIntent.putExtra(Intent.EXTRA_INTENT, new Intent(Intent.ACTION_CREATE_SHORTCUT)); pickIntent.putExtra(Intent.EXTRA_TITLE, getText(R.string.title_select_shortcut)); pickIntent.putExtras(bundle); - + startActivityForResult(pickIntent, REQUEST_PICK_SHORTCUT); break; } - + case AddAdapter.ITEM_APPWIDGET: { int appWidgetId = Launcher.this.mAppWidgetHost.allocateAppWidgetId(); - + Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK); pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); // add the search widget @@ -1832,15 +1837,15 @@ public final class Launcher extends Activity implements View.OnClickListener, On startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET); break; } - + case AddAdapter.ITEM_LIVE_FOLDER: { // Insert extra item to handle inserting folder Bundle bundle = new Bundle(); - + ArrayList shortcutNames = new ArrayList(); shortcutNames.add(res.getString(R.string.group_folder)); bundle.putStringArrayList(Intent.EXTRA_SHORTCUT_NAME, shortcutNames); - + ArrayList shortcutIcons = new ArrayList(); shortcutIcons.add(ShortcutIconResource.fromContext(Launcher.this, @@ -1853,7 +1858,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On pickIntent.putExtra(Intent.EXTRA_TITLE, getText(R.string.title_select_live_folder)); pickIntent.putExtras(bundle); - + startActivityForResult(pickIntent, REQUEST_PICK_LIVE_FOLDER); break; } @@ -2023,7 +2028,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On 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; @@ -2031,7 +2036,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On private final LinkedList mAppWidgets; private final ApplicationsAdapter mDrawerAdapter; private final WeakReference mLauncher; - + public boolean mTerminate = false; DesktopBinder(Launcher launcher, ArrayList shortcuts, @@ -2041,12 +2046,12 @@ public final class Launcher extends Activity implements View.OnClickListener, On mLauncher = new WeakReference(launcher); mShortcuts = shortcuts; mDrawerAdapter = drawerAdapter; - + // Sort widgets so active workspace is bound first final int currentScreen = launcher.mWorkspace.getCurrentScreen(); final int size = appWidgets.size(); mAppWidgets = new LinkedList(); - + for (int i = 0; i < size; i++) { LauncherAppWidgetInfo appWidgetInfo = appWidgets.get(i); if (appWidgetInfo.screen == currentScreen) { @@ -2056,7 +2061,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On } } } - + public void startBindingItems() { obtainMessage(MESSAGE_BIND_ITEMS, 0, mShortcuts.size()).sendToTarget(); } @@ -2064,13 +2069,13 @@ public final class Launcher extends Activity implements View.OnClickListener, On public void startBindingDrawer() { obtainMessage(MESSAGE_BIND_DRAWER).sendToTarget(); } - + public void startBindingAppWidgetsWhenIdle() { // Ask for notification when message queue becomes idle final MessageQueue messageQueue = Looper.myQueue(); messageQueue.addIdleHandler(this); } - + public boolean queueIdle() { // Queue is idle, so start binding items startBindingAppWidgets(); @@ -2087,7 +2092,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On if (launcher == null || mTerminate) { return; } - + switch (msg.what) { case MESSAGE_BIND_ITEMS: { launcher.bindItems(this, mShortcuts, msg.arg1, msg.arg2);