I am using a worker manager to upload videos along with a notification. When the user tries to upload a video again with an ongoing upload worker job the notification for the second upload is not shown even though the work is being executed. I am using a unique notification Id and calling setForegroundAsync as mentioned here. I would like to have notification shown for every video upload work submitted.
P.S Sorry for my bad English. Thanks
public class PostUploadWorker extends Worker {
private PostDao postDao;
private AppPref appPref;
private HttpLoggingInterceptor logging;
private PostEntity postEntity;
private NotificationManagerCompat notificationManager;
private Bitmap videoThumbnail = null;
public PostUploadWorker(@NonNull Context context, @NonNull WorkerParameters workerParams, @NonNull HttpLoggingInterceptor logging, @NonNull AppPref appPref,
@NonNull PostDao postDao) {
super(context, workerParams);
this.logging = logging;
this.appPref = appPref;
this.postDao = postDao;
this.notificationManager = NotificationManagerCompat.from(getApplicationContext());
}
@NonNull
@Override
public Result doWork() {
// Inject fields
long postId = getInputData().getLong(Constants.INTENT_POST_ID, -1);
// upload post
if (postId != -1) {
postEntity = postDao.getPost(postId);
File videoFile = new File(postEntity.getStoragePath());
if (postEntity.getStoragePath() != null && videoFile.exists()) {
if (postEntity != null && !(postEntity.getPostStatus().equals(PostStatus.PROCESSING) || postEntity.getPostStatus().equals(PostStatus.COMPLETED))) {
try {
setForegroundAsync(createForegroundInfo(true, (int) postId));
// upload call
Call<VideoUploadResponse> uploadVideo = initRetrofit().uploadVideo(appPref.getAuth().typedToken(), body, map);
try {
Response<VideoUploadResponse> response = uploadVideo.execute();
if (response.isSuccessful() && response.body() != null) {
VideoUploadResponse vidUploadResponse = response.body();
deleteLogFile(postId);
postEntity.setPostStatus(PostStatus.PROCESSING);
postEntity.setEventId(vidUploadResponse.getEventId());
postDao.updatePost(postEntity);
trackPost("worker upload completed", postEntity);
setForegroundAsync(createForegroundInfo(false, (int) postId));
} else {
App.reportError(appPref.getAuth().getUserId(), "uploadVideo", response.code(), uploadVideo.request());
// TODO retry
trackPost("upload worker failed with response code " + response.code() + ";\n" + uploadVideo.request().toString(), postEntity);
return handlePostUploadFailure(postEntity);
}
} catch (IOException e) {
// TODO retry
App.reportError(appPref.getAuth().getUserId(), "", null, uploadVideo.request(), e.fillInStackTrace());
Log.e("PostUploadWorker", "Upload Failed with post id: " + postEntity.getId());
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
trackPost("upload worker failed with trace " + ";\n" + sw.toString(), postEntity);
return handlePostUploadFailure(postEntity);
}
} catch (Exception e) {
App.reportError(appPref.getAuth().getUserId(), "uploadWorker", null, null, e.fillInStackTrace());
Log.e("PostUploadWorker", "Upload Failed with post id: " + postEntity.getId());
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
trackPost("upload worker failed with trace " + ";\n" + sw.toString(), postEntity);
return handlePostUploadFailure(postEntity);
}
}
} else {
postEntity.setPostStatus(PostStatus.UPLOADING_FAILED);
postDao.updatePost(postEntity);
trackPost("upload worker failed. File to upload doesn't exist", postEntity);
return Result.success();
}
}
// Indicate whether the work finished successfully with the Result
if (videoThumbnail != null) videoThumbnail.recycle();
return Result.success();
}
@NonNull
private ForegroundInfo createForegroundInfo(boolean isUnderProgress, int notificationId) {
// Build a notification using bytesRead and contentLength
Context context = getApplicationContext();
String id = context.getString(R.string.uploads_notification_channel_id);
String title = context.getString(R.string.uploads_notification_title);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createChannel();
}
if (videoThumbnail == null && postEntity != null) {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
videoThumbnail = ThumbnailUtils.createVideoThumbnail(new File(postEntity.getStoragePath()), new Size(200, 200), new CancellationSignal());
} else {
videoThumbnail = ThumbnailUtils.createVideoThumbnail(postEntity.getStoragePath(), MediaStore.Images.Thumbnails.MICRO_KIND);
}
} catch (Exception e) {
e.printStackTrace();
}
}
NotificationCompat.Builder notification = new NotificationCompat.Builder(context, id)
.setContentTitle(title)
.setTicker(title);
if (videoThumbnail != null) {
notification.setLargeIcon(videoThumbnail);
}
if (postEntity != null && !TextUtils.isEmpty(postEntity.getTitle())) {
notification.setContentText(postEntity.getTitle());
notification.setStyle(new NotificationCompat.BigTextStyle()
.bigText(postEntity.getTitle()));
}
if (isUnderProgress) {
notification.setProgress(0,0, true);
notification.setPriority(NotificationCompat.PRIORITY_HIGH);
notification.setOngoing(true);
} else {
notification.setProgress(0,0, false);
notification.setContentTitle("video posted");
notification.setPriority(NotificationCompat.PRIORITY_MIN);
notification.setOngoing(false);
}
Intent intent = new Intent(getApplicationContext(), SplashActivity.class);
intent.putExtra("id", notificationId);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), notificationId, intent, 0);
Notification notification1 = notification
.setSmallIcon(R.drawable.ic_logo_remush)
.setContentIntent(pendingIntent)
.build();
return new ForegroundInfo(notificationId, notification1, 1);
}
@RequiresApi(Build.VERSION_CODES.O)
private void createChannel() {
// Create a Notification channel
CharSequence name = "post uploads";
String description = "post uploads";
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel("uploads", name, importance);
channel.setDescription(description);
channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
notificationManager.createNotificationChannel(channel);
}
private Result handlePostUploadFailure(PostEntity postEntity) {
// retry until 5 tries reached
if (postEntity.getUploadRetry() <= 5) {
postEntity.setUploadRetry(postEntity.getUploadRetry() + 1);
postDao.updatePost(postEntity);
return Result.retry();
} else {
// update failed status
postEntity.setPostStatus(PostStatus.UPLOADING_FAILED);
postDao.updatePost(postEntity);
return Result.failure();
}
}
@Override
public void onStopped() {
if (postEntity != null) trackPost("upload worker stopped", postEntity);
if (videoThumbnail != null) videoThumbnail.recycle();
super.onStopped();
}
}
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
WorkRequest postWorkRequest =
new OneTimeWorkRequest.Builder(PostUploadWorker.class)
.setInputData(new Data.Builder()
.putLong(Constants.INTENT_POST_ID, postEntity.getId())
.build())
.setConstraints(constraints)
.addTag("vid_upload_" + postEntity.getId())
.setBackoffCriteria(
BackoffPolicy.LINEAR,
10L,
TimeUnit.SECONDS)
.build();