From 67639a5f678f3e472210e5cf6060592430a5ffbb Mon Sep 17 00:00:00 2001 From: Michael Kwan Date: Fri, 16 Dec 2016 12:38:10 -0800 Subject: [PATCH] Fix OnCancelListener for Dialogs on swipe to dismiss. Swipe to dismiss on dialogs did not dispatch onCancel events to OnCancelListeners. Resolve by adding listener to monitor swipe to dismiss events and dispatch onCancel events when that occurs. Bug: 33663411 Change-Id: I64ff29e008d485a4559eb3d1ff7f0e74dccff404 --- core/java/android/app/Dialog.java | 5 ++++ core/java/android/view/Window.java | 25 +++++++++++++++++++ .../android/internal/policy/PhoneWindow.java | 1 + 3 files changed, 31 insertions(+) diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java index 9c1778010f43d..72ccf72d2d050 100644 --- a/core/java/android/app/Dialog.java +++ b/core/java/android/app/Dialog.java @@ -185,6 +185,11 @@ public class Dialog implements DialogInterface, Window.Callback, mWindow = w; w.setCallback(this); w.setOnWindowDismissedCallback(this); + w.setOnWindowSwipeDismissedCallback(() -> { + if (mCancelable) { + cancel(); + } + }); w.setWindowManager(mWindowManager, null, null); w.setGravity(Gravity.CENTER); diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index a36127db559fd..c3ae9d9ef1c1e 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -275,6 +275,7 @@ public abstract class Window { private TypedArray mWindowStyle; private Callback mCallback; private OnWindowDismissedCallback mOnWindowDismissedCallback; + private OnWindowSwipeDismissedCallback mOnWindowSwipeDismissedCallback; private WindowControllerCallback mWindowControllerCallback; private OnRestrictedCaptionAreaChangedListener mOnRestrictedCaptionAreaChangedListener; private Rect mRestrictedCaptionAreaRect; @@ -587,6 +588,18 @@ public abstract class Window { void onWindowDismissed(boolean finishTask, boolean suppressWindowTransition); } + /** @hide */ + public interface OnWindowSwipeDismissedCallback { + /** + * Called when a window is swipe dismissed. This informs the callback that the + * window is gone, and it should finish itself. + * @param finishTask True if the task should also be finished. + * @param suppressWindowTransition True if the resulting exit and enter window transition + * animations should be suppressed. + */ + void onWindowSwipeDismissed(); + } + /** @hide */ public interface WindowControllerCallback { /** @@ -880,6 +893,18 @@ public abstract class Window { } } + /** @hide */ + public final void setOnWindowSwipeDismissedCallback(OnWindowSwipeDismissedCallback sdcb) { + mOnWindowSwipeDismissedCallback = sdcb; + } + + /** @hide */ + public final void dispatchOnWindowSwipeDismissed() { + if (mOnWindowSwipeDismissedCallback != null) { + mOnWindowSwipeDismissedCallback.onWindowSwipeDismissed(); + } + } + /** @hide */ public final void setWindowControllerCallback(WindowControllerCallback wccb) { mWindowControllerCallback = wccb; diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 5d25b1b9de08c..920a6cb0f84cc 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -2990,6 +2990,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { swipeDismiss.setOnDismissedListener(new SwipeDismissLayout.OnDismissedListener() { @Override public void onDismissed(SwipeDismissLayout layout) { + dispatchOnWindowSwipeDismissed(); dispatchOnWindowDismissed(false /*finishTask*/, true /*suppressWindowTransition*/); } });