com.phonegap.Notification.java Source code

Java tutorial

Introduction

Here is the source code for com.phonegap.Notification.java

Source

/*
 * 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;
        }
    }

}