summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher/DeleteZone.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/launcher/DeleteZone.java')
-rw-r--r--src/com/android/launcher/DeleteZone.java260
1 files changed, 260 insertions, 0 deletions
diff --git a/src/com/android/launcher/DeleteZone.java b/src/com/android/launcher/DeleteZone.java
new file mode 100644
index 000000000..f31a206c5
--- /dev/null
+++ b/src/com/android/launcher/DeleteZone.java
@@ -0,0 +1,260 @@
+/*
+ * 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.launcher;
+
+import android.widget.ImageView;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.animation.TranslateAnimation;
+import android.view.animation.Animation;
+import android.view.animation.AnimationSet;
+import android.view.animation.AccelerateInterpolator;
+import android.view.animation.AlphaAnimation;
+import android.graphics.RectF;
+import android.graphics.drawable.TransitionDrawable;
+
+public class DeleteZone extends ImageView implements DropTarget, DragController.DragListener {
+ private static final int ORIENTATION_HORIZONTAL = 1;
+ private static final int TRANSITION_DURATION = 250;
+ private static final int ANIMATION_DURATION = 200;
+
+ private final int[] mLocation = new int[2];
+
+ private Launcher mLauncher;
+ private boolean mTrashMode;
+
+ private AnimationSet mInAnimation;
+ private AnimationSet mOutAnimation;
+ private Animation mHandleInAnimation;
+ private Animation mHandleOutAnimation;
+
+ private int mOrientation;
+ private DragLayer mDragLayer;
+
+ private final RectF mRegion = new RectF();
+ private TransitionDrawable mTransition;
+ private View mHandle;
+
+ public DeleteZone(Context context) {
+ super(context);
+ }
+
+ public DeleteZone(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public DeleteZone(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DeleteZone, defStyle, 0);
+ mOrientation = a.getInt(R.styleable.DeleteZone_direction, ORIENTATION_HORIZONTAL);
+ a.recycle();
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mTransition = (TransitionDrawable) getBackground();
+ }
+
+ public boolean acceptDrop(DragSource source, int x, int y, int xOffset, int yOffset,
+ Object dragInfo) {
+ return true;
+ }
+
+ public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo) {
+ final ItemInfo item = (ItemInfo) dragInfo;
+
+ if (item.container == -1) return;
+
+ final LauncherModel model = Launcher.getModel();
+ if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) {
+ if (item instanceof LauncherGadgetInfo) {
+ model.removeDesktopGadget((LauncherGadgetInfo) item);
+ } else {
+ model.removeDesktopItem(item);
+ }
+ } else {
+ if (source instanceof UserFolder) {
+ final UserFolder userFolder = (UserFolder) source;
+ final UserFolderInfo userFolderInfo = (UserFolderInfo) userFolder.getInfo();
+ model.removeUserFolderItem(userFolderInfo, item);
+ }
+ }
+ if (item instanceof UserFolderInfo) {
+ final UserFolderInfo userFolderInfo = (UserFolderInfo)item;
+ LauncherModel.deleteUserFolderContentsFromDatabase(mLauncher, userFolderInfo);
+ model.removeUserFolder(userFolderInfo);
+ } else if (item instanceof LauncherGadgetInfo) {
+ final LauncherGadgetInfo launcherGadgetInfo = (LauncherGadgetInfo)item;
+ final LauncherGadgetHost gadgetHost = mLauncher.getGadgetHost();
+ if (gadgetHost != null) {
+ gadgetHost.deleteGadgetId(launcherGadgetInfo.gadgetId);
+ }
+ }
+ LauncherModel.deleteItemFromDatabase(mLauncher, item);
+ }
+
+ public void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset,
+ Object dragInfo) {
+ mTransition.reverseTransition(TRANSITION_DURATION);
+ }
+
+ public void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset,
+ Object dragInfo) {
+ }
+
+ public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset,
+ Object dragInfo) {
+ mTransition.reverseTransition(TRANSITION_DURATION);
+ }
+
+ public void onDragStart(View v, DragSource source, Object info, int dragAction) {
+ 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);
+ mDragLayer.setDeleteRegion(mRegion);
+ mTransition.resetTransition();
+ startAnimation(mInAnimation);
+ mHandle.startAnimation(mHandleOutAnimation);
+ setVisibility(VISIBLE);
+ }
+ }
+
+ public void onDragEnd() {
+ if (mTrashMode) {
+ mTrashMode = false;
+ mDragLayer.setDeleteRegion(null);
+ startAnimation(mOutAnimation);
+ mHandle.startAnimation(mHandleInAnimation);
+ setVisibility(GONE);
+ }
+ }
+
+ private void createAnimations() {
+ if (mInAnimation == null) {
+ mInAnimation = new FastAnimationSet();
+ final AnimationSet animationSet = mInAnimation;
+ animationSet.setInterpolator(new AccelerateInterpolator());
+ animationSet.addAnimation(new AlphaAnimation(0.0f, 1.0f));
+ if (mOrientation == ORIENTATION_HORIZONTAL) {
+ animationSet.addAnimation(new TranslateAnimation(Animation.ABSOLUTE, 0.0f,
+ Animation.ABSOLUTE, 0.0f, Animation.RELATIVE_TO_SELF, 1.0f,
+ Animation.RELATIVE_TO_SELF, 0.0f));
+ } else {
+ animationSet.addAnimation(new TranslateAnimation(Animation.RELATIVE_TO_SELF,
+ 1.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.ABSOLUTE, 0.0f,
+ Animation.ABSOLUTE, 0.0f));
+ }
+ animationSet.setDuration(ANIMATION_DURATION);
+ }
+ if (mHandleInAnimation == null) {
+ if (mOrientation == ORIENTATION_HORIZONTAL) {
+ mHandleInAnimation = new TranslateAnimation(Animation.ABSOLUTE, 0.0f,
+ Animation.ABSOLUTE, 0.0f, Animation.RELATIVE_TO_SELF, 1.0f,
+ Animation.RELATIVE_TO_SELF, 0.0f);
+ } else {
+ mHandleInAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF,
+ 1.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.ABSOLUTE, 0.0f,
+ Animation.ABSOLUTE, 0.0f);
+ }
+ mHandleInAnimation.setDuration(ANIMATION_DURATION);
+ }
+ if (mOutAnimation == null) {
+ mOutAnimation = new FastAnimationSet();
+ final AnimationSet animationSet = mOutAnimation;
+ animationSet.setInterpolator(new AccelerateInterpolator());
+ animationSet.addAnimation(new AlphaAnimation(1.0f, 0.0f));
+ if (mOrientation == ORIENTATION_HORIZONTAL) {
+ animationSet.addAnimation(new FastTranslateAnimation(Animation.ABSOLUTE, 0.0f,
+ Animation.ABSOLUTE, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f,
+ Animation.RELATIVE_TO_SELF, 1.0f));
+ } else {
+ animationSet.addAnimation(new FastTranslateAnimation(Animation.RELATIVE_TO_SELF,
+ 0.0f, Animation.RELATIVE_TO_SELF, 1.0f, Animation.ABSOLUTE, 0.0f,
+ Animation.ABSOLUTE, 0.0f));
+ }
+ animationSet.setDuration(ANIMATION_DURATION);
+ }
+ if (mHandleOutAnimation == null) {
+ if (mOrientation == ORIENTATION_HORIZONTAL) {
+ mHandleOutAnimation = new FastTranslateAnimation(Animation.ABSOLUTE, 0.0f,
+ Animation.ABSOLUTE, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f,
+ Animation.RELATIVE_TO_SELF, 1.0f);
+ } else {
+ mHandleOutAnimation = new FastTranslateAnimation(Animation.RELATIVE_TO_SELF,
+ 0.0f, Animation.RELATIVE_TO_SELF, 1.0f, Animation.ABSOLUTE, 0.0f,
+ Animation.ABSOLUTE, 0.0f);
+ }
+ mHandleOutAnimation.setFillAfter(true);
+ mHandleOutAnimation.setDuration(ANIMATION_DURATION);
+ }
+ }
+
+ void setLauncher(Launcher launcher) {
+ mLauncher = launcher;
+ }
+
+ void setDragController(DragLayer dragLayer) {
+ mDragLayer = dragLayer;
+ }
+
+ void setHandle(View view) {
+ mHandle = view;
+ }
+
+ private static class FastTranslateAnimation extends TranslateAnimation {
+ public FastTranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue,
+ int fromYType, float fromYValue, int toYType, float toYValue) {
+ super(fromXType, fromXValue, toXType, toXValue,
+ fromYType, fromYValue, toYType, toYValue);
+ }
+
+ @Override
+ public boolean willChangeTransformationMatrix() {
+ return true;
+ }
+
+ @Override
+ public boolean willChangeBounds() {
+ return false;
+ }
+ }
+
+ private static class FastAnimationSet extends AnimationSet {
+ FastAnimationSet() {
+ super(false);
+ }
+
+ @Override
+ public boolean willChangeTransformationMatrix() {
+ return true;
+ }
+
+ @Override
+ public boolean willChangeBounds() {
+ return false;
+ }
+ }
+}