Loading src/com/android/documentsui/DragAndDropHelper.java 0 → 100644 +54 −0 Original line number Diff line number Diff line /* * Copyright (C) 2016 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.documentsui; import static com.android.documentsui.base.Shared.DEBUG; import android.util.Log; import com.android.documentsui.base.DocumentInfo; import java.util.List; /** * A helper class for drag and drop operations */ public final class DragAndDropHelper { private static final String TAG = "DragAndDropHelper"; private DragAndDropHelper() {} /** * Helper method to see whether an item can be dropped/copied into a particular destination. * Don't copy from the cwd into a provided list of prohibited directories. (ie. into cwd, into a * selected directory). Note: this currently doesn't work for multi-window drag, because * localState isn't carried over from one process to another. */ public static boolean canCopyTo(Object dragLocalState, DocumentInfo dst) { if (dragLocalState == null || !(dragLocalState instanceof List<?>)) { if (DEBUG) Log.d(TAG, "Invalid local state object. Will allow copy."); return true; } List<?> src = (List<?>) dragLocalState; if (src.contains(dst)) { if (DEBUG) Log.d(TAG, "Drop target same as source. Ignoring."); return false; } return true; } } src/com/android/documentsui/DrawerController.java +5 −0 Original line number Diff line number Diff line Loading @@ -166,6 +166,11 @@ public abstract class DrawerController implements DrawerListener { setOpen(true); } @Override public void onDragExited(View v, Object localState) { // do nothing } @Override public void onViewHovered(View v) { } Loading src/com/android/documentsui/HorizontalBreadcrumb.java +5 −0 Original line number Diff line number Diff line Loading @@ -130,6 +130,11 @@ public final class HorizontalBreadcrumb extends RecyclerView // do nothing } @Override public void onDragExited(View v, Object localState) { // do nothing } @Override public void onViewHovered(View v) { int pos = getChildAdapterPosition(v); Loading src/com/android/documentsui/ItemDragListener.java +13 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.documentsui; import static com.android.documentsui.base.Shared.DEBUG; import android.content.ClipData; import android.graphics.drawable.Drawable; import android.util.Log; Loading @@ -24,8 +26,10 @@ import android.view.View; import android.view.View.OnDragListener; import com.android.documentsui.ItemDragListener.DragHost; import com.android.documentsui.base.DocumentInfo; import com.android.internal.annotations.VisibleForTesting; import java.util.List; import java.util.Timer; import java.util.TimerTask; Loading Loading @@ -67,6 +71,8 @@ public class ItemDragListener<H extends DragHost> implements OnDragListener { handleLocationEvent(v, event.getX(), event.getY()); return true; case DragEvent.ACTION_DRAG_EXITED: mDragHost.onDragExited(v, event.getLocalState()); // fall through case DragEvent.ACTION_DRAG_ENDED: handleExitedEndedEvent(v, event); return true; Loading Loading @@ -97,7 +103,6 @@ public class ItemDragListener<H extends DragHost> implements OnDragListener { private void handleExitedEndedEvent(View v, DragEvent event) { mDragHost.setDropTargetHighlight(v, event.getLocalState(), false); TimerTask task = (TimerTask) v.getTag(R.id.drag_hovering_tag); if (task != null) { task.cancel(); Loading Loading @@ -171,5 +176,12 @@ public class ItemDragListener<H extends DragHost> implements OnDragListener { * @param localState the Local state object given by DragEvent */ void onDragEntered(View v, Object localState); /** * Notifies right away when drag shadow exits the view * @param v the view which drop shadow just exited * @param localState the Local state object given by DragEvent */ void onDragExited(View v, Object localState); } } src/com/android/documentsui/dirlist/DirectoryDragListener.java +3 −6 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.documentsui.dirlist; import android.view.DragEvent; import android.view.View; import com.android.documentsui.DragAndDropHelper; import com.android.documentsui.ItemDragListener; import java.util.TimerTask; Loading @@ -36,10 +37,6 @@ class DirectoryDragListener extends ItemDragListener<DirectoryFragment> { final boolean result = super.onDrag(v, event); switch (event.getAction()) { case DragEvent.ACTION_DRAG_EXITED: // If drag exits, we want to update drag and drop status on the drop shadow mDragHost.dragExited(v); break; case DragEvent.ACTION_DRAG_ENDED: // getResult() is true if drag was accepted mDragHost.dragStopped(event.getResult()); Loading @@ -58,7 +55,7 @@ class DirectoryDragListener extends ItemDragListener<DirectoryFragment> { @Override public @Nullable TimerTask createOpenTask(final View v, DragEvent event) { return mDragHost.canCopyTo(event.getLocalState(), v) ? super.createOpenTask(v, event) : null; return DragAndDropHelper.canCopyTo(event.getLocalState(), mDragHost.getDestination(v)) ? super.createOpenTask(v, event) : null; } } No newline at end of file Loading
src/com/android/documentsui/DragAndDropHelper.java 0 → 100644 +54 −0 Original line number Diff line number Diff line /* * Copyright (C) 2016 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.documentsui; import static com.android.documentsui.base.Shared.DEBUG; import android.util.Log; import com.android.documentsui.base.DocumentInfo; import java.util.List; /** * A helper class for drag and drop operations */ public final class DragAndDropHelper { private static final String TAG = "DragAndDropHelper"; private DragAndDropHelper() {} /** * Helper method to see whether an item can be dropped/copied into a particular destination. * Don't copy from the cwd into a provided list of prohibited directories. (ie. into cwd, into a * selected directory). Note: this currently doesn't work for multi-window drag, because * localState isn't carried over from one process to another. */ public static boolean canCopyTo(Object dragLocalState, DocumentInfo dst) { if (dragLocalState == null || !(dragLocalState instanceof List<?>)) { if (DEBUG) Log.d(TAG, "Invalid local state object. Will allow copy."); return true; } List<?> src = (List<?>) dragLocalState; if (src.contains(dst)) { if (DEBUG) Log.d(TAG, "Drop target same as source. Ignoring."); return false; } return true; } }
src/com/android/documentsui/DrawerController.java +5 −0 Original line number Diff line number Diff line Loading @@ -166,6 +166,11 @@ public abstract class DrawerController implements DrawerListener { setOpen(true); } @Override public void onDragExited(View v, Object localState) { // do nothing } @Override public void onViewHovered(View v) { } Loading
src/com/android/documentsui/HorizontalBreadcrumb.java +5 −0 Original line number Diff line number Diff line Loading @@ -130,6 +130,11 @@ public final class HorizontalBreadcrumb extends RecyclerView // do nothing } @Override public void onDragExited(View v, Object localState) { // do nothing } @Override public void onViewHovered(View v) { int pos = getChildAdapterPosition(v); Loading
src/com/android/documentsui/ItemDragListener.java +13 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.documentsui; import static com.android.documentsui.base.Shared.DEBUG; import android.content.ClipData; import android.graphics.drawable.Drawable; import android.util.Log; Loading @@ -24,8 +26,10 @@ import android.view.View; import android.view.View.OnDragListener; import com.android.documentsui.ItemDragListener.DragHost; import com.android.documentsui.base.DocumentInfo; import com.android.internal.annotations.VisibleForTesting; import java.util.List; import java.util.Timer; import java.util.TimerTask; Loading Loading @@ -67,6 +71,8 @@ public class ItemDragListener<H extends DragHost> implements OnDragListener { handleLocationEvent(v, event.getX(), event.getY()); return true; case DragEvent.ACTION_DRAG_EXITED: mDragHost.onDragExited(v, event.getLocalState()); // fall through case DragEvent.ACTION_DRAG_ENDED: handleExitedEndedEvent(v, event); return true; Loading Loading @@ -97,7 +103,6 @@ public class ItemDragListener<H extends DragHost> implements OnDragListener { private void handleExitedEndedEvent(View v, DragEvent event) { mDragHost.setDropTargetHighlight(v, event.getLocalState(), false); TimerTask task = (TimerTask) v.getTag(R.id.drag_hovering_tag); if (task != null) { task.cancel(); Loading Loading @@ -171,5 +176,12 @@ public class ItemDragListener<H extends DragHost> implements OnDragListener { * @param localState the Local state object given by DragEvent */ void onDragEntered(View v, Object localState); /** * Notifies right away when drag shadow exits the view * @param v the view which drop shadow just exited * @param localState the Local state object given by DragEvent */ void onDragExited(View v, Object localState); } }
src/com/android/documentsui/dirlist/DirectoryDragListener.java +3 −6 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.documentsui.dirlist; import android.view.DragEvent; import android.view.View; import com.android.documentsui.DragAndDropHelper; import com.android.documentsui.ItemDragListener; import java.util.TimerTask; Loading @@ -36,10 +37,6 @@ class DirectoryDragListener extends ItemDragListener<DirectoryFragment> { final boolean result = super.onDrag(v, event); switch (event.getAction()) { case DragEvent.ACTION_DRAG_EXITED: // If drag exits, we want to update drag and drop status on the drop shadow mDragHost.dragExited(v); break; case DragEvent.ACTION_DRAG_ENDED: // getResult() is true if drag was accepted mDragHost.dragStopped(event.getResult()); Loading @@ -58,7 +55,7 @@ class DirectoryDragListener extends ItemDragListener<DirectoryFragment> { @Override public @Nullable TimerTask createOpenTask(final View v, DragEvent event) { return mDragHost.canCopyTo(event.getLocalState(), v) ? super.createOpenTask(v, event) : null; return DragAndDropHelper.canCopyTo(event.getLocalState(), mDragHost.getDestination(v)) ? super.createOpenTask(v, event) : null; } } No newline at end of file