diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateService.kt index f078e91df..8d87f40b3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateService.kt @@ -111,7 +111,7 @@ class BackupCreateService : Service() { val backupFileUri = backupManager.createBackup(uri, backupFlags, false)?.toUri() val unifile = UniFile.fromUri(this, backupFileUri) - notifier.showBackupComplete(unifile) + notifier.showBackupComplete(unifile, backupType == BackupConst.BACKUP_TYPE_LEGACY) } catch (e: Exception) { notifier.showBackupError(e.message) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt index 8a0d06e61..c67c02b28 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt @@ -60,7 +60,7 @@ class BackupNotifier(private val context: Context) { } } - fun showBackupComplete(unifile: UniFile) { + fun showBackupComplete(unifile: UniFile, isLegacyFormat: Boolean) { context.notificationManager.cancel(Notifications.ID_BACKUP_PROGRESS) with(completeNotificationBuilder) { @@ -73,7 +73,7 @@ class BackupNotifier(private val context: Context) { addAction( R.drawable.ic_share_24dp, context.getString(R.string.action_share), - NotificationReceiver.shareBackupPendingBroadcast(context, unifile.uri, Notifications.ID_BACKUP_COMPLETE) + NotificationReceiver.shareBackupPendingBroadcast(context, unifile.uri, isLegacyFormat, Notifications.ID_BACKUP_COMPLETE) ) show(Notifications.ID_BACKUP_COMPLETE) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt index 5dd2edc48..c11fc151b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt @@ -70,9 +70,10 @@ class NotificationReceiver : BroadcastReceiver() { ) // Share backup file ACTION_SHARE_BACKUP -> - shareBackup( + shareFile( context, intent.getParcelableExtra(EXTRA_URI), + if (intent.getBooleanExtra(EXTRA_IS_LEGACY_BACKUP, false)) "application/json" else "application/octet-stream+gzip", intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1) ) ACTION_CANCEL_RESTORE -> cancelRestore( @@ -101,6 +102,14 @@ class NotificationReceiver : BroadcastReceiver() { markAsRead(urls, mangaId) } } + // Share crash dump file + ACTION_SHARE_CRASH_LOG -> + shareFile( + context, + intent.getParcelableExtra(EXTRA_URI), + "text/plain", + intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1) + ) } } @@ -140,11 +149,11 @@ class NotificationReceiver : BroadcastReceiver() { * @param path path of file * @param notificationId id of notification */ - private fun shareBackup(context: Context, uri: Uri, notificationId: Int) { + private fun shareFile(context: Context, uri: Uri, fileMimeType: String, notificationId: Int) { val sendIntent = Intent(Intent.ACTION_SEND).apply { putExtra(Intent.EXTRA_STREAM, uri) clipData = ClipData.newRawUri(null, uri) - type = "application/json" + type = fileMimeType flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION } // Dismiss notification @@ -245,59 +254,34 @@ class NotificationReceiver : BroadcastReceiver() { companion object { private const val NAME = "NotificationReceiver" - // Called to launch share intent. private const val ACTION_SHARE_IMAGE = "$ID.$NAME.SHARE_IMAGE" - - // Called to delete image. private const val ACTION_DELETE_IMAGE = "$ID.$NAME.DELETE_IMAGE" - // Called to launch send intent. private const val ACTION_SHARE_BACKUP = "$ID.$NAME.SEND_BACKUP" - // Called to cancel backup restore job. + private const val ACTION_SHARE_CRASH_LOG = "$ID.$NAME.SEND_CRASH_LOG" + private const val ACTION_CANCEL_RESTORE = "$ID.$NAME.CANCEL_RESTORE" - // Called to cancel library update. private const val ACTION_CANCEL_LIBRARY_UPDATE = "$ID.$NAME.CANCEL_LIBRARY_UPDATE" - // Called to mark manga chapters as read. private const val ACTION_MARK_AS_READ = "$ID.$NAME.MARK_AS_READ" - - // Called to open chapter. private const val ACTION_OPEN_CHAPTER = "$ID.$NAME.ACTION_OPEN_CHAPTER" - // Value containing file location. - private const val EXTRA_FILE_LOCATION = "$ID.$NAME.FILE_LOCATION" - - // Called to resume downloads. private const val ACTION_RESUME_DOWNLOADS = "$ID.$NAME.ACTION_RESUME_DOWNLOADS" - - // Called to pause downloads. private const val ACTION_PAUSE_DOWNLOADS = "$ID.$NAME.ACTION_PAUSE_DOWNLOADS" - - // Called to clear downloads. private const val ACTION_CLEAR_DOWNLOADS = "$ID.$NAME.ACTION_CLEAR_DOWNLOADS" - // Called to dismiss notification. private const val ACTION_DISMISS_NOTIFICATION = "$ID.$NAME.ACTION_DISMISS_NOTIFICATION" - // Value containing uri. + private const val EXTRA_FILE_LOCATION = "$ID.$NAME.FILE_LOCATION" private const val EXTRA_URI = "$ID.$NAME.URI" - - // Value containing notification id. private const val EXTRA_NOTIFICATION_ID = "$ID.$NAME.NOTIFICATION_ID" - - // Value containing group id. private const val EXTRA_GROUP_ID = "$ID.$NAME.EXTRA_GROUP_ID" - - // Value containing manga id. private const val EXTRA_MANGA_ID = "$ID.$NAME.EXTRA_MANGA_ID" - - // Value containing chapter id. private const val EXTRA_CHAPTER_ID = "$ID.$NAME.EXTRA_CHAPTER_ID" - - // Value containing chapter url. private const val EXTRA_CHAPTER_URL = "$ID.$NAME.EXTRA_CHAPTER_URL" + private const val EXTRA_IS_LEGACY_BACKUP = "$ID.$NAME.EXTRA_IS_LEGACY_BACKUP" /** * Returns a [PendingIntent] that resumes the download of a chapter @@ -510,10 +494,11 @@ class NotificationReceiver : BroadcastReceiver() { * @param notificationId id of notification * @return [PendingIntent] */ - internal fun shareBackupPendingBroadcast(context: Context, uri: Uri, notificationId: Int): PendingIntent { + internal fun shareBackupPendingBroadcast(context: Context, uri: Uri, isLegacyFormat: Boolean, notificationId: Int): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_SHARE_BACKUP putExtra(EXTRA_URI, uri) + putExtra(EXTRA_IS_LEGACY_BACKUP, isLegacyFormat) putExtra(EXTRA_NOTIFICATION_ID, notificationId) } return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) @@ -535,6 +520,23 @@ class NotificationReceiver : BroadcastReceiver() { return PendingIntent.getActivity(context, 0, intent, 0) } + /** + * Returns [PendingIntent] that starts a share activity for a crash log dump file. + * + * @param context context of application + * @param uri uri of file + * @param notificationId id of notification + * @return [PendingIntent] + */ + internal fun shareCrashLogPendingBroadcast(context: Context, uri: Uri, notificationId: Int): PendingIntent { + val intent = Intent(context, NotificationReceiver::class.java).apply { + action = ACTION_SHARE_CRASH_LOG + putExtra(EXTRA_URI, uri) + putExtra(EXTRA_NOTIFICATION_ID, notificationId) + } + return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) + } + /** * Returns [PendingIntent] that cancels a backup restore job. * diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt b/app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt index dc75452f3..46535b565 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt @@ -44,6 +44,12 @@ class CrashLogUtil(private val context: Context) { NotificationReceiver.openErrorLogPendingActivity(context, uri) ) + addAction( + R.drawable.ic_share_24dp, + context.getString(R.string.action_share), + NotificationReceiver.shareCrashLogPendingBroadcast(context, uri, Notifications.ID_CRASH_LOGS) + ) + context.notificationManager.notify(Notifications.ID_CRASH_LOGS, build()) } }