I am still really new to Android and I am trying to improve my notification's progress bar to be smoother, not fire a million updates to my Pebble and do it the "right way". This code works "fine" as in when I am using it, the notification draws and the progress bar completes as expected.
It became an issue to me when I set my Pebble watch to accept my app's notifications. Which causes it to vibrate about 50 times per image that uploads depending on how fast the upload speed is.
Being a beginner I assume I am doing this all wrong and there is a much better way to do what I am trying to do.
My notification's progress bar is updated with the following code:
private int upload_progress;
private Long time_previous_progress = Calendar.getInstance().getTimeInMillis();
protected void onProgressUpdate(Integer... progress) {
Long time_now = Calendar.getInstance().getTimeInMillis();
if(
((time_now - time_previous_progress) < 55) // 55ms minimum delay
|| (progress[0] < 0 && progress[0] > 100) // progress >0 && <100
|| progress[0].equals(upload_progress) // progress changed
|| ! App.getStatus() // watcher is running
)
{
return;
}
time_previous_progress = time_now;
upload_progress = progress[0];
int upload_counter = getUploadCounter();
int upload_total = db.getReadyImagesCount();
NotificationHandler.notify(context, upload_progress, upload_counter, (upload_total + upload_counter));
}
The notification is then generated with this code:
public static int notify(Context context, Integer progress, Integer upload_count, Integer upload_total)
{
Bitmap bm = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher);
String notif_title = context.getResources().getString(R.string.instant_upload_title);
String notif_progress = context.getResources().getString(R.string.instant_upload_progress);
String notif_ticker = String.format(notif_progress, upload_count, upload_total);
String notif_msg = String.format(notif_progress, upload_count, upload_total);
Intent intent_swipe = new Intent(context, NotifyReceiver.class);
intent_swipe.setAction("notification_cancelled");
PendingIntent pendingIntent_swipe = PendingIntent.getBroadcast(context, 0, intent_swipe, PendingIntent.FLAG_CANCEL_CURRENT);
Intent intent_click = new Intent(context, Settings.class);
intent_click.putExtra("notification_clicked", true);
PendingIntent pendingIntent_click = PendingIntent.getActivity(context, 0, intent_click, PendingIntent.FLAG_CANCEL_CURRENT);
int pro_max = 100;
int pro_cur = 0;
if(progress < 100)
{
pro_cur = progress;
}else{
pro_cur = pro_max = 0;
}
//new NotificationCompat.Builder(context)
NotificationCompat.Builder builder = new NotificationCompat.Builder(context) //PixelRelayApplication.getNotificationBuilder()
.setTicker(notif_ticker)
.setContentTitle(notif_title)
.setContentText(notif_msg)
.setNumber(upload_count)
.setSmallIcon(R.drawable.ic_launcher)
.setLargeIcon(bm)
.setContentIntent(pendingIntent_click)
.setDeleteIntent(pendingIntent_swipe)
.setAutoCancel(true)
.setOngoing(true)
.setWhen(Calendar.getInstance().getTimeInMillis())
.setProgress(pro_max, pro_cur, false);
Notification notification = builder.build();
// Put the auto cancel notification flag
notification.flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONLY_ALERT_ONCE;
NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFY_ME_ID, notification);
return NOTIFY_ME_ID;
}
Display a Fixed-duration Progress Indicator To display a determinate progress bar, add the bar to your notification by calling setProgress(max, progress, false) and then issue the notification. The third argument is a boolean that indicates whether the progress bar is indeterminate (true) or determinate (false).
In Android, in order to display a progress bar in a Notification, you just need to initialize setProgress(...) into the Notification. Builder. Note that, in your case, you would probably want to use even the setOngoing(true) flag. Absolutely helpful!
Generally, the progress indicators in android are implemented by using the ProgressBar class. To display the progress indicators in our app, we need to add the progress bar to our notification by calling setProgress(max, progress, false) method and then issue the notification.
You can use the open source code that is working properly for the idea you have in mind accessing it through Github: Progress Watch - A progress bar watchface for pebble. In case you decide to reuse the code, my suggestions are:
I fixed this by setting the ongoing flag after the first notification.
So, reuse the builder, and after the first notification is sent, update the builder so it creates ongoing notifications instead:
builder.setOngoing(true);
Of course this also means that the updated notification will become ongoing, http://developer.android.com/reference/android/app/Notification.Builder.html#setOngoing(boolean)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With