Fix PendingIntents missing FLAG_MUTABLE

Even though PendingIntents are assumed to be mutable by default,
adding FLAG_MUTABLE is required when running on Android API 33+.
This commit is contained in:
Trevor Slocum 2023-04-01 10:29:33 -07:00
parent ed5afd4b83
commit 1e67644af2
9 changed files with 42 additions and 42 deletions

View File

@ -8,8 +8,8 @@ android {
minSdkVersion 16
targetSdkVersion 33
versionCode 166
versionName "1.6.6"
versionCode 167
versionName "1.6.7"
applicationId "sh.ftp.rocketninelabs.meditationassistant"
manifestPlaceholders = [

View File

@ -27,6 +27,12 @@
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
tools:node="replace" />
<uses-permission
android:name="android.permission.USE_EXACT_ALARM"
tools:node="replace" />
<uses-permission
android:name="android.permission.SCHEDULE_EXACT_ALARM"
tools:node="replace" android:maxSdkVersion="32" />
<application
android:name=".MeditationAssistant"

View File

@ -83,7 +83,7 @@ public class DailyReminderReceiver extends BroadcastReceiver {
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(notificationIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT | MeditationAssistant.extraPendingIntentFlags());
notificationBuilder.setContentIntent(resultPendingIntent);
Notification notification = notificationBuilder.build();

View File

@ -131,7 +131,7 @@ public class MainActivity extends Activity implements OnShowcaseEventListener {
intent_interval.setAction(BROADCAST_ACTION_ALARM);
pendingintent_interval = PendingIntent.getActivity(
getApplicationContext(), ID_INTERVAL,
intent_interval, PendingIntent.FLAG_CANCEL_CURRENT);
intent_interval, PendingIntent.FLAG_CANCEL_CURRENT | MeditationAssistant.extraPendingIntentFlags());
getMeditationAssistant().setAlarm(true, cal.getTimeInMillis(), pendingintent_interval);
handler.postDelayed(this, interval * 1000);
@ -1244,7 +1244,7 @@ public class MainActivity extends Activity implements OnShowcaseEventListener {
intent.setAction(BROADCAST_ACTION_ALARM);
pendingintent = PendingIntent.getActivity(
getApplicationContext(), ID_END, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent.FLAG_CANCEL_CURRENT | MeditationAssistant.extraPendingIntentFlags());
Log.d("MeditationAssistant", "Setting MAIN WAKEUP alarm for "
+ cal.getTimeInMillis() + " (Now: "
@ -1398,7 +1398,7 @@ public class MainActivity extends Activity implements OnShowcaseEventListener {
intent.setAction(BROADCAST_ACTION_ALARM);
pendingintent = PendingIntent.getActivity(
getApplicationContext(), ID_END, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent.FLAG_CANCEL_CURRENT | MeditationAssistant.extraPendingIntentFlags());
Log.d("MeditationAssistant", "Setting MAIN WAKEUP alarm for "
+ cal.getTimeInMillis() + " (Now: "
@ -1456,7 +1456,7 @@ public class MainActivity extends Activity implements OnShowcaseEventListener {
intent_delay.setAction(BROADCAST_ACTION_ALARM);
pendingintent_delay = PendingIntent.getActivity(
getApplicationContext(), ID_DELAY, intent_delay,
PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent.FLAG_CANCEL_CURRENT | MeditationAssistant.extraPendingIntentFlags());
getMeditationAssistant().setAlarm(true, cal.getTimeInMillis(), pendingintent_delay);
} else {
handler.postDelayed(meditateRunnable, 50);
@ -1485,7 +1485,7 @@ public class MainActivity extends Activity implements OnShowcaseEventListener {
intent_interval.setAction(BROADCAST_ACTION_ALARM);
pendingintent_interval = PendingIntent.getActivity(
getApplicationContext(), ID_INTERVAL,
intent_interval, PendingIntent.FLAG_CANCEL_CURRENT);
intent_interval, PendingIntent.FLAG_CANCEL_CURRENT | MeditationAssistant.extraPendingIntentFlags());
getMeditationAssistant().setAlarm(true, cal.getTimeInMillis(), pendingintent_interval);
}
}
@ -1521,7 +1521,7 @@ public class MainActivity extends Activity implements OnShowcaseEventListener {
intent_bell.putExtra("wakeupbell", true);
intent_bell.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent_bell.setAction(BROADCAST_ACTION_ALARM);
mindfulnessBellIntent = PendingIntent.getActivity(getApplicationContext(), ID_BELL, intent_bell, PendingIntent.FLAG_CANCEL_CURRENT);
mindfulnessBellIntent = PendingIntent.getActivity(getApplicationContext(), ID_BELL, intent_bell, PendingIntent.FLAG_CANCEL_CURRENT | MeditationAssistant.extraPendingIntentFlags());
getMeditationAssistant().setAlarm(true, cal.getTimeInMillis(), mindfulnessBellIntent);
}
@ -2016,7 +2016,7 @@ public class MainActivity extends Activity implements OnShowcaseEventListener {
intent_interval.setAction(BROADCAST_ACTION_ALARM);
pendingintent_interval = PendingIntent.getActivity(
getApplicationContext(), ID_INTERVAL,
intent_interval, PendingIntent.FLAG_CANCEL_CURRENT);
intent_interval, PendingIntent.FLAG_CANCEL_CURRENT | MeditationAssistant.extraPendingIntentFlags());
getMeditationAssistant().setAlarm(true, cal.getTimeInMillis(), pendingintent_interval);
} else {
Log.d("MeditationAssistant", "Skipping INTERVAL WAKEUP alarm");

View File

@ -52,26 +52,13 @@ public class MediNETActivity extends Activity {
}
public String getPageUrl(String page) {
/*TimeZone tz = TimeZone.getDefault();
Date now = new Date();
if (page.equals("community")) {
return MeditationAssistant.URL_MEDINET + "/om/community?v="
+ MediNET.version.toString() + "&avn="
+ getMeditationAssistant().getMAAppVersionNumber() + "&th="
+ ma.getMAThemeString() + "&tz="
+ TimeZone.getDefault().getID() + "&x="
+ getMeditationAssistant().getMediNETKey() + "&page="
+ page;
}*/
return MeditationAssistant.URL_MEDINET + "/client_android.php?v="
+ MediNET.version.toString() + "&avn="
+ getMeditationAssistant().getMAAppVersionNumber() + "&th="
+ ma.getMAThemeString() + "&tz="
+ TimeZone.getDefault().getID() + "&x="
+ getMeditationAssistant().getMediNETKey() + "&page="
+ page;
return MeditationAssistant.URL_MEDINET
+ "/om/" + page
+ "?v=" + MediNET.version.toString()
+ "&avn=" + getMeditationAssistant().getMAAppVersionNumber()
+ "&th=" + ma.getMAThemeString()
+ "&tz=" + TimeZone.getDefault().getID()
+ "&x=" + getMeditationAssistant().getMediNETKey();
}
public void goTo(String go_to) {

View File

@ -366,7 +366,7 @@ public class MeditationAssistant extends Application {
public void setAlarm(boolean allowAlarmClock, long triggerAtMillis, PendingIntent pendingIntent) {
if (Build.VERSION.SDK_INT >= 21 && allowAlarmClock) {
getAlarmManager().setAlarmClock(new AlarmManager.AlarmClockInfo(triggerAtMillis, PendingIntent.getActivity(this, 0, new Intent(getApplicationContext(), MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT)), pendingIntent);
getAlarmManager().setAlarmClock(new AlarmManager.AlarmClockInfo(triggerAtMillis, PendingIntent.getActivity(this, 0, new Intent(getApplicationContext(), MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT | MeditationAssistant.extraPendingIntentFlags())), pendingIntent);
} else if (Build.VERSION.SDK_INT >= 19) {
getAlarmManager().setExact(AlarmManager.RTC_WAKEUP, triggerAtMillis, pendingIntent);
} else {
@ -765,7 +765,7 @@ public class MeditationAssistant extends Application {
AuthorizationService authorizationService = new AuthorizationService(context);
PendingIntent authIntent = PendingIntent.getActivity(MeditationAssistant.this, 0, new Intent(context, AuthResultActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent authIntent = PendingIntent.getActivity(MeditationAssistant.this, 0, new Intent(context, AuthResultActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), PendingIntent.FLAG_CANCEL_CURRENT | MeditationAssistant.extraPendingIntentFlags());
authorizationService.performAuthorizationRequest(
request,
@ -1297,7 +1297,7 @@ public class MeditationAssistant extends Application {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
cancelDailyReminder(context);
reminderPendingIntent = PendingIntent.getBroadcast(context, dailyReminderNotificationID, new Intent(MeditationAssistant.ACTION_REMINDER), PendingIntent.FLAG_CANCEL_CURRENT);
reminderPendingIntent = PendingIntent.getBroadcast(context, dailyReminderNotificationID, new Intent(MeditationAssistant.ACTION_REMINDER), PendingIntent.FLAG_CANCEL_CURRENT | MeditationAssistant.extraPendingIntentFlags());
/* Don't use setAlarmClock here as it will always place an alarm icon in the status bar */
setAlarm(false, calendar.getTimeInMillis(), reminderPendingIntent);
@ -1332,7 +1332,7 @@ public class MeditationAssistant extends Application {
Log.e("MeditationAssistant", "AlarmManager update was not canceled. " + e.toString());
}
try {
PendingIntent.getBroadcast(context, 0, new Intent(MeditationAssistant.ACTION_REMINDER), PendingIntent.FLAG_CANCEL_CURRENT).cancel();
PendingIntent.getBroadcast(context, 0, new Intent(MeditationAssistant.ACTION_REMINDER), PendingIntent.FLAG_CANCEL_CURRENT | MeditationAssistant.extraPendingIntentFlags()).cancel();
} catch (Exception e) {
Log.e("MeditationAssistant", "PendingIntent broadcast was not canceled. " + e.toString());
}
@ -1553,14 +1553,14 @@ public class MeditationAssistant extends Application {
// intent.putExtra("notificationButton", "notification");
// intent.putExtra("notificationButton", "");
PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent.FLAG_UPDATE_CURRENT | MeditationAssistant.extraPendingIntentFlags());
Intent intent3 = new Intent(this, MainActivity.class);
// intent3.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
// intent3.putExtra("notificationButton", "end");
intent3.setAction("notificationEndBell");
PendingIntent pIntentEnd = PendingIntent.getActivity(this, 0, intent3,
PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent.FLAG_UPDATE_CURRENT | MeditationAssistant.extraPendingIntentFlags());
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setOngoing(true)
@ -1591,20 +1591,20 @@ public class MeditationAssistant extends Application {
// intent.putExtra("notificationButton", "notification");
// intent.putExtra("notificationButton", "");
PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent.FLAG_UPDATE_CURRENT | MeditationAssistant.extraPendingIntentFlags());
Intent intent2 = new Intent(this, MainActivity.class);
// intent2.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent2.setAction("notificationPause");
PendingIntent pIntentPause = PendingIntent.getActivity(this, 0, intent2,
PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent.FLAG_UPDATE_CURRENT | MeditationAssistant.extraPendingIntentFlags());
Intent intent3 = new Intent(this, MainActivity.class);
// intent3.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
// intent3.putExtra("notificationButton", "end");
intent3.setAction("notificationEnd");
PendingIntent pIntentEnd = PendingIntent.getActivity(this, 0, intent3,
PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent.FLAG_UPDATE_CURRENT | MeditationAssistant.extraPendingIntentFlags());
String streaktext = "";
if (getMeditationStreak().get(0) > 1) {
@ -2643,4 +2643,11 @@ public class MeditationAssistant extends Application {
super.attachBaseContext(base);
MultiDex.install(this);
}
public static int extraPendingIntentFlags() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
return 0;
}
return PendingIntent.FLAG_MUTABLE;
}
}

View File

@ -57,7 +57,7 @@ public class WidgetPresetProvider extends AppWidgetProvider {
clickintent.putExtra("widgetid", widgetId);
PendingIntent pendingIntent = PendingIntent.getActivity(
context, widgetId, clickintent, 0);
context, widgetId, clickintent, MeditationAssistant.extraPendingIntentFlags());
updateViews.setOnClickPendingIntent(R.id.layWidget, pendingIntent);
updateViews.setOnClickPendingIntent(R.id.txtWidgetPresetText, pendingIntent);

View File

@ -54,7 +54,7 @@ public class WidgetStreakService extends Service {
Intent clickintent = new Intent(getApplicationContext(), MainActivity.class);
clickintent.setAction("widgetclick");
PendingIntent pendingIntent = PendingIntent.getActivity(
getApplicationContext(), 0, clickintent, 0);
getApplicationContext(), 0, clickintent, MeditationAssistant.extraPendingIntentFlags());
updateViews.setOnClickPendingIntent(R.id.layWidget, pendingIntent);
updateViews.setOnClickPendingIntent(R.id.txtWidgetStreakDays, pendingIntent);
updateViews.setOnClickPendingIntent(R.id.txtWidgetStreakText, pendingIntent);

View File

@ -5,7 +5,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:7.2.0'
classpath 'com.android.tools.build:gradle:7.2.2'
}
}