Add the explicitly mutable flag for creating a PendingIntent

- Android S+ to specify explicitly either FLAG_MUTABLE or FLAG_IMMUTABLE
  when creating a PendingIntent.
- Suggest to use the FLAG_IMMUTABLE as default. Change it to
  FLAG_MUTABLE while errors occur.

Fixes: 172207262
Fixes: 172207195
Fixes: 172205385
Fixes: 172204525
Fixes: 172205897
Test: build pass, manual test to paring blutooth device and doing
seamless transfer

Change-Id: Ic37b37bdbe6de6bdbad741985d3a920334240d80
This commit is contained in:
Hugh Chen
2020-11-03 12:08:45 +08:00
parent 5f5d754af2
commit 40d4e47b05
5 changed files with 21 additions and 12 deletions

View File

@@ -127,10 +127,12 @@ public final class BluetoothPairingService extends Service {
PendingIntent pairIntent = PendingIntent.getActivity(this, 0, PendingIntent pairIntent = PendingIntent.getActivity(this, 0,
getPairingDialogIntent(this, intent, getPairingDialogIntent(this, intent,
BluetoothDevice.EXTRA_PAIRING_INITIATOR_BACKGROUND), BluetoothDevice.EXTRA_PAIRING_INITIATOR_BACKGROUND),
PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT
| PendingIntent.FLAG_IMMUTABLE);
PendingIntent dismissIntent = PendingIntent.getBroadcast(this, 0, PendingIntent dismissIntent = PendingIntent.getBroadcast(this, 0,
new Intent(ACTION_DISMISS_PAIRING), PendingIntent.FLAG_ONE_SHOT); new Intent(ACTION_DISMISS_PAIRING), PendingIntent.FLAG_ONE_SHOT
| PendingIntent.FLAG_IMMUTABLE);
mDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); mDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

View File

@@ -177,8 +177,9 @@ public final class BluetoothPermissionRequest extends BroadcastReceiver {
.setOnlyAlertOnce(false) .setOnlyAlertOnce(false)
.setDefaults(Notification.DEFAULT_ALL) .setDefaults(Notification.DEFAULT_ALL)
.setContentIntent(PendingIntent.getActivity(context, 0, .setContentIntent(PendingIntent.getActivity(context, 0,
connectionAccessIntent, 0)) connectionAccessIntent, PendingIntent.FLAG_IMMUTABLE))
.setDeleteIntent(PendingIntent.getBroadcast(context, 0, deleteIntent, 0)) .setDeleteIntent(PendingIntent.getBroadcast(context, 0, deleteIntent,
PendingIntent.FLAG_IMMUTABLE))
.setColor(context.getColor( .setColor(context.getColor(
com.android.internal.R.color.system_notification_accent_color)) com.android.internal.R.color.system_notification_accent_color))
.setLocalOnly(true) .setLocalOnly(true)

View File

@@ -194,7 +194,7 @@ public class MediaOutputGroupSlice implements CustomSliceable {
intent.putExtra(CUSTOMIZED_ACTION, action); intent.putExtra(CUSTOMIZED_ACTION, action);
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
return PendingIntent.getBroadcast(mContext, requestCode, intent, return PendingIntent.getBroadcast(mContext, requestCode, intent,
PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
} }
private MediaDeviceUpdateWorker getWorker() { private MediaDeviceUpdateWorker getWorker() {

View File

@@ -147,7 +147,8 @@ public class MediaOutputSlice implements CustomSliceable {
.setSourceMetricsCategory(SettingsEnums.PANEL_MEDIA_OUTPUT) .setSourceMetricsCategory(SettingsEnums.PANEL_MEDIA_OUTPUT)
.toIntent(); .toIntent();
final SliceAction primarySliceAction = SliceAction.createDeeplink( final SliceAction primarySliceAction = SliceAction.createDeeplink(
PendingIntent.getActivity(mContext, 0 /* requestCode */, intent, 0 /* flags */), PendingIntent.getActivity(mContext, 0 /* requestCode */, intent,
PendingIntent.FLAG_IMMUTABLE),
IconCompat.createWithResource(mContext, R.drawable.ic_add_24dp/*ic_add_blue_24dp*/), IconCompat.createWithResource(mContext, R.drawable.ic_add_24dp/*ic_add_blue_24dp*/),
ListBuilder.ICON_IMAGE, ListBuilder.ICON_IMAGE,
mContext.getText(R.string.bluetooth_pairing_pref_title)); mContext.getText(R.string.bluetooth_pairing_pref_title));
@@ -248,7 +249,8 @@ public class MediaOutputSlice implements CustomSliceable {
.putExtra(MEDIA_DEVICE_ID, id) .putExtra(MEDIA_DEVICE_ID, id)
.setClass(mContext, SliceBroadcastReceiver.class); .setClass(mContext, SliceBroadcastReceiver.class);
return PendingIntent.getBroadcast(mContext, requestCode, intent, 0); return PendingIntent.getBroadcast(mContext, requestCode, intent,
PendingIntent.FLAG_IMMUTABLE);
} }
private SliceAction getEndItemSliceAction() { private SliceAction getEndItemSliceAction() {
@@ -261,7 +263,8 @@ public class MediaOutputSlice implements CustomSliceable {
? 0 ? 0
: getWorker().getPackageName().hashCode(); : getWorker().getPackageName().hashCode();
return SliceAction.createDeeplink( return SliceAction.createDeeplink(
PendingIntent.getActivity(mContext, requestCode, intent, 0 /* flags */), PendingIntent.getActivity(mContext, requestCode, intent,
PendingIntent.FLAG_IMMUTABLE),
IconCompat.createWithResource(mContext, R.drawable.ic_add_blue_24dp), IconCompat.createWithResource(mContext, R.drawable.ic_add_blue_24dp),
ListBuilder.ICON_IMAGE, ListBuilder.ICON_IMAGE,
mContext.getText(R.string.add)); mContext.getText(R.string.add));
@@ -350,7 +353,7 @@ public class MediaOutputSlice implements CustomSliceable {
intent.putExtra(MEDIA_DEVICE_ID, id); intent.putExtra(MEDIA_DEVICE_ID, id);
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
return PendingIntent.getBroadcast(context, requestCode, intent, return PendingIntent.getBroadcast(context, requestCode, intent,
PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
} }
@Override @Override

View File

@@ -165,7 +165,8 @@ public class RemoteMediaSlice implements CustomSliceable {
.setData(getUri()) .setData(getUri())
.putExtra(MEDIA_ID, id) .putExtra(MEDIA_ID, id)
.setClass(mContext, SliceBroadcastReceiver.class); .setClass(mContext, SliceBroadcastReceiver.class);
return PendingIntent.getBroadcast(mContext, requestCode, intent, 0); return PendingIntent.getBroadcast(mContext, requestCode, intent,
PendingIntent.FLAG_MUTABLE);
} }
private SliceAction getSoundSettingAction(CharSequence actionTitle, IconCompat icon, private SliceAction getSoundSettingAction(CharSequence actionTitle, IconCompat icon,
@@ -177,7 +178,8 @@ public class RemoteMediaSlice implements CustomSliceable {
mContext.getText(R.string.sound_settings).toString(), 0); mContext.getText(R.string.sound_settings).toString(), 0);
intent.setClassName(mContext.getPackageName(), SubSettings.class.getName()); intent.setClassName(mContext.getPackageName(), SubSettings.class.getName());
intent.setData(contentUri); intent.setData(contentUri);
final PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0); final PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent,
PendingIntent.FLAG_IMMUTABLE);
final SliceAction primarySliceAction = SliceAction.createDeeplink(pendingIntent, icon, final SliceAction primarySliceAction = SliceAction.createDeeplink(pendingIntent, icon,
ListBuilder.ICON_IMAGE, actionTitle); ListBuilder.ICON_IMAGE, actionTitle);
return primarySliceAction; return primarySliceAction;
@@ -192,7 +194,8 @@ public class RemoteMediaSlice implements CustomSliceable {
.putExtra(SESSION_INFO, info) .putExtra(SESSION_INFO, info)
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); .addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
final PendingIntent primaryBroadcastIntent = PendingIntent.getBroadcast(mContext, final PendingIntent primaryBroadcastIntent = PendingIntent.getBroadcast(mContext,
info.hashCode(), intent, PendingIntent.FLAG_UPDATE_CURRENT); info.hashCode(), intent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
final SliceAction primarySliceAction = SliceAction.createDeeplink( final SliceAction primarySliceAction = SliceAction.createDeeplink(
primaryBroadcastIntent, primaryBroadcastIntent,
IconCompat.createWithResource(mContext, R.drawable.ic_volume_remote), IconCompat.createWithResource(mContext, R.drawable.ic_volume_remote),