mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-19 10:48:19 +00:00
Using DragObject for folder drop instead of maintaining states when
drag starts from inside a folder Change-Id: I073b59c194d0bd483d579bbcb638b116b09590a0
This commit is contained in:
@@ -2907,7 +2907,7 @@ public class Workspace extends PagedView
|
||||
|
||||
private void cleanupAddToFolder() {
|
||||
if (mDragOverFolderIcon != null) {
|
||||
mDragOverFolderIcon.onDragExit(null);
|
||||
mDragOverFolderIcon.onDragExit();
|
||||
mDragOverFolderIcon = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,6 +50,7 @@ import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.launcher3.Alarm;
|
||||
import com.android.launcher3.AppInfo;
|
||||
import com.android.launcher3.CellLayout;
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.DragSource;
|
||||
@@ -163,10 +164,8 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
|
||||
@ViewDebug.ExportedProperty(category = "launcher")
|
||||
private boolean mRearrangeOnClose = false;
|
||||
boolean mItemsInvalidated = false;
|
||||
private ShortcutInfo mCurrentDragInfo;
|
||||
private View mCurrentDragView;
|
||||
private boolean mIsExternalDrag;
|
||||
boolean mSuppressOnAdd = false;
|
||||
private boolean mDragInProgress = false;
|
||||
private boolean mDeleteFolderOnDropCompleted = false;
|
||||
private boolean mSuppressFolderDeletion = false;
|
||||
@@ -291,7 +290,6 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
|
||||
return false;
|
||||
}
|
||||
|
||||
mCurrentDragInfo = item;
|
||||
mEmptyCellRank = item.rank;
|
||||
mCurrentDragView = v;
|
||||
|
||||
@@ -322,7 +320,15 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
|
||||
}
|
||||
|
||||
mContent.removeItem(mCurrentDragView);
|
||||
mInfo.remove(mCurrentDragInfo, true);
|
||||
if (dragObject.dragInfo instanceof ShortcutInfo) {
|
||||
mItemsInvalidated = true;
|
||||
|
||||
// We do not want to get events for the item being removed, as they will get handled
|
||||
// when the drop completes
|
||||
try (SuppressInfoChanges s = new SuppressInfoChanges()) {
|
||||
mInfo.remove((ShortcutInfo) dragObject.dragInfo, true);
|
||||
}
|
||||
}
|
||||
mDragInProgress = true;
|
||||
mItemAddedBackToSelfViaIcon = false;
|
||||
}
|
||||
@@ -664,9 +670,8 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
|
||||
mContent.verifyVisibleHighResIcons(mContent.getNextPage());
|
||||
}
|
||||
|
||||
public void beginExternalDrag(ShortcutInfo item) {
|
||||
mCurrentDragInfo = item;
|
||||
mEmptyCellRank = mContent.allocateRankForNewItem(item);
|
||||
public void beginExternalDrag() {
|
||||
mEmptyCellRank = mContent.allocateRankForNewItem();
|
||||
mIsExternalDrag = true;
|
||||
mDragInProgress = true;
|
||||
|
||||
@@ -845,9 +850,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
|
||||
}
|
||||
|
||||
private void clearDragInfo() {
|
||||
mCurrentDragInfo = null;
|
||||
mCurrentDragView = null;
|
||||
mSuppressOnAdd = false;
|
||||
mIsExternalDrag = false;
|
||||
}
|
||||
|
||||
@@ -911,9 +914,9 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
|
||||
mContent.arrangeChildren(views, views.size());
|
||||
mItemsInvalidated = true;
|
||||
|
||||
mSuppressOnAdd = true;
|
||||
mFolderIcon.onDrop(d);
|
||||
mSuppressOnAdd = false;
|
||||
try (SuppressInfoChanges s = new SuppressInfoChanges()) {
|
||||
mFolderIcon.onDrop(d);
|
||||
}
|
||||
}
|
||||
|
||||
if (target != this) {
|
||||
@@ -930,9 +933,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
|
||||
mDeleteFolderOnDropCompleted = false;
|
||||
mDragInProgress = false;
|
||||
mItemAddedBackToSelfViaIcon = false;
|
||||
mCurrentDragInfo = null;
|
||||
mCurrentDragView = null;
|
||||
mSuppressOnAdd = false;
|
||||
|
||||
// Reordering may have occured, and we need to save the new item locations. We do this once
|
||||
// at the end to prevent unnecessary database operations.
|
||||
@@ -1274,7 +1275,14 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
|
||||
mContent.completePendingPageChanges();
|
||||
|
||||
View currentDragView;
|
||||
ShortcutInfo si = mCurrentDragInfo;
|
||||
final ShortcutInfo si;
|
||||
if (d.dragInfo instanceof AppInfo) {
|
||||
// Came from all apps -- make a copy.
|
||||
si = ((AppInfo) d.dragInfo).makeShortcut();
|
||||
} else {
|
||||
// ShortcutInfo
|
||||
si = (ShortcutInfo) d.dragInfo;
|
||||
}
|
||||
if (mIsExternalDrag) {
|
||||
currentDragView = mContent.createAndAddViewForRank(si, mEmptyCellRank);
|
||||
// Actually move the item in the database if it was an external drag. Call this
|
||||
@@ -1311,11 +1319,11 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
|
||||
rearrangeChildren();
|
||||
|
||||
// Temporarily suppress the listener, as we did all the work already here.
|
||||
mSuppressOnAdd = true;
|
||||
mInfo.add(si, false);
|
||||
mSuppressOnAdd = false;
|
||||
try (SuppressInfoChanges s = new SuppressInfoChanges()) {
|
||||
mInfo.add(si, false);
|
||||
}
|
||||
|
||||
// Clear the drag info, as it is no longer being dragged.
|
||||
mCurrentDragInfo = null;
|
||||
mDragInProgress = false;
|
||||
|
||||
if (mContent.getPageCount() > 1) {
|
||||
@@ -1338,10 +1346,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
|
||||
|
||||
@Override
|
||||
public void onAdd(ShortcutInfo item) {
|
||||
// If the item was dropped onto this open folder, we have done the work associated
|
||||
// with adding the item to the folder, as indicated by mSuppressOnAdd being set
|
||||
if (mSuppressOnAdd) return;
|
||||
mContent.createAndAddViewForRank(item, mContent.allocateRankForNewItem(item));
|
||||
mContent.createAndAddViewForRank(item, mContent.allocateRankForNewItem());
|
||||
mItemsInvalidated = true;
|
||||
LauncherModel.addOrMoveItemInDatabase(
|
||||
mLauncher, item, mInfo.id, 0, item.cellX, item.cellY);
|
||||
@@ -1349,9 +1354,6 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
|
||||
|
||||
public void onRemove(ShortcutInfo item) {
|
||||
mItemsInvalidated = true;
|
||||
// If this item is being dragged from this open folder, we have already handled
|
||||
// the work associated with removing the item, so we don't have to do anything here.
|
||||
if (item == mCurrentDragInfo) return;
|
||||
View v = getViewForInfo(item);
|
||||
mContent.removeItem(v);
|
||||
if (mState == STATE_ANIMATING) {
|
||||
@@ -1490,4 +1492,20 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Temporary resource held while we don't want to handle info changes
|
||||
*/
|
||||
private class SuppressInfoChanges implements AutoCloseable {
|
||||
|
||||
SuppressInfoChanges() {
|
||||
mInfo.removeListener(Folder.this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
mInfo.addListener(Folder.this);
|
||||
updateTextViewFocus();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -125,8 +125,6 @@ public class FolderIcon extends FrameLayout implements FolderListener {
|
||||
Paint mBgPaint = new Paint();
|
||||
|
||||
private Alarm mOpenAlarm = new Alarm();
|
||||
@Thunk
|
||||
ItemInfo mDragInfo;
|
||||
|
||||
public FolderIcon(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
@@ -195,8 +193,6 @@ public class FolderIcon extends FrameLayout implements FolderListener {
|
||||
return super.onSaveInstanceState();
|
||||
}
|
||||
|
||||
|
||||
|
||||
public Folder getFolder() {
|
||||
return mFolder;
|
||||
}
|
||||
@@ -242,22 +238,11 @@ public class FolderIcon extends FrameLayout implements FolderListener {
|
||||
// Workspace#onDropExternal.
|
||||
mOpenAlarm.setAlarm(ON_OPEN_DELAY);
|
||||
}
|
||||
mDragInfo = dragInfo;
|
||||
}
|
||||
|
||||
OnAlarmListener mOnOpenListener = new OnAlarmListener() {
|
||||
public void onAlarm(Alarm alarm) {
|
||||
ShortcutInfo item;
|
||||
if (mDragInfo instanceof AppInfo) {
|
||||
// Came from all apps -- make a copy.
|
||||
item = ((AppInfo) mDragInfo).makeShortcut();
|
||||
item.spanX = 1;
|
||||
item.spanY = 1;
|
||||
} else {
|
||||
// ShortcutInfo
|
||||
item = (ShortcutInfo) mDragInfo;
|
||||
}
|
||||
mFolder.beginExternalDrag(item);
|
||||
mFolder.beginExternalDrag();
|
||||
mLauncher.openFolder(FolderIcon.this);
|
||||
}
|
||||
};
|
||||
@@ -284,7 +269,7 @@ public class FolderIcon extends FrameLayout implements FolderListener {
|
||||
animateFirstItem(animateDrawable, INITIAL_ITEM_ANIMATION_DURATION, false, null);
|
||||
|
||||
// This will animate the dragView (srcView) into the new folder
|
||||
onDrop(srcInfo, srcView, dstRect, scaleRelativeToDragLayer, 1, postAnimationRunnable, null);
|
||||
onDrop(srcInfo, srcView, dstRect, scaleRelativeToDragLayer, 1, postAnimationRunnable);
|
||||
}
|
||||
|
||||
public void performDestroyAnimation(final View finalView, Runnable onCompleteRunnable) {
|
||||
@@ -298,18 +283,13 @@ public class FolderIcon extends FrameLayout implements FolderListener {
|
||||
onCompleteRunnable);
|
||||
}
|
||||
|
||||
public void onDragExit(Object dragInfo) {
|
||||
onDragExit();
|
||||
}
|
||||
|
||||
public void onDragExit() {
|
||||
mBackground.animateToRest();
|
||||
mOpenAlarm.cancelAlarm();
|
||||
}
|
||||
|
||||
private void onDrop(final ShortcutInfo item, DragView animateView, Rect finalRect,
|
||||
float scaleRelativeToDragLayer, int index, Runnable postAnimationRunnable,
|
||||
DragObject d) {
|
||||
float scaleRelativeToDragLayer, int index, Runnable postAnimationRunnable) {
|
||||
item.cellX = -1;
|
||||
item.cellY = -1;
|
||||
|
||||
@@ -379,7 +359,7 @@ public class FolderIcon extends FrameLayout implements FolderListener {
|
||||
item = (ShortcutInfo) d.dragInfo;
|
||||
}
|
||||
mFolder.notifyDrop();
|
||||
onDrop(item, d.dragView, null, 1.0f, mInfo.contents.size(), d.postAnimationRunnable, d);
|
||||
onDrop(item, d.dragView, null, 1.0f, mInfo.contents.size(), d.postAnimationRunnable);
|
||||
}
|
||||
|
||||
private void computePreviewDrawingParams(int drawableSize, int totalSize) {
|
||||
|
||||
@@ -195,7 +195,7 @@ public class FolderPagedView extends PagedView {
|
||||
* Create space for a new item at the end, and returns the rank for that item.
|
||||
* Also sets the current page to the last page.
|
||||
*/
|
||||
public int allocateRankForNewItem(ShortcutInfo info) {
|
||||
public int allocateRankForNewItem() {
|
||||
int rank = getItemCount();
|
||||
ArrayList<View> views = new ArrayList<>(mFolder.getItemsInReadingOrder());
|
||||
views.add(rank, null);
|
||||
|
||||
Reference in New Issue
Block a user