From ae09a0602b6f392f26dc0d54177a93354d59047c Mon Sep 17 00:00:00 2001 From: Eric Kok Date: Wed, 2 Feb 2022 10:51:32 +0100 Subject: [PATCH] Fix widget due to API level 31 pending intent changes --- README.md | 8 ++++---- .../core/service/AppUpdateJobRunner.java | 3 ++- .../core/service/RssCheckerJobRunner.java | 3 ++- .../core/service/ServerCheckerJobRunner.java | 2 +- .../core/widget/ListWidgetProvider.java | 18 ++++++++++++------ 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index c16aef7c..68654b18 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Transdroid ========== [www.transdroid.org](https://www.transdroid.org/) -[Twitter](https://twitter.com/transdroid) - [transdroid@2312.nl](transdroid@2312.nl) +[Twitter](https://twitter.com/transdroid) - [transdroid@2312.nl](mailto:transdroid@2312.nl) Manage torrents from your Android device. @@ -46,20 +46,20 @@ Code structure ============== Starting with version 2.3.0, Transdroid is developed in Android Studio, fully integrating with the Gradle build system. -It is (since version 2.5.18) compiled against Android 10 (API level 29) and (since version 2.2.0) supporting Android ICS (API level 15) and up only. +It is (since version 2.5.21) compiled against Android 12 (API level 31) and (since version 2.2.0) supporting Android ICS (API level 15) and up only. To support lite (Transdrone, specially for the Play Store) and full (Transdroid) versions of the app, build flavours are defined in gradle, which contain version-specific resources. Dependencies are managed via JCentral et al. in the app's build.gradle file. Developed By ============ -Designed and developed by [Eric Kok](eric@2312.nl) of [2312 development](https://2312.nl/). +Designed and developed by [Eric Kok](mailto:eric@2312.nl) of [2312 development](https://2312.nl/). Contributions by various others (see commit log). License ======= - Copyright 2010-2020 Eric Kok et al. + Copyright 2010-2022 Eric Kok et al. Transdroid is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/app/src/main/java/org/transdroid/core/service/AppUpdateJobRunner.java b/app/src/main/java/org/transdroid/core/service/AppUpdateJobRunner.java index c525eb6d..e2b070ce 100644 --- a/app/src/main/java/org/transdroid/core/service/AppUpdateJobRunner.java +++ b/app/src/main/java/org/transdroid/core/service/AppUpdateJobRunner.java @@ -171,7 +171,8 @@ public class AppUpdateJobRunner { private void newNotification(String ticker, String title, String text, String downloadUrl, int notifyID) { PendingIntent pi = PendingIntent.getActivity(context, notifyID, - new Intent(Intent.ACTION_VIEW, Uri.parse(downloadUrl)), PendingIntent.FLAG_UPDATE_CURRENT); + new Intent(Intent.ACTION_VIEW, Uri.parse(downloadUrl)), + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); final NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NotificationChannels.CHANNEL_APP_UPDATE) .setSmallIcon(R.drawable.ic_stat_notification) .setTicker(ticker) diff --git a/app/src/main/java/org/transdroid/core/service/RssCheckerJobRunner.java b/app/src/main/java/org/transdroid/core/service/RssCheckerJobRunner.java index c3034cc1..b8fb04a4 100644 --- a/app/src/main/java/org/transdroid/core/service/RssCheckerJobRunner.java +++ b/app/src/main/java/org/transdroid/core/service/RssCheckerJobRunner.java @@ -122,7 +122,8 @@ public class RssCheckerJobRunner { // Provide a notification, since there are new RSS items PendingIntent pi = PendingIntent - .getActivity(context, 80000, new Intent(context, RssFeedsActivity_.class), PendingIntent.FLAG_UPDATE_CURRENT); + .getActivity(context, 80000, new Intent(context, RssFeedsActivity_.class), + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); String title = context.getResources().getQuantityString(R.plurals.rss_service_new, unread, Integer.toString(unread)); String forString = Collections2.joinString(hasUnread, ", "); final NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NotificationChannels.CHANNEL_RSS_CHECKER) diff --git a/app/src/main/java/org/transdroid/core/service/ServerCheckerJobRunner.java b/app/src/main/java/org/transdroid/core/service/ServerCheckerJobRunner.java index 3e7b3b14..c6b00d0b 100644 --- a/app/src/main/java/org/transdroid/core/service/ServerCheckerJobRunner.java +++ b/app/src/main/java/org/transdroid/core/service/ServerCheckerJobRunner.java @@ -147,7 +147,7 @@ public class ServerCheckerJobRunner { i.putExtra("org.transdroid.START_SERVER", server.getOrder()); // Should start the main activity directly into this server PendingIntent pi = PendingIntent.getActivity(context, notifyBase + server.getOrder(), i, - PendingIntent.FLAG_CANCEL_CURRENT); + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE); ArrayList affectedTorrents = new ArrayList<>(newTorrents.size() + doneTorrents.size()); affectedTorrents.addAll(newTorrents); affectedTorrents.addAll(doneTorrents); diff --git a/app/src/main/java/org/transdroid/core/widget/ListWidgetProvider.java b/app/src/main/java/org/transdroid/core/widget/ListWidgetProvider.java index 7ef8a79d..281a43ab 100644 --- a/app/src/main/java/org/transdroid/core/widget/ListWidgetProvider.java +++ b/app/src/main/java/org/transdroid/core/widget/ListWidgetProvider.java @@ -91,7 +91,8 @@ public class ListWidgetProvider extends AppWidgetProvider { rv.setRemoteAdapter(appWidgetId, R.id.torrents_list, data); Intent open = new Intent(context, TorrentsActivity_.class); open.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - rv.setPendingIntentTemplate(R.id.torrents_list, PendingIntent.getActivity(context, appWidgetId, open, PendingIntent.FLAG_UPDATE_CURRENT)); + rv.setPendingIntentTemplate(R.id.torrents_list, PendingIntent.getActivity(context, appWidgetId, open, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE)); rv.setEmptyView(R.id.torrents_list, R.id.error_text); rv.setTextViewText(R.id.error_text, context.getString(R.string.widget_loading)); @@ -107,8 +108,10 @@ public class ListWidgetProvider extends AppWidgetProvider { start.setAction(INTENT_STARTSERVER); start.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); start.putExtra(EXTRA_SERVER, config.getServerId()); - rv.setOnClickPendingIntent(R.id.icon_image, PendingIntent.getActivity(context, appWidgetId, start, PendingIntent.FLAG_UPDATE_CURRENT)); - rv.setOnClickPendingIntent(R.id.navigation_view, PendingIntent.getActivity(context, appWidgetId, start, PendingIntent.FLAG_UPDATE_CURRENT)); + rv.setOnClickPendingIntent(R.id.icon_image, PendingIntent.getActivity(context, appWidgetId, start, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE)); + rv.setOnClickPendingIntent(R.id.navigation_view, PendingIntent.getActivity(context, appWidgetId, start, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE)); // Set up the widgets refresh button pending intent (calling this WidgetProvider itself) // Make sure that the intent is unique using a custom data path (rather than just the extras) @@ -116,7 +119,8 @@ public class ListWidgetProvider extends AppWidgetProvider { refresh.setData(Uri.parse("intent://widget/" + appWidgetId + "/refresh")); refresh.putExtra(EXTRA_REFRESH, appWidgetId); refresh.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); - rv.setOnClickPendingIntent(R.id.refresh_button, PendingIntent.getBroadcast(context, appWidgetId, refresh, PendingIntent.FLAG_UPDATE_CURRENT)); + rv.setOnClickPendingIntent(R.id.refresh_button, PendingIntent.getBroadcast(context, appWidgetId, refresh, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE)); // Set up the control (pause and resume) buttons (calling the WidgetProvider itself) Intent pauseall = new Intent(context, ListWidgetProvider_.class); @@ -124,13 +128,15 @@ public class ListWidgetProvider extends AppWidgetProvider { pauseall.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); pauseall.setAction(ControlService.INTENT_PAUSEALL); rv.setOnClickPendingIntent(R.id.pauseall_button, - PendingIntent.getBroadcast(context, appWidgetId, pauseall, PendingIntent.FLAG_UPDATE_CURRENT)); + PendingIntent.getBroadcast(context, appWidgetId, pauseall, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE)); Intent resumeall = new Intent(context, ListWidgetProvider_.class); resumeall.setData(Uri.parse("intent://widget/" + appWidgetId + "/resumeall")); resumeall.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); resumeall.setAction(ControlService.INTENT_RESUMEALL); rv.setOnClickPendingIntent(R.id.resumeall_button, - PendingIntent.getBroadcast(context, appWidgetId, resumeall, PendingIntent.FLAG_UPDATE_CURRENT)); + PendingIntent.getBroadcast(context, appWidgetId, resumeall, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE)); return rv;