package com.tomclaw.mandarin.util;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import java.lang.ref.WeakReference;
import java.util.List;
/**
* Created by Igor on 13.05.2015.
*/
public class AppsMenuHelper {
public static void fillMenuItemSubmenu(AppCompatActivity activity, Menu menu, int menuId, Intent intent) {
fillMenuItemSubmenu(activity, menu, menuId, intent, 0);
}
public static void fillMenuItemSubmenu(AppCompatActivity activity, Menu menu, int menuId, Intent intent, int requestCode) {
// Find specified menu id in menu and clear its submenu.
SubMenu subMenu = menu.findItem(menuId).getSubMenu();
subMenu.clear();
// Obtain list of packages for specified intent.
PackageManager packageManager = activity.getPackageManager();
List<ResolveInfo> resolveInfoList = packageManager
.queryIntentActivities(intent, 0);
// Prepare click listener.
MenuItem.OnMenuItemClickListener onMenuItemClickListener =
new AppsMenuHelper.ShareMenuItemClickListener(activity, resolveInfoList, intent, requestCode);
// Fill menu item with submenu elements with app name and icon.
int i = 0;
for (ResolveInfo resolveInfo : resolveInfoList) {
try {
subMenu.add(0, i, i, resolveInfo.loadLabel(packageManager))
.setIcon(resolveInfo.loadIcon(packageManager))
.setOnMenuItemClickListener(onMenuItemClickListener);
i++;
} catch (Throwable ignored) {
// Bad package.
}
}
}
/**
* Reusable listener for handling share item clicks.
*/
public static class ShareMenuItemClickListener implements MenuItem.OnMenuItemClickListener {
private final int requestCode;
private WeakReference<AppCompatActivity> weakActivity;
private final List<ResolveInfo> resolveInfoList;
private final Intent intent;
public ShareMenuItemClickListener(AppCompatActivity activity, List<ResolveInfo> resolveInfoList, Intent intent, int requestCode) {
this.weakActivity = new WeakReference<>(activity);
this.resolveInfoList = resolveInfoList;
this.intent = intent;
this.requestCode = requestCode;
}
@Override
public boolean onMenuItemClick(MenuItem item) {
AppCompatActivity activity = weakActivity.get();
if (activity != null && intent != null) {
ResolveInfo resolveInfo = resolveInfoList.get(item.getItemId());
final ActivityInfo activityInfo = resolveInfo.activityInfo;
final ComponentName name = new ComponentName(activityInfo.applicationInfo.packageName, activityInfo.name);
intent.setComponent(name);
final String action = intent.getAction();
if (Intent.ACTION_SEND.equals(action) ||
Intent.ACTION_SEND_MULTIPLE.equals(action)) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT |
Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
}
if (Intent.ACTION_PICK.equals(action) ||
Intent.ACTION_GET_CONTENT.equals(action)) {
activity.startActivityForResult(intent, requestCode);
} else {
activity.startActivity(intent);
}
}
return true;
}
}
}