Don't export broadcast receivers that don't require it
Issue: google/ExoPlayer#10287 PiperOrigin-RevId: 455131138
This commit is contained in:
parent
958105c91c
commit
691b392b24
@ -94,7 +94,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);
|
||||||
context.registerReceiver(/* receiver= */ new Receiver(), filter);
|
Util.registerReceiverNotExported(context, new Receiver(), filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -34,9 +34,11 @@ import android.Manifest.permission;
|
|||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.UiModeManager;
|
import android.app.UiModeManager;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
import android.content.pm.PackageInfo;
|
import android.content.pm.PackageInfo;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.content.pm.PackageManager.NameNotFoundException;
|
import android.content.pm.PackageManager.NameNotFoundException;
|
||||||
@ -189,6 +191,54 @@ public final class Util {
|
|||||||
return outputStream.toByteArray();
|
return outputStream.toByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
* @return The first sticky intent found that matches {@code filter}, or null if there are none.
|
||||||
|
*/
|
||||||
|
@UnstableApi
|
||||||
|
@Nullable
|
||||||
|
public static Intent registerReceiverNotExported(
|
||||||
|
Context context, @Nullable BroadcastReceiver receiver, IntentFilter filter) {
|
||||||
|
if (SDK_INT < 33) {
|
||||||
|
return context.registerReceiver(receiver, filter);
|
||||||
|
} else {
|
||||||
|
return context.registerReceiver(receiver, filter, Context.RECEIVER_NOT_EXPORTED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
@UnstableApi
|
||||||
|
@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.
|
||||||
|
@ -21,6 +21,7 @@ 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 androidx.media3.common.util.Util;
|
||||||
|
|
||||||
/* package */ final class AudioBecomingNoisyManager {
|
/* package */ final class AudioBecomingNoisyManager {
|
||||||
|
|
||||||
@ -46,8 +47,8 @@ import android.os.Handler;
|
|||||||
*/
|
*/
|
||||||
public void setEnabled(boolean enabled) {
|
public void setEnabled(boolean enabled) {
|
||||||
if (enabled && !receiverRegistered) {
|
if (enabled && !receiverRegistered) {
|
||||||
context.registerReceiver(
|
Util.registerReceiverNotExported(
|
||||||
receiver, new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY));
|
context, 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);
|
||||||
|
@ -75,7 +75,7 @@ import androidx.media3.common.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 {
|
||||||
applicationContext.registerReceiver(receiver, filter);
|
Util.registerReceiverNotExported(applicationContext, 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);
|
||||||
|
@ -88,8 +88,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 =
|
||||||
context.registerReceiver(
|
Util.registerReceiverNotExported(
|
||||||
/* receiver= */ null, new IntentFilter(AudioManager.ACTION_HDMI_AUDIO_PLUG));
|
context, /* receiver= */ null, new IntentFilter(AudioManager.ACTION_HDMI_AUDIO_PLUG));
|
||||||
return getCapabilities(context, intent);
|
return getCapabilities(context, intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,12 +90,10 @@ public final class AudioCapabilitiesReceiver {
|
|||||||
if (externalSurroundSoundSettingObserver != null) {
|
if (externalSurroundSoundSettingObserver != null) {
|
||||||
externalSurroundSoundSettingObserver.register();
|
externalSurroundSoundSettingObserver.register();
|
||||||
}
|
}
|
||||||
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 =
|
stickyIntent = Util.registerReceiverNotExported(context, receiver, intentFilter, handler);
|
||||||
context.registerReceiver(
|
|
||||||
receiver, intentFilter, /* broadcastPermission= */ null, handler);
|
|
||||||
}
|
}
|
||||||
audioCapabilities = AudioCapabilities.getCapabilities(context, stickyIntent);
|
audioCapabilities = AudioCapabilities.getCapabilities(context, stickyIntent);
|
||||||
return audioCapabilities;
|
return audioCapabilities;
|
||||||
|
@ -184,8 +184,8 @@ public final class Requirements implements Parcelable {
|
|||||||
private boolean isDeviceCharging(Context context) {
|
private boolean isDeviceCharging(Context context) {
|
||||||
@Nullable
|
@Nullable
|
||||||
Intent batteryStatus =
|
Intent batteryStatus =
|
||||||
context.registerReceiver(
|
Util.registerReceiverNotExported(
|
||||||
/* receiver= */ null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
context, /* receiver= */ null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
||||||
if (batteryStatus == null) {
|
if (batteryStatus == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -203,8 +203,8 @@ public final class Requirements implements Parcelable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean isStorageNotLow(Context context) {
|
private boolean isStorageNotLow(Context context) {
|
||||||
return context.registerReceiver(
|
return Util.registerReceiverNotExported(
|
||||||
/* receiver= */ null, new IntentFilter(Intent.ACTION_DEVICE_STORAGE_LOW))
|
context, /* receiver= */ null, new IntentFilter(Intent.ACTION_DEVICE_STORAGE_LOW))
|
||||||
== null;
|
== null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,7 +111,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();
|
||||||
context.registerReceiver(receiver, filter, null, handler);
|
Util.registerReceiverNotExported(context, receiver, filter, handler);
|
||||||
return notMetRequirements;
|
return notMetRequirements;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user