/*
 * 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) 2011, IBM Corporation
 */ 
package com.phonegap.util;

import com.phonegap.camera.Camera;

import net.rim.device.api.system.ApplicationDescriptor;
import net.rim.device.api.system.ApplicationManager;
import net.rim.device.api.system.Characters;
import net.rim.device.api.system.CodeModuleManager;
import net.rim.device.api.system.ControlledAccessException;
import net.rim.device.api.system.EventInjector;
import net.rim.device.api.ui.UiApplication;

public class ApplicationUtils {
    /**
     * Determines if the specified application is running in the foreground.
     * 
     * @param handle
     *            the name of the application handle (e.g., net_rim_bb_camera")
     * @return <code>true</code> if the application is running and in the
     *         foreground
     */
    public static boolean isApplicationInForeground(String handle) {
        // determine if the specified application is running in the foreground
        ApplicationManager manager = ApplicationManager.getApplicationManager();
        int foregroundProcessId = manager.getForegroundProcessId();
        ApplicationDescriptor descriptors[] = manager.getVisibleApplications();
        for (int i = 0; i < descriptors.length; i++) {
            if (descriptors[i].getModuleName().equals(handle)
                    && manager.getProcessId(descriptors[i]) == foregroundProcessId) {
                return true;
            }
        }
        return false;
    }

    /**
     * Determines if the specified application is installed.
     * 
     * @param handle
     *            the name of the application handle (e.g., net_rim_bb_camera")
     * @return <code>true</code> if the application is installed on the device
     */
    public static boolean isModuleInstalled(String handle) {
        return (CodeModuleManager.getModuleHandle(handle) != 0);
    }

    /**
     * Use this method when another native application has been launched by this
     * application, and you would like the application to be closed.
     * <p>
     * Unfortunately, the only way to do this programmatically is to simulate
     * the Escape (back) key being pressed. We do this by injecting key events,
     * which means the application permissions must have the key injection
     * permissions enabled for it to work.
     * <p>
     * An alternative to closing the applications would be to simply request
     * that our application be brought to the foreground; however, this just
     * pushes all the applications we've launched to the background, leaving a
     * mess for the user to cleanup after this application has been closed.
     * 
     * @param repeat
     *            the number of times to press the Esc key
     */
    public static void injectEscKeyPress(final int repeat) {
        // simulate escape characters (back button press) 
        Runnable escKeyPresser = new Runnable() {
            public void run() {
                try {
                    EventInjector.KeyEvent inject = new EventInjector.KeyEvent(
                            EventInjector.KeyEvent.KEY_DOWN, Characters.ESCAPE,
                            0);
                    int count = 0;
                    while (count < repeat) {
                        inject.post();
                        count++;
                    }
                }
                catch (ControlledAccessException e) {
                    // the application doesn't have key injection
                    // permissions
                    Logger.log(Camera.class.getName() + ": "
                            + ApplicationDescriptor
                                    .currentApplicationDescriptor().getName()
                            + " does not have key injection permissions.");
                }
            }
        };
        UiApplication.getUiApplication().invokeLater(escKeyPresser);
    }    
}

Add ApplicationUtils class.