android: Mark PendingIntents as immutable via FLAG_IMMUTABLE

Setting this or explicitly FLAG_MUTABLE is required when targeting
Android 12.

References strongswan/strongswan#1151
This commit is contained in:
Tobias Brunner 2022-07-22 11:12:52 +02:00
parent 86b69f26e4
commit 563407e42a
2 changed files with 26 additions and 6 deletions

View File

@ -461,8 +461,13 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(VpnProfileControlActivity.START_PROFILE); intent.setAction(VpnProfileControlActivity.START_PROFILE);
intent.putExtra(VpnProfileControlActivity.EXTRA_VPN_PROFILE_ID, profile.getUUID().toString()); intent.putExtra(VpnProfileControlActivity.EXTRA_VPN_PROFILE_ID, profile.getUUID().toString());
int flags = PendingIntent.FLAG_UPDATE_CURRENT;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
flags |= PendingIntent.FLAG_IMMUTABLE;
}
PendingIntent pending = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent pending = PendingIntent.getActivity(getApplicationContext(), 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT); flags);
builder.addAction(R.drawable.ic_notification_connecting, getString(R.string.retry), pending); builder.addAction(R.drawable.ic_notification_connecting, getString(R.string.retry), pending);
add_action = true; add_action = true;
} }
@ -491,6 +496,12 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe
} }
} }
builder.setContentTitle(getString(s)); builder.setContentTitle(getString(s));
int flags = PendingIntent.FLAG_UPDATE_CURRENT;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
flags |= PendingIntent.FLAG_IMMUTABLE;
}
if (!publicVersion) if (!publicVersion)
{ {
if (add_action) if (add_action)
@ -498,7 +509,7 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe
Intent intent = new Intent(getApplicationContext(), VpnProfileControlActivity.class); Intent intent = new Intent(getApplicationContext(), VpnProfileControlActivity.class);
intent.setAction(VpnProfileControlActivity.DISCONNECT); intent.setAction(VpnProfileControlActivity.DISCONNECT);
PendingIntent pending = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent pending = PendingIntent.getActivity(getApplicationContext(), 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT); flags);
builder.addAction(R.drawable.ic_notification_disconnect, getString(R.string.disconnect), pending); builder.addAction(R.drawable.ic_notification_disconnect, getString(R.string.disconnect), pending);
} }
if (error == ErrorState.NO_ERROR) if (error == ErrorState.NO_ERROR)
@ -510,7 +521,7 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe
Intent intent = new Intent(getApplicationContext(), MainActivity.class); Intent intent = new Intent(getApplicationContext(), MainActivity.class);
PendingIntent pending = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent pending = PendingIntent.getActivity(getApplicationContext(), 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT); flags);
builder.setContentIntent(pending); builder.setContentIntent(pending);
return builder.build(); return builder.build();
} }
@ -820,8 +831,12 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe
* we just use our main Activity */ * we just use our main Activity */
Context context = getApplicationContext(); Context context = getApplicationContext();
Intent intent = new Intent(context, MainActivity.class); Intent intent = new Intent(context, MainActivity.class);
PendingIntent pending = PendingIntent.getActivity(context, 0, intent, int flags = PendingIntent.FLAG_UPDATE_CURRENT;
PendingIntent.FLAG_UPDATE_CURRENT); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
flags |= PendingIntent.FLAG_IMMUTABLE;
}
PendingIntent pending = PendingIntent.getActivity(context, 0, intent, flags);
builder.setConfigureIntent(pending); builder.setConfigureIntent(pending);
/* mark all VPN connections as unmetered (default changed for Android 10) */ /* mark all VPN connections as unmetered (default changed for Android 10) */

View File

@ -82,7 +82,12 @@ public class Scheduler extends BroadcastReceiver
/* using component/class doesn't work with dynamic broadcast receivers */ /* using component/class doesn't work with dynamic broadcast receivers */
Intent intent = new Intent(EXECUTE_JOB); Intent intent = new Intent(EXECUTE_JOB);
intent.setPackage(mContext.getPackageName()); intent.setPackage(mContext.getPackageName());
return PendingIntent.getBroadcast(mContext, 0, intent, 0); int flags = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
flags |= PendingIntent.FLAG_IMMUTABLE;
}
return PendingIntent.getBroadcast(mContext, 0, intent, flags);
} }
/** /**