Package com.rim.samples.device.mmsdemo

Source Code of com.rim.samples.device.mmsdemo.MMSDemo$ProcessMMSThread

/**
* MMSDemo.java
*
* Copyright � 1998-2011 Research In Motion Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Note: For the sake of simplicity, this sample application may not leverage
* resource bundles and resource strings.  However, it is STRONGLY recommended
* that application developers make use of the localization features available
* within the BlackBerry development platform to ensure a seamless application
* experience across a variety of languages and geographies.  For more information
* on localizing your application, please refer to the BlackBerry Java Development
* Environment Development Guide associated with this release.
*/

package com.rim.samples.device.mmsdemo;

import java.io.IOException;
import java.io.InputStream;

import javax.microedition.io.Connection;
import javax.microedition.io.Connector;
import javax.wireless.messaging.MessageConnection;
import javax.wireless.messaging.MessagePart;
import javax.wireless.messaging.MultipartMessage;

import net.rim.device.api.io.IOUtilities;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.EditField;
import net.rim.device.api.ui.component.table.TableModel;
import net.rim.device.api.ui.container.MainScreen;

/**
* This sample demonstrates the sending and receiving of MMS messages using the
* javax.wireless.messaging APIs. Note that MMS is not supported by the
* BlackBerry Smartphone simulator.
*/
public final class MMSDemo extends UiApplication {
    // The application ID that the MMS connection is opened with
    private static final String APP_ID = "com.rim.samples.device.mmsdemo";

    private static final int CLIENT_CHOICE = 0;
    private static final int SERVER_CHOICE = 1;
    private static final String[] CHOICES =
            { "Send MMS", "Receive MMS", "Exit" };

    static final int PICTURE = 0;
    static final int AUDIO = 1;

    // Parallel arrays containg file information
    private static final String[] MIME_TYPES = { "image/png", "audio/mp3" };
    private static final String[] FOLDER_NAMES = { "picture", "audio" };
    private static final String[] EXTENSIONS = { ".png", ".mp3" };

    private Connection _sendConn;
    private Connection _recConn;
    private MMSDemoSendScreen _mmsDemoSendScreen;
    private MMSDemoReceiveScreen _mmsDemoReceiveScreen;
    private final MainScreen _blankScreen;

    // Vector to hold MessagePart objects
    private final TableModel _messageParts;

    /**
     * Creates a new MMSDemo object
     */
    public MMSDemo() {
        _messageParts = new TableModel();
        _blankScreen = new MainScreen();
        _blankScreen.setTitle("MMS Demo");
        pushScreen(_blankScreen);
        chooseModeDialog();
    }

    /**
     * Creates a MessagePart with content of given type to be attached to
     * outgoing MultipartMessage
     *
     * @param type
     *            The type of content to attach
     */
    void attach(final int type) {
        boolean exists = false;

        // Check that content has not already been added. For this sample there
        // is no point in attaching the same file twice. Note that every
        // MessagePart contained within a MultipartMessage must have a unique
        // content id.
        for (int i = 0; i < getMessageParts().getNumberOfRows(); i++) {
            final MessagePart messagePart =
                    (MessagePart) getMessageParts().getRow(i);
            final String contentLocation = messagePart.getContentLocation();
            if (contentLocation.equals(FOLDER_NAMES[type] + '0'
                    + EXTENSIONS[type])) {
                exists = true;
            }
        }
        if (!exists) {
            // Obtain content data from project resource
            final String filename = FOLDER_NAMES[type] + "0" + EXTENSIONS[type];
            final StringBuffer path = new StringBuffer("/media/");
            path.append(FOLDER_NAMES[type]);
            path.append("/");
            path.append(filename);
            final InputStream inputStream =
                    getClass().getResourceAsStream(path.toString());
            try {
                final byte[] contentData =
                        IOUtilities.streamToBytes(inputStream);

                // Create a MessagePart object with the contentData and add it
                // to the message parts vector
                final MessagePart messagePart =
                        new MessagePart(contentData, MIME_TYPES[type],
                                FOLDER_NAMES[type], filename, null);
                addMessagePart(messagePart);
            } catch (final IOException ioe) {
                errorDialog(ioe.toString());
            }
        }
    }

    /**
     * Allows user to choose between client or server mode
     */
    private void chooseModeDialog() {
        invokeLater(new Runnable() {
            public void run() {
                final int choice =
                        Dialog.ask("Select Mode", CHOICES, CLIENT_CHOICE);

                popScreen(_blankScreen);

                if (choice == CLIENT_CHOICE) {
                    _mmsDemoSendScreen = new MMSDemoSendScreen(MMSDemo.this);
                    pushScreen(_mmsDemoSendScreen);
                } else if (choice == SERVER_CHOICE) {
                    receiveMMS();
                    _mmsDemoReceiveScreen = new MMSDemoReceiveScreen();
                    pushScreen(_mmsDemoReceiveScreen);
                } else {
                    System.exit(0);
                }
            }
        });
    }

    /**
     * Retrieves a vector of MessagePart objects
     *
     * @return A vector that contains the message parts
     */
    TableModel getMessageParts() {
        return _messageParts;
    }

    /**
     * Adds a new MessagePart object
     *
     * @param m
     *            The MessagePart object to be added
     */
    void addMessagePart(final MessagePart messagePart) {
        _messageParts.addRow(messagePart);
    }

    /**
     * Sends an MMS message
     */
    void sendMMS(final EditField addressField, final EditField subjectField,
            final EditField messageField) {
        final String address = addressField.getText();
        final String subject = subjectField.getText();
        final String message = messageField.getText();

        // Check for blank fields
        if (address.length() == 0) {
            errorDialog("Destination field cannot be blank");
            addressField.setFocus();
        } else if (subject.length() == 0) {
            errorDialog("Subject field cannot be blank");
            subjectField.setFocus();
        } else if (message.length() == 0) {
            errorDialog("Message field cannot be blank");
            messageField.setFocus();
        } else {
            MultipartMessage multipartMessage = null;
            try {
                // Open an MMS connection for sending
                _sendConn = Connector.open("mms://" + address + ":" + APP_ID);

                // Create the multipart message and set the subject
                multipartMessage =
                        (MultipartMessage) ((MessageConnection) _sendConn)
                                .newMessage(MessageConnection.MULTIPART_MESSAGE);
                multipartMessage.setSubject(subject);

                // Add the message text to the multipart message
                multipartMessage.addMessagePart(new MessagePart(message
                        .getBytes(), "text/plain", "text", null, null));

                // Add any attachments
                for (int i = 0; i < _messageParts.getNumberOfRows(); i++) {
                    multipartMessage.addMessagePart((MessagePart) _messageParts
                            .getRow(i));
                }
            } catch (final IOException ioe) {
                errorDialog(ioe.toString() + " when creating message.");
            }
            try {
                ((MessageConnection) _sendConn).send(multipartMessage);

                invokeLater(new Runnable() {
                    public void run() {
                        Dialog.alert("Message sent");
                    }
                });
            } catch (final IOException ioe) {
                errorDialog(ioe.toString() + " when sending message.");
            }
        }
    }

    /**
     * Listens for incoming MMS messages
     */
    private void receiveMMS() {
        final Thread t = new Thread() {
            public void run() {
                try {
                    // Open an MMS connection for receiving
                    _recConn = Connector.open("mms://:" + APP_ID);

                    for (;;) {
                        // Wait for an MMS
                        final MultipartMessage multipartMessage =
                                (MultipartMessage) ((MessageConnection) _recConn)
                                        .receive();

                        // Process the MMS in an other thread so this thread can
                        // continue to listen for messages without interruption.
                        new ProcessMMSThread(multipartMessage).start();
                    }
                } catch (final IOException ioe) {
                    MMSDemo.errorDialog("MessageConnection.receive() threw "
                            + ioe.toString());
                }
            }
        };
        t.start();
    }

    /**
     * A class to process an MMS message and update the screen
     */
    class ProcessMMSThread extends Thread {
        private final MultipartMessage _multipartMessage;
        private String _msgText;
        private Bitmap _bitmap;

        /**
         * Create a new ProcessMMSThread object
         *
         * @param multipartMessage
         *            Message to display on the screen
         */
        ProcessMMSThread(final MultipartMessage multipartMessage) {
            _multipartMessage = multipartMessage;
        }

        public void run() {
            // Obtain the message part containing the message body
            final MessagePart textMsgPart =
                    _multipartMessage.getMessagePart("text");

            if (textMsgPart != null) {
                final byte[] bytes = textMsgPart.getContent();
                _msgText = new String(bytes);
            }

            final MessagePart pictureMsgPart =
                    _multipartMessage.getMessagePart("picture");
            if (pictureMsgPart != null) {
                final byte[] pictureData = pictureMsgPart.getContent();
                _bitmap = Bitmap.createBitmapFromBytes(pictureData, 0, -1, 1);
            }

            invokeLater(new Runnable() {
                public void run() {
                    // Update the screen on the event thread
                    _mmsDemoReceiveScreen.setStatus("Message received");
                    _mmsDemoReceiveScreen.setSubject(_multipartMessage
                            .getSubject());
                    _mmsDemoReceiveScreen.setMessage(_msgText);
                    _mmsDemoReceiveScreen.updateBitmapField(_bitmap);
                }
            });
        }
    }

    /**
     * @see net.rim.device.api.ui.Screen#close()
     */
    public void close() {
        try {
            if (_sendConn != null) {
                _sendConn.close();
            }
        } catch (final Exception e) {
        }
        try {
            if (_recConn != null) {
                _recConn.close();
            }
        } catch (final Exception e) {
        }
    }

    /**
     * Entry point for application
     *
     * @param args
     *            Command line arguments (not used)
     */
    public static void main(final String[] args) {
        // Create a new instance of the application and make the currently
        // running thread the application's event dispatch thread.
        final MMSDemo mmsDemo = new MMSDemo();
        mmsDemo.enterEventDispatcher();
    }

    /**
     * Presents a dialog to the user with a given message
     *
     * @param message
     *            The text to display
     */
    public static void errorDialog(final String message) {
        UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                Dialog.alert(message);
            }
        });
    }
}
TOP

Related Classes of com.rim.samples.device.mmsdemo.MMSDemo$ProcessMMSThread

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.