package com.blogspot.developersu.ns_usbloader.service; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.os.ResultReceiver; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import com.blogspot.developersu.ns_usbloader.MainActivity; import com.blogspot.developersu.ns_usbloader.NsConstants; import com.blogspot.developersu.ns_usbloader.R; abstract class TransferTask { private final static boolean isModernAndroidOs = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O; private NotificationManager notificationManager; private NotificationCompat.Builder notificationBuilder; private ResultReceiver resultReceiver; Context context; String issueDescription; String status = ""; volatile boolean interrupt; TransferTask(ResultReceiver resultReceiver, Context context){ this.interrupt = false; this.resultReceiver = resultReceiver; this.context = context; this.createNotificationChannel(); this.notificationBuilder = new NotificationCompat.Builder(context, NsConstants.NOTIFICATION_FOREGROUND_SERVICE_CHAN_ID) .setSmallIcon(R.drawable.ic_notification) .setPriority(NotificationCompat.PRIORITY_LOW) .setContentTitle(context.getString(R.string.notification_transfer_in_progress)) .setOnlyAlertOnce(true) .setOngoing(true) .setContentIntent(PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), 0)); } String getIssueDescription() { return issueDescription; } String getStatus() { return status; } void resetProgressBar(){ resultReceiver.send(NsConstants.NS_RESULT_PROGRESS_INDETERMINATE, Bundle.EMPTY); resetNotificationProgressBar(); } void updateProgressBar(int currentPosition){ Bundle bundle = new Bundle(); bundle.putInt("POSITION", currentPosition); resultReceiver.send(NsConstants.NS_RESULT_PROGRESS_VALUE, bundle); updateNotificationProgressBar(currentPosition); } /** * Main work routine here * @return true if issue, false if not * */ abstract boolean run(); /** * What shall we do in case of user interruption * */ void cancel(){ interrupt = true; } private void updateNotificationProgressBar(int value){ final Notification notify = notificationBuilder.setProgress(100, value, false).setContentText(value+"%").build(); if (isModernAndroidOs) { notificationManager.notify(NsConstants.NOTIFICATION_TRANSFER_ID, notify); return; } NotificationManagerCompat.from(context).notify(NsConstants.NOTIFICATION_TRANSFER_ID, notify); } private void resetNotificationProgressBar(){ final Notification notify = notificationBuilder.setProgress(0, 0, true).setContentText("").build(); if (isModernAndroidOs) { notificationManager.notify(NsConstants.NOTIFICATION_TRANSFER_ID, notify); return; } NotificationManagerCompat.from(context).notify(NsConstants.NOTIFICATION_TRANSFER_ID, notify); } private void createNotificationChannel(){ if (isModernAndroidOs) { CharSequence notificationChanName = context.getString(R.string.notification_chan_name_progress); String notificationChanDesc = context.getString(R.string.notification_chan_desc_progress); NotificationChannel notificationChannel = new NotificationChannel( NsConstants.NOTIFICATION_FOREGROUND_SERVICE_CHAN_ID, notificationChanName, NotificationManager.IMPORTANCE_DEFAULT); notificationChannel.setDescription(notificationChanDesc); notificationManager = context.getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(notificationChannel); } } }