package com.zachklipp.captivate.util; import java.util.List; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; /* * Allows sending implicit intents without crashing when there * are no available receivers. */ public class SafeIntentSender { public static interface OnNoReceiverListener { public void onNoReceiver(Intent primary); } private static final String LOG_TAG = "SafeIntentSender"; private static final OnNoReceiverListener sDefaultNoReceiverListener = new OnNoReceiverListener() { @Override public void onNoReceiver(Intent primary) { Log.w(LOG_TAG, "No receiver for intent %s", primary.getAction()); } }; private Context mContext; private PackageManager mPackageManager; private OnNoReceiverListener mNoReceiverHandler; public SafeIntentSender(Context context) { mContext = context; mPackageManager = mContext.getPackageManager(); } public SafeIntentSender setNoReceiverHandler(OnNoReceiverListener handler) { mNoReceiverHandler = handler; return this; } public void startActivity(Intent primary, Intent... fallbacks) { List<ResolveInfo> activities = mPackageManager.queryIntentActivities(primary, 0); Intent intent = primary; for (int i = 0; activities.size() == 0 && i < fallbacks.length; i++) { intent = fallbacks[i]; activities = mPackageManager.queryIntentActivities(primary, 0); } if (activities.size() > 0) { mContext.startActivity(intent); } else { onNoReceiver(primary); } } private void onNoReceiver(Intent primary) { OnNoReceiverListener listener = mNoReceiverHandler; if (listener == null) listener = sDefaultNoReceiverListener; listener.onNoReceiver(primary); } }