From b670f195ffb7b4a0519fd0b337b68f7412159414 Mon Sep 17 00:00:00 2001 From: Adam Cohen Date: Tue, 8 Apr 2014 15:34:17 -0700 Subject: [PATCH] Ensure the intro view is always the top view in the draglayer if it is present -> On devices post-api-16, we can achieve this just with child drawing order but on level 16 devices, child drawing order doesn't give us touch dispatch which is problematic for the intro screen. issue 13796017 Change-Id: Ibf89ae91d8489f2de1eb9c8f235a0e6e6aed1847 --- src/com/android/launcher3/DragLayer.java | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/DragLayer.java b/src/com/android/launcher3/DragLayer.java index cd51c96e1e..c54db01278 100644 --- a/src/com/android/launcher3/DragLayer.java +++ b/src/com/android/launcher3/DragLayer.java @@ -122,10 +122,14 @@ public class DragLayer extends FrameLayout implements ViewGroup.OnHierarchyChang setInsets(child, mInsets, new Rect()); } - public void showOverlayView(View introScreen) { + public void showOverlayView(View overlayView) { LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); - mOverlayView = introScreen; - addView(introScreen, lp); + mOverlayView = overlayView; + addView(overlayView, lp); + + // ensure that the overlay view stays on top. we can't use drawing order for this + // because in API level 16 touch dispatch doesn't respect drawing order. + mOverlayView.bringToFront(); } public void dismissOverlayView() { @@ -774,6 +778,11 @@ public class DragLayer extends FrameLayout implements ViewGroup.OnHierarchyChang @Override public void onChildViewAdded(View parent, View child) { + if (mOverlayView != null) { + // ensure that the overlay view stays on top. we can't use drawing order for this + // because in API level 16 touch dispatch doesn't respect drawing order. + mOverlayView.bringToFront(); + } updateChildIndices(); } @@ -785,6 +794,11 @@ public class DragLayer extends FrameLayout implements ViewGroup.OnHierarchyChang @Override public void bringChildToFront(View child) { super.bringChildToFront(child); + if (child != mOverlayView && mOverlayView != null) { + // ensure that the overlay view stays on top. we can't use drawing order for this + // because in API level 16 touch dispatch doesn't respect drawing order. + mOverlayView.bringToFront(); + } updateChildIndices(); } @@ -792,8 +806,7 @@ public class DragLayer extends FrameLayout implements ViewGroup.OnHierarchyChang mTopViewIndex = -1; int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { - if (getChildAt(i) instanceof DragView || - getChildAt(i) == mOverlayView) { + if (getChildAt(i) instanceof DragView) { mTopViewIndex = i; } }