diff options
Diffstat (limited to 'src/com/android/launcher2/Launcher.java')
-rw-r--r-- | src/com/android/launcher2/Launcher.java | 461 |
1 files changed, 138 insertions, 323 deletions
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index 26f41fa53..90bd151eb 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -115,7 +115,6 @@ public final class Launcher extends Activity static final boolean PROFILE_STARTUP = false; static final boolean DEBUG_WIDGETS = false; - static final boolean DEBUG_USER_INTERFACE = false; private static final int MENU_GROUP_ADD = 1; private static final int MENU_GROUP_WALLPAPER = MENU_GROUP_ADD + 1; @@ -149,6 +148,8 @@ public final class Launcher extends Activity // Type: int private static final String RUNTIME_STATE = "launcher.state"; // Type: int + private static final String RUNTIME_STATE_PENDING_ADD_CONTAINER = "launcher.add_container"; + // Type: int private static final String RUNTIME_STATE_PENDING_ADD_SCREEN = "launcher.add_screen"; // Type: int private static final String RUNTIME_STATE_PENDING_ADD_CELL_X = "launcher.add_cell_x"; @@ -185,16 +186,14 @@ public final class Launcher extends Activity private AppWidgetManager mAppWidgetManager; private LauncherAppWidgetHost mAppWidgetHost; - private int mAddScreen = -1; - private int mAddCellX = -1; - private int mAddCellY = -1; - private int[] mAddDropPosition; + private ItemInfo mPendingAddInfo = new ItemInfo(); private int[] mTmpAddItemCellCoordinates = new int[2]; private FolderInfo mFolderInfo; - private ViewGroup mButtonCluster; + private Hotseat mHotseat; private View mAllAppsButton; + private SearchDropTargetBar mSearchDeleteBar; private AppsCustomizeTabHost mAppsCustomizeTabHost; private AppsCustomizePagedView mAppsCustomizeContent; @@ -259,6 +258,7 @@ public final class Launcher extends Activity private static class PendingAddArguments { int requestCode; Intent intent; + long container; int screen; int cellX; int cellY; @@ -600,20 +600,22 @@ public final class Launcher extends Activity private boolean completeAdd(PendingAddArguments args) { switch (args.requestCode) { case REQUEST_PICK_APPLICATION: - completeAddApplication(args.intent, args.screen, args.cellX, args.cellY); + completeAddApplication(args.intent, args.container, args.screen, args.cellX, + args.cellY); break; case REQUEST_PICK_SHORTCUT: processShortcut(args.intent); break; case REQUEST_CREATE_SHORTCUT: - completeAddShortcut(args.intent, args.screen, args.cellX, args.cellY); + completeAddShortcut(args.intent, args.container, args.screen, args.cellX, + args.cellY); return true; case REQUEST_PICK_APPWIDGET: addAppWidgetFromPick(args.intent); break; case REQUEST_CREATE_APPWIDGET: int appWidgetId = args.intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); - completeAddAppWidget(appWidgetId, args.screen); + completeAddAppWidget(appWidgetId, args.container, args.screen); return true; case REQUEST_PICK_WALLPAPER: // We just wanted the activity result here so we can clear mWaitingForResult @@ -632,13 +634,15 @@ public final class Launcher extends Activity // 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 && mAddScreen != -1) { + if (resultCode == RESULT_OK && mPendingAddInfo.container != ItemInfo.NO_ID && + mPendingAddInfo.screen > -1) { final PendingAddArguments args = new PendingAddArguments(); args.requestCode = requestCode; args.intent = data; - args.screen = mAddScreen; - args.cellX = mAddCellX; - args.cellY = mAddCellY; + args.container = mPendingAddInfo.container; + args.screen = mPendingAddInfo.screen; + args.cellX = mPendingAddInfo.cellX; + args.cellY = mPendingAddInfo.cellY; // If the loader is still running, defer the add until it is done. if (isWorkspaceLocked()) { @@ -797,12 +801,15 @@ public final class Launcher extends Activity mWorkspace.setCurrentPage(currentScreen); } - final int addScreen = savedState.getInt(RUNTIME_STATE_PENDING_ADD_SCREEN, -1); + final long pendingAddContainer = savedState.getLong(RUNTIME_STATE_PENDING_ADD_CONTAINER, -1); + final int pendingAddScreen = savedState.getInt(RUNTIME_STATE_PENDING_ADD_SCREEN, -1); + - if (addScreen > -1) { - mAddScreen = addScreen; - mAddCellX = savedState.getInt(RUNTIME_STATE_PENDING_ADD_CELL_X); - mAddCellY = savedState.getInt(RUNTIME_STATE_PENDING_ADD_CELL_Y); + if (pendingAddContainer != ItemInfo.NO_ID && pendingAddScreen > -1) { + mPendingAddInfo.container = pendingAddContainer; + mPendingAddInfo.screen = pendingAddScreen; + mPendingAddInfo.cellX = savedState.getInt(RUNTIME_STATE_PENDING_ADD_CELL_X); + mPendingAddInfo.cellY = savedState.getInt(RUNTIME_STATE_PENDING_ADD_CELL_Y); mRestoring = true; } @@ -841,6 +848,12 @@ public final class Launcher extends Activity // Setup the drag layer mDragLayer.setup(this, dragController); + // Setup the hotseat + mHotseat = (Hotseat) findViewById(R.id.hotseat); + if (mHotseat != null) { + mHotseat.setup(this); + } + // Setup the workspace mWorkspace.setHapticFeedbackEnabled(false); mWorkspace.setOnLongClickListener(this); @@ -857,47 +870,9 @@ public final class Launcher extends Activity mAppsCustomizeTabHost.findViewById(R.id.apps_customize_pane_content); mAppsCustomizeContent.setup(this, dragController); - // Setup AppsCustomize button - mAllAppsButton = mDragLayer.findViewById(R.id.all_apps_button); - mAllAppsButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - onClickAllAppsButton(v); - } - }); - if (!LauncherApplication.isScreenLarge()) { - // Setup AppsCustomize button on the phone - HandleView handleView = (HandleView) mAllAppsButton; - handleView.setLauncher(this); - handleView.setOnLongClickListener(this); - - // Setup Hotseat - ImageView hotseatLeft = (ImageView) findViewById(R.id.hotseat_left); - hotseatLeft.setContentDescription(mHotseatLabels[0]); - hotseatLeft.setImageDrawable(mHotseatIcons[0]); - ImageView hotseatRight = (ImageView) findViewById(R.id.hotseat_right); - hotseatRight.setContentDescription(mHotseatLabels[1]); - hotseatRight.setImageDrawable(mHotseatIcons[1]); - } - - if (!LauncherApplication.isScreenLarge()) { - // Setup keylistener for button cluster - mButtonCluster = (ViewGroup) findViewById(R.id.all_apps_button_cluster); - View.OnKeyListener listener = null; - if (LauncherApplication.isScreenLarge()) { - // For tablets, AllApps lives in the button bar at the top - listener = new ButtonBarKeyEventListener(); - } else { - // For phones, AppsCustomize lives in the "dock" at the bottom - listener = new DockKeyEventListener(); - } - int buttonCount = mButtonCluster.getChildCount(); - for (int i = 0; i < buttonCount; ++i) { - mButtonCluster.getChildAt(i).setOnKeyListener(listener); - } - } - // Setup the drag controller (the drop targets have to be added in reverse order) + // Setup the drag controller (drop targets have to be added in reverse order in priority) dragController.setDragScoller(mWorkspace); dragController.setScrollView(mDragLayer); dragController.setMoveTarget(mWorkspace); @@ -907,40 +882,7 @@ public final class Launcher extends Activity } } - @SuppressWarnings({"UnusedDeclaration"}) - public void previousScreen(View v) { - if (mState != State.APPS_CUSTOMIZE) { - mWorkspace.scrollLeft(); - } - } - - @SuppressWarnings({"UnusedDeclaration"}) - public void nextScreen(View v) { - if (mState != State.APPS_CUSTOMIZE) { - mWorkspace.scrollRight(); - } - } - - @SuppressWarnings({"UnusedDeclaration"}) - public void launchHotSeat(View v) { - if (mState == State.APPS_CUSTOMIZE) return; - - int index = -1; - if (v.getId() == R.id.hotseat_left) { - index = 0; - } else if (v.getId() == R.id.hotseat_right) { - index = 1; - } - // reload these every tap; you never know when they might change - loadHotseats(); - if (index >= 0 && index < mHotseats.length && mHotseats[index] != null) { - startActivitySafely( - mHotseats[index], - "hotseat" - ); - } - } /** * Creates a view representing a shortcut. @@ -976,9 +918,9 @@ public final class Launcher extends Activity * @param data The intent describing the application. * @param cellInfo The position on screen where to create the shortcut. */ - void completeAddApplication(Intent data, int screen, int cellX, int cellY) { + void completeAddApplication(Intent data, long container, int screen, int cellX, int cellY) { final int[] cellXY = mTmpAddItemCellCoordinates; - final CellLayout layout = (CellLayout) mWorkspace.getChildAt(screen); + final CellLayout layout = getCellLayout(container, screen); // First we check if we already know the exact location where we want to add this item. if (cellX >= 0 && cellY >= 0) { @@ -995,7 +937,7 @@ public final class Launcher extends Activity info.setActivity(data.getComponent(), Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); info.container = ItemInfo.NO_ID; - mWorkspace.addApplicationShortcut(info, screen, cellXY[0], cellXY[1], + mWorkspace.addApplicationShortcut(info, layout, container, screen, cellXY[0], cellXY[1], isWorkspaceLocked(), cellX, cellY); } else { Log.e(TAG, "Couldn't find ActivityInfo for selected application: " + data); @@ -1008,11 +950,12 @@ public final class Launcher extends Activity * @param data The intent describing the shortcut. * @param cellInfo The position on screen where to create the shortcut. */ - private void completeAddShortcut(Intent data, int screen, int cellX, int cellY) { - final int[] cellXY = mTmpAddItemCellCoordinates; - final CellLayout layout = (CellLayout) mWorkspace.getChildAt(screen); + private void completeAddShortcut(Intent data, long container, int screen, int cellX, + int cellY) { + int[] cellXY = mTmpAddItemCellCoordinates; + int[] touchXY = mPendingAddInfo.dropPos; + CellLayout layout = getCellLayout(container, screen); - int[] touchXY = mAddDropPosition; boolean foundCellSpan = false; // First we check if we already know the exact location where we want to add this item. @@ -1022,9 +965,7 @@ public final class Launcher extends Activity foundCellSpan = true; } else if (touchXY != null) { // when dragging and dropping, just find the closest free spot - CellLayout screenLayout = (CellLayout) mWorkspace.getChildAt(screen); - int[] result = screenLayout.findNearestVacantArea( - touchXY[0], touchXY[1], 1, 1, cellXY); + int[] result = layout.findNearestVacantArea(touchXY[0], touchXY[1], 1, 1, cellXY); foundCellSpan = (result != null); } else { foundCellSpan = layout.findCellForSpan(cellXY, 1, 1); @@ -1036,11 +977,12 @@ public final class Launcher extends Activity } final ShortcutInfo info = mModel.addShortcut( - this, data, screen, cellXY[0], cellXY[1], false); + this, data, container, screen, cellXY[0], cellXY[1], false); if (!mRestoring) { final View view = createShortcut(info); - mWorkspace.addInScreen(view, screen, cellXY[0], cellXY[1], 1, 1, isWorkspaceLocked()); + mWorkspace.addInScreen(view, container, screen, cellXY[0], cellXY[1], 1, 1, + isWorkspaceLocked()); } } @@ -1050,11 +992,11 @@ public final class Launcher extends Activity * @param appWidgetId The app widget id * @param cellInfo The position on screen where to create the widget. */ - private void completeAddAppWidget(final int appWidgetId, int screen) { + private void completeAddAppWidget(final int appWidgetId, long container, int screen) { AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId); // Calculate the grid spans needed to fit this widget - CellLayout layout = (CellLayout) mWorkspace.getChildAt(screen); + CellLayout layout = getCellLayout(container, screen); // We want to account for the extra amount of padding that we are adding to the widget // to ensure that it gets the full amount of space that it has requested @@ -1070,18 +1012,16 @@ public final class Launcher extends Activity // Try finding open space on Launcher screen // We have saved the position to which the widget was dragged-- this really only matters // if we are placing widgets on a "spring-loaded" screen - final int[] cellXY = mTmpAddItemCellCoordinates; - - int[] touchXY = mAddDropPosition; + int[] cellXY = mTmpAddItemCellCoordinates; + int[] touchXY = mPendingAddInfo.dropPos; boolean foundCellSpan = false; - if (mAddCellX >= 0 && mAddCellY >= 0) { - cellXY[0] = mAddCellX; - cellXY[1] = mAddCellY; + if (mPendingAddInfo.cellX >= 0 && mPendingAddInfo.cellY >= 0) { + cellXY[0] = mPendingAddInfo.cellX; + cellXY[1] = mPendingAddInfo.cellY; foundCellSpan = true; } else if (touchXY != null) { // when dragging and dropping, just find the closest free spot - CellLayout screenLayout = (CellLayout) mWorkspace.getChildAt(screen); - int[] result = screenLayout.findNearestVacantArea( + int[] result = layout.findNearestVacantArea( touchXY[0], touchXY[1], spanXY[0], spanXY[1], cellXY); foundCellSpan = (result != null); } else { @@ -1108,8 +1048,7 @@ public final class Launcher extends Activity launcherInfo.spanY = spanXY[1]; LauncherModel.addItemToDatabase(this, launcherInfo, - LauncherSettings.Favorites.CONTAINER_DESKTOP, - screen, cellXY[0], cellXY[1], false); + container, screen, cellXY[0], cellXY[1], false); if (!mRestoring) { // Perform actual inflation because we're live @@ -1118,7 +1057,7 @@ public final class Launcher extends Activity launcherInfo.hostView.setAppWidget(appWidgetId, appWidgetInfo); launcherInfo.hostView.setTag(launcherInfo); - mWorkspace.addInScreen(launcherInfo.hostView, screen, cellXY[0], cellXY[1], + mWorkspace.addInScreen(launcherInfo.hostView, container, screen, cellXY[0], cellXY[1], launcherInfo.spanX, launcherInfo.spanY, isWorkspaceLocked()); addWidgetToAutoAdvanceIfNeeded(launcherInfo.hostView, appWidgetInfo); @@ -1331,10 +1270,12 @@ public final class Launcher extends Activity // this state is reflected. closeFolder(); - if (mAddScreen > -1 && mWaitingForResult) { - outState.putInt(RUNTIME_STATE_PENDING_ADD_SCREEN, mAddScreen); - outState.putInt(RUNTIME_STATE_PENDING_ADD_CELL_X, mAddCellX); - outState.putInt(RUNTIME_STATE_PENDING_ADD_CELL_Y, mAddCellY); + if (mPendingAddInfo.container != ItemInfo.NO_ID && mPendingAddInfo.screen > -1 && + mWaitingForResult) { + outState.putLong(RUNTIME_STATE_PENDING_ADD_CONTAINER, mPendingAddInfo.container); + outState.putInt(RUNTIME_STATE_PENDING_ADD_SCREEN, mPendingAddInfo.screen); + outState.putInt(RUNTIME_STATE_PENDING_ADD_CELL_X, mPendingAddInfo.cellX); + outState.putInt(RUNTIME_STATE_PENDING_ADD_CELL_Y, mPendingAddInfo.cellY); } if (mFolderInfo != null && mWaitingForResult) { @@ -1372,7 +1313,7 @@ public final class Launcher extends Activity TextKeyListener.getInstance().release(); - unbindWorkspaceItems(); + unbindWorkspaceAndHotseatItems(); getContentResolver().unregisterContentObserver(mWidgetObserver); unregisterReceiver(mCloseSystemDialogsReceiver); @@ -1507,10 +1448,11 @@ public final class Launcher extends Activity } private void resetAddInfo() { - mAddScreen = -1; - mAddCellX = -1; - mAddCellY = -1; - mAddDropPosition = null; + mPendingAddInfo.container = ItemInfo.NO_ID; + mPendingAddInfo.screen = -1; + mPendingAddInfo.cellX = mPendingAddInfo.cellY = -1; + mPendingAddInfo.spanX = mPendingAddInfo.spanY = -1; + mPendingAddInfo.dropPos = null; } private void manageApps() { @@ -1566,7 +1508,7 @@ public final class Launcher extends Activity startActivityForResultSafely(intent, REQUEST_CREATE_APPWIDGET); } else { // Otherwise just add it - completeAddAppWidget(appWidgetId, mAddScreen); + completeAddAppWidget(appWidgetId, info.container, info.screen); // Exit spring loaded mode if necessary after adding the widget exitSpringLoadedDragModeDelayed(false); @@ -1581,14 +1523,16 @@ public final class Launcher extends Activity * @param cell The cell it should be added to, optional * @param position The location on the screen where it was dropped, optional */ - void processShortcutFromDrop(ComponentName componentName, int screen, int[] cell, int[] loc) { + void processShortcutFromDrop(ComponentName componentName, long container, int screen, + int[] cell, int[] loc) { resetAddInfo(); - mAddScreen = screen; - mAddDropPosition = loc; + mPendingAddInfo.container = container; + mPendingAddInfo.screen = screen; + mPendingAddInfo.dropPos = loc; if (cell != null) { - mAddCellX = cell[0]; - mAddCellY = cell[1]; + mPendingAddInfo.cellX = cell[0]; + mPendingAddInfo.cellY = cell[1]; } Intent createShortcutIntent = new Intent(Intent.ACTION_CREATE_SHORTCUT); @@ -1604,14 +1548,15 @@ public final class Launcher extends Activity * @param cell The cell it should be added to, optional * @param position The location on the screen where it was dropped, optional */ - void addAppWidgetFromDrop(PendingAddWidgetInfo info, int screen, int[] cell, int[] loc) { + void addAppWidgetFromDrop(PendingAddWidgetInfo info, long container, int screen, + int[] cell, int[] loc) { resetAddInfo(); - mAddScreen = screen; - mAddDropPosition = loc; - + mPendingAddInfo.container = info.container = container; + mPendingAddInfo.screen = info.screen = screen; + mPendingAddInfo.dropPos = loc; if (cell != null) { - mAddCellX = cell[0]; - mAddCellY = cell[1]; + mPendingAddInfo.cellX = cell[0]; + mPendingAddInfo.cellY = cell[1]; } int appWidgetId = getAppWidgetHost().allocateAppWidgetId(); @@ -1641,21 +1586,21 @@ public final class Launcher extends Activity startActivityForResult(intent, REQUEST_PICK_WALLPAPER); } - FolderIcon addFolder(final int screen, int cellX, int cellY) { + FolderIcon addFolder(CellLayout layout, long container, final int screen, int cellX, + int cellY) { final FolderInfo folderInfo = new FolderInfo(); folderInfo.title = getText(R.string.folder_name); // Update the model - LauncherModel.addItemToDatabase(Launcher.this, folderInfo, - LauncherSettings.Favorites.CONTAINER_DESKTOP, - screen, cellX, cellY, false); + LauncherModel.addItemToDatabase(Launcher.this, folderInfo, container, screen, cellX, cellY, + false); sFolders.put(folderInfo.id, folderInfo); // Create the view - FolderIcon newFolder = FolderIcon.fromXml(R.layout.folder_icon, this, - (ViewGroup) mWorkspace.getChildAt(mWorkspace.getCurrentPage()), - folderInfo, mIconCache); - mWorkspace.addInScreen(newFolder, screen, cellX, cellY, 1, 1, isWorkspaceLocked()); + FolderIcon newFolder = + FolderIcon.fromXml(R.layout.folder_icon, this, layout, folderInfo, mIconCache); + mWorkspace.addInScreen(newFolder, container, screen, cellX, cellY, 1, 1, + isWorkspaceLocked()); return newFolder; } @@ -1753,8 +1698,7 @@ public final class Launcher extends Activity ViewGroup parent = (ViewGroup) folder.getParent().getParent(); if (parent != null) { - CellLayout cl = (CellLayout) mWorkspace.getChildAt(folder.mInfo.screen); - FolderIcon fi = (FolderIcon) cl.getChildAt(folder.mInfo.cellX, folder.mInfo.cellY); + FolderIcon fi = (FolderIcon) mWorkspace.getViewForTag(folder.mInfo); shrinkAndFadeInFolderIcon(fi); mDragController.removeDropTarget((DropTarget)folder); } @@ -1774,7 +1718,7 @@ public final class Launcher extends Activity * Go through the and disconnect any of the callbacks in the drawables and the views or we * leak the previous Home screen on orientation change. */ - private void unbindWorkspaceItems() { + private void unbindWorkspaceAndHotseatItems() { LauncherModel.unbindWorkspaceItems(); } @@ -1995,16 +1939,6 @@ public final class Launcher extends Activity return false; } - switch (v.getId()) { - case R.id.all_apps_button: - if (mState != State.APPS_CUSTOMIZE) { - mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, - HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - showPreviews(v); - } - return true; - } - if (isWorkspaceLocked()) { return false; } @@ -2020,12 +1954,13 @@ public final class Launcher extends Activity return true; } + // The hotseat touch handling does not go through Workspace, and we always allow long press + // on hotseat items. final View itemUnderLongClick = longClickCellInfo.cell; - - if (mWorkspace.allowLongPress() && !mDragController.isDragging()) { + boolean allowLongPress = isHotseatLayout(v) || mWorkspace.allowLongPress(); + if (allowLongPress && !mDragController.isDragging()) { if (itemUnderLongClick == null) { // User long pressed on empty space - mWorkspace.setAllowLongPress(false); mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); addItems(); @@ -2041,137 +1976,26 @@ public final class Launcher extends Activity return true; } - @SuppressWarnings({"unchecked"}) - private void dismissPreview(final View v) { - final PopupWindow window = (PopupWindow) v.getTag(); - if (window != null) { - window.setOnDismissListener(new PopupWindow.OnDismissListener() { - public void onDismiss() { - ViewGroup group = (ViewGroup) v.getTag(R.id.workspace); - int count = group.getChildCount(); - for (int i = 0; i < count; i++) { - ((ImageView) group.getChildAt(i)).setImageDrawable(null); - } - ArrayList<Bitmap> bitmaps = - (ArrayList<Bitmap>) v.getTag(R.id.all_apps_button_cluster); - for (Bitmap bitmap : bitmaps) bitmap.recycle(); - - v.setTag(R.id.workspace, null); - v.setTag(R.id.all_apps_button_cluster, null); - window.setOnDismissListener(null); - } - }); - window.dismiss(); - } - v.setTag(null); + boolean isHotseatLayout(View layout) { + return mHotseat != null && layout != null && + (layout instanceof CellLayout) && (layout == mHotseat.getLayout()); } - - private void showPreviews(View anchor) { - showPreviews(anchor, 0, mWorkspace.getChildCount()); + Hotseat getHotseat() { + return mHotseat; } - private void showPreviews(final View anchor, int start, int end) { - final Resources resources = getResources(); - final Workspace workspace = mWorkspace; - - CellLayout cell = ((CellLayout) workspace.getChildAt(start)); - - float max = workspace.getChildCount(); - - final Rect r = new Rect(); - resources.getDrawable(R.drawable.preview_background).getPadding(r); - int extraW = (int) ((r.left + r.right) * max); - int extraH = r.top + r.bottom; - - int aW = cell.getWidth() - extraW; - float w = aW / max; - - int width = cell.getWidth(); - int height = cell.getHeight(); - int x = cell.getPaddingLeft(); - int y = cell.getPaddingTop(); - width -= (x + cell.getPaddingRight()); - height -= (y + cell.getPaddingBottom()); - - float scale = w / width; - - int count = end - start; - - final float sWidth = width * scale; - float sHeight = height * scale; - - LinearLayout preview = new LinearLayout(this); - - PreviewTouchHandler handler = new PreviewTouchHandler(anchor); - ArrayList<Bitmap> bitmaps = new ArrayList<Bitmap>(count); - - for (int i = start; i < end; i++) { - ImageView image = new ImageView(this); - cell = (CellLayout) workspace.getChildAt(i); - - final Bitmap bitmap = Bitmap.createBitmap((int) sWidth, (int) sHeight, - Bitmap.Config.ARGB_8888); - - final Canvas c = new Canvas(bitmap); - c.scale(scale, scale); - c.translate(-cell.getPaddingLeft(), -cell.getPaddingTop()); - cell.drawChildren(c); - - image.setBackgroundDrawable(resources.getDrawable(R.drawable.preview_background)); - image.setImageBitmap(bitmap); - image.setTag(i); - image.setOnClickListener(handler); - image.setOnFocusChangeListener(handler); - image.setFocusable(true); - if (i == mWorkspace.getCurrentPage()) image.requestFocus(); - - preview.addView(image, - LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); - - bitmaps.add(bitmap); - } - - final PopupWindow p = new PopupWindow(this); - p.setContentView(preview); - p.setWidth((int) (sWidth * count + extraW)); - p.setHeight((int) (sHeight + extraH)); - p.setAnimationStyle(R.style.AnimationPreview); - p.setOutsideTouchable(true); - p.setFocusable(true); - p.setBackgroundDrawable(new ColorDrawable(0)); - p.showAsDropDown(anchor, 0, 0); - - p.setOnDismissListener(new PopupWindow.OnDismissListener() { - public void onDismiss() { - dismissPreview(anchor); - } - }); - - anchor.setTag(p); - anchor.setTag(R.id.workspace, preview); - anchor.setTag(R.id.all_apps_button_cluster, bitmaps); - } - - class PreviewTouchHandler implements View.OnClickListener, Runnable, View.OnFocusChangeListener { - private final View mAnchor; - - public PreviewTouchHandler(View anchor) { - mAnchor = anchor; - } - - public void onClick(View v) { - mWorkspace.snapToPage((Integer) v.getTag()); - v.post(this); - } - - public void run() { - dismissPreview(mAnchor); - } - - public void onFocusChange(View v, boolean hasFocus) { - if (hasFocus) { - mWorkspace.snapToPage((Integer) v.getTag()); + /** + * Returns the CellLayout of the specified container at the specified screen. + */ + CellLayout getCellLayout(long container, int screen) { + if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { + if (mHotseat != null) { + return mHotseat.getLayout(); + } else { + return null; } + } else { + return (CellLayout) mWorkspace.getChildAt(screen); } } @@ -2215,7 +2039,8 @@ public final class Launcher extends Activity private void showAddDialog() { resetAddInfo(); - mAddScreen = mWorkspace.getCurrentPage(); + mPendingAddInfo.container = LauncherSettings.Favorites.CONTAINER_DESKTOP; + mPendingAddInfo.screen = mWorkspace.getCurrentPage(); mWaitingForResult = true; showDialog(DIALOG_CREATE_SHORTCUT); } @@ -2594,29 +2419,29 @@ public final class Launcher extends Activity } /** - * Shows the dock/hotseat area. + * Shows the hotseat area. */ - void showDock(boolean animated) { + void showHotseat(boolean animated) { if (!LauncherApplication.isScreenLarge()) { if (animated) { int duration = mSearchDeleteBar.getTransitionInDuration(); - mButtonCluster.animate().alpha(1f).setDuration(duration); + mHotseat.animate().alpha(1f).setDuration(duration); } else { - mButtonCluster.setAlpha(1f); + mHotseat.setAlpha(1f); } } } /** - * Hides the dock/hotseat area. + * Hides the hotseat area. */ - void hideDock(boolean animated) { + void hideHotseat(boolean animated) { if (!LauncherApplication.isScreenLarge()) { if (animated) { int duration = mSearchDeleteBar.getTransitionOutDuration(); - mButtonCluster.animate().alpha(0f).setDuration(duration); + mHotseat.animate().alpha(0f).setDuration(duration); } else { - mButtonCluster.setAlpha(0f); + mHotseat.setAlpha(0f); } } } @@ -2627,9 +2452,9 @@ public final class Launcher extends Activity cameraZoomOut(State.APPS_CUSTOMIZE, animated, false); mAppsCustomizeTabHost.requestFocus(); - // Hide the search bar and dock + // Hide the search bar and hotseat mSearchDeleteBar.hideSearchBar(animated); - hideDock(animated); + hideHotseat(animated); // Change the state *after* we've called all the transition code mState = State.APPS_CUSTOMIZE; @@ -2686,12 +2511,14 @@ public final class Launcher extends Activity mWorkspace.setVisibility(View.VISIBLE); cameraZoomIn(State.APPS_CUSTOMIZE, animated, false); - // Show the search bar and dock + // Show the search bar and hotseat mSearchDeleteBar.showSearchBar(animated); - showDock(animated); + showHotseat(animated); // Set focus to the AppsCustomize button - findViewById(R.id.all_apps_button).requestFocus(); + if (mAllAppsButton != null) { + mAllAppsButton.requestFocus(); + } } } @@ -3024,21 +2851,12 @@ public final class Launcher extends Activity final CellLayout layoutParent = (CellLayout) workspace.getChildAt(i); layoutParent.removeAllViewsInLayout(); } - - if (DEBUG_USER_INTERFACE) { - android.widget.Button finishButton = new android.widget.Button(this); - finishButton.setText("Finish"); - workspace.addInScreen(finishButton, 1, 0, 0, 1, 1); - - finishButton.setOnClickListener(new android.widget.Button.OnClickListener() { - public void onClick(View v) { - finish(); - } - }); + if (mHotseat != null) { + mHotseat.resetLayout(); } // This wasn't being called before which resulted in a leak of AppWidgetHostViews - unbindWorkspaceItems(); + unbindWorkspaceAndHotseatItems(); } /** @@ -3047,30 +2865,27 @@ public final class Launcher extends Activity * Implementation of the method from LauncherModel.Callbacks. */ public void bindItems(ArrayList<ItemInfo> shortcuts, int start, int end) { - setLoadOnResume(); final Workspace workspace = mWorkspace; - for (int i=start; i<end; i++) { final ItemInfo item = shortcuts.get(i); switch (item.itemType) { case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: - final View shortcut = createShortcut((ShortcutInfo)item); - workspace.addInScreen(shortcut, item.screen, item.cellX, item.cellY, 1, 1, - false); + View shortcut = createShortcut((ShortcutInfo)item); + workspace.addInScreen(shortcut, item.container, item.screen, item.cellX, + item.cellY, 1, 1, false); break; case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: - final FolderIcon newFolder = FolderIcon.fromXml(R.layout.folder_icon, this, + FolderIcon newFolder = FolderIcon.fromXml(R.layout.folder_icon, this, (ViewGroup) workspace.getChildAt(workspace.getCurrentPage()), (FolderInfo) item, mIconCache); - workspace.addInScreen(newFolder, item.screen, item.cellX, item.cellY, 1, 1, - false); + workspace.addInScreen(newFolder, item.container, item.screen, item.cellX, + item.cellY, 1, 1, false); break; } } - workspace.requestLayout(); } @@ -3108,7 +2923,7 @@ public final class Launcher extends Activity item.hostView.setAppWidget(appWidgetId, appWidgetInfo); item.hostView.setTag(item); - workspace.addInScreen(item.hostView, item.screen, item.cellX, + workspace.addInScreen(item.hostView, item.container, item.screen, item.cellX, item.cellY, item.spanX, item.spanY, false); addWidgetToAutoAdvanceIfNeeded(item.hostView, appWidgetInfo); |