diff --git a/android/app/src/main/kotlin/com/nkming/nc_photos/NotificationChannelHandler.kt b/android/app/src/main/kotlin/com/nkming/nc_photos/NotificationChannelHandler.kt index 16b52349..8ebb57e6 100644 --- a/android/app/src/main/kotlin/com/nkming/nc_photos/NotificationChannelHandler.kt +++ b/android/app/src/main/kotlin/com/nkming/nc_photos/NotificationChannelHandler.kt @@ -22,7 +22,8 @@ import kotlin.math.max * Show notification on device * * Methods: - * fun notifyItemDownloadSuccessful(fileUri: String, mimeType: String): Unit + * fun notifyItemsDownloadSuccessful(fileUris: List, + * mimeTypes: List): Unit */ class NotificationChannelHandler(activity: Activity) : MethodChannel.MethodCallHandler { @@ -38,10 +39,12 @@ class NotificationChannelHandler(activity: Activity) } override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { - if (call.method == "notifyItemDownloadSuccessful") { + if (call.method == "notifyItemsDownloadSuccessful") { try { - notifyItemDownloadSuccessful(call.argument("fileUri")!!, - call.argument("mimeType")!!, result) + notifyItemsDownloadSuccessful( + call.argument>("fileUris")!!, + call.argument>("mimeTypes")!!, + result) } catch (e: Throwable) { result.error("systemException", e.toString(), null) } @@ -50,23 +53,66 @@ class NotificationChannelHandler(activity: Activity) } } - private fun notifyItemDownloadSuccessful(fileUri: String, mimeType: String, - result: MethodChannel.Result) { - val uriStr = fileUri - val uri = Uri.parse(uriStr) - val openIntent = Intent().apply { - action = Intent.ACTION_VIEW - setDataAndType(uri, mimeType) + private fun notifyItemsDownloadSuccessful(fileUris: List, + mimeTypes: List, result: MethodChannel.Result) { + assert(fileUris.isNotEmpty()) + assert(fileUris.size == mimeTypes.size) + val uris = fileUris.map { Uri.parse(it) } + val builder = NotificationCompat.Builder(_context, DOWNLOAD_CHANNEL_ID) + .setSmallIcon(R.drawable.baseline_download_white_18) + .setWhen(System.currentTimeMillis()) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setSound(RingtoneManager.getDefaultUri( + RingtoneManager.TYPE_NOTIFICATION)) + .setOnlyAlertOnce(true) + .setAutoCancel(true) + .setLocalOnly(true) + + if (uris.size == 1) { + builder.setTicker(_context.getString( + R.string.download_successful_notification_title)) + .setContentTitle(_context.getString( + R.string.download_successful_notification_title)) + .setContentText(_context.getString( + R.string.download_successful_notification_text)) + + val openIntent = Intent().apply { + action = Intent.ACTION_VIEW + setDataAndType(uris[0], mimeTypes[0]) + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + } + val openPendingIntent = PendingIntent.getActivity(_context, 0, + openIntent, PendingIntent.FLAG_UPDATE_CURRENT) + builder.setContentIntent(openPendingIntent) + + // show preview if available + if (mimeTypes[0]?.startsWith("image/") == true) { + val preview = loadNotificationImage(uris[0]) + if (preview != null) { + builder.setStyle(NotificationCompat.BigPictureStyle() + .bigPicture(loadNotificationImage(uris[0]))) + } + } + } else { + val title = _context.getString( + R.string.download_multiple_successful_notification_title, + fileUris.size) + builder.setTicker(title) + .setContentTitle(title) + } + + val shareIntent = if (uris.size == 1) Intent().apply { + action = Intent.ACTION_SEND + putExtra(Intent.EXTRA_STREAM, uris[0]) + type = mimeTypes[0] ?: "*/*" addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) - } - val openPendingIntent = PendingIntent.getActivity(_context, 0, - openIntent, PendingIntent.FLAG_UPDATE_CURRENT) - - val shareIntent = Intent().apply { - action = Intent.ACTION_SEND - putExtra(Intent.EXTRA_STREAM, uri) - type = mimeType + } else Intent().apply { + action = Intent.ACTION_SEND_MULTIPLE + putParcelableArrayListExtra(Intent.EXTRA_STREAM, ArrayList(uris)) + type = if (mimeTypes.all { it?.startsWith("image/") == true }) + "image/*" else "*/*" addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) } @@ -74,34 +120,9 @@ class NotificationChannelHandler(activity: Activity) R.string.download_successful_notification_action_share_chooser)) val sharePendingIntent = PendingIntent.getActivity(_context, 1, shareChooser, PendingIntent.FLAG_UPDATE_CURRENT) - - val builder = NotificationCompat.Builder(_context, DOWNLOAD_CHANNEL_ID) - .setSmallIcon(R.drawable.baseline_download_white_18) - .setTicker(_context.getString( - R.string.download_successful_notification_title)) - .setContentTitle(_context.getString( - R.string.download_successful_notification_title)) - .setContentText(_context.getString( - R.string.download_successful_notification_text)) - .setWhen(System.currentTimeMillis()) - .setContentIntent(openPendingIntent) - .addAction(0, _context.getString( - R.string.download_successful_notification_action_share), - sharePendingIntent) - .setPriority(NotificationCompat.PRIORITY_HIGH) - .setSound(RingtoneManager.getDefaultUri( - RingtoneManager.TYPE_NOTIFICATION)) - .setOnlyAlertOnce(false) - .setAutoCancel(true) - .setLocalOnly(true) - - // show preview if available - val preview = if (mimeType.startsWith("image/")) - loadNotificationImage(uri) else null; - if (preview != null) { - builder.setStyle(NotificationCompat.BigPictureStyle() - .bigPicture(loadNotificationImage(uri))) - } + builder.addAction(0, _context.getString( + R.string.download_successful_notification_action_share), + sharePendingIntent) with(NotificationManagerCompat.from(_context)) { notify(DOWNLOAD_NOTIFICATION_ID, builder.build()) diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 3691888e..fb33b517 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -8,4 +8,5 @@ Tap to view your downloaded item SHARE Share with: + Downloaded %1$s items successfully diff --git a/lib/mobile/android/notification.dart b/lib/mobile/android/notification.dart index adc47dd8..a7c419b7 100644 --- a/lib/mobile/android/notification.dart +++ b/lib/mobile/android/notification.dart @@ -1,11 +1,11 @@ import 'package:flutter/services.dart'; class Notification { - static Future notifyItemDownloadSuccessful( - String fileUri, String mimeType) => - _channel.invokeMethod("notifyItemDownloadSuccessful", { - "fileUri": fileUri, - "mimeType": mimeType, + static Future notifyItemsDownloadSuccessful( + List fileUris, List mimeTypes) => + _channel.invokeMethod("notifyItemsDownloadSuccessful", { + "fileUris": fileUris, + "mimeTypes": mimeTypes, }); static const _channel = diff --git a/lib/mobile/notification.dart b/lib/mobile/notification.dart index d26610de..9a1ec09e 100644 --- a/lib/mobile/notification.dart +++ b/lib/mobile/notification.dart @@ -3,13 +3,13 @@ import 'package:nc_photos/platform/notification.dart' as itf; class AndroidItemDownloadSuccessfulNotification extends itf.ItemDownloadSuccessfulNotification { - AndroidItemDownloadSuccessfulNotification(this.fileUri, this.mimeType); + AndroidItemDownloadSuccessfulNotification(this.fileUris, this.mimeTypes); @override Future notify() { - return Notification.notifyItemDownloadSuccessful(fileUri, mimeType); + return Notification.notifyItemsDownloadSuccessful(fileUris, mimeTypes); } - final String fileUri; - final String mimeType; + final List fileUris; + final List mimeTypes; } diff --git a/lib/widget/viewer.dart b/lib/widget/viewer.dart index 6005849c..1508b6c4 100644 --- a/lib/widget/viewer.dart +++ b/lib/widget/viewer.dart @@ -586,8 +586,8 @@ class _ViewerState extends State { void _onDownloadSuccessful(File file, dynamic result) { var notif; if (platform_k.isAndroid) { - notif = - AndroidItemDownloadSuccessfulNotification(result, file.contentType); + notif = AndroidItemDownloadSuccessfulNotification( + [result], [file.contentType]); } if (notif != null) { try {