Alert and notification dialogs should be run on UI thread.

This commit is contained in:
Bryce Curtis 2010-10-25 14:35:02 -05:00
parent 5647e54399
commit 153d42f693

View File

@ -18,7 +18,6 @@ import android.content.DialogInterface;
import android.media.Ringtone; import android.media.Ringtone;
import android.media.RingtoneManager; import android.media.RingtoneManager;
import android.net.Uri; import android.net.Uri;
import android.os.Looper;
import android.os.Vibrator; import android.os.Vibrator;
/** /**
@ -56,14 +55,12 @@ public class Notification extends Plugin {
this.vibrate(args.getLong(0)); this.vibrate(args.getLong(0));
} }
else if (action.equals("alert")) { else if (action.equals("alert")) {
Looper.prepare();
this.alert(args.getString(0),args.getString(1),args.getString(2), callbackId); this.alert(args.getString(0),args.getString(1),args.getString(2), callbackId);
Looper.loop(); return new PluginResult(PluginResult.Status.RESULT_TO_BE_SENT);
} }
else if (action.equals("confirm")) { else if (action.equals("confirm")) {
Looper.prepare();
this.confirm(args.getString(0),args.getString(1),args.getString(2), callbackId); this.confirm(args.getString(0),args.getString(1),args.getString(2), callbackId);
Looper.loop(); return new PluginResult(PluginResult.Status.RESULT_TO_BE_SENT);
} }
else if (action.equals("activityStart")) { else if (action.equals("activityStart")) {
this.activityStart(args.getString(0),args.getString(1)); this.activityStart(args.getString(0),args.getString(1));
@ -94,10 +91,10 @@ public class Notification extends Plugin {
*/ */
public boolean isSynch(String action) { public boolean isSynch(String action) {
if (action.equals("alert")) { if (action.equals("alert")) {
return false; return true;
} }
else if (action.equals("confirm")) { else if (action.equals("confirm")) {
return false; return true;
} }
else if (action.equals("activityStart")) { else if (action.equals("activityStart")) {
return true; return true;
@ -169,23 +166,30 @@ public class Notification extends Plugin {
* @param buttonLabel The label of the button * @param buttonLabel The label of the button
* @param callbackId The callback id * @param callbackId The callback id
*/ */
public synchronized void alert(String message,String title,String buttonLabel, String callbackId) { public synchronized void alert(final String message, final String title, final String buttonLabel, final String callbackId) {
final DroidGap ctx = this.ctx;
final Notification notification = this; final Notification notification = this;
final String fCallbackId = callbackId;
AlertDialog.Builder dlg = new AlertDialog.Builder(this.ctx); Runnable runnable = new Runnable() {
dlg.setMessage(message); public void run() {
dlg.setTitle(title);
dlg.setCancelable(false); AlertDialog.Builder dlg = new AlertDialog.Builder(ctx);
dlg.setPositiveButton(buttonLabel, dlg.setMessage(message);
new AlertDialog.OnClickListener() { dlg.setTitle(title);
public void onClick(DialogInterface dialog, int which) { dlg.setCancelable(false);
dialog.dismiss(); dlg.setPositiveButton(buttonLabel,
notification.success(new PluginResult(PluginResult.Status.OK, 0), fCallbackId); new AlertDialog.OnClickListener() {
} public void onClick(DialogInterface dialog, int which) {
}); dialog.dismiss();
dlg.create(); notification.success(new PluginResult(PluginResult.Status.OK, 0), callbackId);
dlg.show(); }
});
dlg.create();
dlg.show();
};
};
this.ctx.runOnUiThread(runnable);
} }
/** /**
@ -198,54 +202,58 @@ public class Notification extends Plugin {
* @param buttonLabels A comma separated list of button labels (Up to 3 buttons) * @param buttonLabels A comma separated list of button labels (Up to 3 buttons)
* @param callbackId The callback id * @param callbackId The callback id
*/ */
public synchronized void confirm(final String message, final String title, String buttonLabels, String callbackId) { public synchronized void confirm(final String message, final String title, String buttonLabels, final String callbackId) {
final DroidGap ctx = this.ctx; final DroidGap ctx = this.ctx;
final Notification notification = this; final Notification notification = this;
final String[] fButtons = buttonLabels.split(","); final String[] fButtons = buttonLabels.split(",");
final String fCallbackId = callbackId;
AlertDialog.Builder dlg = new AlertDialog.Builder(ctx);
dlg.setMessage(message);
dlg.setTitle(title);
dlg.setCancelable(false);
// First button Runnable runnable = new Runnable() {
if (fButtons.length > 0) { public void run() {
dlg.setPositiveButton(fButtons[0], AlertDialog.Builder dlg = new AlertDialog.Builder(ctx);
new AlertDialog.OnClickListener() { dlg.setMessage(message);
public void onClick(DialogInterface dialog, int which) { dlg.setTitle(title);
dialog.dismiss(); dlg.setCancelable(false);
notification.success(new PluginResult(PluginResult.Status.OK, 1), fCallbackId);
// First button
if (fButtons.length > 0) {
dlg.setPositiveButton(fButtons[0],
new AlertDialog.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
notification.success(new PluginResult(PluginResult.Status.OK, 1), callbackId);
}
});
} }
});
}
// Second button // Second button
if (fButtons.length > 1) { if (fButtons.length > 1) {
dlg.setNeutralButton(fButtons[1], dlg.setNeutralButton(fButtons[1],
new AlertDialog.OnClickListener() { new AlertDialog.OnClickListener() {
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
dialog.dismiss(); dialog.dismiss();
notification.success(new PluginResult(PluginResult.Status.OK, 2), fCallbackId); notification.success(new PluginResult(PluginResult.Status.OK, 2), callbackId);
}
});
} }
});
}
// Third button // Third button
if (fButtons.length > 2) { if (fButtons.length > 2) {
dlg.setNegativeButton(fButtons[2], dlg.setNegativeButton(fButtons[2],
new AlertDialog.OnClickListener() { new AlertDialog.OnClickListener() {
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
dialog.dismiss(); dialog.dismiss();
notification.success(new PluginResult(PluginResult.Status.OK, 3), fCallbackId); notification.success(new PluginResult(PluginResult.Status.OK, 3), callbackId);
}
}
);
} }
}
);
}
dlg.create(); dlg.create();
dlg.show(); dlg.show();
};
};
this.ctx.runOnUiThread(runnable);
} }
/** /**