mirror of
https://github.com/apache/cordova-android.git
synced 2025-02-27 04:42:51 +08:00
356 lines
10 KiB
Java
Executable File
356 lines
10 KiB
Java
Executable File
/*
|
|
* PhoneGap is available under *either* the terms of the modified BSD license *or* the
|
|
* MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
|
|
*
|
|
* Copyright (c) 2005-2010, Nitobi Software Inc.
|
|
* Copyright (c) 2010, IBM Corporation
|
|
*/
|
|
package com.phonegap;
|
|
|
|
import org.json.JSONArray;
|
|
import org.json.JSONException;
|
|
import com.phonegap.api.Plugin;
|
|
import com.phonegap.api.PhonegapActivity;
|
|
import com.phonegap.api.PluginResult;
|
|
import android.app.AlertDialog;
|
|
import android.app.ProgressDialog;
|
|
import android.content.Context;
|
|
import android.content.DialogInterface;
|
|
import android.media.Ringtone;
|
|
import android.media.RingtoneManager;
|
|
import android.net.Uri;
|
|
import android.os.Vibrator;
|
|
|
|
/**
|
|
* This class provides access to notifications on the device.
|
|
*/
|
|
public class Notification extends Plugin {
|
|
|
|
public int confirmResult = -1;
|
|
public ProgressDialog spinnerDialog = null;
|
|
public ProgressDialog progressDialog = null;
|
|
|
|
/**
|
|
* Constructor.
|
|
*/
|
|
public Notification() {
|
|
}
|
|
|
|
/**
|
|
* Executes the request and returns PluginResult.
|
|
*
|
|
* @param action The action to execute.
|
|
* @param args JSONArry of arguments for the plugin.
|
|
* @param callbackId The callback id used when calling back into JavaScript.
|
|
* @return A PluginResult object with a status and message.
|
|
*/
|
|
public PluginResult execute(String action, JSONArray args, String callbackId) {
|
|
PluginResult.Status status = PluginResult.Status.OK;
|
|
String result = "";
|
|
|
|
try {
|
|
if (action.equals("beep")) {
|
|
this.beep(args.getLong(0));
|
|
}
|
|
else if (action.equals("vibrate")) {
|
|
this.vibrate(args.getLong(0));
|
|
}
|
|
else if (action.equals("alert")) {
|
|
this.alert(args.getString(0),args.getString(1),args.getString(2), callbackId);
|
|
PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
|
|
r.setKeepCallback(true);
|
|
return r;
|
|
}
|
|
else if (action.equals("confirm")) {
|
|
this.confirm(args.getString(0),args.getString(1),args.getString(2), callbackId);
|
|
PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
|
|
r.setKeepCallback(true);
|
|
return r;
|
|
}
|
|
else if (action.equals("activityStart")) {
|
|
this.activityStart(args.getString(0),args.getString(1));
|
|
}
|
|
else if (action.equals("activityStop")) {
|
|
this.activityStop();
|
|
}
|
|
else if (action.equals("progressStart")) {
|
|
this.progressStart(args.getString(0),args.getString(1));
|
|
}
|
|
else if (action.equals("progressValue")) {
|
|
this.progressValue(args.getInt(0));
|
|
}
|
|
else if (action.equals("progressStop")) {
|
|
this.progressStop();
|
|
}
|
|
return new PluginResult(status, result);
|
|
} catch (JSONException e) {
|
|
return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Identifies if action to be executed returns a value and should be run synchronously.
|
|
*
|
|
* @param action The action to execute
|
|
* @return T=returns value
|
|
*/
|
|
public boolean isSynch(String action) {
|
|
if (action.equals("alert")) {
|
|
return true;
|
|
}
|
|
else if (action.equals("confirm")) {
|
|
return true;
|
|
}
|
|
else if (action.equals("activityStart")) {
|
|
return true;
|
|
}
|
|
else if (action.equals("activityStop")) {
|
|
return true;
|
|
}
|
|
else if (action.equals("progressStart")) {
|
|
return true;
|
|
}
|
|
else if (action.equals("progressValue")) {
|
|
return true;
|
|
}
|
|
else if (action.equals("progressStop")) {
|
|
return true;
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------------------
|
|
// LOCAL METHODS
|
|
//--------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Beep plays the default notification ringtone.
|
|
*
|
|
* @param count Number of times to play notification
|
|
*/
|
|
public void beep(long count) {
|
|
Uri ringtone = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
|
|
Ringtone notification = RingtoneManager.getRingtone(this.ctx, ringtone);
|
|
|
|
// If phone is not set to silent mode
|
|
if (notification != null) {
|
|
for (long i = 0; i < count; ++i) {
|
|
notification.play();
|
|
long timeout = 5000;
|
|
while (notification.isPlaying() && (timeout > 0)) {
|
|
timeout = timeout - 100;
|
|
try {
|
|
Thread.sleep(100);
|
|
} catch (InterruptedException e) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Vibrates the device for the specified amount of time.
|
|
*
|
|
* @param time Time to vibrate in ms.
|
|
*/
|
|
public void vibrate(long time){
|
|
// Start the vibration, 0 defaults to half a second.
|
|
if (time == 0) {
|
|
time = 500;
|
|
}
|
|
Vibrator vibrator = (Vibrator) this.ctx.getSystemService(Context.VIBRATOR_SERVICE);
|
|
vibrator.vibrate(time);
|
|
}
|
|
|
|
/**
|
|
* Builds and shows a native Android alert with given Strings
|
|
* @param message The message the alert should display
|
|
* @param title The title of the alert
|
|
* @param buttonLabel The label of the button
|
|
* @param callbackId The callback id
|
|
*/
|
|
public synchronized void alert(final String message, final String title, final String buttonLabel, final String callbackId) {
|
|
|
|
final PhonegapActivity ctx = this.ctx;
|
|
final Notification notification = this;
|
|
|
|
Runnable runnable = new Runnable() {
|
|
public void run() {
|
|
|
|
AlertDialog.Builder dlg = new AlertDialog.Builder(ctx);
|
|
dlg.setMessage(message);
|
|
dlg.setTitle(title);
|
|
dlg.setCancelable(false);
|
|
dlg.setPositiveButton(buttonLabel,
|
|
new AlertDialog.OnClickListener() {
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
dialog.dismiss();
|
|
notification.success(new PluginResult(PluginResult.Status.OK, 0), callbackId);
|
|
}
|
|
});
|
|
dlg.create();
|
|
dlg.show();
|
|
};
|
|
};
|
|
this.ctx.runOnUiThread(runnable);
|
|
}
|
|
|
|
/**
|
|
* Builds and shows a native Android confirm dialog with given title, message, buttons.
|
|
* This dialog only shows up to 3 buttons. Any labels after that will be ignored.
|
|
* The index of the button pressed will be returned to the JavaScript callback identified by callbackId.
|
|
*
|
|
* @param message The message the dialog should display
|
|
* @param title The title of the dialog
|
|
* @param buttonLabels A comma separated list of button labels (Up to 3 buttons)
|
|
* @param callbackId The callback id
|
|
*/
|
|
public synchronized void confirm(final String message, final String title, String buttonLabels, final String callbackId) {
|
|
|
|
final PhonegapActivity ctx = this.ctx;
|
|
final Notification notification = this;
|
|
final String[] fButtons = buttonLabels.split(",");
|
|
|
|
Runnable runnable = new Runnable() {
|
|
public void run() {
|
|
AlertDialog.Builder dlg = new AlertDialog.Builder(ctx);
|
|
dlg.setMessage(message);
|
|
dlg.setTitle(title);
|
|
dlg.setCancelable(false);
|
|
|
|
// 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
|
|
if (fButtons.length > 1) {
|
|
dlg.setNeutralButton(fButtons[1],
|
|
new AlertDialog.OnClickListener() {
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
dialog.dismiss();
|
|
notification.success(new PluginResult(PluginResult.Status.OK, 2), callbackId);
|
|
}
|
|
});
|
|
}
|
|
|
|
// Third button
|
|
if (fButtons.length > 2) {
|
|
dlg.setNegativeButton(fButtons[2],
|
|
new AlertDialog.OnClickListener() {
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
dialog.dismiss();
|
|
notification.success(new PluginResult(PluginResult.Status.OK, 3), callbackId);
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|
|
dlg.create();
|
|
dlg.show();
|
|
};
|
|
};
|
|
this.ctx.runOnUiThread(runnable);
|
|
}
|
|
|
|
/**
|
|
* Show the spinner.
|
|
*
|
|
* @param title Title of the dialog
|
|
* @param message The message of the dialog
|
|
*/
|
|
public synchronized void activityStart(final String title, final String message) {
|
|
if (this.spinnerDialog != null) {
|
|
this.spinnerDialog.dismiss();
|
|
this.spinnerDialog = null;
|
|
}
|
|
final Notification notification = this;
|
|
final PhonegapActivity ctx = this.ctx;
|
|
Runnable runnable = new Runnable() {
|
|
public void run() {
|
|
notification.spinnerDialog = ProgressDialog.show(ctx, title , message, true, true,
|
|
new DialogInterface.OnCancelListener() {
|
|
public void onCancel(DialogInterface dialog) {
|
|
notification.spinnerDialog = null;
|
|
}
|
|
});
|
|
}
|
|
};
|
|
this.ctx.runOnUiThread(runnable);
|
|
}
|
|
|
|
/**
|
|
* Stop spinner.
|
|
*/
|
|
public synchronized void activityStop() {
|
|
if (this.spinnerDialog != null) {
|
|
this.spinnerDialog.dismiss();
|
|
this.spinnerDialog = null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Show the progress dialog.
|
|
*
|
|
* @param title Title of the dialog
|
|
* @param message The message of the dialog
|
|
*/
|
|
public synchronized void progressStart(final String title, final String message) {
|
|
if (this.progressDialog != null) {
|
|
this.progressDialog.dismiss();
|
|
this.progressDialog = null;
|
|
}
|
|
final Notification notification = this;
|
|
final PhonegapActivity ctx = this.ctx;
|
|
Runnable runnable = new Runnable() {
|
|
public void run() {
|
|
notification.progressDialog = new ProgressDialog(ctx);
|
|
notification.progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
|
|
notification.progressDialog.setTitle(title);
|
|
notification.progressDialog.setMessage(message);
|
|
notification.progressDialog.setCancelable(true);
|
|
notification.progressDialog.setMax(100);
|
|
notification.progressDialog.setProgress(0);
|
|
notification.progressDialog.setOnCancelListener(
|
|
new DialogInterface.OnCancelListener() {
|
|
public void onCancel(DialogInterface dialog) {
|
|
notification.progressDialog = null;
|
|
}
|
|
});
|
|
notification.progressDialog.show();
|
|
}
|
|
};
|
|
this.ctx.runOnUiThread(runnable);
|
|
}
|
|
|
|
/**
|
|
* Set value of progress bar.
|
|
*
|
|
* @param value 0-100
|
|
*/
|
|
public synchronized void progressValue(int value) {
|
|
if (this.progressDialog != null) {
|
|
this.progressDialog.setProgress(value);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Stop progress dialog.
|
|
*/
|
|
public synchronized void progressStop() {
|
|
if (this.progressDialog != null) {
|
|
this.progressDialog.dismiss();
|
|
this.progressDialog = null;
|
|
}
|
|
}
|
|
|
|
}
|