/** * @flow * AndroidNotification representation wrapper */ import type Notification from './Notification'; type Lights = { argb: number, onMs: number, offMs: number, }; type Progress = { max: number, progress: number, indeterminate: boolean, }; type SmallIcon = { icon: number, level?: number, }; export type NativeAndroidNotification = { // TODO actions: Action[], autoCancel: boolean, badgeIconType: BadgeIconTypeType, category: CategoryType, channelId: string, color: number, colorized: boolean, contentInfo: string, defaults: DefaultsType[], group: string, groupAlertBehaviour: GroupAlertType, groupSummary: boolean, largeIcon: string, lights: Lights, localOnly: boolean, number: number, ongoing: boolean, onlyAlertOnce: boolean, people: string[], priority: PriorityType, progress: Progress, publicVersion: Notification, remoteInputHistory: string[], shortcutId: string, showWhen: boolean, smallIcon: SmallIcon, sortKey: string, // TODO: style: Style, ticker: string, timeoutAfter: number, usesChronometer: boolean, vibrate: number[], visibility: VisibilityType, when: number, }; export const BadgeIconType = { Large: 2, None: 0, Small: 1, }; export const Category = { Alarm: 'alarm', Call: 'call', Email: 'email', Error: 'err', Event: 'event', Message: 'msg', Progress: 'progress', Promo: 'promo', Recommendation: 'recommendation', Reminder: 'reminder', Service: 'service', Social: 'social', Status: 'status', System: 'system', Transport: 'transport', }; export const Defaults = { All: -1, Lights: 4, Sound: 1, Vibrate: 2, }; export const GroupAlert = { All: 0, Children: 2, Summary: 1, }; export const Priority = { Default: 0, High: 1, Low: -1, Max: 2, Min: -2, }; export const Visibility = { Private: 0, Public: 1, Secret: -1, }; type BadgeIconTypeType = $Values; type CategoryType = $Values; type DefaultsType = $Values; type GroupAlertType = $Values; type PriorityType = $Values; type VisibilityType = $Values; export default class AndroidNotification { // TODO actions: Action[]; // icon, title, ??pendingIntent??, allowGeneratedReplies, extender, extras, remoteinput (ugh) _autoCancel: boolean; _badgeIconType: BadgeIconTypeType; _category: CategoryType; _channelId: string; _color: number; _colorized: boolean; _contentInfo: string; _defaults: DefaultsType[]; _group: string; _groupAlertBehaviour: GroupAlertType; _groupSummary: boolean; _largeIcon: string; _lights: Lights; _localOnly: boolean; _notification: Notification; _number: number; _ongoing: boolean; _onlyAlertOnce: boolean; _people: string[]; _priority: PriorityType; _progress: Progress; _publicVersion: Notification; _remoteInputHistory: string[]; _shortcutId: string; _showWhen: boolean; _smallIcon: SmallIcon; _sortKey: string; // TODO: style: Style; // Need to figure out if this can work _ticker: string; _timeoutAfter: number; _usesChronometer: boolean; _vibrate: number[]; _visibility: VisibilityType; _when: number; // android unsupported // content: RemoteViews // contentIntent: PendingIntent - need to look at what this is // customBigContentView: RemoteViews // customContentView: RemoteViews // customHeadsUpContentView: RemoteViews // deleteIntent: PendingIntent // fullScreenIntent: PendingIntent // sound.streamType constructor(notification: Notification) { this._notification = notification; this._people = []; } /** * * @param identifier * @param identifier * @param identifier * @returns {Notification} */ addPerson(person: string): Notification { this._people.push(person); return this._notification; } /** * * @param autoCancel * @returns {Notification} */ setAutoCancel(autoCancel: boolean): Notification { this._autoCancel = autoCancel; return this._notification; } /** * * @param badgeIconType * @returns {Notification} */ setBadgeIconType(badgeIconType: BadgeIconTypeType): Notification { this._badgeIconType = badgeIconType; return this._notification; } /** * * @param category * @returns {Notification} */ setCategory(category: CategoryType): Notification { if (!Object.values(Category).includes(category)) { throw new Error(`AndroidNotification: Invalid Category: ${category}`); } this._category = category; return this._notification; } /** * * @param channelId * @returns {Notification} */ setChannelId(channelId: string): Notification { this._channelId = channelId; return this._notification; } /** * * @param color * @returns {Notification} */ setColor(color: number): Notification { this._color = color; return this._notification; } /** * * @param colorized * @returns {Notification} */ setColorized(colorized: boolean): Notification { this._colorized = colorized; return this._notification; } /** * * @param contentInfo * @returns {Notification} */ setContentInfo(contentInfo: string): Notification { this._contentInfo = contentInfo; return this._notification; } /** * * @param defaults * @returns {Notification} */ setDefaults(defaults: DefaultsType[]): Notification { this._defaults = defaults; return this._notification; } /** * * @param group * @returns {Notification} */ setGroup(group: string): Notification { this._group = group; return this._notification; } /** * * @param groupAlertBehaviour * @returns {Notification} */ setGroupAlertBehaviour(groupAlertBehaviour: GroupAlertType): Notification { this._groupAlertBehaviour = groupAlertBehaviour; return this._notification; } /** * * @param groupSummary * @returns {Notification} */ setGroupSummary(groupSummary: boolean): Notification { this._groupSummary = groupSummary; return this._notification; } /** * * @param largeIcon * @returns {Notification} */ setLargeIcon(largeIcon: string): Notification { this._largeIcon = largeIcon; return this._notification; } /** * * @param argb * @param onMs * @param offMs * @returns {Notification} */ setLights(argb: number, onMs: number, offMs: number): Notification { this._lights = { argb, onMs, offMs, }; return this._notification; } /** * * @param localOnly * @returns {Notification} */ setLocalOnly(localOnly: boolean): Notification { this._localOnly = localOnly; return this._notification; } /** * * @param number * @returns {Notification} */ setNumber(number: number): Notification { this._number = number; return this._notification; } /** * * @param ongoing * @returns {Notification} */ setOngoing(ongoing: boolean): Notification { this._ongoing = ongoing; return this._notification; } /** * * @param onlyAlertOnce * @returns {Notification} */ setOnlyAlertOnce(onlyAlertOnce: boolean): Notification { this._onlyAlertOnce = onlyAlertOnce; return this._notification; } /** * * @param priority * @returns {Notification} */ setPriority(priority: PriorityType): Notification { this._priority = priority; return this._notification; } /** * * @param max * @param progress * @param indeterminate * @returns {Notification} */ setProgress( max: number, progress: number, indeterminate: boolean ): Notification { this._progress = { max, progress, indeterminate, }; return this._notification; } /** * * @param publicVersion * @returns {Notification} */ setPublicVersion(publicVersion: Notification): Notification { this._publicVersion = publicVersion; return this._notification; } /** * * @param remoteInputHistory * @returns {Notification} */ setRemoteInputHistory(remoteInputHistory: string[]): Notification { this._remoteInputHistory = remoteInputHistory; return this._notification; } /** * * @param shortcutId * @returns {Notification} */ setShortcutId(shortcutId: string): Notification { this._shortcutId = shortcutId; return this._notification; } /** * * @param showWhen * @returns {Notification} */ setShowWhen(showWhen: boolean): Notification { this._showWhen = showWhen; return this._notification; } /** * * @param icon * @param level * @returns {Notification} */ setSmallIcon(icon: number, level?: number): Notification { this._smallIcon = { icon, level, }; return this._notification; } /** * * @param sortKey * @returns {Notification} */ setSortKey(sortKey: string): Notification { this._sortKey = sortKey; return this._notification; } /** * * @param ticker * @returns {Notification} */ setTicker(ticker: string): Notification { this._ticker = ticker; return this._notification; } /** * * @param timeoutAfter * @returns {Notification} */ setTimeoutAfter(timeoutAfter: number): Notification { this._timeoutAfter = timeoutAfter; return this._notification; } /** * * @param usesChronometer * @returns {Notification} */ setUsesChronometer(usesChronometer: boolean): Notification { this._usesChronometer = usesChronometer; return this._notification; } /** * * @param vibrate * @returns {Notification} */ setVibrate(vibrate: number[]): Notification { this._vibrate = vibrate; return this._notification; } /** * * @param when * @returns {Notification} */ setWhen(when: number): Notification { this._when = when; return this._notification; } build(): NativeAndroidNotification { // TODO: Validation return { // TODO actions: Action[], autoCancel: this._autoCancel, badgeIconType: this._badgeIconType, category: this._category, channelId: this._channelId, color: this._color, colorized: this._colorized, contentInfo: this._contentInfo, defaults: this._defaults, group: this._group, groupAlertBehaviour: this._groupAlertBehaviour, groupSummary: this._groupSummary, largeIcon: this._largeIcon, lights: this._lights, localOnly: this._localOnly, number: this._number, ongoing: this._ongoing, onlyAlertOnce: this._onlyAlertOnce, people: this._people, priority: this._priority, progress: this._progress, publicVersion: this._publicVersion, remoteInputHistory: this._remoteInputHistory, shortcutId: this._shortcutId, showWhen: this._showWhen, smallIcon: this._smallIcon, sortKey: this._sortKey, // TODO: style: Style, ticker: this._ticker, timeoutAfter: this._timeoutAfter, usesChronometer: this._usesChronometer, vibrate: this._vibrate, visibility: this._visibility, when: this._when, }; } }