Skip to content

Commit 2f07949

Browse files
Fixed race condition between activity start and stop on Android.
When activityStop is called quickly after activityStart, abort the asynchronous operation for showing the progress if it has not yet executed.
1 parent ede58c7 commit 2f07949

File tree

1 file changed

+34
-22
lines changed

1 file changed

+34
-22
lines changed

src/android/Notification.java

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ public class Notification extends CordovaPlugin {
5151
public int confirmResult = -1;
5252
public ProgressDialog spinnerDialog = null;
5353
public ProgressDialog progressDialog = null;
54-
54+
55+
private Runnable spinnerDialogUpdate = null;
56+
5557
/**
5658
* Constructor.
5759
*/
@@ -366,32 +368,39 @@ public synchronized void activityStart(final String title, final String message,
366368
}*/
367369
final Notification notification = this;
368370
final CordovaInterface cordova = this.cordova;
369-
Runnable runnable = new Runnable() {
371+
this.spinnerDialogUpdate = new Runnable() {
370372
public void run() {
371-
if (notification.spinnerDialog != null) { //update
372-
notification.spinnerDialog.setTitle(title);
373-
notification.spinnerDialog.setMessage(message);
374-
notification.spinnerDialog.setCancelable(cancelable);
375-
if (!notification.spinnerDialog.isShowing()) {
373+
synchronized (notification) {
374+
if (notification.spinnerDialogUpdate != this) {
375+
return; // operation aborted before run
376+
}
377+
notification.spinnerDialogUpdate = null;
378+
379+
if (notification.spinnerDialog != null) { //update
380+
notification.spinnerDialog.setTitle(title);
381+
notification.spinnerDialog.setMessage(message);
382+
notification.spinnerDialog.setCancelable(cancelable);
383+
if (!notification.spinnerDialog.isShowing()) {
384+
notification.spinnerDialog.show();
385+
}
386+
} else {
387+
notification.spinnerDialog = createProgressDialog(cordova); // new ProgressDialog(cordova.getActivity(), AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
388+
notification.spinnerDialog.setTitle(title);
389+
notification.spinnerDialog.setMessage(message);
390+
notification.spinnerDialog.setCancelable(cancelable);
391+
notification.spinnerDialog.setIndeterminate(true);
392+
notification.spinnerDialog.setOnCancelListener(
393+
new DialogInterface.OnCancelListener() {
394+
public void onCancel(DialogInterface dialog) {
395+
notification.spinnerDialog = null;
396+
}
397+
});
376398
notification.spinnerDialog.show();
377399
}
378-
} else {
379-
notification.spinnerDialog = createProgressDialog(cordova); // new ProgressDialog(cordova.getActivity(), AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
380-
notification.spinnerDialog.setTitle(title);
381-
notification.spinnerDialog.setMessage(message);
382-
notification.spinnerDialog.setCancelable(cancelable);
383-
notification.spinnerDialog.setIndeterminate(true);
384-
notification.spinnerDialog.setOnCancelListener(
385-
new DialogInterface.OnCancelListener() {
386-
public void onCancel(DialogInterface dialog) {
387-
notification.spinnerDialog = null;
388-
}
389-
});
390-
notification.spinnerDialog.show();
391-
}
400+
}
392401
}
393402
};
394-
this.cordova.getActivity().runOnUiThread(runnable);
403+
this.cordova.getActivity().runOnUiThread(this.spinnerDialogUpdate);
395404
}
396405

397406
/**
@@ -402,6 +411,9 @@ public synchronized void activityStop() {
402411
this.spinnerDialog.dismiss();
403412
this.spinnerDialog = null;
404413
}
414+
if (this.spinnerDialogUpdate != null) {
415+
this.spinnerDialogUpdate = null;
416+
}
405417
}
406418

407419
/**

0 commit comments

Comments
 (0)