Major refactoring of ShareActivity. Google Maps now has labeled pins
This commit is contained in:
143
mobile/src/com/cradle/iitc_mobile/share/IntentGenerator.java
Normal file
143
mobile/src/com/cradle/iitc_mobile/share/IntentGenerator.java
Normal file
@ -0,0 +1,143 @@
|
||||
package com.cradle.iitc_mobile.share;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.net.Uri;
|
||||
|
||||
import com.cradle.iitc_mobile.Log;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
public class IntentGenerator {
|
||||
private static final String EXTRA_FLAG_IS_DEFAULT = "IITCM_IS_DEFAULT";
|
||||
private static final String EXTRA_FLAG_TITLE = "IITCM_TITLE";
|
||||
private static final HashSet<ComponentName> KNOWN_COPY_HANDLERS = new HashSet<ComponentName>();
|
||||
|
||||
static {
|
||||
if (KNOWN_COPY_HANDLERS.isEmpty()) {
|
||||
|
||||
KNOWN_COPY_HANDLERS.add(new ComponentName(
|
||||
"com.google.android.apps.docs",
|
||||
"com.google.android.apps.docs.app.SendTextToClipboardActivity"));
|
||||
|
||||
KNOWN_COPY_HANDLERS.add(new ComponentName(
|
||||
"com.aokp.romcontrol",
|
||||
"com.aokp.romcontrol.ShareToClipboard"));
|
||||
}
|
||||
}
|
||||
|
||||
public static String getTitle(final Intent intent) {
|
||||
if (intent.hasExtra(EXTRA_FLAG_TITLE))
|
||||
return intent.getStringExtra(EXTRA_FLAG_TITLE);
|
||||
|
||||
throw new IllegalArgumentException("Got an intent not generated by IntentGenerator");
|
||||
}
|
||||
|
||||
public static boolean isDefault(final Intent intent) {
|
||||
return intent.hasExtra(EXTRA_FLAG_IS_DEFAULT) && intent.getBooleanExtra(EXTRA_FLAG_IS_DEFAULT, false);
|
||||
}
|
||||
|
||||
private final Context mContext;
|
||||
|
||||
private final PackageManager mPackageManager;
|
||||
|
||||
public IntentGenerator(final Context context) {
|
||||
mContext = context;
|
||||
mPackageManager = mContext.getPackageManager();
|
||||
}
|
||||
|
||||
private boolean containsCopyIntent(final List<Intent> targets) {
|
||||
for (final Intent intent : targets) {
|
||||
for (final ComponentName handler : KNOWN_COPY_HANDLERS) {
|
||||
if (handler.equals(intent.getComponent())) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private ArrayList<Intent> resolveTargets(final Intent intent) {
|
||||
final String packageName = mContext.getPackageName();
|
||||
final List<ResolveInfo> activityList = mPackageManager.queryIntentActivities(intent, 0);
|
||||
final ResolveInfo defaultTarget = mPackageManager.resolveActivity(intent, 0);
|
||||
|
||||
final ArrayList<Intent> list = new ArrayList<Intent>(activityList.size());
|
||||
|
||||
for (final ResolveInfo resolveInfo : activityList) {
|
||||
final ActivityInfo activity = resolveInfo.activityInfo;
|
||||
final ComponentName component = new ComponentName(activity.packageName, activity.name);
|
||||
|
||||
// remove IITCm from list
|
||||
if (activity.packageName.equals(packageName)) continue;
|
||||
|
||||
final Intent targetIntent = new Intent(intent)
|
||||
.setComponent(component)
|
||||
.putExtra(EXTRA_FLAG_TITLE, activity.loadLabel(mPackageManager));
|
||||
|
||||
if (resolveInfo.activityInfo.name.equals(defaultTarget.activityInfo.name) &&
|
||||
resolveInfo.activityInfo.packageName.equals(defaultTarget.activityInfo.packageName)) {
|
||||
targetIntent.putExtra(EXTRA_FLAG_IS_DEFAULT, true);
|
||||
}
|
||||
|
||||
list.add(targetIntent);
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public ArrayList<Intent> getBrowserIntents(final String title, final String url) {
|
||||
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url))
|
||||
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
|
||||
|
||||
return resolveTargets(intent);
|
||||
}
|
||||
|
||||
public ArrayList<Intent> getGeoIntents(final String title, final String mLl, final int mZoom) {
|
||||
final Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
|
||||
Uri.parse(String.format("geo:%s&z=%d", mLl, mZoom)))
|
||||
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
|
||||
|
||||
final ArrayList<Intent> targets = resolveTargets(intent);
|
||||
|
||||
// According to https://developer.android.com/guide/components/intents-common.html, markers can be labeled.
|
||||
// Unfortunately, only Google Maps supports this, most other apps fail
|
||||
for (final Intent target : targets) {
|
||||
final ComponentName cn = target.getComponent();
|
||||
if ("com.google.android.apps.maps".equals(cn.getPackageName())) {
|
||||
try {
|
||||
final String encodedTitle = URLEncoder.encode(title, "UTF-8");
|
||||
target.setData(Uri.parse(String.format("geo:0,0?q=%s%%20(%s)&z=%d", mLl, encodedTitle, mZoom)));
|
||||
} catch (final UnsupportedEncodingException e) {
|
||||
Log.w(e);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return targets;
|
||||
}
|
||||
|
||||
public ArrayList<Intent> getShareIntents(final String title, final String text) {
|
||||
final Intent intent = new Intent(Intent.ACTION_SEND)
|
||||
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET)
|
||||
.setType("text/plain")
|
||||
.putExtra(Intent.EXTRA_TEXT, text)
|
||||
.putExtra(Intent.EXTRA_SUBJECT, title);
|
||||
|
||||
final ArrayList<Intent> targets = resolveTargets(intent);
|
||||
|
||||
if (!containsCopyIntent(targets)) {
|
||||
// add SendToClipboard intent in case Drive is not installed
|
||||
targets.add(new Intent(intent).setComponent(new ComponentName(mContext, SendToClipboard.class)));
|
||||
}
|
||||
|
||||
return targets;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user