|
@@ -0,0 +1,201 @@
|
|
|
+package com.vpn.fastestvpnservice.fcm;
|
|
|
+
|
|
|
+import android.app.NotificationChannel;
|
|
|
+import android.app.NotificationManager;
|
|
|
+import android.app.PendingIntent;
|
|
|
+import android.content.Context;
|
|
|
+import android.content.Intent;
|
|
|
+import android.media.RingtoneManager;
|
|
|
+import android.net.Uri;
|
|
|
+import android.os.Build;
|
|
|
+import android.util.Log;
|
|
|
+
|
|
|
+import androidx.core.app.NotificationCompat;
|
|
|
+import com.google.firebase.messaging.FirebaseMessagingService;
|
|
|
+import com.google.firebase.messaging.RemoteMessage;
|
|
|
+import com.vpn.fastestvpnservice.MainActivity;
|
|
|
+import com.vpn.fastestvpnservice.R;
|
|
|
+import com.vpn.fastestvpnservice.application.App;
|
|
|
+import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper;
|
|
|
+
|
|
|
+import kotlinx.coroutines.Job;
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Created by
|
|
|
+ * Mykhailo on 11/16/2016.
|
|
|
+ */
|
|
|
+
|
|
|
+public class PetsFirebaseMessagingService extends FirebaseMessagingService {
|
|
|
+
|
|
|
+ private static final String TAG = "MyFirebaseMsgService";
|
|
|
+ BasePreferenceHelper prefHelper;
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Called when message is received.
|
|
|
+ *
|
|
|
+ * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
|
|
|
+ */
|
|
|
+ // [START receive_message]
|
|
|
+ @Override
|
|
|
+ public void onMessageReceived(RemoteMessage remoteMessage) {
|
|
|
+ // [START_EXCLUDE]
|
|
|
+ // There are two types of messages data messages and notification messages. Data messages
|
|
|
+ // are handled
|
|
|
+ // here in onMessageReceived whether the app is in the foreground or background. Data
|
|
|
+ // messages are the type
|
|
|
+ // traditionally used with GCM. Notification messages are only received here in
|
|
|
+ // onMessageReceived when the app
|
|
|
+ // is in the foreground. When the app is in the background an automatically generated
|
|
|
+ // notification is displayed.
|
|
|
+ // When the user taps on the notification they are returned to the app. Messages
|
|
|
+ // containing both notification
|
|
|
+ // and data payloads are treated as notification messages. The Firebase console always
|
|
|
+ // sends notification
|
|
|
+ // messages. For more see: https://firebase.google.com/docs/cloud-messaging/concept-options
|
|
|
+ // [END_EXCLUDE]
|
|
|
+
|
|
|
+ // TODO(developer): Handle FCM messages here.
|
|
|
+ // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
|
|
|
+ Log.d(TAG, "From: " + remoteMessage.getFrom());
|
|
|
+
|
|
|
+ // Check if message contains a data payload.
|
|
|
+ if (remoteMessage.getData().size() > 0) {
|
|
|
+ Log.d(TAG, "Message data payload: " + remoteMessage.getData());
|
|
|
+ sendNotification(remoteMessage.getData().get("title"), remoteMessage.getData().get("body"));
|
|
|
+
|
|
|
+ if (/* Check if data needs to be processed by long running job */ false) { // by default true, using false to prevent crash on Android 13
|
|
|
+ // For long-running tasks (10 seconds or more) use Firebase Job Dispatcher.
|
|
|
+ scheduleJob();
|
|
|
+ } else {
|
|
|
+ // Handle message within 10 seconds
|
|
|
+ handleNow();
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check if message contains a notification payload.
|
|
|
+ if (remoteMessage.getNotification() != null) {
|
|
|
+ Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
|
|
|
+ sendNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
|
|
|
+ }
|
|
|
+
|
|
|
+ // Also if you intend on generating your own notifications as a result of a received FCM
|
|
|
+ // message, here is where that should be initiated. See sendNotification method below.
|
|
|
+ }
|
|
|
+ // [END receive_message]
|
|
|
+
|
|
|
+
|
|
|
+ // [START on_new_token]
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Called if InstanceID token is updated. This may occur if the security of
|
|
|
+ * the previous token had been compromised. Note that this is called when the InstanceID token
|
|
|
+ * is initially generated so this is where you would retrieve the token.
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void onNewToken(String token) {
|
|
|
+ Log.d(TAG, "Refreshed token: " + token);
|
|
|
+
|
|
|
+ prefHelper = new BasePreferenceHelper(App.getApplication());
|
|
|
+ prefHelper.saveFcmToken(token);
|
|
|
+
|
|
|
+
|
|
|
+ // If you want to send messages to this application instance or
|
|
|
+ // manage this apps subscriptions on the server side, send the
|
|
|
+ // Instance ID token to your app server.
|
|
|
+ sendRegistrationToServer(token);
|
|
|
+ }
|
|
|
+ // [END on_new_token]
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Schedule a job using FirebaseJobDispatcher.
|
|
|
+ */
|
|
|
+ private void scheduleJob() {
|
|
|
+ // [START dispatch_job]
|
|
|
+// FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
|
|
|
+// Job myJob = dispatcher.newJobBuilder()
|
|
|
+// .setService(MyJobService.class)
|
|
|
+// .setTag("my-job-tag")
|
|
|
+// .build();
|
|
|
+// dispatcher.schedule(myJob);
|
|
|
+ // [END dispatch_job]
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Handle time allotted to BroadcastReceivers.
|
|
|
+ */
|
|
|
+ private void handleNow() {
|
|
|
+ Log.d(TAG, "Short lived task is done.");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Persist token to third-party servers.
|
|
|
+ * <p>
|
|
|
+ * Modify this method to associate the user's FCM InstanceID token with any server-side account
|
|
|
+ * maintained by your application.
|
|
|
+ *
|
|
|
+ * @param token The new token.
|
|
|
+ */
|
|
|
+ private void sendRegistrationToServer(String token) {
|
|
|
+ // TODO: Implement this method to send token to your app server.
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Create and show a simple notification containing the received FCM message.
|
|
|
+ *
|
|
|
+ * @param title
|
|
|
+ * @param messageBody FCM message body received.
|
|
|
+ */
|
|
|
+ private void sendNotification(String title, String messageBody) {
|
|
|
+ Intent intent = new Intent(this, MainActivity.class);
|
|
|
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
|
|
+// PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
|
|
|
+// PendingIntent.FLAG_ONE_SHOT);
|
|
|
+// PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
|
|
|
+// PendingIntent.FLAG_IMMUTABLE);
|
|
|
+ PendingIntent pendingIntent = null;
|
|
|
+
|
|
|
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
|
|
+ pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
|
|
|
+ PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
|
|
|
+ }
|
|
|
+// else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
|
+// pendingIntent = PendingIntent.getForegroundService(this, 0, intent,
|
|
|
+// PendingIntent.FLAG_IMMUTABLE);
|
|
|
+// }
|
|
|
+ else{
|
|
|
+ pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
|
|
|
+ PendingIntent.FLAG_IMMUTABLE);
|
|
|
+ }
|
|
|
+
|
|
|
+ String channelId = getString(R.string.default_notification_channel_id);
|
|
|
+ Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
|
|
|
+
|
|
|
+ NotificationCompat.Builder notificationBuilder =
|
|
|
+ new NotificationCompat.Builder(this, channelId)
|
|
|
+// .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_logo))
|
|
|
+ .setSmallIcon(R.drawable.ic_logo_notify)
|
|
|
+ .setColor(getResources().getColor(R.color.app_yellow_color))
|
|
|
+// .setContentTitle("New Message")
|
|
|
+ .setContentTitle(title + "")
|
|
|
+ .setContentText(messageBody)
|
|
|
+ .setAutoCancel(true)
|
|
|
+ .setSound(defaultSoundUri)
|
|
|
+ .setContentIntent(pendingIntent);
|
|
|
+
|
|
|
+ NotificationManager notificationManager =
|
|
|
+ (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
|
|
+
|
|
|
+ // Since android Oreo notification channel is needed.
|
|
|
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
|
+ NotificationChannel channel = new NotificationChannel(channelId,
|
|
|
+ "Channel human readable title",
|
|
|
+ NotificationManager.IMPORTANCE_DEFAULT);
|
|
|
+ notificationManager.createNotificationChannel(channel);
|
|
|
+ }
|
|
|
+
|
|
|
+ notificationManager.notify(App.NOTIFICATION_ID /* ID of notification */, notificationBuilder.build());
|
|
|
+ }
|
|
|
+}
|