diff options
-rw-r--r-- | src/com/android/launcher2/Alarm.java | 8 | ||||
-rw-r--r-- | src/com/android/launcher2/Folder.java | 57 | ||||
-rw-r--r-- | src/com/android/launcher2/FolderIcon.java | 9 |
3 files changed, 57 insertions, 17 deletions
diff --git a/src/com/android/launcher2/Alarm.java b/src/com/android/launcher2/Alarm.java index 38ff36733..7cd21c327 100644 --- a/src/com/android/launcher2/Alarm.java +++ b/src/com/android/launcher2/Alarm.java @@ -28,6 +28,7 @@ public class Alarm implements Runnable{ private Handler mHandler; private OnAlarmListener mAlarmListener; + private boolean mAlarmPending = false; public Alarm() { mHandler = new Handler(); @@ -41,6 +42,7 @@ public class Alarm implements Runnable{ // it's overwritten and only the new alarm setting is used public void setAlarm(long millisecondsInFuture) { long currentTime = System.currentTimeMillis(); + mAlarmPending = true; mAlarmTriggerTime = currentTime + millisecondsInFuture; if (!mWaitingForCallback) { mHandler.postDelayed(this, mAlarmTriggerTime - currentTime); @@ -50,6 +52,7 @@ public class Alarm implements Runnable{ public void cancelAlarm() { mAlarmTriggerTime = 0; + mAlarmPending = false; } // this is called when our timer runs out @@ -63,12 +66,17 @@ public class Alarm implements Runnable{ mHandler.postDelayed(this, Math.max(0, mAlarmTriggerTime - currentTime)); mWaitingForCallback = true; } else { + mAlarmPending = false; if (mAlarmListener != null) { mAlarmListener.onAlarm(this); } } } } + + public boolean alarmPending() { + return mAlarmPending; + } } interface OnAlarmListener { diff --git a/src/com/android/launcher2/Folder.java b/src/com/android/launcher2/Folder.java index 780d0ed26..652c8b03d 100644 --- a/src/com/android/launcher2/Folder.java +++ b/src/com/android/launcher2/Folder.java @@ -91,7 +91,6 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList private int[] mTargetCell = new int[2]; private int[] mPreviousTargetCell = new int[2]; private int[] mEmptyCell = new int[2]; - private int[] mTempXY = new int[2]; private Alarm mReorderAlarm = new Alarm(); private Alarm mOnExitAlarm = new Alarm(); private TextView mFolderName; @@ -99,10 +98,10 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList private Rect mHitRect = new Rect(); private Rect mTempRect = new Rect(); private boolean mFirstOpen = true; - - // Internal variable to track whether the folder was destroyed due to only a single - // item remaining - private boolean mDestroyed = false; + private boolean mDragInProgress = false; + private boolean mDeleteFolderOnDropCompleted = false; + private boolean mSuppressFolderDeletion = false; + private boolean mItemAddedBackToSelf = false; private boolean mIsEditingName = false; private InputMethodManager mInputMethodManager; @@ -221,6 +220,8 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mContent.removeView(mCurrentDragView); mInfo.remove(mCurrentDragInfo); + mDragInProgress = true; + mItemAddedBackToSelf = false; } return true; } @@ -660,20 +661,38 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList } public void onDropCompleted(View target, DragObject d, boolean success) { + if (success) { + if (mDeleteFolderOnDropCompleted && !mItemAddedBackToSelf) { + replaceFolderWithFinalItem(); + } + } else { + // The drag failed, we need to return the item to the folder + mFolderIcon.onDrop(d); + + // We're going to trigger a "closeFolder" which may occur before this item has + // been added back to the folder -- this could cause the folder to be deleted + if (mOnExitAlarm.alarmPending()) { + mSuppressFolderDeletion = true; + } + } + + if (target != this) { + if (mOnExitAlarm.alarmPending()) { + mOnExitAlarm.cancelAlarm(); + completeDragExit(); + } + } + mDeleteFolderOnDropCompleted = false; + mDragInProgress = false; + mItemAddedBackToSelf = false; mCurrentDragInfo = null; mCurrentDragView = null; mSuppressOnAdd = false; - if (target != this) { - mOnExitAlarm.cancelAlarm(); - completeDragExit(); - } + } - if (!success) { - if (!mDestroyed) { - mFolderIcon.onDrop(d); - } else { - // TODO: if the folder was removed, recreate it - } + public void notifyDrop() { + if (mDragInProgress) { + mItemAddedBackToSelf = true; } } @@ -839,14 +858,18 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList mRearrangeOnClose = false; } if (getItemCount() <= 1) { - replaceFolderWithFinalItem(); + if (!mDragInProgress && !mSuppressFolderDeletion) { + replaceFolderWithFinalItem(); + } else if (mDragInProgress) { + mDeleteFolderOnDropCompleted = true; + } } + mSuppressFolderDeletion = false; } private void replaceFolderWithFinalItem() { ItemInfo finalItem = null; - mDestroyed = true; if (getItemCount() == 1) { finalItem = mInfo.contents.get(0); } diff --git a/src/com/android/launcher2/FolderIcon.java b/src/com/android/launcher2/FolderIcon.java index 8cf3fa7d1..b6b027a50 100644 --- a/src/com/android/launcher2/FolderIcon.java +++ b/src/com/android/launcher2/FolderIcon.java @@ -329,8 +329,16 @@ public class FolderIcon extends LinearLayout implements FolderListener { if (to == null) { to = new Rect(); Workspace workspace = mLauncher.getWorkspace(); + // Set cellLayout and this to it's final state to compute final animation locations workspace.setFinalTransitionTransform((CellLayout) getParent().getParent()); + float scaleX = getScaleX(); + float scaleY = getScaleY(); + setScaleX(1.0f); + setScaleY(1.0f); scaleRelativeToDragLayer = dragLayer.getDescendantRectRelativeToSelf(this, to); + // Finished computing final animation locations, restore current state + setScaleX(scaleX); + setScaleY(scaleY); workspace.resetTransitionTransform((CellLayout) getParent().getParent()); } @@ -362,6 +370,7 @@ public class FolderIcon extends LinearLayout implements FolderListener { } else { item = (ShortcutInfo) d.dragInfo; } + mFolder.notifyDrop(); onDrop(item, d.dragView, null, 1.0f, mInfo.contents.size(), d.postAnimationRunnable); } |