package me.ycdev.android.arch.wrapper; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.annotation.NonNull; /** * A wrapper class to avoid security issues when sending/receiving broadcast. */ @SuppressWarnings("unused") public class BroadcastHelper { private static final String PERM_COMMON_BROADCAST_SUFFIX = ".permission.INTERNAL_COMMON"; private BroadcastHelper() { // nothing to do } public static String getInternalBroadcastPerm(Context cxt) { return cxt.getPackageName() + PERM_COMMON_BROADCAST_SUFFIX; } /** * Register a receiver for internal broadcast. */ public static Intent registerForInternal(@NonNull Context cxt, @NonNull BroadcastReceiver receiver, @NonNull IntentFilter filter) { String perm = cxt.getPackageName() + PERM_COMMON_BROADCAST_SUFFIX; return cxt.registerReceiver(receiver, filter, perm, null); } /** * Register a receiver for external broadcast (includes system broadcast). */ public static Intent registerForExternal(@NonNull Context cxt, @NonNull BroadcastReceiver receiver, @NonNull IntentFilter filter) { return cxt.registerReceiver(receiver, filter); } /** * Send a broadcast to internal receivers. */ public static void sendToInternal(@NonNull Context cxt, @NonNull Intent intent) { String perm = cxt.getPackageName() + PERM_COMMON_BROADCAST_SUFFIX; intent.setPackage(cxt.getPackageName()); // only works on Android 4.0 and higher versions cxt.sendBroadcast(intent, perm); } /** * Send a broadcast to external receivers. */ public static void sendToExternal(@NonNull Context cxt, @NonNull Intent intent, @NonNull String perm) { cxt.sendBroadcast(intent, perm); } /** * Send a broadcast to external receivers. */ public static void sendToExternal(@NonNull Context cxt, @NonNull Intent intent) { cxt.sendBroadcast(intent); } }