Do not specify export flags for protected system broadcasts.

Protected system broadcasts should not specify the export flag.
Marking them as NOT_EXPORTED breaks sticky broadcasts in some
cases.

Issue: google/ExoPlayer#10970

#minor-release

PiperOrigin-RevId: 512020154
(cherry picked from commit 34b9824201314b4fa6442deac643635f2fa9e541)
This commit is contained in:
tonihei 2023-02-24 10:42:37 +00:00
parent 342ae31a00
commit 29eeca3359
8 changed files with 18 additions and 39 deletions

View File

@ -93,7 +93,7 @@ public final class NetworkTypeObserver {
networkType = C.NETWORK_TYPE_UNKNOWN; networkType = C.NETWORK_TYPE_UNKNOWN;
IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
Util.registerReceiverNotExported(context, new Receiver(), filter); context.registerReceiver(new Receiver(), filter);
} }
/** /**

View File

@ -203,6 +203,10 @@ public final class Util {
* apps. This will be enforced by specifying {@link Context#RECEIVER_NOT_EXPORTED} if {@link * apps. This will be enforced by specifying {@link Context#RECEIVER_NOT_EXPORTED} if {@link
* #SDK_INT} is 33 or above. * #SDK_INT} is 33 or above.
* *
* <p>Do not use this method if registering a receiver for a <a
* href="https://android.googlesource.com/platform/frameworks/base/+/master/core/res/AndroidManifest.xml">protected
* system broadcast</a>.
*
* @param context The context on which {@link Context#registerReceiver} will be called. * @param context The context on which {@link Context#registerReceiver} will be called.
* @param receiver The {@link BroadcastReceiver} to register. This value may be null. * @param receiver The {@link BroadcastReceiver} to register. This value may be null.
* @param filter Selects the Intent broadcasts to be received. * @param filter Selects the Intent broadcasts to be received.
@ -218,32 +222,6 @@ public final class Util {
} }
} }
/**
* Registers a {@link BroadcastReceiver} that's not intended to receive broadcasts from other
* apps. This will be enforced by specifying {@link Context#RECEIVER_NOT_EXPORTED} if {@link
* #SDK_INT} is 33 or above.
*
* @param context The context on which {@link Context#registerReceiver} will be called.
* @param receiver The {@link BroadcastReceiver} to register. This value may be null.
* @param filter Selects the Intent broadcasts to be received.
* @param handler Handler identifying the thread that will receive the Intent.
* @return The first sticky intent found that matches {@code filter}, or null if there are none.
*/
@Nullable
public static Intent registerReceiverNotExported(
Context context, BroadcastReceiver receiver, IntentFilter filter, Handler handler) {
if (SDK_INT < 33) {
return context.registerReceiver(receiver, filter, /* broadcastPermission= */ null, handler);
} else {
return context.registerReceiver(
receiver,
filter,
/* broadcastPermission= */ null,
handler,
Context.RECEIVER_NOT_EXPORTED);
}
}
/** /**
* Calls {@link Context#startForegroundService(Intent)} if {@link #SDK_INT} is 26 or higher, or * Calls {@link Context#startForegroundService(Intent)} if {@link #SDK_INT} is 26 or higher, or
* {@link Context#startService(Intent)} otherwise. * {@link Context#startService(Intent)} otherwise.

View File

@ -21,7 +21,6 @@ import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.media.AudioManager; import android.media.AudioManager;
import android.os.Handler; import android.os.Handler;
import com.google.android.exoplayer2.util.Util;
/* package */ final class AudioBecomingNoisyManager { /* package */ final class AudioBecomingNoisyManager {
@ -47,8 +46,8 @@ import com.google.android.exoplayer2.util.Util;
*/ */
public void setEnabled(boolean enabled) { public void setEnabled(boolean enabled) {
if (enabled && !receiverRegistered) { if (enabled && !receiverRegistered) {
Util.registerReceiverNotExported( context.registerReceiver(
context, receiver, new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY)); receiver, new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY));
receiverRegistered = true; receiverRegistered = true;
} else if (!enabled && receiverRegistered) { } else if (!enabled && receiverRegistered) {
context.unregisterReceiver(receiver); context.unregisterReceiver(receiver);

View File

@ -74,7 +74,7 @@ import com.google.android.exoplayer2.util.Util;
VolumeChangeReceiver receiver = new VolumeChangeReceiver(); VolumeChangeReceiver receiver = new VolumeChangeReceiver();
IntentFilter filter = new IntentFilter(VOLUME_CHANGED_ACTION); IntentFilter filter = new IntentFilter(VOLUME_CHANGED_ACTION);
try { try {
Util.registerReceiverNotExported(applicationContext, receiver, filter); applicationContext.registerReceiver(receiver, filter);
this.receiver = receiver; this.receiver = receiver;
} catch (RuntimeException e) { } catch (RuntimeException e) {
Log.w(TAG, "Error registering stream volume receiver", e); Log.w(TAG, "Error registering stream volume receiver", e);

View File

@ -86,8 +86,8 @@ public final class AudioCapabilities {
@SuppressWarnings("InlinedApi") @SuppressWarnings("InlinedApi")
public static AudioCapabilities getCapabilities(Context context) { public static AudioCapabilities getCapabilities(Context context) {
Intent intent = Intent intent =
Util.registerReceiverNotExported( context.registerReceiver(
context, /* receiver= */ null, new IntentFilter(AudioManager.ACTION_HDMI_AUDIO_PLUG)); /* receiver= */ null, new IntentFilter(AudioManager.ACTION_HDMI_AUDIO_PLUG));
return getCapabilities(context, intent); return getCapabilities(context, intent);
} }

View File

@ -91,7 +91,9 @@ public final class AudioCapabilitiesReceiver {
@Nullable Intent stickyIntent = null; @Nullable Intent stickyIntent = null;
if (receiver != null) { if (receiver != null) {
IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_HDMI_AUDIO_PLUG); IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_HDMI_AUDIO_PLUG);
stickyIntent = Util.registerReceiverNotExported(context, receiver, intentFilter, handler); stickyIntent =
context.registerReceiver(
receiver, intentFilter, /* broadcastPermission= */ null, handler);
} }
audioCapabilities = AudioCapabilities.getCapabilities(context, stickyIntent); audioCapabilities = AudioCapabilities.getCapabilities(context, stickyIntent);
return audioCapabilities; return audioCapabilities;

View File

@ -182,8 +182,8 @@ public final class Requirements implements Parcelable {
private boolean isDeviceCharging(Context context) { private boolean isDeviceCharging(Context context) {
@Nullable @Nullable
Intent batteryStatus = Intent batteryStatus =
Util.registerReceiverNotExported( context.registerReceiver(
context, /* receiver= */ null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); /* receiver= */ null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
if (batteryStatus == null) { if (batteryStatus == null) {
return false; return false;
} }
@ -201,8 +201,8 @@ public final class Requirements implements Parcelable {
} }
private boolean isStorageNotLow(Context context) { private boolean isStorageNotLow(Context context) {
return Util.registerReceiverNotExported( return context.registerReceiver(
context, /* receiver= */ null, new IntentFilter(Intent.ACTION_DEVICE_STORAGE_LOW)) /* receiver= */ null, new IntentFilter(Intent.ACTION_DEVICE_STORAGE_LOW))
== null; == null;
} }

View File

@ -109,7 +109,7 @@ public final class RequirementsWatcher {
filter.addAction(Intent.ACTION_DEVICE_STORAGE_OK); filter.addAction(Intent.ACTION_DEVICE_STORAGE_OK);
} }
receiver = new DeviceStatusChangeReceiver(); receiver = new DeviceStatusChangeReceiver();
Util.registerReceiverNotExported(context, receiver, filter, handler); context.registerReceiver(receiver, filter, /* broadcastPermission= */ null, handler);
return notMetRequirements; return notMetRequirements;
} }