From fea1d846827262615a601b907d5ee04ab8b07db5 Mon Sep 17 00:00:00 2001 From: Lucas Nogueira Date: Thu, 27 Apr 2023 15:35:09 -0300 Subject: [PATCH] update api --- .../android/src/main/java/Notification.kt | 18 +- .../src/main/java/TauriNotificationManager.kt | 13 +- plugins/notification/guest-js/index.ts | 175 +++++++++++++++++- 3 files changed, 186 insertions(+), 20 deletions(-) diff --git a/plugins/notification/android/src/main/java/Notification.kt b/plugins/notification/android/src/main/java/Notification.kt index 42a221fa..ad4facb3 100644 --- a/plugins/notification/android/src/main/java/Notification.kt +++ b/plugins/notification/android/src/main/java/Notification.kt @@ -16,7 +16,7 @@ class Notification { var title: String? = null var body: String? = null var largeBody: String? = null - var summaryText: String? = null + var summary: String? = null var id: Int? = null private var sound: String? = null private var smallIcon: String? = null @@ -24,7 +24,7 @@ class Notification { var iconColor: String? = null var actionTypeId: String? = null var group: String? = null - var inboxList: List? = null + var inboxLines: List? = null var isGroupSummary = false var isOngoing = false var isAutoCancel = false @@ -145,7 +145,7 @@ class Notification { if (if (group != null) group != that.group else that.group != null) return false if (if (extra != null) extra != that.extra else that.extra != null) return false if (if (attachments != null) attachments != that.attachments else that.attachments != null) return false - if (if (inboxList != null) inboxList != that.inboxList else that.inboxList != null) return false + if (if (inboxLines != null) inboxLines != that.inboxLines else that.inboxLines != null) return false if (isGroupSummary != that.isGroupSummary) return false if (isOngoing != that.isOngoing) return false if (isAutoCancel != that.isAutoCancel) return false @@ -226,12 +226,12 @@ class Notification { notification.id = jsonObject.getInteger("id") notification.body = jsonObject.getString("body") notification.largeBody = jsonObject.getString("largeBody") - notification.summaryText = jsonObject.getString("summaryText") + notification.summary = jsonObject.getString("summary") notification.actionTypeId = jsonObject.getString("actionTypeId") notification.group = jsonObject.getString("group") notification.setSound(jsonObject.getString("sound")) notification.title = jsonObject.getString("title") - notification.setSmallIcon(jsonObject.getString("smallIcon")) + notification.setSmallIcon(jsonObject.getString("icon")) notification.setLargeIcon(jsonObject.getString("largeIcon")) notification.iconColor = jsonObject.getString("iconColor") notification.attachments = NotificationAttachment.getAttachments(jsonObject) @@ -245,12 +245,12 @@ class Notification { notification.isOngoing = jsonObject.getBoolean("ongoing", false) notification.isAutoCancel = jsonObject.getBoolean("autoCancel", true) try { - val inboxList = jsonObject.getJSONArray("inboxList") + val inboxLines = jsonObject.getJSONArray("inboxLines") val inboxStringList: MutableList = ArrayList() - for (i in 0 until inboxList.length()) { - inboxStringList.add(inboxList.getString(i)) + for (i in 0 until inboxLines.length()) { + inboxStringList.add(inboxLines.getString(i)) } - notification.inboxList = inboxStringList + notification.inboxLines = inboxStringList } catch (_: Exception) { } return notification diff --git a/plugins/notification/android/src/main/java/TauriNotificationManager.kt b/plugins/notification/android/src/main/java/TauriNotificationManager.kt index c61a1a94..b95d4151 100644 --- a/plugins/notification/android/src/main/java/TauriNotificationManager.kt +++ b/plugins/notification/android/src/main/java/TauriNotificationManager.kt @@ -172,16 +172,15 @@ class TauriNotificationManager( mBuilder.setStyle( NotificationCompat.BigTextStyle() .bigText(notification.largeBody) - .setSummaryText(notification.summaryText) + .setSummaryText(notification.summary) ) - } - if (notification.inboxList != null) { + } else if (notification.inboxLines != null) { val inboxStyle = NotificationCompat.InboxStyle() - for (line in notification.inboxList ?: listOf()) { + for (line in notification.inboxLines ?: listOf()) { inboxStyle.addLine(line) } inboxStyle.setBigContentTitle(notification.title) - inboxStyle.setSummaryText(notification.summaryText) + inboxStyle.setSummaryText(notification.summary) mBuilder.setStyle(inboxStyle) } val sound = notification.getSound(context, getDefaultSound(context)) @@ -202,7 +201,7 @@ class TauriNotificationManager( if (group != null) { mBuilder.setGroup(group) if (notification.isGroupSummary) { - mBuilder.setSubText(notification.summaryText) + mBuilder.setSubText(notification.summary) } } mBuilder.setVisibility(NotificationCompat.VISIBILITY_PRIVATE) @@ -455,7 +454,7 @@ class TauriNotificationManager( private fun getDefaultSmallIcon(context: Context): Int { if (defaultSmallIconID != AssetUtils.RESOURCE_ID_ZERO_VALUE) return defaultSmallIconID var resId: Int = AssetUtils.RESOURCE_ID_ZERO_VALUE - val smallIconConfigResourceName = AssetUtils.getResourceBaseName(config.getString("smallIcon")) + val smallIconConfigResourceName = AssetUtils.getResourceBaseName(config.getString("icon")) if (smallIconConfigResourceName != null) { resId = AssetUtils.getResourceID(context, smallIconConfigResourceName, "drawable") } diff --git a/plugins/notification/guest-js/index.ts b/plugins/notification/guest-js/index.ts index a480105b..90374a97 100644 --- a/plugins/notification/guest-js/index.ts +++ b/plugins/notification/guest-js/index.ts @@ -32,12 +32,179 @@ import { invoke } from '@tauri-apps/api/tauri' * @since 1.0.0 */ interface Options { - /** Notification title. */ + /** + * The notification identifier to reference this object later. + * + * On Android, it is a 32 bit integer. + */ + id?: number + /** + * Identifier of the {@link Channel} that deliveres this notification. + * + * If the channel does not exist, the notification won't fire. + * Make sure the channel exists with {@link listChannels} and {@link createChannel}. + */ + channelId?: string + /** + * Notification title. + */ title: string - /** Optional notification body. */ + /** + * Optional notification body. + * */ body?: string - /** Optional notification icon. */ + /** + * Schedule this notification to fire on a later time or a fixed interval. + */ + schedule?: Schedule + /** + * Multiline text. + * Changes the notification style to big text. + * Cannot be used with `inboxLines`. + */ + largeBody?: string + /** + * Detail text for the notification with `largeBody`, `inboxLines` or `groupSummary`. + */ + summary?: string + /** + * Defines an action type for this notification. + */ + actionTypeId?: string + /** + * Identifier used to group multiple notifications on Android. + */ + group?: string + /** + * Instructs the system that this notification is the summary of a group on Android. + */ + groupSummary?: boolean + /** + * The sound resource name. Only available on mobile. + */ + sound?: string + /** + * List of lines to add to the notification. + * Changes the notification style to inbox. + * Cannot be used with `largeBody`. + * + * Only supports up to 5 lines. + */ + inboxLines?: string[] + /** + * Notification icon. + * + * On Android the icon must be placed in the app's `res/drawable` folder. + */ icon?: string + /** + * Notification large icon (Android). + * + * The icon must be placed in the app's `res/drawable` folder. + */ + largeIcon?: string + /** + * Icon color on Android. + */ + iconColor?: string + /** + * Notification attachments. + */ + attachments?: Attachment[] + /** + * Extra payload to store in the notification. + */ + extra?: { [key: string]: any } + /** + * If true, the notification cannot be dismissed by the user on Android. + * + * An application service must manage the dismissal of the notification. + * It is typically used to indicate a background task that is pending (e.g. a file download) + * or the user is engaged with (e.g. playing music). + */ + ongoing?: boolean + /** + * Automatically cancel the notification when the user clicks on it. + */ + autoCancel?: boolean +} + +type ScheduleInterval = { + year?: number + month?: number + day?: number + /** + * 1 - Sunday + * 2 - Monday + * 3 - Tuesday + * 4 - Wednesday + * 5 - Thursday + * 6 - Friday + * 7 - Saturday + */ + weekday?: number + hour?: number + minute?: number + second?: number + } + +enum ScheduleEvery { + Year = 'Year', + Month = 'Month', + TwoWeeks = 'TwoWeeks', + Week = 'Week', + Day = 'Day', + Hour = 'Hour', + Minute = 'Minute', + Second = 'Second' +} + +type ScheduleData = { + kind: 'at', + data: { + date: Date + repeating: boolean + } +} | { + kind: 'interval', + data: ScheduleInterval +} | { + kind: 'every', + data: { + interval: ScheduleEvery + } +} + +class Schedule { + kind: string + data: unknown + + private constructor(schedule: ScheduleData) { + this.kind = schedule.kind + this.data = schedule.data + } + + static at(date: Date, repeating = false) { + return new Schedule({ kind: 'at', data: { date, repeating }}) + } + + static interval(interval: ScheduleInterval) { + return new Schedule({ kind: 'interval', data: interval }) + } + + static every(kind: ScheduleEvery) { + return new Schedule({ kind: 'every', data: { interval: kind }}) + } +} + +/** + * Attachment of a notification. + */ +interface Attachment { + /** Attachment identifier. */ + id: string + /** Attachment URL. Accepts the `asset` and `file` protocols. */ + url: string } /** Possible permission values. */ @@ -108,6 +275,6 @@ function sendNotification(options: Options | string): void { } } -export type { Options, Permission } +export type { Attachment, Options, Permission } export { sendNotification, requestPermission, isPermissionGranted }