From d994ce7feb911aa39b05fe25da19b4dbc5b945ee Mon Sep 17 00:00:00 2001 From: Aaron Labiaga Date: Tue, 3 Mar 2026 12:32:48 -0700 Subject: [PATCH 1/4] Add necessary changes to enable FCM integration Change-Id: I5d0e9105de0d413714c613a5701688a8a02c2112 --- app/build.gradle.kts | 3 +- app/src/main/AndroidManifest.xml | 6 +++ .../android/samples/socialite/MainActivity.kt | 23 ++++++++++ .../samples/socialite/fcm/MessagingService.kt | 46 +++++++++++++++++++ build.gradle.kts | 1 + gradle/libs.versions.toml | 6 ++- 6 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/google/android/samples/socialite/fcm/MessagingService.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6ec7784a..e6a803a0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -43,7 +43,7 @@ android { defaultConfig { applicationId = "com.google.android.samples.socialite" - minSdk = 21 + minSdk = 23 targetSdk = 35 versionCode = 1 versionName = "1.0" @@ -184,6 +184,7 @@ dependencies { implementation(platform(libs.firebase.bom)) implementation(libs.firebase.ai) implementation(libs.datastore) + implementation(libs.firebase.messaging) implementation(libs.adaptive.navigation3) implementation(libs.navigation3.runtime) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cc3b47a4..b8c23b32 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -193,6 +193,12 @@ android:value="" /> + + + + + + diff --git a/app/src/main/java/com/google/android/samples/socialite/MainActivity.kt b/app/src/main/java/com/google/android/samples/socialite/MainActivity.kt index 20555ea6..9bb59003 100644 --- a/app/src/main/java/com/google/android/samples/socialite/MainActivity.kt +++ b/app/src/main/java/com/google/android/samples/socialite/MainActivity.kt @@ -20,6 +20,7 @@ import android.content.Intent import android.content.pm.PackageManager import android.os.Build import android.os.Bundle +import android.util.Log import android.view.KeyEvent import android.view.KeyboardShortcutGroup import android.view.KeyboardShortcutInfo @@ -30,8 +31,10 @@ import androidx.activity.enableEdgeToEdge import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.glance.appwidget.updateAll import androidx.lifecycle.lifecycleScope +import com.google.android.gms.tasks.OnCompleteListener import com.google.android.samples.socialite.ui.Main import com.google.android.samples.socialite.widget.SociaLiteAppWidget +import com.google.firebase.messaging.FirebaseMessaging import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch @@ -40,6 +43,7 @@ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { installSplashScreen() enableEdgeToEdge() + initializeFcm() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { window.isNavigationBarContrastEnforced = false } @@ -55,6 +59,25 @@ class MainActivity : ComponentActivity() { } } + /** + * Sets up Firebase Cloud Messaging (FCM) for push notifications. + * FCM enables cross device message delivery and versatile message delivery. + * See https://firebase.google.com/docs/cloud-messaging/android/get-started. + */ + private fun initializeFcm() { + FirebaseMessaging.getInstance().token.addOnCompleteListener( + OnCompleteListener { task -> + if (!task.isSuccessful) { + Log.w("FCM", "Fetching FCM registration token failed", task.exception) + return@OnCompleteListener + } // Get new FCM registration token + val token = task.result + // Log token + Log.d("FCM", "FCM message token $token") + }, + ) + } + private fun extractAppArgs(intent: Intent?): AppArgs? { if (intent == null) return null return AppArgs.ShortcutParams.tryFrom(intent) ?: AppArgs.LaunchParams.tryFrom(intent) diff --git a/app/src/main/java/com/google/android/samples/socialite/fcm/MessagingService.kt b/app/src/main/java/com/google/android/samples/socialite/fcm/MessagingService.kt new file mode 100644 index 00000000..6b04475e --- /dev/null +++ b/app/src/main/java/com/google/android/samples/socialite/fcm/MessagingService.kt @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.samples.socialite.fcm + +import android.util.Log +import com.google.firebase.messaging.FirebaseMessagingService +import com.google.firebase.messaging.RemoteMessage + +class MessagingService : FirebaseMessagingService() { + + override fun onNewToken(token: String) { + // Token used for device targeting. + // See https://firebase.google.com/docs/cloud-messaging/android/get-started#access-fcm-registration-token + super.onNewToken(token) + Log.d("FCM", "Refreshed token: $token") + } + + override fun onMessageReceived(remoteMessage: RemoteMessage) { + super.onMessageReceived(remoteMessage) + + // Handle data payload + if (remoteMessage.data.isNotEmpty()) { + Log.d("FCM", "Message data payload: ${remoteMessage.data}") + } + + // Handle notification payload + remoteMessage.notification?.let { + Log.d("FCM", "Message Notification Body: ${it.body}") + // Trigger local notification here + } + } +} diff --git a/build.gradle.kts b/build.gradle.kts index a60e1334..814773c5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -26,6 +26,7 @@ plugins { alias(libs.plugins.spotless) apply false alias(libs.plugins.hilt) apply false alias(libs.plugins.ksp) apply false + alias(libs.plugins.google.gms.google.services) apply false } subprojects { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 92192566..fb0be912 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -30,8 +30,8 @@ core = "1.16.0" core-performance = "1.0.0" core-splashscreen = "1.0.1" espresso = "3.6.1" -firebaseBoM = "33.14.0" -googleGmsGoogleServices = "4.4.2" +firebaseBoM = "34.10.0" +googleGmsGoogleServices = "4.4.4" download = "5.6.0" graphics = "1.0.1" hilt = "2.56.1" @@ -143,6 +143,8 @@ generativeai = { group = "com.google.ai.client.generativeai", name = "generative datastore = { group = "androidx.datastore", name = "datastore-preferences", version.ref = "datastore" } firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebaseBoM" } firebase-ai = { group = "com.google.firebase", name = "firebase-ai" } +firebase-analytics = { group = "com.google.firebase", name = "firebase-analytics" } +firebase-messaging = {group = "com.google.firebase", name = "firebase-messaging" } vision-common = { group = "com.google.mlkit", name = "vision-common", version.ref = "visionCommon" } From 66f4446973e1a6864579a7a6062999ae202d1ceb Mon Sep 17 00:00:00 2001 From: Aaron Labiaga Date: Tue, 3 Mar 2026 15:35:12 -0700 Subject: [PATCH 2/4] fix formatting Change-Id: I7d942068896b3b9419554e2f75079dd584167487 --- .../java/com/google/android/samples/socialite/MainActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/google/android/samples/socialite/MainActivity.kt b/app/src/main/java/com/google/android/samples/socialite/MainActivity.kt index 9bb59003..39c08b74 100644 --- a/app/src/main/java/com/google/android/samples/socialite/MainActivity.kt +++ b/app/src/main/java/com/google/android/samples/socialite/MainActivity.kt @@ -70,7 +70,7 @@ class MainActivity : ComponentActivity() { if (!task.isSuccessful) { Log.w("FCM", "Fetching FCM registration token failed", task.exception) return@OnCompleteListener - } // Get new FCM registration token + } // Get new FCM registration token val token = task.result // Log token Log.d("FCM", "FCM message token $token") From 9cd8179eb8b0e04df85ea937112cd5884e16c4f3 Mon Sep 17 00:00:00 2001 From: Aaron Labiaga Date: Tue, 3 Mar 2026 15:54:43 -0700 Subject: [PATCH 3/4] comment out logging Change-Id: Id33b31250bdb92d02665d0cf1adf6034fa320581 --- .../java/com/google/android/samples/socialite/MainActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/google/android/samples/socialite/MainActivity.kt b/app/src/main/java/com/google/android/samples/socialite/MainActivity.kt index 39c08b74..5a661ec7 100644 --- a/app/src/main/java/com/google/android/samples/socialite/MainActivity.kt +++ b/app/src/main/java/com/google/android/samples/socialite/MainActivity.kt @@ -72,8 +72,8 @@ class MainActivity : ComponentActivity() { return@OnCompleteListener } // Get new FCM registration token val token = task.result - // Log token - Log.d("FCM", "FCM message token $token") + // Log token, for testing purposes only. + // Log.d("FCM", "FCM message token $token") }, ) } From 7f09ecc4bd15dd36f15f59078dc97caf769f0374 Mon Sep 17 00:00:00 2001 From: Aaron Labiaga Date: Tue, 3 Mar 2026 18:40:28 -0700 Subject: [PATCH 4/4] remove more logging Change-Id: Ia66dc2932c8e90699bd12692fe68c6a56c6ec1c3 --- .../android/samples/socialite/fcm/MessagingService.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/google/android/samples/socialite/fcm/MessagingService.kt b/app/src/main/java/com/google/android/samples/socialite/fcm/MessagingService.kt index 6b04475e..9937c2a3 100644 --- a/app/src/main/java/com/google/android/samples/socialite/fcm/MessagingService.kt +++ b/app/src/main/java/com/google/android/samples/socialite/fcm/MessagingService.kt @@ -16,7 +16,6 @@ package com.google.android.samples.socialite.fcm -import android.util.Log import com.google.firebase.messaging.FirebaseMessagingService import com.google.firebase.messaging.RemoteMessage @@ -26,7 +25,6 @@ class MessagingService : FirebaseMessagingService() { // Token used for device targeting. // See https://firebase.google.com/docs/cloud-messaging/android/get-started#access-fcm-registration-token super.onNewToken(token) - Log.d("FCM", "Refreshed token: $token") } override fun onMessageReceived(remoteMessage: RemoteMessage) { @@ -34,12 +32,12 @@ class MessagingService : FirebaseMessagingService() { // Handle data payload if (remoteMessage.data.isNotEmpty()) { - Log.d("FCM", "Message data payload: ${remoteMessage.data}") + // Log.d("FCM", "Message data payload: ${remoteMessage.data}") } // Handle notification payload remoteMessage.notification?.let { - Log.d("FCM", "Message Notification Body: ${it.body}") + // Log.d("FCM", "Message Notification Body: ${it.body}") // Trigger local notification here } }