From eda6d034d7013b17c6c33a3ddea25a8b1435e6b7 Mon Sep 17 00:00:00 2001 From: harvey186 Date: Mon, 11 Dec 2023 18:03:06 +0100 Subject: [PATCH] remove_fcm Change-Id: I71f795a263a5f846ba4c4fe07745e61219381e26 --- .../fcm/FcmRegistrationReceiver.java | 32 ---- .../fcm/FcmRegistrationService.java | 153 ------------------ .../imsserviceentitlement/fcm/FcmService.java | 135 ---------------- .../fcm/FcmTokenStore.java | 83 ---------- .../imsserviceentitlement/fcm/FcmUtils.java | 73 --------- 5 files changed, 476 deletions(-) delete mode 100644 src/com/android/imsserviceentitlement/fcm/FcmRegistrationReceiver.java delete mode 100644 src/com/android/imsserviceentitlement/fcm/FcmRegistrationService.java delete mode 100644 src/com/android/imsserviceentitlement/fcm/FcmService.java delete mode 100644 src/com/android/imsserviceentitlement/fcm/FcmTokenStore.java delete mode 100644 src/com/android/imsserviceentitlement/fcm/FcmUtils.java diff --git a/src/com/android/imsserviceentitlement/fcm/FcmRegistrationReceiver.java b/src/com/android/imsserviceentitlement/fcm/FcmRegistrationReceiver.java deleted file mode 100644 index 9c72f39..0000000 --- a/src/com/android/imsserviceentitlement/fcm/FcmRegistrationReceiver.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2021 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.android.imsserviceentitlement.fcm; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; - -/** A {@link BroadcastReceiver} that triggers FCM registration jobs. */ -public class FcmRegistrationReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - if (Intent.ACTION_BOOT_COMPLETED.equals(action)) { - FcmRegistrationService.enqueueJob(context); - } - } -} diff --git a/src/com/android/imsserviceentitlement/fcm/FcmRegistrationService.java b/src/com/android/imsserviceentitlement/fcm/FcmRegistrationService.java deleted file mode 100644 index 184740d..0000000 --- a/src/com/android/imsserviceentitlement/fcm/FcmRegistrationService.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (C) 2021 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.android.imsserviceentitlement.fcm; - -import android.app.job.JobParameters; -import android.app.job.JobService; -import android.content.ComponentName; -import android.content.Context; -import android.os.AsyncTask; -import android.telephony.SubscriptionManager; -import android.util.Log; - -import androidx.annotation.VisibleForTesting; - -import com.android.imsserviceentitlement.R; -import com.android.imsserviceentitlement.job.JobManager; -import com.android.imsserviceentitlement.utils.TelephonyUtils; - -import com.google.firebase.FirebaseApp; -import com.google.firebase.FirebaseOptions; -import com.google.firebase.iid.FirebaseInstanceId; -import com.google.firebase.messaging.FirebaseMessaging; - -import java.io.IOException; - -/** A {@link JobService} that gets a FCM tokens for all active SIMs. */ -public class FcmRegistrationService extends JobService { - private static final String TAG = "IMSSE-FcmRegistrationService"; - - private FirebaseInstanceId mFakeInstanceID = null; - private FirebaseApp mApp = null; - - @VisibleForTesting AsyncTask mOngoingTask; - - /** Enqueues a job for FCM registration. */ - public static void enqueueJob(Context context) { - ComponentName componentName = new ComponentName(context, FcmRegistrationService.class); - // No subscription id associated job, use {@link - // SubscriptionManager#INVALID_SUBSCRIPTION_ID}. - JobManager jobManager = - JobManager.getInstance( - context, componentName, SubscriptionManager.INVALID_SUBSCRIPTION_ID); - jobManager.registerFcmOnceNetworkReady(); - } - - @VisibleForTesting - void setFakeInstanceID(FirebaseInstanceId instanceID) { - mFakeInstanceID = instanceID; - } - - @Override - @VisibleForTesting - protected void attachBaseContext(Context base) { - super.attachBaseContext(base); - } - - /** Returns a {@link FirebaseApp} instance, lazily initialized. */ - private FirebaseApp getFirebaseApp() { - if (mApp == null) { - try { - mApp = FirebaseApp.getInstance(); - } catch (IllegalStateException e) { - Log.d(TAG, "initialize FirebaseApp"); - mApp = FirebaseApp.initializeApp( - this, - new FirebaseOptions.Builder() - .setApplicationId(getResources().getString(R.string.fcm_app_id)) - .setProjectId(getResources().getString(R.string.fcm_project_id)) - .setApiKey(getResources().getString(R.string.fcm_api_key)) - .build()); - } - } - return mApp; - } - - @Override - public boolean onStartJob(JobParameters params) { - mOngoingTask = new AsyncTask() { - @Override - protected Void doInBackground(JobParameters... params) { - onHandleWork(params[0]); - return null; - } - }; - mOngoingTask.execute(params); - return true; - } - - @Override - public boolean onStopJob(JobParameters params) { - return true; // Always re-run if job stopped. - } - - /** - * Registers to receive FCM messages published to subscribe topics under the retrieved token. - * The token changes when the InstanceID becomes invalid (e.g. app data is deleted). - */ - protected void onHandleWork(JobParameters params) { - boolean wantsReschedule = false; - for (int subId : TelephonyUtils.getSubIdsWithFcmSupported(this)) { - if (!updateFcmToken(getFirebaseInstanceId(), subId)) { - wantsReschedule = true; - } - } - - jobFinished(params, wantsReschedule); - } - - /** Returns {@code false} if failed to get token. */ - private boolean updateFcmToken(FirebaseInstanceId instanceID, int subId) { - Log.d(TAG, "FcmRegistrationService.updateFcmToken: subId=" + subId); - String token = getTokenForSubId(instanceID, subId); - if (token == null) { - Log.d(TAG, "getToken null"); - return false; - } - Log.d(TAG, "FCM token: " + token + " subId: " + subId); - FcmTokenStore.setToken(this, subId, token); - return true; - } - - private FirebaseInstanceId getFirebaseInstanceId() { - return (mFakeInstanceID != null) - ? mFakeInstanceID - : FirebaseInstanceId.getInstance(getFirebaseApp()); - } - - private String getTokenForSubId(FirebaseInstanceId instanceID, int subId) { - String token = null; - try { - token = instanceID.getToken( - TelephonyUtils.getFcmSenderId(this, subId), - FirebaseMessaging.INSTANCE_ID_SCOPE); - } catch (IOException e) { - Log.e(TAG, "Failed to get a new FCM token: " + e); - } - return token; - } -} diff --git a/src/com/android/imsserviceentitlement/fcm/FcmService.java b/src/com/android/imsserviceentitlement/fcm/FcmService.java deleted file mode 100644 index 9ab33fc..0000000 --- a/src/com/android/imsserviceentitlement/fcm/FcmService.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2021 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.android.imsserviceentitlement.fcm; - -import android.content.ComponentName; -import android.content.Context; -import android.util.Log; - -import com.android.imsserviceentitlement.ImsEntitlementPollingService; -import com.android.imsserviceentitlement.job.JobManager; -import com.android.imsserviceentitlement.utils.TelephonyUtils; -import com.android.libraries.entitlement.ServiceEntitlement; - -import com.google.common.annotations.VisibleForTesting; -import com.google.firebase.messaging.FirebaseMessagingService; -import com.google.firebase.messaging.RemoteMessage; - -import java.util.Map; - -/** Service for handling Firebase Cloud Messaging.*/ -public class FcmService extends FirebaseMessagingService { - private static final String TAG = "IMSSE-FcmService"; - - private static final String DATA_APP_KEY = "app"; - private static final String DATA_TIMESTAMP_KEY = "timestamp"; - - private JobManager mJobManager; - - @Override - @VisibleForTesting - protected void attachBaseContext(Context base) { - super.attachBaseContext(base); - } - - /** - * Called when a new token for the default Firebase project is generated. - * - * @param token the token used for sending messages to this application instance. - */ - @Override - public void onNewToken(String token) { - Log.d(TAG, "New token: " + token); - - // TODO(b/182560867): check if we need to update the new token to server. - - // Note we cannot directly save the new token, as we don't know which subId - // it's associated with. - FcmRegistrationService.enqueueJob(this); - } - - /** - * Handles FCM message for entitlement. - * - * @param message holds the message received from Firebase Cloud Messaging. - */ - @Override - public void onMessageReceived(RemoteMessage message) { - // Not testable. - onMessageReceived(message.getSenderId(), message.getData()); - } - - @VisibleForTesting - void onMessageReceived(String fcmSenderId, Map fcmData) { - Log.d(TAG, "onMessageReceived, SenderId:" + fcmSenderId); - if (!isTs43EntitlementsChangeEvent(fcmData)) { - Log.i(TAG, "Ignore message not related to entitlements change."); - return; - } - // A corner case: a FCM received after SIM is removed, and SIM inserted back later. - // We missed the FCM in this case. - scheduleEntitlementStatusCheckForSubIdAssociatedWithSenderId(fcmSenderId); - } - - private static boolean isTs43EntitlementsChangeEvent(Map dataMap) { - if (dataMap == null) { - return false; - } - Log.v(TAG, "The payload data: " + dataMap); - - // Based on GSMA TS.43 2.4.2 Messaging Infrastructure-Based Notifications, the notification - // payload for multiple applications follows: - // "data": - // { - // "app": ["ap2003", "ap2004", "ap2005"], - // "timestamp": "2019-01-29T13:15:31-08:00" - // } - if (!dataMap.containsKey(DATA_APP_KEY) || !dataMap.containsKey(DATA_TIMESTAMP_KEY)) { - Log.d(TAG, "data format error"); - return false; - } - // Check if APP_VOWIFI i.e. "ap2004" is in notification data. - if (dataMap.get(DATA_APP_KEY).contains(ServiceEntitlement.APP_VOWIFI)) { - return true; - } - return false; - } - - @VisibleForTesting - void setMockJobManager(JobManager jobManager) { - mJobManager = jobManager; - } - - private JobManager getJobManager(int subId) { - return (mJobManager != null) - ? mJobManager - : JobManager.getInstance( - this, - ImsEntitlementPollingService.COMPONENT_NAME, - subId); - } - - private void scheduleEntitlementStatusCheckForSubIdAssociatedWithSenderId(String msgSenderId) { - for (int subId : TelephonyUtils.getSubIdsWithFcmSupported(this)) { - String configSenderId = TelephonyUtils.getFcmSenderId(this, subId); - if (msgSenderId.equals(configSenderId)) { - Log.d(TAG, "check entitlement status for subscription id(" + subId + ")"); - getJobManager(subId).queryEntitlementStatusOnceNetworkReady(); - } - } - } -} diff --git a/src/com/android/imsserviceentitlement/fcm/FcmTokenStore.java b/src/com/android/imsserviceentitlement/fcm/FcmTokenStore.java deleted file mode 100644 index a972fb7..0000000 --- a/src/com/android/imsserviceentitlement/fcm/FcmTokenStore.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2021 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.android.imsserviceentitlement.fcm; - -import android.content.Context; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; -import android.text.TextUtils; -import android.util.Log; - -import androidx.annotation.WorkerThread; - -/** Stores FCM token. */ -public final class FcmTokenStore { - private static final String TAG = "IMSSE-FcmTokenStore"; - - private static final String FCM_TOKEN_FILE = "FCM_TOKEN"; - private static final String FCM_TOKEN_KEY = "FCM_TOKEN_SUB_"; - - private FcmTokenStore() {} - - /** Returns FCM token or empty string if not available. */ - public static String getToken(Context context, int subId) { - return getFcmTokenFile(context).getString(FCM_TOKEN_KEY + subId, ""); - } - - /** Returns {@code true} if FCM token available. */ - public static boolean hasToken(Context context, int subId) { - return !TextUtils.isEmpty(getToken(context, subId)); - } - - /** Saves the FCM token into data store. */ - @WorkerThread - public static boolean setToken(Context context, int subId, String token) { - if (!TextUtils.isEmpty(token)) { - return getFcmTokenFile(context) - .edit() - .putString(FCM_TOKEN_KEY + subId, token) - .commit(); - } else { - return getFcmTokenFile(context) - .edit() - .remove(FCM_TOKEN_KEY + subId) - .commit(); - } - } - - /** Registers a listener for FCM token update. */ - public static void registerTokenUpdateListener( - Context context, OnSharedPreferenceChangeListener listener) { - Log.d(TAG, "registerTokenUpdateListener"); - // Since FCM_TOKEN_FILE only contains one item FCM_TOKEN_KEY, a change to FCM_TOKEN_FILE - // means a change to FCM_TOKEN_KEY. The listener can ignore its arguments. - getFcmTokenFile(context).registerOnSharedPreferenceChangeListener(listener); - } - - /** Unregisters a listener for FCM token update. */ - public static void unregisterTokenUpdateListener( - Context context, OnSharedPreferenceChangeListener listener) { - Log.d(TAG, "unregisterTokenUpdateListener"); - // Since FCM_TOKEN_FILE only contains one item FCM_TOKEN_KEY, a change to FCM_TOKEN_FILE - // means a change to FCM_TOKEN_KEY. The listener can ignore its arguments. - getFcmTokenFile(context).unregisterOnSharedPreferenceChangeListener(listener); - } - - private static SharedPreferences getFcmTokenFile(Context context) { - return context.getSharedPreferences(FCM_TOKEN_FILE, Context.MODE_PRIVATE); - } -} diff --git a/src/com/android/imsserviceentitlement/fcm/FcmUtils.java b/src/com/android/imsserviceentitlement/fcm/FcmUtils.java deleted file mode 100644 index 70ec276..0000000 --- a/src/com/android/imsserviceentitlement/fcm/FcmUtils.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2021 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.android.imsserviceentitlement.fcm; - -import static java.util.concurrent.TimeUnit.SECONDS; - -import android.content.Context; -import android.content.SharedPreferences; -import android.util.Log; - -import androidx.annotation.WorkerThread; - -import java.util.concurrent.CountDownLatch; - -/** Convenience methods for FCM. */ -public final class FcmUtils { - public static final String LOG_TAG = "IMSSE-FcmUtils"; - - private static final long TOKEN_UPDATE_WAITING_SECONDS = 25L; - - private FcmUtils() {} - - /** Fetches FCM token, if it's not available via {@link FcmTokenStore#getToken}. */ - @WorkerThread - public static void fetchFcmToken(Context context, int subId) { - if (FcmTokenStore.hasToken(context, subId)) { - Log.d(LOG_TAG, "FCM token available."); - return; - } - - Log.d(LOG_TAG, "FCM token unavailable. Try to update..."); - final CountDownLatch tokenUpdated = new CountDownLatch(1); - final SharedPreferences.OnSharedPreferenceChangeListener listener = - (s, k) -> { - Log.d(LOG_TAG, "FCM preference changed."); - if (FcmTokenStore.hasToken(context, subId)) { - tokenUpdated.countDown(); - } - }; - FcmTokenStore.registerTokenUpdateListener(context, listener); - - // Starts a JobIntentService to update FCM token by calling FCM API on a worker thread. - FcmRegistrationService.enqueueJob(context); - - try { - // Wait for 25s. If FCM token update failed/timeout, we will let user see - // the error message returned by server. Then user can manually retry. - if (tokenUpdated.await(TOKEN_UPDATE_WAITING_SECONDS, SECONDS)) { - Log.d(LOG_TAG, "FCM token updated."); - } else { - Log.d(LOG_TAG, "FCM token update failed."); - } - } catch (InterruptedException e) { - // Do nothing - Log.d(LOG_TAG, "FCM token update interrupted."); - } - FcmTokenStore.unregisterTokenUpdateListener(context, listener); - } -} -- 2.34.1