Loading src/com/android/documentsui/dirlist/GridDirectoryHolder.java +2 −1 Original line number Diff line number Diff line Loading @@ -81,7 +81,8 @@ final class GridDirectoryHolder extends DocumentHolder { @Override public boolean inSelectRegion(MotionEvent event) { return mAction == State.ACTION_BROWSE ? Views.isEventOver(event, mIconLayout) : false; return mAction == State.ACTION_BROWSE ? Views.isEventOver(event, itemView.getParent(), mIconLayout) : false; } /** Loading src/com/android/documentsui/dirlist/GridDocumentHolder.java +2 −2 Original line number Diff line number Diff line Loading @@ -137,12 +137,12 @@ final class GridDocumentHolder extends DocumentHolder { @Override public boolean inSelectRegion(MotionEvent event) { return Views.isEventOver(event, mIconLayout); return Views.isEventOver(event, itemView.getParent(), mIconLayout); } @Override public boolean inPreviewIconRegion(MotionEvent event) { return Views.isEventOver(event, mPreviewIcon); return Views.isEventOver(event, itemView.getParent(), mPreviewIcon); } /** Loading src/com/android/documentsui/dirlist/GridPhotoHolder.java +1 −1 Original line number Diff line number Diff line Loading @@ -125,7 +125,7 @@ final class GridPhotoHolder extends DocumentHolder { @Override public boolean inPreviewIconRegion(MotionEvent event) { return Views.isEventOver(event, mPreviewIcon); return Views.isEventOver(event, itemView.getParent(), mPreviewIcon); } /** Loading src/com/android/documentsui/dirlist/ListDocumentHolder.java +2 −2 Original line number Diff line number Diff line Loading @@ -180,12 +180,12 @@ final class ListDocumentHolder extends DocumentHolder { @Override public boolean inSelectRegion(MotionEvent event) { return (mDoc.isDirectory() && !(mAction == State.ACTION_BROWSE)) ? false : Views.isEventOver(event, mIconLayout); false : Views.isEventOver(event, itemView.getParent(), mIconLayout); } @Override public boolean inPreviewIconRegion(MotionEvent event) { return Views.isEventOver(event, mPreviewIcon); return Views.isEventOver(event, itemView.getParent(), mPreviewIcon); } /** Loading src/com/android/documentsui/ui/Views.java +29 −5 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.documentsui.ui; import android.graphics.Rect; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; /** * A utility class for working with Views. Loading @@ -28,22 +30,44 @@ public final class Views { private Views() {} /** * Return whether the event is in the view's region * * Return whether the event is in the view's region. We determine it with in the coordinate * of the parent view that dispatches the motion event. * @param event the motion event * @param eventSource the view dispatching the motion events. * @param view the view to check the selection region * @return True, if the event is in the region. Otherwise, return false. */ public static boolean isEventOver(MotionEvent event, View view) { public static boolean isEventOver(MotionEvent event, ViewParent eventSource, View view) { if (view == null || event == null || !view.isAttachedToWindow()) { return false; } View parent = null; if (eventSource instanceof ViewGroup) { parent = (View) eventSource; } final Rect viewBoundsOnGlobalCoordinate = getBoundsOnScreen(view); // If the parent is null, it means view is the view root of the window, so the event // should be from view itself, in this case we don't need any offset. final int[] viewParentCoord = new int[2]; if (parent != null) { parent.getLocationOnScreen(viewParentCoord); } Rect viewBoundsOnParentViewCoordinate = new Rect(viewBoundsOnGlobalCoordinate); viewBoundsOnParentViewCoordinate.offset(-viewParentCoord[0], -viewParentCoord[1]); return viewBoundsOnParentViewCoordinate.contains((int) event.getX(), (int) event.getY()); } private static Rect getBoundsOnScreen(View view) { final int[] coord = new int[2]; view.getLocationOnScreen(coord); final Rect viewRect = new Rect(coord[0], coord[1], coord[0] + view.getMeasuredWidth(), return new Rect(coord[0], coord[1], coord[0] + view.getMeasuredWidth(), coord[1] + view.getMeasuredHeight()); return viewRect.contains((int) event.getRawX(), (int) event.getRawY()); } } Loading
src/com/android/documentsui/dirlist/GridDirectoryHolder.java +2 −1 Original line number Diff line number Diff line Loading @@ -81,7 +81,8 @@ final class GridDirectoryHolder extends DocumentHolder { @Override public boolean inSelectRegion(MotionEvent event) { return mAction == State.ACTION_BROWSE ? Views.isEventOver(event, mIconLayout) : false; return mAction == State.ACTION_BROWSE ? Views.isEventOver(event, itemView.getParent(), mIconLayout) : false; } /** Loading
src/com/android/documentsui/dirlist/GridDocumentHolder.java +2 −2 Original line number Diff line number Diff line Loading @@ -137,12 +137,12 @@ final class GridDocumentHolder extends DocumentHolder { @Override public boolean inSelectRegion(MotionEvent event) { return Views.isEventOver(event, mIconLayout); return Views.isEventOver(event, itemView.getParent(), mIconLayout); } @Override public boolean inPreviewIconRegion(MotionEvent event) { return Views.isEventOver(event, mPreviewIcon); return Views.isEventOver(event, itemView.getParent(), mPreviewIcon); } /** Loading
src/com/android/documentsui/dirlist/GridPhotoHolder.java +1 −1 Original line number Diff line number Diff line Loading @@ -125,7 +125,7 @@ final class GridPhotoHolder extends DocumentHolder { @Override public boolean inPreviewIconRegion(MotionEvent event) { return Views.isEventOver(event, mPreviewIcon); return Views.isEventOver(event, itemView.getParent(), mPreviewIcon); } /** Loading
src/com/android/documentsui/dirlist/ListDocumentHolder.java +2 −2 Original line number Diff line number Diff line Loading @@ -180,12 +180,12 @@ final class ListDocumentHolder extends DocumentHolder { @Override public boolean inSelectRegion(MotionEvent event) { return (mDoc.isDirectory() && !(mAction == State.ACTION_BROWSE)) ? false : Views.isEventOver(event, mIconLayout); false : Views.isEventOver(event, itemView.getParent(), mIconLayout); } @Override public boolean inPreviewIconRegion(MotionEvent event) { return Views.isEventOver(event, mPreviewIcon); return Views.isEventOver(event, itemView.getParent(), mPreviewIcon); } /** Loading
src/com/android/documentsui/ui/Views.java +29 −5 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.documentsui.ui; import android.graphics.Rect; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; /** * A utility class for working with Views. Loading @@ -28,22 +30,44 @@ public final class Views { private Views() {} /** * Return whether the event is in the view's region * * Return whether the event is in the view's region. We determine it with in the coordinate * of the parent view that dispatches the motion event. * @param event the motion event * @param eventSource the view dispatching the motion events. * @param view the view to check the selection region * @return True, if the event is in the region. Otherwise, return false. */ public static boolean isEventOver(MotionEvent event, View view) { public static boolean isEventOver(MotionEvent event, ViewParent eventSource, View view) { if (view == null || event == null || !view.isAttachedToWindow()) { return false; } View parent = null; if (eventSource instanceof ViewGroup) { parent = (View) eventSource; } final Rect viewBoundsOnGlobalCoordinate = getBoundsOnScreen(view); // If the parent is null, it means view is the view root of the window, so the event // should be from view itself, in this case we don't need any offset. final int[] viewParentCoord = new int[2]; if (parent != null) { parent.getLocationOnScreen(viewParentCoord); } Rect viewBoundsOnParentViewCoordinate = new Rect(viewBoundsOnGlobalCoordinate); viewBoundsOnParentViewCoordinate.offset(-viewParentCoord[0], -viewParentCoord[1]); return viewBoundsOnParentViewCoordinate.contains((int) event.getX(), (int) event.getY()); } private static Rect getBoundsOnScreen(View view) { final int[] coord = new int[2]; view.getLocationOnScreen(coord); final Rect viewRect = new Rect(coord[0], coord[1], coord[0] + view.getMeasuredWidth(), return new Rect(coord[0], coord[1], coord[0] + view.getMeasuredWidth(), coord[1] + view.getMeasuredHeight()); return viewRect.contains((int) event.getRawX(), (int) event.getRawY()); } }