diff --git a/messaging/messaging.go b/messaging/messaging.go index dcd412c3..90c0b367 100644 --- a/messaging/messaging.go +++ b/messaging/messaging.go @@ -191,6 +191,7 @@ type AndroidNotification struct { DefaultLightSettings bool `json:"default_light_settings,omitempty"` Visibility AndroidNotificationVisibility `json:"-"` NotificationCount *int `json:"notification_count,omitempty"` + Proxy AndroidNotificationProxy `json:"-"` } // MarshalJSON marshals an AndroidNotification into JSON (for internal use only). @@ -217,6 +218,16 @@ func (a *AndroidNotification) MarshalJSON() ([]byte, error) { visibility, _ = visibilities[a.Visibility] } + var proxy string + if a.Proxy != proxyUnspecified { + proxies := map[AndroidNotificationProxy]string{ + ProxyAllow: "ALLOW", + ProxyDeny: "DENY", + ProxyIfPriorityLowered: "IF_PRIORITY_LOWERED", + } + proxy, _ = proxies[a.Proxy] + } + var timestamp string if a.EventTimestamp != nil { timestamp = a.EventTimestamp.UTC().Format(rfc3339Zulu) @@ -232,12 +243,14 @@ func (a *AndroidNotification) MarshalJSON() ([]byte, error) { EventTimestamp string `json:"event_time,omitempty"` Priority string `json:"notification_priority,omitempty"` Visibility string `json:"visibility,omitempty"` + Proxy string `json:"proxy,omitempty"` VibrateTimings []string `json:"vibrate_timings,omitempty"` *androidInternal }{ EventTimestamp: timestamp, Priority: priority, Visibility: visibility, + Proxy: proxy, VibrateTimings: vibTimings, androidInternal: (*androidInternal)(a), } @@ -251,6 +264,7 @@ func (a *AndroidNotification) UnmarshalJSON(b []byte) error { EventTimestamp string `json:"event_time,omitempty"` Priority string `json:"notification_priority,omitempty"` Visibility string `json:"visibility,omitempty"` + Proxy string `json:"proxy,omitempty"` VibrateTimings []string `json:"vibrate_timings,omitempty"` *androidInternal }{ @@ -288,6 +302,19 @@ func (a *AndroidNotification) UnmarshalJSON(b []byte) error { } } + if temp.Proxy != "" { + proxies := map[string]AndroidNotificationProxy{ + "ALLOW": ProxyAllow, + "DENY": ProxyDeny, + "IF_PRIORITY_LOWERED": ProxyIfPriorityLowered, + } + if prox, ok := proxies[temp.Proxy]; ok { + a.Proxy = prox + } else { + return fmt.Errorf("unknown proxy value: %q", temp.Proxy) + } + } + if temp.EventTimestamp != "" { ts, err := time.Parse(rfc3339Zulu, temp.EventTimestamp) if err != nil { @@ -356,6 +383,23 @@ const ( VisibilitySecret ) +// AndroidNotificationProxy to control when a notification may be proxied. +type AndroidNotificationProxy int + +const ( + proxyUnspecified AndroidNotificationProxy = iota + + // ProxyAllow tries to proxy this notification. + ProxyAllow + + // ProxyDeny does not proxy this notification. + ProxyDeny + + // ProxyIfPriorityLowered only tries to proxy this notification if its AndroidConfig's Priority was + // lowered from high to normal on the device. + ProxyIfPriorityLowered +) + // LightSettings to control notification LED. type LightSettings struct { Color string diff --git a/messaging/messaging_test.go b/messaging/messaging_test.go index dceed542..ce5c5bfc 100644 --- a/messaging/messaging_test.go +++ b/messaging/messaging_test.go @@ -683,6 +683,63 @@ var validMessages = []struct { "topic": "test-topic", }, }, + { + name: "AndroidNotificationProxyAllow", + req: &Message{ + Android: &AndroidConfig{ + Notification: &AndroidNotification{ + Proxy: ProxyAllow, + }, + }, + Topic: "test-topic", + }, + want: map[string]interface{}{ + "android": map[string]interface{}{ + "notification": map[string]interface{}{ + "proxy": "ALLOW", + }, + }, + "topic": "test-topic", + }, + }, + { + name: "AndroidNotificationProxyDeny", + req: &Message{ + Android: &AndroidConfig{ + Notification: &AndroidNotification{ + Proxy: ProxyDeny, + }, + }, + Topic: "test-topic", + }, + want: map[string]interface{}{ + "android": map[string]interface{}{ + "notification": map[string]interface{}{ + "proxy": "DENY", + }, + }, + "topic": "test-topic", + }, + }, + { + name: "AndroidNotificationProxyIfPriorityLowered", + req: &Message{ + Android: &AndroidConfig{ + Notification: &AndroidNotification{ + Proxy: ProxyIfPriorityLowered, + }, + }, + Topic: "test-topic", + }, + want: map[string]interface{}{ + "android": map[string]interface{}{ + "notification": map[string]interface{}{ + "proxy": "IF_PRIORITY_LOWERED", + }, + }, + "topic": "test-topic", + }, + }, } var invalidMessages = []struct {