Skip to content

Commit 387f11a

Browse files
authored
feat(fcm): Support proxy field in FCM AndroidNotification (#868)
* feat(fcm): Support `proxy` field in FCM `AndroidNotification` * fix lint * fix: Update `proxy` and `visibility` doc string with TW suggestion
1 parent 3c86208 commit 387f11a

File tree

4 files changed

+36
-4
lines changed

4 files changed

+36
-4
lines changed

firebase_admin/_messaging_encoder.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,9 @@ def encode_android_notification(cls, notification):
319319
'visibility': _Validators.check_string(
320320
'AndroidNotification.visibility', notification.visibility, non_empty=True),
321321
'notification_count': _Validators.check_number(
322-
'AndroidNotification.notification_count', notification.notification_count)
322+
'AndroidNotification.notification_count', notification.notification_count),
323+
'proxy': _Validators.check_string(
324+
'AndroidNotification.proxy', notification.proxy, non_empty=True)
323325
}
324326
result = cls.remove_null_values(result)
325327
color = result.get('color')
@@ -363,6 +365,13 @@ def encode_android_notification(cls, notification):
363365
'AndroidNotification.vibrate_timings_millis', msec)
364366
vibrate_timing_strings.append(formated_string)
365367
result['vibrate_timings'] = vibrate_timing_strings
368+
369+
proxy = result.get('proxy')
370+
if proxy:
371+
if proxy not in ('allow', 'deny', 'if_priority_lowered'):
372+
raise ValueError(
373+
'AndroidNotification.proxy must be "allow", "deny" or "if_priority_lowered".')
374+
result['proxy'] = proxy.upper()
366375
return result
367376

368377
@classmethod

firebase_admin/_messaging_utils.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -137,14 +137,18 @@ class AndroidNotification:
137137
If ``default_light_settings`` is set to ``True`` and ``light_settings`` is also set, the
138138
user-specified ``light_settings`` is used instead of the default value.
139139
visibility: Sets the visibility of the notification. Must be either ``private``, ``public``,
140-
or ``secret``. If unspecified, default to ``private``.
140+
or ``secret``. If unspecified, it remains undefined in the Admin SDK, and defers to
141+
the FCM backend's default mapping.
141142
notification_count: Sets the number of items this notification represents. May be displayed
142143
as a badge count for Launchers that support badging. See ``NotificationBadge``
143144
https://developer.android.com/training/notify-user/badges. For example, this might be
144145
useful if you're using just one notification to represent multiple new messages but you
145146
want the count here to represent the number of total new messages. If zero or
146147
unspecified, systems that support badging use the default, which is to increment a
147148
number displayed on the long-press menu each time a new notification arrives.
149+
proxy: Sets if the notification may be proxied. Must be one of ``allow``, ``deny``, or
150+
``if_priority_lowered``. If unspecified, it remains undefined in the Admin SDK, and
151+
defers to the FCM backend's default mapping.
148152
149153
150154
"""
@@ -154,7 +158,8 @@ def __init__(self, title=None, body=None, icon=None, color=None, sound=None, tag
154158
title_loc_args=None, channel_id=None, image=None, ticker=None, sticky=None,
155159
event_timestamp=None, local_only=None, priority=None, vibrate_timings_millis=None,
156160
default_vibrate_timings=None, default_sound=None, light_settings=None,
157-
default_light_settings=None, visibility=None, notification_count=None):
161+
default_light_settings=None, visibility=None, notification_count=None,
162+
proxy=None):
158163
self.title = title
159164
self.body = body
160165
self.icon = icon
@@ -180,6 +185,7 @@ def __init__(self, title=None, body=None, icon=None, color=None, sound=None, tag
180185
self.default_light_settings = default_light_settings
181186
self.visibility = visibility
182187
self.notification_count = notification_count
188+
self.proxy = proxy
183189

184190

185191
class LightSettings:

integration/test_messaging.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ def test_send():
5555
light_off_duration_millis=200,
5656
light_on_duration_millis=300
5757
),
58-
notification_count=1
58+
notification_count=1,
59+
proxy='if_priority_lowered',
5960
)
6061
),
6162
apns=messaging.APNSConfig(payload=messaging.APNSPayload(

tests/test_messaging.py

+16
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,20 @@ def test_invalid_visibility(self, visibility):
535535
expected = 'AndroidNotification.visibility must be a non-empty string.'
536536
assert str(excinfo.value) == expected
537537

538+
@pytest.mark.parametrize('proxy', NON_STRING_ARGS + ['foo'])
539+
def test_invalid_proxy(self, proxy):
540+
notification = messaging.AndroidNotification(proxy=proxy)
541+
excinfo = self._check_notification(notification)
542+
if isinstance(proxy, str):
543+
if not proxy:
544+
expected = 'AndroidNotification.proxy must be a non-empty string.'
545+
else:
546+
expected = ('AndroidNotification.proxy must be "allow", "deny" or'
547+
' "if_priority_lowered".')
548+
else:
549+
expected = 'AndroidNotification.proxy must be a non-empty string.'
550+
assert str(excinfo.value) == expected
551+
538552
@pytest.mark.parametrize('vibrate_timings', ['', 1, True, 'msec', ['500', 500], [0, 'abc']])
539553
def test_invalid_vibrate_timings_millis(self, vibrate_timings):
540554
notification = messaging.AndroidNotification(vibrate_timings_millis=vibrate_timings)
@@ -580,6 +594,7 @@ def test_android_notification(self):
580594
light_off_duration_millis=300,
581595
),
582596
default_light_settings=False, visibility='public', notification_count=1,
597+
proxy='if_priority_lowered',
583598
)
584599
)
585600
)
@@ -620,6 +635,7 @@ def test_android_notification(self):
620635
'default_light_settings': False,
621636
'visibility': 'PUBLIC',
622637
'notification_count': 1,
638+
'proxy': 'IF_PRIORITY_LOWERED'
623639
},
624640
},
625641
}

0 commit comments

Comments
 (0)