Loading core/java/android/view/ActionProvider.java +28 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ import android.content.Context; * @see MenuItem#getActionProvider() */ public abstract class ActionProvider { private SubUiVisibilityListener mSubUiVisibilityListener; /** * Creates a new instance. Loading Loading @@ -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); } } core/java/android/widget/ActivityChooserView.java +25 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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> Loading Loading @@ -104,6 +105,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. */ Loading @@ -129,6 +135,9 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod getListPopupWindow().dismiss(); } else { getListPopupWindow().show(); if (mProvider != null) { mProvider.subUiVisibilityChanged(true); } } } } Loading Loading @@ -259,6 +268,14 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod mExpandActivityOverflowButtonImage.setImageDrawable(drawable); } /** * 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. * Loading Loading @@ -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); } } } Loading Loading @@ -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() { Loading core/java/android/widget/PopupMenu.java +2 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading core/java/android/widget/ShareActionProvider.java +1 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading core/java/com/android/internal/view/menu/ActionMenuPresenter.java +29 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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; Loading Loading @@ -590,7 +613,6 @@ public class ActionMenuPresenter extends BaseMenuPresenter { @Override public void onDismiss() { super.onDismiss(); mSubMenu.close(); mActionButtonPopup = null; mOpenSubMenuId = 0; } Loading @@ -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); } } } Loading Loading
core/java/android/view/ActionProvider.java +28 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ import android.content.Context; * @see MenuItem#getActionProvider() */ public abstract class ActionProvider { private SubUiVisibilityListener mSubUiVisibilityListener; /** * Creates a new instance. Loading Loading @@ -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); } }
core/java/android/widget/ActivityChooserView.java +25 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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> Loading Loading @@ -104,6 +105,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. */ Loading @@ -129,6 +135,9 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod getListPopupWindow().dismiss(); } else { getListPopupWindow().show(); if (mProvider != null) { mProvider.subUiVisibilityChanged(true); } } } } Loading Loading @@ -259,6 +268,14 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod mExpandActivityOverflowButtonImage.setImageDrawable(drawable); } /** * 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. * Loading Loading @@ -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); } } } Loading Loading @@ -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() { Loading
core/java/android/widget/PopupMenu.java +2 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading
core/java/android/widget/ShareActionProvider.java +1 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading
core/java/com/android/internal/view/menu/ActionMenuPresenter.java +29 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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; Loading Loading @@ -590,7 +613,6 @@ public class ActionMenuPresenter extends BaseMenuPresenter { @Override public void onDismiss() { super.onDismiss(); mSubMenu.close(); mActionButtonPopup = null; mOpenSubMenuId = 0; } Loading @@ -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); } } } Loading