|  | @@ -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());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |