de.appplant.cordova.plugin.EmailComposer.java Source code

Java tutorial

Introduction

Here is the source code for de.appplant.cordova.plugin.EmailComposer.java

Source

/**
 *  EmailComposer.java
 *  Cordova Email Composition Plugin
 *
 *  Created by Sebastian Katzer (github.com/katzer) on 16/08/2013.
 *  Copyright 2013 Sebastian Katzer. All rights reserved.
 *  GPL v2 licensed
 */

package de.appplant.cordova.plugin;

import java.io.File;
import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Intent;
import android.net.Uri;
import android.text.Html;

import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.PluginResult;

public class EmailComposer extends CordovaPlugin {

    private CallbackContext ctx;

    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        // Eine E-Mail soll versendet werden
        if ("open".equals(action)) {
            open(args, callbackContext);

            return true;
        }

        // Es soll berprft werden, ob ein Dienst zum Versenden der E-Mail zur Verfgung steht
        if ("isServiceAvailable".equals(action)) {
            isServiceAvailable(callbackContext);

            return true;
        }

        // Returning false results in a "MethodNotFound" error.
        return false;
    }

    /**
     * berprft, ob Emails versendet werden knnen.
     */
    private void isServiceAvailable(CallbackContext ctx) {
        Boolean available = this.isEmailAccountConfigured();
        PluginResult result = new PluginResult(PluginResult.Status.OK, available);

        ctx.sendPluginResult(result);
    }

    /**
     * ffnet den Email-Kontroller mit vorausgefllten Daten.
     */
    private void open(JSONArray args, CallbackContext ctx) throws JSONException {
        JSONObject properties = args.getJSONObject(0);
        Intent draft = this.getDraftWithProperties(properties);

        this.ctx = ctx;
        this.openDraft(draft);
    }

    /**
     * Erstellt den ViewController fr Mails und fgt die bergebenen Eigenschaften ein.
     *
     * @param {JSONObject} params (Subject, Body, Recipients, ...)
     */
    private Intent getDraftWithProperties(JSONObject params) throws JSONException {
        Intent mail = new Intent(android.content.Intent.ACTION_SEND);

        if (params.has("subject"))
            this.setSubject(params.getString("subject"), mail);
        if (params.has("body"))
            this.setBody(params.getString("body"), params.optBoolean("isHtml"), mail);
        if (params.has("recipients"))
            this.setRecipients(params.getJSONArray("recipients"), mail);
        if (params.has("ccRecipients"))
            this.setCcRecipients(params.getJSONArray("ccRecipients"), mail);
        if (params.has("bccRecipients"))
            this.setBccRecipients(params.getJSONArray("bccRecipients"), mail);
        if (params.has("attachments"))
            this.setAttachments(params.getJSONArray("attachments"), mail);

        return mail;
    }

    /**
     * Zeigt den ViewController zum Versenden/Bearbeiten der Mail an.
     */
    private void openDraft(Intent draft) {
        this.cordova.startActivityForResult(this, Intent.createChooser(draft, "Select Email app"), 0);
    }

    /**
     * Setzt den Subject der Mail.
     */
    private void setSubject(String subject, Intent draft) {
        draft.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
    }

    /**
     * Setzt den Body der Mail.
     */
    private void setBody(String body, Boolean isHTML, Intent draft) {
        if (isHTML) {
            draft.putExtra(android.content.Intent.EXTRA_TEXT, Html.fromHtml(body));
            draft.setType("text/html");
        } else {
            draft.putExtra(android.content.Intent.EXTRA_TEXT, body);
            draft.setType("text/plain");
        }
    }

    /**
     * Setzt die Empfnger der Mail.
     */
    private void setRecipients(JSONArray recipients, Intent draft) throws JSONException {
        String[] receivers = new String[recipients.length()];

        for (int i = 0; i < recipients.length(); i++) {
            receivers[i] = recipients.getString(i);
        }

        draft.putExtra(android.content.Intent.EXTRA_EMAIL, receivers);
    }

    /**
     * Setzt die CC-Empfnger der Mail.
     */
    private void setCcRecipients(JSONArray ccRecipients, Intent draft) throws JSONException {
        String[] receivers = new String[ccRecipients.length()];

        for (int i = 0; i < ccRecipients.length(); i++) {
            receivers[i] = ccRecipients.getString(i);
        }

        draft.putExtra(android.content.Intent.EXTRA_CC, receivers);
    }

    /**
     * Setzt die BCC-Empfnger der Mail.
     */
    private void setBccRecipients(JSONArray bccRecipients, Intent draft) throws JSONException {
        String[] receivers = new String[bccRecipients.length()];

        for (int i = 0; i < bccRecipients.length(); i++) {
            receivers[i] = bccRecipients.getString(i);
        }

        draft.putExtra(android.content.Intent.EXTRA_BCC, receivers);
    }

    /**
     * Fgt die Anhnde zur Mail hinzu.
     * Convert from paths to Android friendly Parcelable Uri's
     */
    private void setAttachments(JSONArray attachments, Intent draft) throws JSONException {
        ArrayList<Uri> uris = new ArrayList<Uri>();

        for (int i = 0; i < attachments.length(); i++) {
            File file = new File(attachments.getString(i));

            if (file.exists()) {
                Uri uri = Uri.fromFile(file);

                uris.add(uri);
            }
        }

        draft.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
    }

    /**
     * Gibt an, ob es eine Anwendung gibt, welche E-Mails versenden kann.
     */
    private Boolean isEmailAccountConfigured() {
        Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", "max@mustermann.com", null));
        Boolean available = cordova.getActivity().getPackageManager().queryIntentActivities(intent, 0).size() > 1;

        return available;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);

        if (this.isEmailAccountConfigured()) {
            this.ctx.success();
        } else {
            this.ctx.success(4);
        }
    }
}