diff options
7 files changed, 90 insertions, 5 deletions
diff --git a/core/java/android/view/ActionProvider.java b/core/java/android/view/ActionProvider.java index 5601dc5..ed976ab 100644 --- a/core/java/android/view/ActionProvider.java +++ b/core/java/android/view/ActionProvider.java @@ -58,6 +58,7 @@ import android.content.Context; * @see MenuItem#getActionProvider() */ public abstract class ActionProvider { + private SubUiVisibilityListener mSubUiVisibilityListener; /** * Creates a new instance. @@ -138,4 +139,31 @@ public abstract class ActionProvider { */ public void onPrepareSubMenu(SubMenu subMenu) { } + + /** + * Notify the system that the visibility of an action view's sub-UI such as + * an anchored popup has changed. This will affect how other system + * visibility notifications occur. + * + * @hide Pending future API approval + */ + public void subUiVisibilityChanged(boolean isVisible) { + if (mSubUiVisibilityListener != null) { + mSubUiVisibilityListener.onSubUiVisibilityChanged(isVisible); + } + } + + /** + * @hide Internal use only + */ + public void setSubUiVisibilityListener(SubUiVisibilityListener listener) { + mSubUiVisibilityListener = listener; + } + + /** + * @hide Internal use only + */ + public interface SubUiVisibilityListener { + public void onSubUiVisibilityChanged(boolean isVisible); + } } diff --git a/core/java/android/widget/ActivityChooserView.java b/core/java/android/widget/ActivityChooserView.java index 25af3fa..5841283 100644 --- a/core/java/android/widget/ActivityChooserView.java +++ b/core/java/android/widget/ActivityChooserView.java @@ -16,6 +16,8 @@ package android.widget; +import com.android.internal.R; + import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -25,6 +27,7 @@ import android.content.res.TypedArray; import android.database.DataSetObserver; import android.graphics.drawable.Drawable; import android.util.AttributeSet; +import android.view.ActionProvider; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -32,8 +35,6 @@ import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.widget.ActivityChooserModel.ActivityChooserModelClient; -import com.android.internal.R; - /** * This class is a view for choosing an activity for handling a given {@link Intent}. * <p> @@ -105,6 +106,11 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod private final int mListPopupMaxWidth; /** + * The ActionProvider hosting this view, if applicable. + */ + ActionProvider mProvider; + + /** * Observer for the model data. */ private final DataSetObserver mModelDataSetOberver = new DataSetObserver() { @@ -129,6 +135,9 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod getListPopupWindow().dismiss(); } else { getListPopupWindow().show(); + if (mProvider != null) { + mProvider.subUiVisibilityChanged(true); + } } } } @@ -260,6 +269,14 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod } /** + * Set the provider hosting this view, if applicable. + * @hide Internal use only + */ + public void setProvider(ActionProvider provider) { + mProvider = provider; + } + + /** * Shows the popup window with activities. * * @return True if the popup was shown, false if already showing. @@ -307,6 +324,9 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod final int contentWidth = Math.min(mAdapter.measureContentWidth(), mListPopupMaxWidth); popupWindow.setContentWidth(contentWidth); popupWindow.show(); + if (mProvider != null) { + mProvider.subUiVisibilityChanged(true); + } } } @@ -525,6 +545,9 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod // PopUpWindow.OnDismissListener#onDismiss public void onDismiss() { notifyOnDismissListener(); + if (mProvider != null) { + mProvider.subUiVisibilityChanged(false); + } } private void notifyOnDismissListener() { diff --git a/core/java/android/widget/PopupMenu.java b/core/java/android/widget/PopupMenu.java index 17512d8..6a6d767 100644 --- a/core/java/android/widget/PopupMenu.java +++ b/core/java/android/widget/PopupMenu.java @@ -157,6 +157,8 @@ public class PopupMenu implements MenuBuilder.Callback, MenuPresenter.Callback { * @hide */ public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (subMenu == null) return false; + if (!subMenu.hasVisibleItems()) { return true; } diff --git a/core/java/android/widget/ShareActionProvider.java b/core/java/android/widget/ShareActionProvider.java index 6e29024..3627890 100644 --- a/core/java/android/widget/ShareActionProvider.java +++ b/core/java/android/widget/ShareActionProvider.java @@ -169,6 +169,7 @@ public class ShareActionProvider extends ActionProvider { mContext.getTheme().resolveAttribute(R.attr.actionModeShareDrawable, outTypedValue, true); Drawable drawable = mContext.getResources().getDrawable(outTypedValue.resourceId); activityChooserView.setExpandActivityOverflowButtonDrawable(drawable); + activityChooserView.setProvider(this); return activityChooserView; } diff --git a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java index fba6a5a..0db1ccc 100644 --- a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java +++ b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java @@ -24,6 +24,7 @@ import android.content.res.Resources; import android.os.Parcel; import android.os.Parcelable; import android.util.SparseBooleanArray; +import android.view.ActionProvider; import android.view.MenuItem; import android.view.SoundEffectConstants; import android.view.View; @@ -40,7 +41,8 @@ import java.util.ArrayList; /** * MenuPresenter for building action menus as seen in the action bar and action modes. */ -public class ActionMenuPresenter extends BaseMenuPresenter { +public class ActionMenuPresenter extends BaseMenuPresenter + implements ActionProvider.SubUiVisibilityListener { private static final String TAG = "ActionMenuPresenter"; private View mOverflowButton; @@ -187,6 +189,17 @@ public class ActionMenuPresenter extends BaseMenuPresenter { public void updateMenuView(boolean cleared) { super.updateMenuView(cleared); + if (mMenu != null) { + final ArrayList<MenuItemImpl> actionItems = mMenu.getActionItems(); + final int count = actionItems.size(); + for (int i = 0; i < count; i++) { + final ActionProvider provider = actionItems.get(i).getActionProvider(); + if (provider != null) { + provider.setSubUiVisibilityListener(this); + } + } + } + final boolean hasOverflow = mReserveOverflow && mMenu != null && mMenu.getNonActionItems().size() > 0; if (hasOverflow) { @@ -483,6 +496,16 @@ public class ActionMenuPresenter extends BaseMenuPresenter { } } + @Override + public void onSubUiVisibilityChanged(boolean isVisible) { + if (isVisible) { + // Not a submenu, but treat it like one. + super.onSubMenuSelected(null); + } else { + mMenu.close(false); + } + } + private static class SavedState implements Parcelable { public int openSubMenuId; @@ -590,7 +613,6 @@ public class ActionMenuPresenter extends BaseMenuPresenter { @Override public void onDismiss() { super.onDismiss(); - mSubMenu.close(); mActionButtonPopup = null; mOpenSubMenuId = 0; } @@ -600,12 +622,17 @@ public class ActionMenuPresenter extends BaseMenuPresenter { @Override public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (subMenu == null) return false; + mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId(); return false; } @Override public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (menu instanceof SubMenuBuilder) { + ((SubMenuBuilder) menu).getRootMenu().close(false); + } } } diff --git a/core/java/com/android/internal/view/menu/IconMenuPresenter.java b/core/java/com/android/internal/view/menu/IconMenuPresenter.java index d1b1dae..24ddad6 100644 --- a/core/java/com/android/internal/view/menu/IconMenuPresenter.java +++ b/core/java/com/android/internal/view/menu/IconMenuPresenter.java @@ -187,7 +187,9 @@ public class IconMenuPresenter extends BaseMenuPresenter { @Override public boolean onOpenSubMenu(MenuBuilder subMenu) { - mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId(); + if (subMenu != null) { + mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId(); + } return false; } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index 1b7271d..5281946 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -3470,6 +3470,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (subMenu == null) return false; + // Set a simple callback for the submenu subMenu.setCallback(this); |