package com.duckduckgo.mobile.android.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.os.Parcelable;
import com.duckduckgo.mobile.android.R;
/*
* A class that, well, shares stuff :)
*/
public class Sharer {
/**
* Initializes an intent for share web page action name and sends it to the context parameter to start of an activity
*
* @param context
* @param title
* @param url
*/
public static void shareWebPage(Context context, String title, String url) {
String actionName = (String) context.getResources().getText(R.string.SharePage);
Intent shareIntent = createTargetedShareIntent(context, url, title, actionName);
context.startActivity(shareIntent);
}
/**
* Initializes an intent for share story action name and sends it to the context parameter to start of an activity
*
* @param context
* @param title
* @param url
*/
public static void shareStory(Context context, String title, String url) {
String actionName = (String) context.getResources().getText(R.string.ShareStory);
Intent shareIntent = createTargetedShareIntent(context, String.format("%s %s", title, url), title, actionName);
context.startActivity(shareIntent);
}
/**
* Initializes an intent for share search action name and sends it to the context parameter to start of an activity
*
* @param context
* @param query
*/
public static void shareSearch(Context context, String query) {
String actionName = (String) context.getResources().getText(R.string.ShareSearch);
String url = "https://duckduckgo.com/?q=" + query;
Intent shareIntent = createTargetedShareIntent(context, String.format("%s %s", query, url),
String.format("DuckDuckGo Search for \"%s\"", query), actionName);
context.startActivity(shareIntent);
}
private static Intent createTargetedShareIntent(Context context, String text, String subject, String actionName) {
List<Intent> targetedShareIntents = new ArrayList<Intent>();
Intent shareIntent = createBasicShareIntent(context, text, subject);
List<HashMap<String, String>> intentMetaInfo = new ArrayList<HashMap<String, String>>();
List<ResolveInfo> resInfo = context.getPackageManager().queryIntentActivities(shareIntent, 0);
if (!resInfo.isEmpty()){
for (ResolveInfo resolveInfo : resInfo) {
if (resolveInfo.activityInfo != null) {
HashMap<String, String> info = new HashMap<String, String>();
info.put("packageName", resolveInfo.activityInfo.packageName);
info.put("className", resolveInfo.activityInfo.name);
info.put("simpleName", String.valueOf(resolveInfo.activityInfo.loadLabel(context.getPackageManager())));
intentMetaInfo.add(info);
}
}
if (!intentMetaInfo.isEmpty()) {
Collections.sort(intentMetaInfo, new Comparator<HashMap<String, String>>() {
@Override
public int compare(HashMap<String, String> map, HashMap<String, String> map2) {
return map.get("simpleName").compareTo(map2.get("simpleName"));
}
});
for (HashMap<String, String> metaInfo : intentMetaInfo) {
String packageName = metaInfo.get("packageName");
Intent targetedShareIntent = (Intent) shareIntent.clone();
if (packageName.contains("twitter")) {
targetedShareIntent.putExtra(Intent.EXTRA_TEXT,
String.format(context.getResources().getString(R.string.TwitterShareFormat), text));
}
targetedShareIntent.setPackage(packageName);
targetedShareIntent.setClassName(metaInfo.get("packageName"), metaInfo.get("className"));
targetedShareIntents.add(targetedShareIntent);
}
}
Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(targetedShareIntents.size()-1), actionName);
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[]{}));
return chooserIntent;
}
return shareIntent;
}
private static Intent createBasicShareIntent(Context context, String text, String subject) {
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, String.format(context.getResources().getString(R.string.RegularShareFormat), text));
shareIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
return shareIntent;
}
}