From f75eeb28def26798682748aa5dedabebac86bb6a Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Tue, 10 Aug 2010 15:59:40 -0700 Subject: [PATCH] Fix bug 2908822 - open/closePanel should do the right thing with ActionBars Change-Id: Ic77f9dee864d17046f69c78a1e6d96a49b5c6180 --- .../android/internal/view/menu/ActionMenuView.java | 12 ++++++++++++ .../com/android/internal/widget/ActionBarView.java | 7 +++++++ .../android/internal/policy/impl/PhoneWindow.java | 12 ++++++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/core/java/com/android/internal/view/menu/ActionMenuView.java b/core/java/com/android/internal/view/menu/ActionMenuView.java index e2815368ecba5..13572510b0f2f 100644 --- a/core/java/com/android/internal/view/menu/ActionMenuView.java +++ b/core/java/com/android/internal/view/menu/ActionMenuView.java @@ -24,6 +24,7 @@ import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.LinearLayout; +import java.lang.ref.WeakReference; import java.util.ArrayList; /** @@ -39,6 +40,7 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo private int mMaxItems; private boolean mReserveOverflow; private OverflowMenuButton mOverflowButton; + private WeakReference mOverflowPopup; public ActionMenuView(Context context) { this(context, null); @@ -145,6 +147,16 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo if (mOverflowButton != null) { MenuPopupHelper popup = new MenuPopupHelper(getContext(), mMenu, mOverflowButton, true); popup.show(); + mOverflowPopup = new WeakReference(popup); + return true; + } + return false; + } + + public boolean hideOverflowMenu() { + MenuPopupHelper popup = mOverflowPopup != null ? mOverflowPopup.get() : null; + if (popup != null) { + popup.dismiss(); return true; } return false; diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java index d703a2f7f730e..c6414417bed5a 100644 --- a/core/java/com/android/internal/widget/ActionBarView.java +++ b/core/java/com/android/internal/widget/ActionBarView.java @@ -209,6 +209,13 @@ public class ActionBarView extends ViewGroup { return false; } + public boolean hideOverflowMenu() { + if (mMenuView != null) { + return mMenuView.hideOverflowMenu(); + } + return false; + } + public boolean isOverflowReserved() { return mMenuView != null && mMenuView.isOverflowReserved(); } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index 73fa93c345a3e..8a6428ba5d364 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -406,7 +406,12 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { @Override public final void openPanel(int featureId, KeyEvent event) { - openPanel(getPanelState(featureId, true), event); + if (featureId == FEATURE_OPTIONS_PANEL && mActionBar != null && + mActionBar.isOverflowReserved()) { + mActionBar.showOverflowMenu(); + } else { + openPanel(getPanelState(featureId, true), event); + } } private void openPanel(PanelFeatureState st, KeyEvent event) { @@ -497,7 +502,10 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { @Override public final void closePanel(int featureId) { - if (featureId == FEATURE_CONTEXT_MENU) { + if (featureId == FEATURE_OPTIONS_PANEL && mActionBar != null && + mActionBar.isOverflowReserved()) { + mActionBar.hideOverflowMenu(); + } else if (featureId == FEATURE_CONTEXT_MENU) { closeContextMenu(); } else { closePanel(getPanelState(featureId, true), true);