From 117b695222135cc684e891d4126116b97a64bc9e Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Mon, 5 May 2014 18:14:56 -0700 Subject: [PATCH] onWindowDismissed API cleanup Move the window swipe to dismiss plumbing off of Window.Callback into its own internal interface implemented by Activity and Dialog. Make it internal API instead of public. Apps should control this via the window feature setting. Change-Id: I64cd237fa7eab08719b2c34e31dac7d34f02563a --- api/current.txt | 4 ---- core/java/android/app/Activity.java | 6 +++++- core/java/android/app/Dialog.java | 5 ++++- .../android/service/dreams/DreamService.java | 4 ---- core/java/android/view/Window.java | 16 ++++++++++++++++ .../internal/policy/impl/PhoneWindow.java | 10 +--------- 6 files changed, 26 insertions(+), 19 deletions(-) diff --git a/api/current.txt b/api/current.txt index 2638ee45260f6..ea97f8fe24ca2 100644 --- a/api/current.txt +++ b/api/current.txt @@ -2855,7 +2855,6 @@ package android.app { method public void onUserInteraction(); method protected void onUserLeaveHint(); method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams); - method public void onWindowDismissed(); method public void onWindowFocusChanged(boolean); method public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback); method public void openContextMenu(android.view.View); @@ -3372,7 +3371,6 @@ package android.app { method public boolean onTouchEvent(android.view.MotionEvent); method public boolean onTrackballEvent(android.view.MotionEvent); method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams); - method public void onWindowDismissed(); method public void onWindowFocusChanged(boolean); method public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback); method public void openContextMenu(android.view.View); @@ -22912,7 +22910,6 @@ package android.service.dreams { method public boolean onPreparePanel(int, android.view.View, android.view.Menu); method public boolean onSearchRequested(); method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams); - method public void onWindowDismissed(); method public void onWindowFocusChanged(boolean); method public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback); method public void setContentView(int); @@ -28920,7 +28917,6 @@ package android.view { method public abstract boolean onPreparePanel(int, android.view.View, android.view.Menu); method public abstract boolean onSearchRequested(); method public abstract void onWindowAttributesChanged(android.view.WindowManager.LayoutParams); - method public abstract void onWindowDismissed(); method public abstract void onWindowFocusChanged(boolean); method public abstract android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback); } diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index ec58fb0be2e0d..9a573838b8659 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -645,7 +645,8 @@ import java.util.HashMap; public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, - OnCreateContextMenuListener, ComponentCallbacks2 { + OnCreateContextMenuListener, ComponentCallbacks2, + Window.OnWindowDismissedCallback { private static final String TAG = "Activity"; private static final boolean DEBUG_LIFECYCLE = false; @@ -2405,7 +2406,9 @@ public class Activity extends ContextThemeWrapper /** * Called when the main window associated with the activity has been dismissed. + * @hide */ + @Override public void onWindowDismissed() { finish(); } @@ -5196,6 +5199,7 @@ public class Activity extends ContextThemeWrapper mWindow = PolicyManager.makeNewWindow(this); mWindow.setCallback(this); + mWindow.setOnWindowDismissedCallback(this); mWindow.getLayoutInflater().setPrivateFactory(this); if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) { mWindow.setSoftInputMode(info.softInputMode); diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java index a8277b5e7018e..7a362df9991c5 100644 --- a/core/java/android/app/Dialog.java +++ b/core/java/android/app/Dialog.java @@ -80,7 +80,7 @@ import java.lang.ref.WeakReference; * */ public class Dialog implements DialogInterface, Window.Callback, - KeyEvent.Callback, OnCreateContextMenuListener { + KeyEvent.Callback, OnCreateContextMenuListener, Window.OnWindowDismissedCallback { private static final String TAG = "Dialog"; private Activity mOwnerActivity; @@ -166,6 +166,7 @@ public class Dialog implements DialogInterface, Window.Callback, Window w = PolicyManager.makeNewWindow(mContext); mWindow = w; w.setCallback(this); + w.setOnWindowDismissedCallback(this); w.setWindowManager(mWindowManager, null, null); w.setGravity(Gravity.CENTER); mListenersHandler = new ListenersHandler(this); @@ -696,6 +697,8 @@ public class Dialog implements DialogInterface, Window.Callback, public void onDetachedFromWindow() { } + /** @hide */ + @Override public void onWindowDismissed() { dismiss(); } diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index 2303d657efd08..b02a79d74f777 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -300,10 +300,6 @@ public class DreamService extends Service implements Window.Callback { public void onDetachedFromWindow() { } - @Override - public void onWindowDismissed() { - } - /** {@inheritDoc} */ @Override public void onPanelClosed(int featureId, Menu menu) { diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index c450f3c37e9af..59d8fbc1885f9 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -134,6 +134,7 @@ public abstract class Window { private TypedArray mWindowStyle; private Callback mCallback; + private OnWindowDismissedCallback mOnWindowDismissedCallback; private WindowManager mWindowManager; private IBinder mAppToken; private String mAppName; @@ -390,7 +391,10 @@ public abstract class Window { * @param mode The mode that was just finished. */ public void onActionModeFinished(ActionMode mode); + } + /** @hide */ + public interface OnWindowDismissedCallback { /** * Called when a window is dismissed. This informs the callback that the * window is gone, and it should finish itself. @@ -571,6 +575,18 @@ public abstract class Window { return mCallback; } + /** @hide */ + public final void setOnWindowDismissedCallback(OnWindowDismissedCallback dcb) { + mOnWindowDismissedCallback = dcb; + } + + /** @hide */ + public final void dispatchOnWindowDismissed() { + if (mOnWindowDismissedCallback != null) { + mOnWindowDismissedCallback.onWindowDismissed(); + } + } + /** * Take ownership of this window's surface. The window's view hierarchy * will no longer draw into the surface, though it will otherwise continue diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index fb4466d4eec90..78020e99ca68d 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -3429,15 +3429,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { swipeDismiss.setOnDismissedListener(new SwipeDismissLayout.OnDismissedListener() { @Override public void onDismissed(SwipeDismissLayout layout) { - Callback cb = getCallback(); - if (cb != null) { - try { - cb.onWindowDismissed(); - } catch (AbstractMethodError e) { - Log.e(TAG, "onWindowDismissed not implemented in " + - cb.getClass().getSimpleName(), e); - } - } + dispatchOnWindowDismissed(); } }); swipeDismiss.setOnSwipeProgressChangedListener(