Skip to content

Commit 813fd47

Browse files
amabluea-maurice
authored andcommitted
Added support for DeliveryMetricsExportToBigQueryEnabled and
SetDeliveryMetricsExportToBigQuery. This is currently just a stub on iOS, until the underlying functionality is hooked up. PiperOrigin-RevId: 286297600
1 parent a1975e4 commit 813fd47

File tree

4 files changed

+110
-1
lines changed

4 files changed

+110
-1
lines changed

messaging/src/android/cpp/messaging.cc

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,17 @@ enum RegistrationTokenRequestState {
8888
static RegistrationTokenRequestState g_registration_token_request_state =
8989
kRegistrationTokenRequestStateNone;
9090

91+
// Global flag indicating if metrics export to big query was enabled or
92+
// disabled before app initialization.
93+
enum DeliveryMetricsExportToBigQueryState {
94+
kDeliveryMetricsExportToBigQueryNone,
95+
kDeliveryMetricsExportToBigQueryEnable,
96+
kDeliveryMetricsExportToBigQueryDisable,
97+
};
98+
static DeliveryMetricsExportToBigQueryState
99+
g_delivery_metrics_export_to_big_query_state =
100+
kDeliveryMetricsExportToBigQueryNone;
101+
91102
// Indicates whether a registration token has been received, which is necessary
92103
// to perform certain actions related to topic subscriptions.
93104
// NOTE: The registration token is received by RegistrationIntentService which
@@ -164,7 +175,11 @@ METHOD_LOOKUP_DEFINITION(remote_message_builder,
164175
"(Ljava/lang/String;)Lcom/google/android/gms/tasks/Task;"), \
165176
X(GetInstance, "getInstance", \
166177
"()Lcom/google/firebase/messaging/FirebaseMessaging;", \
167-
firebase::util::kMethodTypeStatic)
178+
firebase::util::kMethodTypeStatic), \
179+
X(DeliveryMetricsExportToBigQueryEnabled, \
180+
"deliveryMetricsExportToBigQueryEnabled", "()Z"), \
181+
X(SetDeliveryMetricsExportToBigQuery, \
182+
"setDeliveryMetricsExportToBigQuery", "(Z)V")
168183
// clang-format on
169184
METHOD_LOOKUP_DECLARATION(firebase_messaging, FIREBASE_MESSAGING_METHODS);
170185
METHOD_LOOKUP_DEFINITION(firebase_messaging,
@@ -645,6 +660,15 @@ InitResult Initialize(const ::firebase::App& app, Listener* listener,
645660
kRegistrationTokenRequestStateEnable);
646661
}
647662

663+
if (g_delivery_metrics_export_to_big_query_state !=
664+
kDeliveryMetricsExportToBigQueryNone) {
665+
// Calling this again, now that we're initialized.
666+
assert(internal::IsInitialized());
667+
SetTokenRegistrationOnInitEnabled(
668+
g_delivery_metrics_export_to_big_query_state ==
669+
kDeliveryMetricsExportToBigQueryEnable);
670+
}
671+
648672
FutureData::Create();
649673

650674
// Supposedly App creation also creates a registration token, but this seems
@@ -695,6 +719,9 @@ void Terminate() {
695719
delete g_lockfile_path;
696720
g_lockfile_path = nullptr;
697721

722+
g_delivery_metrics_export_to_big_query_state =
723+
kDeliveryMetricsExportToBigQueryNone;
724+
698725
env->DeleteGlobalRef(g_firebase_messaging);
699726
g_firebase_messaging = nullptr;
700727
SetListener(nullptr);
@@ -939,6 +966,44 @@ Future<void> UnsubscribeLastResult() {
939966
api->LastResult(kMessagingFnUnsubscribe));
940967
}
941968

969+
bool DeliveryMetricsExportToBigQueryEnabled() {
970+
if (!internal::IsInitialized()) {
971+
// If the user previously called SetDeliveryMetricsExportToBigQuery(true),
972+
// then return true. If they did not set it, or set it to false, return
973+
// false.
974+
return g_delivery_metrics_export_to_big_query_state ==
975+
kDeliveryMetricsExportToBigQueryEnable;
976+
}
977+
978+
JNIEnv* env = g_app->GetJNIEnv();
979+
jboolean result = env->CallBooleanMethod(
980+
g_firebase_messaging,
981+
firebase_messaging::GetMethodId(
982+
firebase_messaging::kDeliveryMetricsExportToBigQueryEnabled));
983+
assert(env->ExceptionCheck() == false);
984+
return static_cast<bool>(result);
985+
}
986+
987+
void SetDeliveryMetricsExportToBigQuery(bool enabled) {
988+
// If this is called before JNI is initialized, we'll just cache the intent
989+
// and handle it on actual init.
990+
// Otherwise if we've already initialized, the underlying API will persist the
991+
// value.
992+
if (internal::IsInitialized()) {
993+
JNIEnv* env = g_app->GetJNIEnv();
994+
env->CallVoidMethod(
995+
g_firebase_messaging,
996+
firebase_messaging::GetMethodId(
997+
firebase_messaging::kSetDeliveryMetricsExportToBigQuery),
998+
static_cast<jboolean>(enabled));
999+
assert(env->ExceptionCheck() == false);
1000+
} else {
1001+
g_delivery_metrics_export_to_big_query_state =
1002+
enabled ? kDeliveryMetricsExportToBigQueryEnable
1003+
: kDeliveryMetricsExportToBigQueryDisable;
1004+
}
1005+
}
1006+
9421007
void SetTokenRegistrationOnInitEnabled(bool enabled) {
9431008
// If this is called before JNI is initialized, we'll just cache the intent
9441009
// and handle it on actual init.

messaging/src/include/firebase/messaging.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,34 @@ Future<void> Unsubscribe(const char* topic);
596596
/// @returns Result of the most recent call to Unsubscribe().
597597
Future<void> UnsubscribeLastResult();
598598

599+
/// Determines whether Firebase Cloud Messaging exports message delivery metrics
600+
/// to BigQuery.
601+
///
602+
/// This function is currently only implemented on Android, and returns false
603+
/// with no other behavior on other platforms.
604+
///
605+
/// @return true if Firebase Cloud Messaging exports message delivery metrics to
606+
/// BigQuery.
607+
bool DeliveryMetricsExportToBigQueryEnabled();
608+
609+
/// Enables or disables Firebase Cloud Messaging message delivery metrics export
610+
/// to BigQuery.
611+
///
612+
/// By default, message delivery metrics are not exported to BigQuery. Use this
613+
/// method to enable or disable the export at runtime. In addition, you can
614+
/// enable the export by adding to your manifest. Note that the run-time method
615+
/// call will override the manifest value.
616+
///
617+
/// <meta-data android:name= "delivery_metrics_exported_to_big_query_enabled"
618+
/// android:value="true"/>
619+
///
620+
/// This function is currently only implemented on Android, and has no behavior
621+
/// on other platforms.
622+
///
623+
/// @param[in] enable Whether Firebase Cloud Messaging should export message
624+
/// delivery metrics to BigQuery.
625+
void SetDeliveryMetricsExportToBigQuery(bool enable);
626+
599627
class PollableListenerImpl;
600628

601629
/// @brief A listener that can be polled to consume pending `Message`s.

messaging/src/ios/messaging.mm

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,18 @@ void Send(const Message &message) {
768768
api->LastResult(kMessagingFnUnsubscribe));
769769
}
770770

771+
bool DeliveryMetricsExportToBigQueryEnabled() {
772+
// TODO(146362498): Implement this once the underlying API is ready on iOS.
773+
LogWarning("DeliveryMetricsExportToBigQueryEnabled is not currently implemented on iOS");
774+
775+
return false;
776+
}
777+
778+
void SetDeliveryMetricsExportToBigQuery(bool /*enable*/) {
779+
// TODO(146362498): Implement this once the underlying API is ready on iOS.
780+
LogWarning("SetDeliveryMetricsExportToBigQuery is not currently implemented on iOS");
781+
}
782+
771783
bool IsTokenRegistrationOnInitEnabled() { return [FIRMessaging messaging].autoInitEnabled; }
772784

773785
void SetTokenRegistrationOnInitEnabled(bool enable) {

messaging/src/stub/messaging.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,5 +194,9 @@ bool IsTokenRegistrationOnInitEnabled() { return true; }
194194

195195
void SetTokenRegistrationOnInitEnabled(bool /*enable*/) {}
196196

197+
bool DeliveryMetricsExportToBigQueryEnabled() { return false; }
198+
199+
void SetDeliveryMetricsExportToBigQuery(bool /*enable*/) {}
200+
197201
} // namespace messaging
198202
} // namespace firebase

0 commit comments

Comments
 (0)