diff --git a/app/src/main/kotlin/at/bitfire/davdroid/db/AppDatabase.kt b/app/src/main/kotlin/at/bitfire/davdroid/db/AppDatabase.kt index 3f803999f..93e77b6bb 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/db/AppDatabase.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/db/AppDatabase.kt @@ -10,6 +10,7 @@ import android.content.Context import android.content.Intent import android.database.sqlite.SQLiteQueryBuilder import androidx.core.app.NotificationCompat +import androidx.core.app.TaskStackBuilder import androidx.core.database.getStringOrNull import androidx.room.AutoMigration import androidx.room.Database @@ -21,7 +22,8 @@ import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase import at.bitfire.davdroid.R import at.bitfire.davdroid.TextTable -import at.bitfire.davdroid.db.migration.* +import at.bitfire.davdroid.db.migration.AutoMigration12 +import at.bitfire.davdroid.db.migration.AutoMigration16 import at.bitfire.davdroid.ui.AccountsActivity import at.bitfire.davdroid.ui.NotificationRegistry import dagger.Module @@ -80,7 +82,11 @@ abstract class AppDatabase: RoomDatabase() { .setContentTitle(context.getString(R.string.database_destructive_migration_title)) .setContentText(context.getString(R.string.database_destructive_migration_text)) .setCategory(NotificationCompat.CATEGORY_ERROR) - .setContentIntent(PendingIntent.getActivity(context, 0, launcherIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)) + .setContentIntent( + TaskStackBuilder.create(context) + .addNextIntent(launcherIntent) + .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + ) .setAutoCancel(true) .build() } diff --git a/app/src/main/kotlin/at/bitfire/davdroid/log/LogFileHandler.kt b/app/src/main/kotlin/at/bitfire/davdroid/log/LogFileHandler.kt index 178fbe860..63a89c83e 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/log/LogFileHandler.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/log/LogFileHandler.kt @@ -10,6 +10,7 @@ import android.content.Intent import android.os.Process import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.TaskStackBuilder import at.bitfire.davdroid.R import at.bitfire.davdroid.ui.AppSettingsActivity import at.bitfire.davdroid.ui.DebugInfoActivity @@ -138,8 +139,9 @@ class LogFileHandler @Inject constructor( val shareIntent = DebugInfoActivity.IntentBuilder(context) .newTask() .share() - val pendingShare = - PendingIntent.getActivity(context, 0, shareIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + val pendingShare = TaskStackBuilder.create(context) + .addNextIntentWithParentStack(shareIntent) + .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) builder.addAction( NotificationCompat.Action.Builder( R.drawable.ic_share, @@ -151,8 +153,9 @@ class LogFileHandler @Inject constructor( // add action to disable verbose logging val prefIntent = Intent(context, AppSettingsActivity::class.java) prefIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - val pendingPref = - PendingIntent.getActivity(context, 0, prefIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + val pendingPref = TaskStackBuilder.create(context) + .addNextIntentWithParentStack(prefIntent) + .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) builder.addAction( NotificationCompat.Action.Builder( R.drawable.ic_settings, diff --git a/app/src/main/kotlin/at/bitfire/davdroid/push/PushNotificationManager.kt b/app/src/main/kotlin/at/bitfire/davdroid/push/PushNotificationManager.kt index bfe8ecb6e..d8e689fec 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/push/PushNotificationManager.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/push/PushNotificationManager.kt @@ -10,6 +10,7 @@ import android.content.Context import android.content.Intent import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.TaskStackBuilder import at.bitfire.davdroid.R import at.bitfire.davdroid.sync.SyncDataType import at.bitfire.davdroid.ui.NotificationRegistry @@ -45,14 +46,13 @@ class PushNotificationManager @Inject constructor( .setAutoCancel(true) .setOnlyAlertOnce(true) .setContentIntent( - PendingIntent.getActivity( - context, - 0, - Intent(context, AccountActivity::class.java).apply { - putExtra(AccountActivity.EXTRA_ACCOUNT, account) - }, - PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT - ) + TaskStackBuilder.create(context) + .addNextIntentWithParentStack( + Intent(context, AccountActivity::class.java).apply { + putExtra(AccountActivity.EXTRA_ACCOUNT, account) + } + ) + .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) ) .build() } diff --git a/app/src/main/kotlin/at/bitfire/davdroid/servicedetection/RefreshCollectionsWorker.kt b/app/src/main/kotlin/at/bitfire/davdroid/servicedetection/RefreshCollectionsWorker.kt index 8be4e46a6..549a2d34d 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/servicedetection/RefreshCollectionsWorker.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/servicedetection/RefreshCollectionsWorker.kt @@ -10,6 +10,7 @@ import android.content.Context import android.content.Intent import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.TaskStackBuilder import androidx.hilt.work.HiltWorker import androidx.work.CoroutineWorker import androidx.work.Data @@ -26,6 +27,7 @@ import at.bitfire.davdroid.InvalidAccountException import at.bitfire.davdroid.R import at.bitfire.davdroid.network.HttpClient import at.bitfire.davdroid.repository.DavServiceRepository +import at.bitfire.davdroid.servicedetection.RefreshCollectionsWorker.Companion.ARG_SERVICE_ID import at.bitfire.davdroid.ui.DebugInfoActivity import at.bitfire.davdroid.ui.NotificationRegistry import at.bitfire.davdroid.ui.account.AccountSettingsActivity @@ -226,12 +228,9 @@ class RefreshCollectionsWorker @AssistedInject constructor( .setContentTitle(applicationContext.getString(R.string.refresh_collections_worker_refresh_failed)) .setContentText(contentText) .setContentIntent( - PendingIntent.getActivity( - applicationContext, - 0, - contentIntent, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) + TaskStackBuilder.create(applicationContext) + .addNextIntentWithParentStack(contentIntent) + .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) ) .setSubText(account?.name) .setCategory(NotificationCompat.CATEGORY_ERROR) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/sync/SyncManager.kt b/app/src/main/kotlin/at/bitfire/davdroid/sync/SyncManager.kt index 951067b9d..b69c58f9b 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/sync/SyncManager.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/sync/SyncManager.kt @@ -16,6 +16,7 @@ import android.provider.CalendarContract import android.provider.ContactsContract import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.TaskStackBuilder import at.bitfire.dav4jvm.DavCollection import at.bitfire.dav4jvm.DavResource import at.bitfire.dav4jvm.Error @@ -814,12 +815,9 @@ abstract class SyncManager, out CollectionType: L .setSubText(account.name) .setOnlyAlertOnce(true) .setContentIntent( - PendingIntent.getActivity( - context, - 0, - contentIntent, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) + TaskStackBuilder.create(context) + .addNextIntentWithParentStack(contentIntent) + .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) ) .setPriority(priority) .setCategory(NotificationCompat.CATEGORY_ERROR) @@ -864,8 +862,13 @@ abstract class SyncManager, out CollectionType: L } } return if (intent != null && context.packageManager.resolveActivity(intent, 0) != null) - NotificationCompat.Action(android.R.drawable.ic_menu_view, context.getString(R.string.sync_error_view_item), - PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)) + NotificationCompat.Action( + android.R.drawable.ic_menu_view, + context.getString(R.string.sync_error_view_item), + TaskStackBuilder.create(context) + .addNextIntent(intent) + .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + ) else null } @@ -880,12 +883,9 @@ abstract class SyncManager, out CollectionType: L .setContentText(context.getString(R.string.sync_invalid_resources_ignoring)) .setSubText(account.name) .setContentIntent( - PendingIntent.getActivity( - context, - 0, - intent, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) + TaskStackBuilder.create(context) + .addNextIntent(intent) + .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) ) .setAutoCancel(true) .setOnlyAlertOnce(true) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/sync/TasksAppManager.kt b/app/src/main/kotlin/at/bitfire/davdroid/sync/TasksAppManager.kt index fdfac3b21..1e9dc7a01 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/sync/TasksAppManager.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/sync/TasksAppManager.kt @@ -11,6 +11,7 @@ import android.content.pm.PackageManager import android.graphics.drawable.BitmapDrawable import android.net.Uri import androidx.core.app.NotificationCompat +import androidx.core.app.TaskStackBuilder import at.bitfire.davdroid.R import at.bitfire.davdroid.repository.AccountRepository import at.bitfire.davdroid.resource.LocalDataStore @@ -125,7 +126,11 @@ class TasksAppManager @Inject constructor( val flags = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE if (intent.resolveActivity(pm) != null) - notify.setContentIntent(PendingIntent.getActivity(context, 0, intent, flags)) + notify.setContentIntent( + TaskStackBuilder.create(context) + .addNextIntent(intent) + .getPendingIntent(0, flags) + ) notify.build() } diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/NotificationRegistry.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/NotificationRegistry.kt index ae2c40774..7b52e9420 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/NotificationRegistry.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/NotificationRegistry.kt @@ -16,6 +16,7 @@ import android.content.pm.PackageManager import android.os.Build import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import androidx.core.app.TaskStackBuilder import androidx.core.content.ContextCompat import androidx.core.content.getSystemService import at.bitfire.davdroid.R @@ -166,12 +167,9 @@ class NotificationRegistry @Inject constructor( .setContentTitle(context.getString(R.string.sync_error_permissions)) .setContentText(context.getString(R.string.sync_error_permissions_text)) .setContentIntent( - PendingIntent.getActivity( - context, - 0, - contentIntent, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) + TaskStackBuilder.create(context) + .addNextIntentWithParentStack(contentIntent) + .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) ) .setCategory(NotificationCompat.CATEGORY_ERROR) .setAutoCancel(true) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/webdav/DavDocumentsProvider.kt b/app/src/main/kotlin/at/bitfire/davdroid/webdav/DavDocumentsProvider.kt index 8fa8ba225..75d220895 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/webdav/DavDocumentsProvider.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/webdav/DavDocumentsProvider.kt @@ -27,6 +27,7 @@ import android.provider.DocumentsContract.buildRootsUri import android.provider.DocumentsProvider import android.webkit.MimeTypeMap import androidx.annotation.WorkerThread +import androidx.core.app.TaskStackBuilder import androidx.core.content.getSystemService import at.bitfire.dav4jvm.DavCollection import at.bitfire.dav4jvm.DavResource @@ -756,7 +757,12 @@ class DavDocumentsProvider: DocumentsProvider() { if (Build.VERSION.SDK_INT >= 26) { // TODO edit mount val intent = Intent(ourContext, WebdavMountsActivity::class.java) - throw AuthenticationRequiredException(this, PendingIntent.getActivity(ourContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)) + throw AuthenticationRequiredException( + this, + TaskStackBuilder.create(ourContext) + .addNextIntentWithParentStack(intent) + .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + ) } } HttpURLConnection.HTTP_NOT_FOUND ->