Skip to content

Commit 3c30a71

Browse files
amabluea-maurice
authored andcommitted
Subscribe and Unsubscribe will now return a Future that contains an error
instead of never completing when TokenRegistrationOnInitEnabled is set to false. PiperOrigin-RevId: 246360447
1 parent d7f08bf commit 3c30a71

File tree

3 files changed

+39
-8
lines changed

3 files changed

+39
-8
lines changed

messaging/src/android/cpp/messaging.cc

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ Future<void> RequestPermission() {
324324
SafeFutureHandle<void> handle =
325325
api->SafeAlloc<void>(kMessagingFnRequestPermission);
326326
api->Complete(handle, kErrorNone);
327-
return Future<void>(api, handle.get());
327+
return MakeFuture(api, handle);
328328
}
329329

330330
Future<void> RequestPermissionLastResult() {
@@ -886,6 +886,10 @@ static void HandlePendingSubscriptions() {
886886
}
887887
}
888888

889+
static const char kErrorMessageNoRegistrationToken[] =
890+
"Cannot update subscription when SetTokenRegistrationOnInitEnabled is set "
891+
"to false.";
892+
889893
Future<void> Subscribe(const char* topic) {
890894
FIREBASE_ASSERT_MESSAGE_RETURN(Future<void>(), internal::IsInitialized(),
891895
kMessagingNotInitializedError);
@@ -894,10 +898,14 @@ Future<void> Subscribe(const char* topic) {
894898
SafeFutureHandle<void> handle = api->SafeAlloc<void>(kMessagingFnSubscribe);
895899
if (g_registration_token_received) {
896900
SubscribeInternal(topic, handle);
901+
} else if (g_registration_token_request_state ==
902+
kRegistrationTokenRequestStateDisable) {
903+
api->Complete(handle, kErrorNoRegistrationToken,
904+
kErrorMessageNoRegistrationToken);
897905
} else if (g_pending_subscriptions) {
898906
g_pending_subscriptions->push_back(PendingTopic(topic, handle));
899907
}
900-
return Future<void>(api, handle.get());
908+
return MakeFuture(api, handle);
901909
}
902910

903911
Future<void> SubscribeLastResult() {
@@ -915,10 +923,14 @@ Future<void> Unsubscribe(const char* topic) {
915923
SafeFutureHandle<void> handle = api->SafeAlloc<void>(kMessagingFnSubscribe);
916924
if (g_registration_token_received) {
917925
UnsubscribeInternal(topic, handle);
926+
} else if (g_registration_token_request_state ==
927+
kRegistrationTokenRequestStateDisable) {
928+
api->Complete(handle, kErrorNoRegistrationToken,
929+
kErrorMessageNoRegistrationToken);
918930
} else if (g_pending_unsubscriptions) {
919931
g_pending_unsubscriptions->push_back(PendingTopic(topic, handle));
920932
}
921-
return Future<void>(api, handle.get());
933+
return MakeFuture(api, handle);
922934
}
923935

924936
Future<void> UnsubscribeLastResult() {

messaging/src/include/firebase/messaging.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616
#define FIREBASE_MESSAGING_CLIENT_CPP_INCLUDE_FIREBASE_MESSAGING_H_
1717

1818
#include <stdint.h>
19+
1920
#include <map>
2021
#include <string>
2122
#include <vector>
23+
2224
#include "firebase/app.h"
2325
#include "firebase/future.h"
2426
#include "firebase/internal/common.h"
@@ -486,6 +488,8 @@ enum Error {
486488
kErrorFailedToRegisterForRemoteNotifications,
487489
/// Topic name is invalid for subscription/unsubscription.
488490
kErrorInvalidTopicName,
491+
/// Could not subscribe/unsubscribe because there is no registration token.
492+
kErrorNoRegistrationToken,
489493
/// Unknown error.
490494
kErrorUnknown,
491495
};

messaging/src/ios/messaging.mm

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ void NotifyListenerSet(Listener* listener) {
239239
g_launch_notification = nil;
240240
}
241241
});
242-
return RequestPermissionLastResult();
242+
return MakeFuture(api, g_permission_prompt_future_handle);
243243
}
244244

245245
Future<void> RequestPermissionLastResult() {
@@ -620,6 +620,9 @@ void Send(const Message &message) {
620620
timeToLive:message.time_to_live];
621621
}
622622

623+
static const char kErrorMessageNoRegistrationToken[] =
624+
"Cannot update subscritption when SetTokenRegistrationOnInitEnabled is set to false";
625+
623626
Future<void> Subscribe(const char *topic) {
624627
FIREBASE_ASSERT_RETURN(Future<void>(), internal::IsInitialized());
625628

@@ -628,12 +631,18 @@ void Send(const Message &message) {
628631
SafeFutureHandle<void> handle = api->SafeAlloc<void>(kMessagingFnSubscribe);
629632

630633
LogInfo("FCM: Subscribe to topic `%s`", topic);
634+
635+
if (!IsTokenRegistrationOnInitEnabled()) {
636+
api->Complete(handle, kErrorNoRegistrationToken,
637+
kErrorMessageNoRegistrationToken);
638+
return MakeFuture(api, handle);
639+
}
631640
if (![FIRMessaging normalizeTopic:@(topic)]) {
632641
std::string error = "Cannot parse topic name ";
633642
error += topic;
634643
error += ". Will not subscribe.";
635644
api->Complete(handle, kErrorInvalidTopicName, error.c_str());
636-
return Future<void>(api, handle.get());
645+
return MakeFuture(api, handle);
637646
}
638647
[[FIRMessaging messaging] subscribeToTopic:@(topic)
639648
completion:^void(NSError *error) {
@@ -643,7 +652,7 @@ void Send(const Message &message) {
643652
api->Complete(handle, kErrorNone);
644653
}
645654
}];
646-
return Future<void>(api, handle.get());
655+
return MakeFuture(api, handle);
647656
}
648657

649658
Future<void> SubscribeLastResult() {
@@ -661,12 +670,18 @@ void Send(const Message &message) {
661670
SafeFutureHandle<void> handle = api->SafeAlloc<void>(kMessagingFnUnsubscribe);
662671

663672
LogInfo("FCM: Unsubscribe to topic `%s`", topic);
673+
674+
if (!IsTokenRegistrationOnInitEnabled()) {
675+
api->Complete(handle, kErrorNoRegistrationToken,
676+
kErrorMessageNoRegistrationToken);
677+
return MakeFuture(api, handle);
678+
}
664679
if (![FIRMessaging normalizeTopic:@(topic)]) {
665680
std::string error = "Cannot parse topic name ";
666681
error += topic;
667682
error += ". Will not unsubscribe.";
668683
api->Complete(handle, kErrorInvalidTopicName, error.c_str());
669-
return Future<void>(api, handle.get());
684+
return MakeFuture(api, handle);
670685
}
671686
[[FIRMessaging messaging] unsubscribeFromTopic:@(topic)
672687
completion:^void(NSError *error) {
@@ -676,7 +691,7 @@ void Send(const Message &message) {
676691
api->Complete(handle, kErrorNone);
677692
}
678693
}];
679-
return Future<void>(api, handle.get());
694+
return MakeFuture(api, handle);
680695
}
681696

682697
Future<void> UnsubscribeLastResult() {

0 commit comments

Comments
 (0)