Merge "Fix bug 5300621 - Share menu disappears in gallery"
This commit is contained in:
@ -58,6 +58,7 @@ import android.content.Context;
|
|||||||
* @see MenuItem#getActionProvider()
|
* @see MenuItem#getActionProvider()
|
||||||
*/
|
*/
|
||||||
public abstract class ActionProvider {
|
public abstract class ActionProvider {
|
||||||
|
private SubUiVisibilityListener mSubUiVisibilityListener;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new instance.
|
* Creates a new instance.
|
||||||
@ -138,4 +139,31 @@ public abstract class ActionProvider {
|
|||||||
*/
|
*/
|
||||||
public void onPrepareSubMenu(SubMenu subMenu) {
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package android.widget;
|
package android.widget;
|
||||||
|
|
||||||
|
import com.android.internal.R;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
@ -25,6 +27,7 @@ import android.content.res.TypedArray;
|
|||||||
import android.database.DataSetObserver;
|
import android.database.DataSetObserver;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
import android.view.ActionProvider;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@ -32,8 +35,6 @@ import android.view.ViewTreeObserver;
|
|||||||
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
|
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
|
||||||
import android.widget.ActivityChooserModel.ActivityChooserModelClient;
|
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}.
|
* This class is a view for choosing an activity for handling a given {@link Intent}.
|
||||||
* <p>
|
* <p>
|
||||||
@ -104,6 +105,11 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod
|
|||||||
*/
|
*/
|
||||||
private final int mListPopupMaxWidth;
|
private final int mListPopupMaxWidth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ActionProvider hosting this view, if applicable.
|
||||||
|
*/
|
||||||
|
ActionProvider mProvider;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Observer for the model data.
|
* Observer for the model data.
|
||||||
*/
|
*/
|
||||||
@ -129,6 +135,9 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod
|
|||||||
getListPopupWindow().dismiss();
|
getListPopupWindow().dismiss();
|
||||||
} else {
|
} else {
|
||||||
getListPopupWindow().show();
|
getListPopupWindow().show();
|
||||||
|
if (mProvider != null) {
|
||||||
|
mProvider.subUiVisibilityChanged(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -259,6 +268,14 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod
|
|||||||
mExpandActivityOverflowButtonImage.setImageDrawable(drawable);
|
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.
|
* Shows the popup window with activities.
|
||||||
*
|
*
|
||||||
@ -307,6 +324,9 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod
|
|||||||
final int contentWidth = Math.min(mAdapter.measureContentWidth(), mListPopupMaxWidth);
|
final int contentWidth = Math.min(mAdapter.measureContentWidth(), mListPopupMaxWidth);
|
||||||
popupWindow.setContentWidth(contentWidth);
|
popupWindow.setContentWidth(contentWidth);
|
||||||
popupWindow.show();
|
popupWindow.show();
|
||||||
|
if (mProvider != null) {
|
||||||
|
mProvider.subUiVisibilityChanged(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -525,6 +545,9 @@ public class ActivityChooserView extends ViewGroup implements ActivityChooserMod
|
|||||||
// PopUpWindow.OnDismissListener#onDismiss
|
// PopUpWindow.OnDismissListener#onDismiss
|
||||||
public void onDismiss() {
|
public void onDismiss() {
|
||||||
notifyOnDismissListener();
|
notifyOnDismissListener();
|
||||||
|
if (mProvider != null) {
|
||||||
|
mProvider.subUiVisibilityChanged(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void notifyOnDismissListener() {
|
private void notifyOnDismissListener() {
|
||||||
|
@ -157,6 +157,8 @@ public class PopupMenu implements MenuBuilder.Callback, MenuPresenter.Callback {
|
|||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
public boolean onOpenSubMenu(MenuBuilder subMenu) {
|
public boolean onOpenSubMenu(MenuBuilder subMenu) {
|
||||||
|
if (subMenu == null) return false;
|
||||||
|
|
||||||
if (!subMenu.hasVisibleItems()) {
|
if (!subMenu.hasVisibleItems()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -169,6 +169,7 @@ public class ShareActionProvider extends ActionProvider {
|
|||||||
mContext.getTheme().resolveAttribute(R.attr.actionModeShareDrawable, outTypedValue, true);
|
mContext.getTheme().resolveAttribute(R.attr.actionModeShareDrawable, outTypedValue, true);
|
||||||
Drawable drawable = mContext.getResources().getDrawable(outTypedValue.resourceId);
|
Drawable drawable = mContext.getResources().getDrawable(outTypedValue.resourceId);
|
||||||
activityChooserView.setExpandActivityOverflowButtonDrawable(drawable);
|
activityChooserView.setExpandActivityOverflowButtonDrawable(drawable);
|
||||||
|
activityChooserView.setProvider(this);
|
||||||
|
|
||||||
return activityChooserView;
|
return activityChooserView;
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ import android.content.res.Resources;
|
|||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import android.util.SparseBooleanArray;
|
import android.util.SparseBooleanArray;
|
||||||
|
import android.view.ActionProvider;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.SoundEffectConstants;
|
import android.view.SoundEffectConstants;
|
||||||
import android.view.View;
|
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.
|
* 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 static final String TAG = "ActionMenuPresenter";
|
||||||
|
|
||||||
private View mOverflowButton;
|
private View mOverflowButton;
|
||||||
@ -187,6 +189,17 @@ public class ActionMenuPresenter extends BaseMenuPresenter {
|
|||||||
public void updateMenuView(boolean cleared) {
|
public void updateMenuView(boolean cleared) {
|
||||||
super.updateMenuView(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 &&
|
final boolean hasOverflow = mReserveOverflow && mMenu != null &&
|
||||||
mMenu.getNonActionItems().size() > 0;
|
mMenu.getNonActionItems().size() > 0;
|
||||||
if (hasOverflow) {
|
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 {
|
private static class SavedState implements Parcelable {
|
||||||
public int openSubMenuId;
|
public int openSubMenuId;
|
||||||
|
|
||||||
@ -590,7 +613,6 @@ public class ActionMenuPresenter extends BaseMenuPresenter {
|
|||||||
@Override
|
@Override
|
||||||
public void onDismiss() {
|
public void onDismiss() {
|
||||||
super.onDismiss();
|
super.onDismiss();
|
||||||
mSubMenu.close();
|
|
||||||
mActionButtonPopup = null;
|
mActionButtonPopup = null;
|
||||||
mOpenSubMenuId = 0;
|
mOpenSubMenuId = 0;
|
||||||
}
|
}
|
||||||
@ -600,12 +622,17 @@ public class ActionMenuPresenter extends BaseMenuPresenter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOpenSubMenu(MenuBuilder subMenu) {
|
public boolean onOpenSubMenu(MenuBuilder subMenu) {
|
||||||
|
if (subMenu == null) return false;
|
||||||
|
|
||||||
mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId();
|
mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
|
public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
|
||||||
|
if (menu instanceof SubMenuBuilder) {
|
||||||
|
((SubMenuBuilder) menu).getRootMenu().close(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,7 +187,9 @@ public class IconMenuPresenter extends BaseMenuPresenter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOpenSubMenu(MenuBuilder subMenu) {
|
public boolean onOpenSubMenu(MenuBuilder subMenu) {
|
||||||
|
if (subMenu != null) {
|
||||||
mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId();
|
mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId();
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3471,6 +3471,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean onOpenSubMenu(MenuBuilder subMenu) {
|
public boolean onOpenSubMenu(MenuBuilder subMenu) {
|
||||||
|
if (subMenu == null) return false;
|
||||||
|
|
||||||
// Set a simple callback for the submenu
|
// Set a simple callback for the submenu
|
||||||
subMenu.setCallback(this);
|
subMenu.setCallback(this);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user