Add HPK Android-related DTO's (#89)

* Add HPK Android-related DTO's
This commit is contained in:
Artyom 2022-11-07 17:14:59 +03:00 committed by GitHub
parent 5f6adc97fe
commit 2dae5f7a77
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 955 additions and 0 deletions

View File

@ -0,0 +1,78 @@
package ru.touchin.push.message.provider.hpk.clients.hms_hpk.dto.android
import com.fasterxml.jackson.annotation.JsonProperty
import ru.touchin.push.message.provider.hpk.base.builders.Buildable
internal data class AndroidBadgeNotification private constructor(
/** Accumulative badge number. */
val addNum: Short?,
/** Full path of the app entry activity class. */
@JsonProperty("class")
val clazz: String,
/** Badge number. Overrides [addNum]. */
val setNum: Short?,
) {
class Validator {
fun check(androidBadgeNotification: AndroidBadgeNotification) {
with(androidBadgeNotification) {
if (addNum != null) {
require(
addNum in ADD_NUM_MIN_VALUE..ADD_NUM_MAX_VALUE
) { "add_num must locate in $ADD_NUM_MIN_VALUE and $ADD_NUM_MAX_VALUE" }
}
if (setNum != null) {
require(
setNum in SET_NUM_RANGE_CONSTRAINT
) { "set_num must locate between $SET_NUM_MIN_VALUE and $SET_NUM_MAX_VALUE" }
}
}
}
private companion object {
const val ADD_NUM_MIN_VALUE: Byte = 1
const val ADD_NUM_MAX_VALUE: Byte = 99
val ADD_NUM_RANGE_CONSTRAINT: IntRange = ADD_NUM_MIN_VALUE..ADD_NUM_MAX_VALUE
const val SET_NUM_MIN_VALUE: Byte = 0
const val SET_NUM_MAX_VALUE: Byte = 99
val SET_NUM_RANGE_CONSTRAINT: IntRange = SET_NUM_MIN_VALUE..SET_NUM_MAX_VALUE
}
}
class Builder : Buildable {
private var addNum: Short? = null
private var setNum: Short? = null
fun setAddNum(addNum: Short): Builder {
this.addNum = addNum
return this
}
fun setSetNum(setNum: Short): Builder {
this.setNum = setNum
return this
}
fun build(badgeClass: String): AndroidBadgeNotification {
return AndroidBadgeNotification(
addNum = addNum,
clazz = badgeClass,
setNum = setNum,
)
}
}
companion object {
val validator = Validator()
fun builder() = Builder()
}
}

View File

@ -0,0 +1,80 @@
package ru.touchin.push.message.provider.hpk.clients.hms_hpk.dto.android
import com.fasterxml.jackson.annotation.JsonProperty
import ru.touchin.push.message.provider.hpk.base.builders.Buildable
import ru.touchin.push.message.provider.hpk.clients.hms_hpk.enums.android.AndroidActionType
import ru.touchin.push.message.provider.hpk.clients.hms_hpk.enums.android.AndroidIntentType
internal data class AndroidButton private constructor(
/** Button name. */
val name: String,
/** Button action. */
@JsonProperty("action_type")
val androidActionType: AndroidActionType,
/** Method of opening a custom app page. */
@JsonProperty("intent_type")
val androidIntentType: AndroidIntentType?,
val intent: String?,
/** Map of key-values. */
val data: String?,
) {
class Validator {
fun check(androidButton: AndroidButton) {
with(androidButton) {
require(
name.length <= NAME_MAX_LENGTH
) { "Button name length cannot exceed $NAME_MAX_LENGTH" }
if (androidActionType == AndroidActionType.SHARE_NOTIFICATION_MESSAGE) {
require(!data.isNullOrEmpty()) { "Data is needed when actionType is $androidActionType" }
require(data.length <= DATA_MAX_LENGTH) { "Data length cannot exceed $DATA_MAX_LENGTH chars" }
}
}
}
private companion object {
const val NAME_MAX_LENGTH: Byte = 40
const val DATA_MAX_LENGTH: Short = 1024
}
}
class Builder : Buildable {
private var intent: String? = null
private var data: String? = null
fun setIntent(intent: String): Builder {
this.intent = intent
return this
}
fun setData(data: String): Builder {
this.data = data
return this
}
fun build(name: String, androidActionType: AndroidActionType, androidIntentType: AndroidIntentType): AndroidButton {
return AndroidButton(
name = name,
androidActionType = androidActionType,
androidIntentType = androidIntentType,
intent = intent,
data = data
)
}
}
companion object {
val validator = Validator()
fun builder() = Builder()
}
}

View File

@ -0,0 +1,93 @@
package ru.touchin.push.message.provider.hpk.clients.hms_hpk.dto.android
import com.fasterxml.jackson.annotation.JsonProperty
import ru.touchin.push.message.provider.hpk.base.builders.Buildable
import ru.touchin.push.message.provider.hpk.clients.hms_hpk.enums.android.AndroidClickActionType
internal data class AndroidClickAction private constructor(
/** Message tapping action type. */
@JsonProperty("type")
val androidClickActionType: AndroidClickActionType,
val intent: String?,
/** URL to be opened. */
val url: String?,
/** Action corresponding to the activity of the page to be opened when the custom app page is opened through the action. */
val action: String?,
) {
class Validator {
fun check(androidClickAction: AndroidClickAction) {
with(androidClickAction) {
when (androidClickActionType) {
AndroidClickActionType.CUSTOMIZE_ACTION -> require(
!intent.isNullOrBlank() || !action.isNullOrBlank()
) { "intent or action is required when click type is $androidClickActionType" }
AndroidClickActionType.OPEN_URL -> {
require(!url.isNullOrBlank()) { "url is required when click type is $androidClickActionType" }
require(url.startsWith(HTTPS_PATTERN_START)) { "url must start with $HTTPS_PATTERN_START" }
}
AndroidClickActionType.OPEN_APP -> {
// no verification
}
}
}
}
private companion object {
const val HTTPS_PATTERN_START = "https"
}
}
class Builder : Buildable {
private var intent: String? = null
private var url: String? = null
private var richResource: String? = null
private var action: String? = null
fun setIntent(intent: String): Builder {
this.intent = intent
return this
}
fun setUrl(url: String): Builder {
this.url = url
return this
}
fun setRichResource(richResource: String): Builder {
this.richResource = richResource
return this
}
fun setAction(action: String): Builder {
this.action = action
return this
}
fun build(androidClickActionType: AndroidClickActionType): AndroidClickAction {
return AndroidClickAction(
androidClickActionType = androidClickActionType,
intent = intent.takeIf { androidClickActionType == AndroidClickActionType.CUSTOMIZE_ACTION },
action = action.takeIf { androidClickActionType == AndroidClickActionType.CUSTOMIZE_ACTION },
url = url.takeIf { androidClickActionType == AndroidClickActionType.OPEN_URL },
)
}
}
companion object {
val validator = Validator()
fun builder() = Builder()
}
}

View File

@ -0,0 +1,82 @@
package ru.touchin.push.message.provider.hpk.clients.hms_hpk.dto.android
import ru.touchin.push.message.provider.hpk.base.builders.Buildable
internal data class AndroidColor private constructor(
/** Alpha setting of the RGB color.*/
val alpha: Float,
/** Red setting of the RGB color. */
val red: Float,
/** Green setting of the RGB color. */
val green: Float,
/** Green setting of the RGB color. */
val blue: Float,
) {
class Validator {
fun check(androidColor: AndroidColor) {
with(androidColor) {
require(alpha in COLOR_RANGE_CONSTRAINT) { "Alpha must be locate between [0,1]" }
require(red in COLOR_RANGE_CONSTRAINT) { "Red must be locate between [0,1]" }
require(green in COLOR_RANGE_CONSTRAINT) { "Green must be locate between [0,1]" }
require(blue in COLOR_RANGE_CONSTRAINT) { "Blue must be locate between [0,1]" }
}
}
private companion object {
private const val ZERO: Float = 0.0f
private const val ONE: Float = 1.0f
val COLOR_RANGE_CONSTRAINT = ZERO..ONE
}
}
class Builder : Buildable {
private var alpha: Float = 1.0f
private var red: Float = 0.0f
private var green: Float = 0.0f
private var blue: Float = 0.0f
fun setAlpha(alpha: Float): Builder {
this.alpha = alpha
return this
}
fun setRed(red: Float): Builder {
this.red = red
return this
}
fun setGreen(green: Float): Builder {
this.green = green
return this
}
fun setBlue(blue: Float): Builder {
this.blue = blue
return this
}
fun build(): AndroidColor {
return AndroidColor(
alpha = alpha,
red = red,
green = green,
blue = blue
)
}
}
companion object {
val validator = Validator()
fun builder() = Builder()
}
}

View File

@ -0,0 +1,63 @@
package ru.touchin.push.message.provider.hpk.clients.hms_hpk.dto.android
import com.fasterxml.jackson.annotation.JsonProperty
import ru.touchin.push.message.provider.hpk.base.builders.Buildable
internal data class AndroidLightSettings private constructor(
/** Breathing light color. */
@JsonProperty("color")
val androidColor: AndroidColor,
/** Interval when a breathing light is on */
val lightOnDuration: String,
/** Interval when a breathing light is off */
val lightOffDuration: String,
) {
class Validator {
fun check(androidLightSettings: AndroidLightSettings) {
with(androidLightSettings) {
AndroidColor.validator.check(androidColor)
require(
lightOnDuration.matches(LIGHT_DURATION_PATTERN)
) { "light_on_duration pattern is wrong" }
require(
lightOffDuration.matches(LIGHT_DURATION_PATTERN)
) { "light_off_duration pattern is wrong" }
}
}
private companion object {
val LIGHT_DURATION_PATTERN: Regex = Regex("\\d+|\\d+[sS]|\\d+.\\d{1,9}|\\d+.\\d{1,9}[sS]")
}
}
class Builder : Buildable {
fun build(
color: AndroidColor,
lightOnDuration: String,
lightOffDuration: String
): AndroidLightSettings {
return AndroidLightSettings(
androidColor = color,
lightOnDuration = lightOnDuration,
lightOffDuration = lightOffDuration,
)
}
}
companion object {
val validator = Validator()
fun builder() = Builder()
}
}

View File

@ -0,0 +1,417 @@
package ru.touchin.push.message.provider.hpk.clients.hms_hpk.dto.android
import com.fasterxml.jackson.annotation.JsonProperty
import ru.touchin.push.message.provider.hpk.base.builders.Buildable
import ru.touchin.push.message.provider.hpk.clients.hms_hpk.dto.Notification
import ru.touchin.push.message.provider.hpk.clients.hms_hpk.enums.android.AndroidImportance
import ru.touchin.push.message.provider.hpk.clients.hms_hpk.enums.android.AndroidStyleType
import ru.touchin.push.message.provider.hpk.clients.hms_hpk.enums.android.AndroidVisibility
internal data class AndroidNotificationConfig private constructor(
/**
* Title of an Android notification message.
* If the title parameter is set, the value of the [Notification.title] field is overwritten.
* */
val title: String?,
/**
* Body of an Android notification message.
* If the body parameter is set, the value of the [Notification.body] field is overwritten.
* */
val body: String?,
/**
* Custom app icon on the left of a notification message.
*/
val icon: String?,
/** Custom notification bar button color. */
val color: String?,
val sound: String?,
/** Indicates whether to use the default ringtone. */
val defaultSound: Boolean,
/**
* Message tag.
* Messages that use the same message tag in the same app will be overwritten by the latest message.
* */
val tag: String?,
@JsonProperty("click_action")
val androidClickAction: AndroidClickAction?,
val bodyLocKey: String?,
val bodyLocArgs: Collection<String>?,
val titleLocKey: String?,
val titleLocArgs: Collection<String>?,
val multiLangKey: Map<String, String>?,
/** Custom channel for displaying notification messages. */
val channelId: String?,
/** Brief description of a notification message to an Android app. */
val notifySummary: String?,
/** URL of the custom small image on the right of a notification message. */
val image: String?,
/** Notification bar style. */
@JsonProperty("style")
val androidStyleType: AndroidStyleType?,
/** Android notification message title in large text style. */
val bigTitle: String?,
val bigBody: String?,
/**
* Unique notification ID of a message.
* If a message does not contain the ID or the ID is -1, the NC will generate a unique ID for the message.
* Different notification messages can use the same notification ID, so that new messages can overwrite old messages.
* */
val notifyId: Int?,
/**
* Message group.
* For example, if 10 messages that contain the same value of group are sent to a device,
* the device displays only the latest message and the total number of messages received in the group,
* but does not display these 10 messages.
*/
val group: String?,
@JsonProperty("badge")
val androidBadgeNotification: AndroidBadgeNotification? = null,
val autoCancel: Boolean,
/**
* Time when Android notification messages are delivered, in the UTC timestamp format.
* If you send multiple messages at the same time,
* they will be sorted based on this value and displayed in the Android notification panel.
* Example: 2014-10-02T15:01:23.045123456Z
*/
@JsonProperty("when")
val sendAt: String?,
val localOnly: Boolean? = null,
/**
* Android notification message priority, which determines the message notification behavior of a user device.
*/
@JsonProperty("importance")
val androidImportance: AndroidImportance?,
/** Indicates whether to use the default vibration mode. */
val useDefaultVibrate: Boolean,
/** Indicates whether to use the default breathing light. */
val useDefaultLight: Boolean,
val vibrateConfig: Collection<String>?,
/** Android notification message visibility. */
@JsonProperty("visibility")
val androidVisibility: AndroidVisibility?,
@JsonProperty("light_settings")
val androidLightSettings: AndroidLightSettings?,
/**
* Indicates whether to display notification messages in the NC when your app is running in the foreground.
* If this parameter is not set, the default value true will be used,
* indicating that notification messages will be displayed in the NC when your app runs in the foreground.
* */
val foregroundShow: Boolean,
val inboxContent: Collection<String>?,
@JsonProperty("buttons")
val androidButtons: Collection<AndroidButton>?,
/** ID of the user-app relationship. */
val profileId: String?,
) {
class Validator {
fun check(androidNotificationConfig: AndroidNotificationConfig, notification: Notification?) {
with(androidNotificationConfig) {
androidBadgeNotification?.let { AndroidBadgeNotification.validator.check(it) }
androidLightSettings?.also { AndroidLightSettings.validator.check(it) }
androidClickAction?.also { AndroidClickAction.validator.check(it) }
require(!notification?.title.isNullOrBlank() || !title.isNullOrBlank()) { "title should be set" }
require(!notification?.body.isNullOrBlank() || !body.isNullOrBlank()) { "body should be set" }
if (!color.isNullOrBlank()) {
require(color.matches(COLOR_PATTERN)) { "Wrong color format, color must be in the form #RRGGBB" }
}
if (!image.isNullOrBlank()) {
require(image.startsWith(HTTPS_URL_PATTERN)) { "notifyIcon must start with $HTTPS_URL_PATTERN" }
}
if (androidStyleType != null) {
when (androidStyleType) {
AndroidStyleType.DEFAULT -> {
// no verification
}
AndroidStyleType.BIG_TEXT -> {
require(
!bigTitle.isNullOrBlank() && !bigBody.isNullOrBlank()
) { "title and body are required when style is $androidStyleType" }
}
AndroidStyleType.INBOX -> {
require(
!inboxContent.isNullOrEmpty()
) { "inboxContent is required when style is $androidStyleType" }
require(
inboxContent.size <= INBOX_CONTENT_MAX_ITEMS
) { "inboxContent must have at most $INBOX_CONTENT_MAX_ITEMS items" }
}
}
}
if (profileId != null) {
require(
profileId.length <= PROFILE_ID_MAX_LENGTH
) { "profileId length cannot exceed $PROFILE_ID_MAX_LENGTH characters" }
}
}
}
private companion object {
val COLOR_PATTERN: Regex = Regex("^#[0-9a-fA-F]{6}$")
const val HTTPS_URL_PATTERN: String = "https"
const val INBOX_CONTENT_MAX_ITEMS: Byte = 5
const val PROFILE_ID_MAX_LENGTH: Byte = 64
}
}
class Builder : Buildable {
private var title: String? = null
private val body: String? = null
private var icon: String? = null
private var color: String? = null
private var sound: String? = null
private var defaultSound = false
private var tag: String? = null
private var bodyLocKey: String? = null
private val bodyLocArgs: MutableList<String> = mutableListOf()
private var titleLocKey: String? = null
private val titleLocArgs: MutableList<String> = mutableListOf()
private var multiLangkey: Map<String, String>? = null
private var channelId: String? = null
private var notifySummary: String? = null
private var image: String? = null
private var androidStyleType: AndroidStyleType? = null
private var bigTitle: String? = null
private var bigBody: String? = null
private var notifyId: Int? = null
private var group: String? = null
private var androidBadgeNotification: AndroidBadgeNotification? = null
private var autoCancel = true
private var sendAt: String? = null
private var androidImportance: AndroidImportance? = null
private var useDefaultVibrate = false
private var useDefaultLight = false
private val vibrateConfig: MutableList<String> = mutableListOf()
private var androidVisibility: AndroidVisibility? = null
private var androidLightSettings: AndroidLightSettings? = null
private var foregroundShow = false
private val inboxContent: MutableList<String> = mutableListOf()
private val buttons: MutableList<AndroidButton> = mutableListOf()
private var profileId: String? = null
fun setTitle(title: String): Builder {
this.title = title
return this
}
fun setBody(body: String): Builder {
this.body = body
return this
}
fun setIcon(icon: String): Builder {
this.icon = icon
return this
}
fun setColor(color: String): Builder {
this.color = color
return this
}
fun setSound(sound: String): Builder {
this.sound = sound
return this
}
fun setDefaultSound(defaultSound: Boolean): Builder {
this.defaultSound = defaultSound
return this
}
fun setTag(tag: String): Builder {
this.tag = tag
return this
}
fun setBodyLocKey(bodyLocKey: String): Builder {
this.bodyLocKey = bodyLocKey
return this
}
fun addBodyLocArgs(vararg arg: String): Builder {
bodyLocArgs.addAll(arg)
return this
}
fun setTitleLocKey(titleLocKey: String): Builder {
this.titleLocKey = titleLocKey
return this
}
fun addTitleLocArgs(vararg args: String): Builder {
titleLocArgs.addAll(args)
return this
}
fun setMultiLangkey(multiLangkey: Map<String, String>): Builder {
this.multiLangkey = multiLangkey
return this
}
fun setChannelId(channelId: String): Builder {
this.channelId = channelId
return this
}
fun setNotifySummary(notifySummary: String): Builder {
this.notifySummary = notifySummary
return this
}
fun setImage(image: String): Builder {
this.image = image
return this
}
fun setStyle(androidStyleType: AndroidStyleType): Builder {
this.androidStyleType = androidStyleType
return this
}
fun setBigTitle(bigTitle: String): Builder {
this.bigTitle = bigTitle
return this
}
fun setBigBody(bigBody: String): Builder {
this.bigBody = bigBody
return this
}
fun setNotifyId(notifyId: Int): Builder {
this.notifyId = notifyId
return this
}
fun setGroup(group: String): Builder {
this.group = group
return this
}
fun setBadge(androidBadgeNotification: AndroidBadgeNotification): Builder {
this.androidBadgeNotification = androidBadgeNotification
return this
}
fun setAutoCancel(autoCancel: Boolean): Builder {
this.autoCancel = autoCancel
return this
}
fun sendAt(sendAt: String): Builder {
this.sendAt = sendAt
return this
}
fun setImportance(androidImportance: AndroidImportance): Builder {
this.androidImportance = androidImportance
return this
}
fun setUseDefaultVibrate(useDefaultVibrate: Boolean): Builder {
this.useDefaultVibrate = useDefaultVibrate
return this
}
fun setUseDefaultLight(useDefaultLight: Boolean): Builder {
this.useDefaultLight = useDefaultLight
return this
}
fun addVibrateConfig(vararg vibrateTimings: String): Builder {
vibrateConfig.addAll(vibrateTimings)
return this
}
fun setAndroidVisibility(androidVisibility: AndroidVisibility): Builder {
this.androidVisibility = androidVisibility
return this
}
fun setLightSettings(androidLightSettings: AndroidLightSettings): Builder {
this.androidLightSettings = androidLightSettings
return this
}
fun setForegroundShow(foregroundShow: Boolean): Builder {
this.foregroundShow = foregroundShow
return this
}
fun addInboxContent(vararg inboxContent: String): Builder {
this.inboxContent.addAll(inboxContent)
return this
}
fun addButton(vararg button: AndroidButton): Builder {
buttons.addAll(button)
return this
}
fun setProfileId(profileId: String): Builder {
this.profileId = profileId
return this
}
fun build(
androidClickAction: AndroidClickAction,
): AndroidNotificationConfig {
return AndroidNotificationConfig(
title = title,
body = body,
icon = icon,
color = color,
sound = sound,
defaultSound = defaultSound,
tag = tag,
androidClickAction = androidClickAction,
bodyLocKey = bodyLocKey,
bodyLocArgs = bodyLocArgs.takeIf(Collection<*>::isNotEmpty),
titleLocKey = titleLocKey,
titleLocArgs = titleLocArgs.takeIf(Collection<*>::isNotEmpty),
multiLangKey = multiLangkey,
channelId = channelId,
notifySummary = notifySummary,
image = image,
androidStyleType = androidStyleType,
bigTitle = bigTitle,
bigBody = bigBody,
notifyId = notifyId,
group = group,
androidBadgeNotification = androidBadgeNotification,
autoCancel = autoCancel,
sendAt = sendAt,
androidImportance = androidImportance,
useDefaultVibrate = useDefaultVibrate,
useDefaultLight = useDefaultLight,
vibrateConfig = vibrateConfig.takeIf(Collection<*>::isNotEmpty),
androidVisibility = androidVisibility,
androidLightSettings = androidLightSettings,
foregroundShow = foregroundShow,
inboxContent = inboxContent.takeIf(Collection<*>::isNotEmpty),
androidButtons = buttons.takeIf(Collection<*>::isNotEmpty),
profileId = profileId,
)
}
}
companion object {
val validator = Validator()
fun builder() = Builder()
}
}

View File

@ -0,0 +1,17 @@
package ru.touchin.push.message.provider.hpk.clients.hms_hpk.enums.android
import ru.touchin.push.message.provider.hpk.base.enums.ValueableSerializableEnum
internal enum class AndroidActionType(
override val value: Short
) : ValueableSerializableEnum<Short> {
OPEN_APP_HOME_PAGE(0),
OPEN_CUSTOM_APP_PAGE(1),
OPEN_WEB_PAGE(2),
DELETE_NOTIFICATION_MESSAGE(3),
/** Only for Huawei devices */
SHARE_NOTIFICATION_MESSAGE(4),
}

View File

@ -0,0 +1,13 @@
package ru.touchin.push.message.provider.hpk.clients.hms_hpk.enums.android
import ru.touchin.push.message.provider.hpk.base.enums.ValueableSerializableEnum
internal enum class AndroidClickActionType(
override val value: Short
) : ValueableSerializableEnum<Short> {
CUSTOMIZE_ACTION(1),
OPEN_URL(2),
OPEN_APP(3),
}

View File

@ -0,0 +1,12 @@
package ru.touchin.push.message.provider.hpk.clients.hms_hpk.enums.android
import ru.touchin.push.message.provider.hpk.base.enums.ValueableSerializableEnum
internal enum class AndroidFastAppTargetType(
override val value: Short
) : ValueableSerializableEnum<Short> {
DEVELOPMENT(1),
PRODUCTION(2),
}

View File

@ -0,0 +1,13 @@
package ru.touchin.push.message.provider.hpk.clients.hms_hpk.enums.android
import ru.touchin.push.message.provider.hpk.base.enums.ValueableSerializableEnum
internal enum class AndroidImportance(
override val value: String
) : ValueableSerializableEnum<String> {
LOW("LOW"),
NORMAL("NORMAL"),
HIGH("HIGH"), // TODO: check if this type is still supported by HMS HPK API
}

View File

@ -0,0 +1,12 @@
package ru.touchin.push.message.provider.hpk.clients.hms_hpk.enums.android
import ru.touchin.push.message.provider.hpk.base.enums.ValueableSerializableEnum
enum class AndroidIntentType(
override val value: Short
) : ValueableSerializableEnum<Short> {
INTENT(0),
ACTION(1),
}

View File

@ -0,0 +1,13 @@
package ru.touchin.push.message.provider.hpk.clients.hms_hpk.enums.android
import ru.touchin.push.message.provider.hpk.base.enums.ValueableSerializableEnum
enum class AndroidStyleType(
override val value: Short
) : ValueableSerializableEnum<Short> {
DEFAULT(0),
BIG_TEXT(1),
INBOX(3),
}

View File

@ -0,0 +1,13 @@
package ru.touchin.push.message.provider.hpk.clients.hms_hpk.enums.android
import ru.touchin.push.message.provider.hpk.base.enums.ValueableSerializableEnum
internal enum class AndroidTargetUserType(
override val value: Short
) : ValueableSerializableEnum<Short> {
TEST_USER(1),
FORMAL_USER(2),
VOIP_USER(3),
}

View File

@ -0,0 +1,13 @@
package ru.touchin.push.message.provider.hpk.clients.hms_hpk.enums.android
import ru.touchin.push.message.provider.hpk.base.enums.ValueableSerializableEnum
internal enum class AndroidTopicOperation(
override val value: String
) : ValueableSerializableEnum<String> {
SUBSCRIBE("subscribe"),
UNSUBSCRIBE("unsubscribe"),
LIST("list"),
}

View File

@ -0,0 +1,12 @@
package ru.touchin.push.message.provider.hpk.clients.hms_hpk.enums.android
import ru.touchin.push.message.provider.hpk.base.enums.ValueableSerializableEnum
internal enum class AndroidUrgency(
override val value: String
) : ValueableSerializableEnum<String> {
HIGH("HIGH"),
NORMAL("NORMAL"),
}

View File

@ -0,0 +1,24 @@
package ru.touchin.push.message.provider.hpk.clients.hms_hpk.enums.android
import ru.touchin.push.message.provider.hpk.base.enums.ValueableSerializableEnum
internal enum class AndroidVisibility(
override val value: String
) : ValueableSerializableEnum<String> {
/** The visibility is not specified. This value is equivalent to PRIVATE. */
VISIBILITY_UNSPECIFIED("VISIBILITY_UNSPECIFIED"),
/**
* If you have set a lock screen password and enabled Hide notification content under Settings > Notifications,
* the content of a received notification message is hidden on the lock screen.
* */
PRIVATE("PRIVATE"),
/** The content of a received notification message is displayed on the lock screen. */
PUBLIC("PUBLIC"),
/** A received notification message is not displayed on the lock screen. */
SECRET("SECRET"),
}