From dea9e93e4a7b78ae48f27ac0d5d117f6b393bba0 Mon Sep 17 00:00:00 2001 From: Patrick Dubroy Date: Wed, 22 Sep 2010 15:04:29 -0700 Subject: Fix misaligned drop targets in the all apps CAB --- src/com/android/launcher2/AllAppsPagedView.java | 49 +++++++++++++++++++--- .../launcher2/ApplicationInfoDropTarget.java | 45 ++++++++++---------- src/com/android/launcher2/DeleteZone.java | 40 ++++++++++++++---- 3 files changed, 97 insertions(+), 37 deletions(-) (limited to 'src') diff --git a/src/com/android/launcher2/AllAppsPagedView.java b/src/com/android/launcher2/AllAppsPagedView.java index a9e4dfe85..a2a3793dd 100644 --- a/src/com/android/launcher2/AllAppsPagedView.java +++ b/src/com/android/launcher2/AllAppsPagedView.java @@ -21,14 +21,13 @@ import com.android.launcher.R; import android.content.ComponentName; import android.content.Context; import android.content.res.TypedArray; -import android.graphics.Rect; import android.util.AttributeSet; -import android.util.Log; import android.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import android.view.animation.AnimationUtils; import android.widget.Checkable; import android.widget.TextView; @@ -72,6 +71,12 @@ public class AllAppsPagedView extends PagedView private final LayoutInflater mInflater; + private ViewGroup mOrigInfoButtonParent; + private LayoutParams mOrigInfoButtonLayoutParams; + + private ViewGroup mOrigDeleteZoneParent; + private LayoutParams mOrigDeleteZoneLayoutParams; + public AllAppsPagedView(Context context) { this(context, null); } @@ -400,10 +405,28 @@ public class AllAppsPagedView extends PagedView public boolean onPrepareActionMode(ActionMode mode, Menu menu) { mode.setTitle(R.string.cab_selection_text); - menu.add(0, MENU_APP_INFO, 0, R.string.cab_menu_app_info) - .setIcon(R.drawable.info_button); - menu.add(0, MENU_DELETE_APP, 0, R.string.cab_menu_delete_app) - .setIcon(R.drawable.delete_zone_selector); + // Until the workspace has a selection mode and the CAB supports drag-and-drop, we + // take a hybrid approach: grab the views from the workspace and stuff them into the CAB. + // When the action mode is done, restore the views to their original place in the toolbar. + + ApplicationInfoDropTarget infoButton = + (ApplicationInfoDropTarget) mLauncher.findViewById(R.id.info_button); + mOrigInfoButtonParent = (ViewGroup) infoButton.getParent(); + mOrigInfoButtonLayoutParams = infoButton.getLayoutParams(); + mOrigInfoButtonParent.removeView(infoButton); + infoButton.setManageVisibility(false); + infoButton.setVisibility(View.VISIBLE); + + DeleteZone deleteZone = (DeleteZone) mLauncher.findViewById(R.id.delete_zone); + mOrigDeleteZoneParent = (ViewGroup) deleteZone.getParent(); + mOrigDeleteZoneLayoutParams = deleteZone.getLayoutParams(); + mOrigDeleteZoneParent.removeView(deleteZone); + deleteZone.setManageVisibility(false); + deleteZone.setVisibility(View.VISIBLE); + + menu.add(0, MENU_APP_INFO, 0, R.string.cab_menu_app_info).setActionView(infoButton); + menu.add(0, MENU_DELETE_APP, 0, R.string.cab_menu_delete_app).setActionView(deleteZone); + return true; } @@ -415,6 +438,20 @@ public class AllAppsPagedView extends PagedView @Override public void onDestroyActionMode(ActionMode mode) { + // Re-parent the drop targets into the toolbar, and restore their layout params + ApplicationInfoDropTarget infoButton = + (ApplicationInfoDropTarget) mLauncher.findViewById(R.id.info_button); + ((ViewGroup) infoButton.getParent()).removeView(infoButton); + mOrigInfoButtonParent.addView(infoButton, mOrigInfoButtonLayoutParams); + infoButton.setVisibility(View.GONE); + infoButton.setManageVisibility(true); + + DeleteZone deleteZone = (DeleteZone) mLauncher.findViewById(R.id.delete_zone); + ((ViewGroup) deleteZone.getParent()).removeView(deleteZone); + mOrigDeleteZoneParent.addView(deleteZone, mOrigDeleteZoneLayoutParams); + deleteZone.setVisibility(View.GONE); + deleteZone.setManageVisibility(true); + mDragController.removeDropTarget(this); endChoiceMode(); } diff --git a/src/com/android/launcher2/ApplicationInfoDropTarget.java b/src/com/android/launcher2/ApplicationInfoDropTarget.java index 99a52582e..0e342a7b4 100644 --- a/src/com/android/launcher2/ApplicationInfoDropTarget.java +++ b/src/com/android/launcher2/ApplicationInfoDropTarget.java @@ -21,7 +21,6 @@ import android.content.Context; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; -import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; @@ -32,10 +31,17 @@ import android.widget.ImageView; */ public class ApplicationInfoDropTarget extends ImageView implements DropTarget, DragController.DragListener { private Launcher mLauncher; - private DragController mDragController; private boolean mActive = false; - private View mHandle; + /** + * If true, this View responsible for managing its own visibility, and that of its handle. + * This is generally the case, but it will be set to false when this is part of the + * Contextual Action Bar. + */ + private boolean mManageVisibility = true; + + /** The view that this view should appear in the place of. */ + private View mHandle = null; private final Paint mPaint = new Paint(); @@ -47,11 +53,6 @@ public class ApplicationInfoDropTarget extends ImageView implements DropTarget, super(context, attrs, defStyle); } - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - } - /** * Set the color that will be used as a filter over objects dragged over this object. */ @@ -92,7 +93,6 @@ public class ApplicationInfoDropTarget extends ImageView implements DropTarget, public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { - // TODO: Animate out dragView.setPaint(null); } @@ -100,22 +100,23 @@ public class ApplicationInfoDropTarget extends ImageView implements DropTarget, if (info != null) { mActive = true; - // TODO: Animate these in and out - - // Only show the info icon when an application is selected - if (((ItemInfo)info).itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) { - setVisibility(VISIBLE); + if (mManageVisibility) { + // Only show the info icon when an application is selected + if (((ItemInfo)info).itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) { + setVisibility(VISIBLE); + } + mHandle.setVisibility(INVISIBLE); } - mHandle.setVisibility(INVISIBLE); } } public void onDragEnd() { if (mActive) { mActive = false; - // TODO: Animate these in and out - setVisibility(GONE); - mHandle.setVisibility(VISIBLE); + if (mManageVisibility) { + setVisibility(GONE); + mHandle.setVisibility(VISIBLE); + } } } @@ -123,14 +124,14 @@ public class ApplicationInfoDropTarget extends ImageView implements DropTarget, mLauncher = launcher; } - void setDragController(DragController dragController) { - mDragController = dragController; - } - void setHandle(View view) { mHandle = view; } + void setManageVisibility(boolean value) { + mManageVisibility = value; + } + @Override public DropTarget getDropTargetDelegate(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { diff --git a/src/com/android/launcher2/DeleteZone.java b/src/com/android/launcher2/DeleteZone.java index 01a20f76b..aeaf5a37e 100644 --- a/src/com/android/launcher2/DeleteZone.java +++ b/src/com/android/launcher2/DeleteZone.java @@ -23,7 +23,6 @@ import android.content.res.TypedArray; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; -import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.TransitionDrawable; import android.util.AttributeSet; @@ -45,6 +44,13 @@ public class DeleteZone extends ImageView implements DropTarget, DragController. private Launcher mLauncher; private boolean mTrashMode; + /** + * If true, this View responsible for managing its own visibility, and that of its handle. + * This is generally the case, but it will be set to false when this is part of the + * Contextual Action Bar. + */ + private boolean mManageVisibility = true; + private AnimationSet mInAnimation; private AnimationSet mOutAnimation; private Animation mHandleInAnimation; @@ -55,9 +61,11 @@ public class DeleteZone extends ImageView implements DropTarget, DragController. private final RectF mRegion = new RectF(); private TransitionDrawable mTransition; - private View mHandle; private final Paint mTrashPaint = new Paint(); + /** The View that this view will replace. */ + private View mHandle = null; + public DeleteZone(Context context, AttributeSet attrs) { this(context, attrs, 0); } @@ -71,6 +79,7 @@ public class DeleteZone extends ImageView implements DropTarget, DragController. TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DeleteZone, defStyle, 0); mOrientation = a.getInt(R.styleable.DeleteZone_direction, ORIENTATION_HORIZONTAL); a.recycle(); + } @Override @@ -149,16 +158,21 @@ public class DeleteZone extends ImageView implements DropTarget, DragController. final ItemInfo item = (ItemInfo) info; if (item != null) { mTrashMode = true; - createAnimations(); final int[] location = mLocation; getLocationOnScreen(location); mRegion.set(location[0], location[1], location[0] + mRight - mLeft, location[1] + mBottom - mTop); mDragController.setDeleteRegion(mRegion); + + // Make sure the icon is set to the default drawable, not the hover drawable mTransition.resetTransition(); - startAnimation(mInAnimation); - mHandle.startAnimation(mHandleOutAnimation); - setVisibility(VISIBLE); + + if (mManageVisibility) { + createAnimations(); + startAnimation(mInAnimation); + mHandle.startAnimation(mHandleOutAnimation); + setVisibility(VISIBLE); + } } } @@ -166,9 +180,13 @@ public class DeleteZone extends ImageView implements DropTarget, DragController. if (mTrashMode) { mTrashMode = false; mDragController.setDeleteRegion(null); - startAnimation(mOutAnimation); - mHandle.startAnimation(mHandleInAnimation); - setVisibility(GONE); + + if (mOutAnimation != null) startAnimation(mOutAnimation); + if (mHandleInAnimation != null) mHandle.startAnimation(mHandleInAnimation); + + if (mManageVisibility) { + setVisibility(GONE); + } } } @@ -228,6 +246,10 @@ public class DeleteZone extends ImageView implements DropTarget, DragController. mHandle = view; } + void setManageVisibility(boolean value) { + mManageVisibility = value; + } + private static class FastTranslateAnimation extends TranslateAnimation { public FastTranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue) { -- cgit v1.2.3