Source code
package android.support.v7.widget;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Build.VERSION;
import android.support.v4.view.ActionProvider;
import android.support.v7.appcompat.R;
import android.support.v7.internal.widget.ActivityChooserModel;
import android.support.v7.internal.widget.ActivityChooserModel.OnChooseActivityListener;
import android.support.v7.internal.widget.ActivityChooserView;
import android.support.v7.internal.widget.TintManager;
import android.util.TypedValue;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.SubMenu;
import android.view.View;
public class ShareActionProvider extends ActionProvider {
private static final int DEFAULT_INITIAL_ACTIVITY_COUNT = 4;
public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
private final Context mContext;
private int mMaxShownActivityCount = 4;
private OnChooseActivityListener mOnChooseActivityListener;
private final ShareMenuItemOnMenuItemClickListener mOnMenuItemClickListener = new ShareMenuItemOnMenuItemClickListener();
private OnShareTargetSelectedListener mOnShareTargetSelectedListener;
private String mShareHistoryFileName = DEFAULT_SHARE_HISTORY_FILE_NAME;
public interface OnShareTargetSelectedListener {
boolean onShareTargetSelected(ShareActionProvider shareActionProvider, Intent intent);
}
private class ShareMenuItemOnMenuItemClickListener implements OnMenuItemClickListener {
private ShareMenuItemOnMenuItemClickListener() {
}
public boolean onMenuItemClick(MenuItem item) {
Intent launchIntent = ActivityChooserModel.get(ShareActionProvider.this.mContext, ShareActionProvider.this.mShareHistoryFileName).chooseActivity(item.getItemId());
if (launchIntent != null) {
String action = launchIntent.getAction();
if ("android.intent.action.SEND".equals(action) || "android.intent.action.SEND_MULTIPLE".equals(action)) {
ShareActionProvider.this.updateIntent(launchIntent);
}
ShareActionProvider.this.mContext.startActivity(launchIntent);
}
return true;
}
}
private class ShareActivityChooserModelPolicy implements OnChooseActivityListener {
private ShareActivityChooserModelPolicy() {
}
public boolean onChooseActivity(ActivityChooserModel host, Intent intent) {
if (ShareActionProvider.this.mOnShareTargetSelectedListener != null) {
ShareActionProvider.this.mOnShareTargetSelectedListener.onShareTargetSelected(ShareActionProvider.this, intent);
}
return false;
}
}
public ShareActionProvider(Context context) {
super(context);
this.mContext = context;
}
public void setOnShareTargetSelectedListener(OnShareTargetSelectedListener listener) {
this.mOnShareTargetSelectedListener = listener;
setActivityChooserPolicyIfNeeded();
}
public View onCreateActionView() {
ActivityChooserView activityChooserView = new ActivityChooserView(this.mContext);
if (!activityChooserView.isInEditMode()) {
activityChooserView.setActivityChooserModel(ActivityChooserModel.get(this.mContext, this.mShareHistoryFileName));
}
TypedValue outTypedValue = new TypedValue();
this.mContext.getTheme().resolveAttribute(R.attr.actionModeShareDrawable, outTypedValue, true);
activityChooserView.setExpandActivityOverflowButtonDrawable(TintManager.getDrawable(this.mContext, outTypedValue.resourceId));
activityChooserView.setProvider(this);
activityChooserView.setDefaultActionButtonContentDescription(R.string.abc_shareactionprovider_share_with_application);
activityChooserView.setExpandActivityOverflowButtonContentDescription(R.string.abc_shareactionprovider_share_with);
return activityChooserView;
}
public boolean hasSubMenu() {
return true;
}
public void onPrepareSubMenu(SubMenu subMenu) {
int i;
subMenu.clear();
ActivityChooserModel dataModel = ActivityChooserModel.get(this.mContext, this.mShareHistoryFileName);
PackageManager packageManager = this.mContext.getPackageManager();
int expandedActivityCount = dataModel.getActivityCount();
int collapsedActivityCount = Math.min(expandedActivityCount, this.mMaxShownActivityCount);
for (i = 0; i < collapsedActivityCount; i++) {
ResolveInfo activity = dataModel.getActivity(i);
subMenu.add(0, i, i, activity.loadLabel(packageManager)).setIcon(activity.loadIcon(packageManager)).setOnMenuItemClickListener(this.mOnMenuItemClickListener);
}
if (collapsedActivityCount < expandedActivityCount) {
SubMenu expandedSubMenu = subMenu.addSubMenu(0, collapsedActivityCount, collapsedActivityCount, this.mContext.getString(R.string.abc_activity_chooser_view_see_all));
for (i = 0; i < expandedActivityCount; i++) {
activity = dataModel.getActivity(i);
expandedSubMenu.add(0, i, i, activity.loadLabel(packageManager)).setIcon(activity.loadIcon(packageManager)).setOnMenuItemClickListener(this.mOnMenuItemClickListener);
}
}
}
public void setShareHistoryFileName(String shareHistoryFile) {
this.mShareHistoryFileName = shareHistoryFile;
setActivityChooserPolicyIfNeeded();
}
public void setShareIntent(Intent shareIntent) {
if (shareIntent != null) {
String action = shareIntent.getAction();
if ("android.intent.action.SEND".equals(action) || "android.intent.action.SEND_MULTIPLE".equals(action)) {
updateIntent(shareIntent);
}
}
ActivityChooserModel.get(this.mContext, this.mShareHistoryFileName).setIntent(shareIntent);
}
private void setActivityChooserPolicyIfNeeded() {
if (this.mOnShareTargetSelectedListener != null) {
if (this.mOnChooseActivityListener == null) {
this.mOnChooseActivityListener = new ShareActivityChooserModelPolicy();
}
ActivityChooserModel.get(this.mContext, this.mShareHistoryFileName).setOnChooseActivityListener(this.mOnChooseActivityListener);
}
}
private void updateIntent(Intent intent) {
if (VERSION.SDK_INT >= 21) {
intent.addFlags(134742016);
} else {
intent.addFlags(524288);
}
}
}