From b80d332e7421e0b8cff12569c2f1b450d769e782 Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Fri, 15 Jul 2011 21:33:11 -0700 Subject: [PATCH] Fix bug 5037642 - Refine back button behavior for action bar modes. Action modes for the action bar used to aggressively hijack the back button before the view hierarchy got a chance to respond to it. Loosen this. New ordering is: view hierarchy => window feature-level modes (action bar modes e.g. CAB/search) => Activity/window callback behavior. Change-Id: Iac1b22997713be968a94f77f9fa6cebaf6f923f0 --- .../internal/widget/ActionBarView.java | 13 +++++++ .../internal/policy/impl/PhoneWindow.java | 36 ++++++++++++++----- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java index 6bb40a455554e..678751cda0605 100644 --- a/core/java/com/android/internal/widget/ActionBarView.java +++ b/core/java/com/android/internal/widget/ActionBarView.java @@ -370,6 +370,19 @@ public class ActionBarView extends AbsActionBarView { mMenuView = menuView; } + public boolean hasExpandedActionView() { + return mExpandedMenuPresenter != null && + mExpandedMenuPresenter.mCurrentExpandedItem != null; + } + + public void collapseActionView() { + final MenuItemImpl item = mExpandedMenuPresenter == null ? null : + mExpandedMenuPresenter.mCurrentExpandedItem; + if (item != null) { + item.collapseActionView(); + } + } + public void setCustomNavigationView(View view) { final boolean showCustom = (mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0; if (mCustomNavView != null && showCustom) { diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index 4be00c56aab09..b963b131f59fb 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -1668,14 +1668,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } } - // Back cancels action modes first. - if (mActionMode != null && keyCode == KeyEvent.KEYCODE_BACK) { - if (action == KeyEvent.ACTION_UP) { - mActionMode.finish(); - } - return true; - } - if (!isDestroyed()) { final Callback cb = getCallback(); final boolean handled = cb != null && mFeatureId < 0 ? cb.dispatchKeyEvent(event) @@ -1684,6 +1676,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { return true; } } + return isDown ? PhoneWindow.this.onKeyDown(mFeatureId, event.getKeyCode(), event) : PhoneWindow.this.onKeyUp(mFeatureId, event.getKeyCode(), event); } @@ -1730,7 +1723,32 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } public boolean superDispatchKeyEvent(KeyEvent event) { - return super.dispatchKeyEvent(event); + if (super.dispatchKeyEvent(event)) { + return true; + } + + // Not handled by the view hierarchy, does the action bar want it + // to cancel out of something special? + if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { + final int action = event.getAction(); + // Back cancels action modes first. + if (mActionMode != null) { + if (action == KeyEvent.ACTION_UP) { + mActionMode.finish(); + } + return true; + } + + // Next collapse any expanded action views. + if (mActionBar != null && mActionBar.hasExpandedActionView()) { + if (action == KeyEvent.ACTION_UP) { + mActionBar.collapseActionView(); + } + return true; + } + } + + return false; } public boolean superDispatchKeyShortcutEvent(KeyEvent event) {