javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/MobileDevice.java
changeset 50 023eef975703
parent 35 85266cc22c7f
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/MobileDevice.java	Tue Jul 06 20:36:19 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/ercp/swt/mobile/MobileDevice.java	Fri Jul 09 16:35:45 2010 +0300
@@ -44,521 +44,524 @@
  */
 public class MobileDevice {
 
-    private static int 		handleMobileDevice;
-    private Vector		mobileDeviceListeners;
-    private Screen[]	screens;
-    private Input[]		inputs;
-    private int			alertLevel;
-    private boolean		isOpen;
-    private static int desktopWidgetHandle;
+    private static int  handleMobileDevice;
+    private Vector      mobileDeviceListeners;
+    private Screen[]    screens;
+    private Input[]     inputs;
+    private int         alertLevel;
+    private boolean     isOpen;
+    private static int  desktopWidgetHandle;
     static MobileDevice currentMobileDevice;
-    private int activeScreenId;
+    private int         activeScreenId;
     
     
 
     
     /** 
      * feature which is permanently attached to the mobile device and always available
-     */	
+     */    
     public static final int LOCAL = 0;
 
-	/**
-	 * local feature which is only available when mobile device is opened
-	 */
-	public static final int INTERNAL = 1;
+    /**
+     * local feature which is only available when mobile device is opened
+     */
+    public static final int INTERNAL = 1;
 
-	/**
-	 * local feature which is only available when mobile device is closed
-	 */
-	public static final int EXTERNAL = 2;
-	
-	/**
-	 * feature which is not part of the mobile device unless connected via wire or wireless signal
-	 */
-	public static final int REMOTE = 3;
-	
-	/**
-	 * alert level indicating simple notification (ex. e-mail arrival)
-	 */
-	public static final int ALERT_LOW_IMPORTANCE = 1;
-	
-	/**
-	 * alert level indicating user attention desired (ex. instant message arrival)
-	 */
-	public static final int ALERT_HIGH_IMPORTANCE = 2;
-	
-	/**
-	 * alert level indicating immediate attention is required (ex. battery level at 1%)
-	 */
-	public static final int ALERT_CRITICAL = 3;
+    /**
+     * local feature which is only available when mobile device is closed
+     */
+    public static final int EXTERNAL = 2;
+    
+    /**
+     * feature which is not part of the mobile device unless connected via wire or wireless signal
+     */
+    public static final int REMOTE = 3;
+    
+    /**
+     * alert level indicating simple notification (ex. e-mail arrival)
+     */
+    public static final int ALERT_LOW_IMPORTANCE = 1;
+    
+    /**
+     * alert level indicating user attention desired (ex. instant message arrival)
+     */
+    public static final int ALERT_HIGH_IMPORTANCE = 2;
+    
+    /**
+     * alert level indicating immediate attention is required (ex. battery level at 1%)
+     */
+    public static final int ALERT_CRITICAL = 3;
    /**
     * virtual keyboard status indicating normal show and hide operation
     */
-	public static final int VK_NORMAL = 1;
+    public static final int VK_NORMAL = 1;
 
-	/**
-	 * virtual keyboard status indicating keyboard is always visible
-	 */
-	public static final int VK_ALWAYS_ON = 2;
+    /**
+     * virtual keyboard status indicating keyboard is always visible
+     */
+    public static final int VK_ALWAYS_ON = 2;
 
-	/**
-	 * virtual keyboard status indicating keyboard is always hidden
-	 */
-	public static final int VK_ALWAYS_OFF = 3;	  
-	
-	/**
-	 * Constructs a new instance of this class. Non-public to prevent
-	 * instantiation outside this package.
-	 * 
-	 */
-	MobileDevice () {
-	   
-	    (getDisplay()).syncExec(new Runnable() {
-			public void run() {
-				handleMobileDevice = Internal_PackageSupport.initializeMobileDevice(
-						Internal_PackageSupport.getDisplayInstance());
-				OS.MobileDevice_createFlipWatch(handleMobileDevice);
-			}
-		}); 
-	    mobileDeviceListeners = new Vector();
-	    isOpen = true;
-	}
-	
-	private static Display getDisplay(){
-		Display display = Internal_PackageSupport.getDisplayInstance();
-		
-		// Following if-statement (getting default display) should be removed
-		// if agreed that MobileDevice shouldn't create the display.
-		if(display==null){
-			display = Display.getDefault();
-		}
-		
-		if(display == null || display.isDisposed()){
-	    	SWT.error(SWT.ERROR_DEVICE_DISPOSED);
-	    }
-		return display;
-	}
-	
-	private void sendMobileDeviceChangedEvent(int eventType) {
-		// MobileDevice changed event for open and closed
-		int count = mobileDeviceListeners.size();
-		for (int i = 0; i <count; ++i) {
-			MobileDeviceEvent event = new MobileDeviceEvent(this);
-			event.type = eventType;
-			MobileDeviceListener listener = (MobileDeviceListener) mobileDeviceListeners.elementAt(i);
-			listener.deviceChanged(event);
-		}
-	}
-	
-	void qt_swt_event_mobiledevice_changed(boolean aStatus) {
-		// update MobileDevice status to opened/closed
-		isOpen = aStatus;
-		
-		if(isOpen){
-			sendMobileDeviceChangedEvent(MobileDeviceEvent.OPENED);
-		}else{
-			sendMobileDeviceChangedEvent(MobileDeviceEvent.CLOSED);
-		}
-	}
-	
-	void qt_swt_event_mobiledevice_screen_activate(boolean aStatus) {
-		
-		if(screens.length > 0 && activeScreenId<screens.length){
-			if(aStatus){
-				// update the active screen
-				activeScreenId = OS.getScreenDeviceNumber();
-				//forward to screen activated event to new active screen
-				screens[activeScreenId].internal_sendScreenEventActivated();
-			}else {
-				//forward to screen deactivated event to old active screen
-				screens[activeScreenId].internal_sendScreenEventDeactivated();
-			}
-		}
-	}
-	
-	void qt_swt_event_mobiledevice_orientationchanged() {
-		activeScreenId = OS.getScreenDeviceNumber();
-		if(activeScreenId<screens.length){
-			// forward to orientation change event to active screen
-			screens[activeScreenId].internal_sendOrientationScreenChanged();
-		}
-	}
-	
-	private void sendMobileDeviceScreenChangedEvent(int eventType, Screen screen) {
-		int count = mobileDeviceListeners.size();
-		for (int i = 0; i <count; ++i) {
-			MobileDeviceEvent event = new MobileDeviceEvent(this);
-			event.type = eventType;
-			event.data = screen;
-			event.feature = screen;
-			MobileDeviceListener listener = (MobileDeviceListener) mobileDeviceListeners.elementAt(i);
-			listener.screenChanged(event);
-		}
-	}
-	
-	void qt_signal_screen_changed(int aCount) {
-		int type = 0;
-		Screen screen = null;
-		Screen []newScreens = new Screen[aCount];
-		
-		// if getScreen is not called and if still want 
-		// screen changed event in the MobileDevice
-		if(screens.length==0){
-			getScreens();
-		}
-		
-		if(screens.length > aCount){
-			// screen removed
-			int screenHandle = 0;
-			for(int j=0; j<screens.length; j++) {
-				// found removed screen
-				boolean found = false;
-				for(int i=0; i<aCount; i++) {     
-					screenHandle = OS.QDesktopWidget_screen(desktopWidgetHandle, i);
-					if(screens[j].screenHandle== screenHandle){
-						newScreens[i] = screens[j];
-						newScreens[i].id = i;
-						found = true;
-						break;
-		        	 }
-				}
-		        if(!found){
-		        	screen = screens[j];
-		        	screens[j].internal_dispose();
-		        } 
-		    }
-			screens = new Screen[aCount];
-			// remove detached screen from 'screens'
-			System.arraycopy(newScreens, 0, screens, 0, aCount);
-			type = MobileDeviceEvent.REMOVED;
-		} else if( screens.length < aCount){
-			// screen attached
-			for(int i=0; i<aCount; i++) {   
-				// found added screen
-				int screenHandle = OS.QDesktopWidget_screen(desktopWidgetHandle, i);
-				boolean found=false;
-				for(int j=0; j<screens.length; j++) {
-					if(screens[j].screenHandle== screenHandle){
-						newScreens[i] = screens[j];
-						newScreens[i].id = i;
-						found = true;
-						break;
-					}
-				}
-				if(!found){
-					screen = screens[i];
-					newScreens[i] = new Screen(i, desktopWidgetHandle);
-				} 
-			}
-			screens = new Screen[aCount];
-			// add attached screen to 'screens'
-			System.arraycopy(newScreens, 0, screens, 0, aCount);
-			type = MobileDeviceEvent.ADDED;
-		}
-		sendMobileDeviceScreenChangedEvent(type, screen);
-		activeScreenId = OS.getScreenDeviceNumber();
-	}
-	
-	private static void hookEvents() {
-	    int screenSignalProxy = OS.SignalHandler_new(desktopWidgetHandle, OS.QSIGNAL_QDESKTOPWIDGET_SCREENCOUNTCHANGED);
-	    OS.QObject_connectOrThrow(desktopWidgetHandle, "screenCountChanged(int)", screenSignalProxy,
-	            "widgetSignal(int)", OS.QT_AUTOCONNECTION);
-	}
+    /**
+     * virtual keyboard status indicating keyboard is always hidden
+     */
+    public static final int VK_ALWAYS_OFF = 3;      
+    
+    /**
+     * Constructs a new instance of this class. Non-public to prevent
+     * instantiation outside this package.
+     * 
+     */
+    MobileDevice () {
+       
+        (getDisplay()).syncExec(new Runnable() {
+            public void run() {
+                handleMobileDevice = Internal_PackageSupport.initializeMobileDevice(
+                        Internal_PackageSupport.getDisplayInstance());
+                if (handleMobileDevice == 0) {
+                    SWT.error(SWT.ERROR_NO_HANDLES);
+                }
+                OS.MobileDevice_createFlipWatch(handleMobileDevice);
+            }
+        }); 
+        mobileDeviceListeners = new Vector();
+        isOpen = true;
+    }
+    
+    private static Display getDisplay(){
+        Display display = Internal_PackageSupport.getDisplayInstance();
+        
+        // Following if-statement (getting default display) should be removed
+        // if agreed that MobileDevice shouldn't create the display.
+        if(display==null){
+            display = Display.getDefault();
+        }
+        
+        if(display == null || display.isDisposed()){
+            SWT.error(SWT.ERROR_DEVICE_DISPOSED);
+        }
+        return display;
+    }
+    
+    private void sendMobileDeviceChangedEvent(int eventType) {
+        // MobileDevice changed event for open and closed
+        int count = mobileDeviceListeners.size();
+        for (int i = 0; i <count; ++i) {
+            MobileDeviceEvent event = new MobileDeviceEvent(this);
+            event.type = eventType;
+            MobileDeviceListener listener = (MobileDeviceListener) mobileDeviceListeners.elementAt(i);
+            listener.deviceChanged(event);
+        }
+    }
+    
+    void qt_swt_event_mobiledevice_changed(boolean aStatus) {
+        // update MobileDevice status to opened/closed
+        isOpen = aStatus;
+        
+        if(isOpen){
+            sendMobileDeviceChangedEvent(MobileDeviceEvent.OPENED);
+        }else{
+            sendMobileDeviceChangedEvent(MobileDeviceEvent.CLOSED);
+        }
+    }
+    
+    void qt_swt_event_mobiledevice_screen_activate(boolean aStatus) {
+        
+        if(screens.length > 0 && activeScreenId<screens.length){
+            if(aStatus){
+                // update the active screen
+                activeScreenId = OS.getScreenDeviceNumber();
+                //forward to screen activated event to new active screen
+                screens[activeScreenId].internal_sendScreenEventActivated();
+            }else {
+                //forward to screen deactivated event to old active screen
+                screens[activeScreenId].internal_sendScreenEventDeactivated();
+            }
+        }
+    }
+    
+    void qt_swt_event_mobiledevice_orientationchanged() {
+        activeScreenId = OS.getScreenDeviceNumber();
+        if(activeScreenId<screens.length){
+            // forward to orientation change event to active screen
+            screens[activeScreenId].internal_sendOrientationScreenChanged();
+        }
+    }
+    
+    private void sendMobileDeviceScreenChangedEvent(int eventType, Screen screen) {
+        int count = mobileDeviceListeners.size();
+        for (int i = 0; i <count; ++i) {
+            MobileDeviceEvent event = new MobileDeviceEvent(this);
+            event.type = eventType;
+            event.data = screen;
+            event.feature = screen;
+            MobileDeviceListener listener = (MobileDeviceListener) mobileDeviceListeners.elementAt(i);
+            listener.screenChanged(event);
+        }
+    }
+    
+    void qt_signal_screen_changed(int aCount) {
+        int type = 0;
+        Screen screen = null;
+        Screen []newScreens = new Screen[aCount];
+        
+        // if getScreen is not called and if still want 
+        // screen changed event in the MobileDevice
+        if(screens.length==0){
+            getScreens();
+        }
+        
+        if(screens.length > aCount){
+            // screen removed
+            int screenHandle = 0;
+            for(int j=0; j<screens.length; j++) {
+                // found removed screen
+                boolean found = false;
+                for(int i=0; i<aCount; i++) {     
+                    screenHandle = OS.QDesktopWidget_screen(desktopWidgetHandle, i);
+                    if(screens[j].screenHandle== screenHandle){
+                        newScreens[i] = screens[j];
+                        newScreens[i].id = i;
+                        found = true;
+                        break;
+                     }
+                }
+                if(!found){
+                    screen = screens[j];
+                    screens[j].internal_dispose();
+                } 
+            }
+            screens = new Screen[aCount];
+            // remove detached screen from 'screens'
+            System.arraycopy(newScreens, 0, screens, 0, aCount);
+            type = MobileDeviceEvent.REMOVED;
+        } else if( screens.length < aCount){
+            // screen attached
+            for(int i=0; i<aCount; i++) {   
+                // found added screen
+                int screenHandle = OS.QDesktopWidget_screen(desktopWidgetHandle, i);
+                boolean found=false;
+                for(int j=0; j<screens.length; j++) {
+                    if(screens[j].screenHandle== screenHandle){
+                        newScreens[i] = screens[j];
+                        newScreens[i].id = i;
+                        found = true;
+                        break;
+                    }
+                }
+                if(!found){
+                    screen = screens[i];
+                    newScreens[i] = new Screen(i, desktopWidgetHandle);
+                } 
+            }
+            screens = new Screen[aCount];
+            // add attached screen to 'screens'
+            System.arraycopy(newScreens, 0, screens, 0, aCount);
+            type = MobileDeviceEvent.ADDED;
+        }
+        sendMobileDeviceScreenChangedEvent(type, screen);
+        activeScreenId = OS.getScreenDeviceNumber();
+    }
+    
+    private static void hookEvents() {
+        int screenSignalProxy = OS.SignalHandler_new(desktopWidgetHandle, OS.QSIGNAL_QDESKTOPWIDGET_SCREENCOUNTCHANGED);
+        OS.QObject_connectOrThrow(desktopWidgetHandle, "screenCountChanged(int)", screenSignalProxy,
+                "widgetSignal(int)", OS.QT_AUTOCONNECTION);
+    }
 
-	/**
-	 * Adds the listener to the collection of listeners who will be notified when a device 
-	 * configuration change occurs, by calling one of the methods defined in the 
-	 * <code>MobileDeviceListener</code> interface. 
-	 * <p>
-	 * <code>screenChanged</code> is called when a monitor configuration changes.<br>
-	 * <code>inputChanged</code> is called when an input configuration changes.<br>
-	 * <code>deviceChanged</code> is called when the device is opened or closed.<br>
-	 *
-	 * @param listener instance called when device events occur
-	 *
-	 * @exception IllegalArgumentException <ul>
-	 *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-	 * </ul>
-	 * @exception SWTError <ul>
-	 *    <li>ERROR_ITEM_NOT_ADDED - if the operation fails because of an operating system failure</li>
-	 * </ul>
-	 *
-	 * @see #removeMobileDeviceListener
-	 * @see MobileDeviceListener
-	 */
-	public void addMobileDeviceListener(MobileDeviceListener listener) {
-	    if (listener == null) {
-			SWT.error (SWT.ERROR_NULL_ARGUMENT);
-		}
-		mobileDeviceListeners.addElement(listener);
-	}
-	
-	
-	/**
-	 * Alerts the user using device specific mechanisms such as sounds, flashing, or
-	 * vibration. <code>Level</code> must be one of ALERT_LOW_IMPORTANCE,
-	 * ALERT_HIGH_IMPORTANCE, or ALERT_CRITICAL. The method maps these levels to
-	 * device specific features that may also be dependent upon user configuration
-	 * or current profile.
-	 * 
-	 * @param level
-	 *            constant describing the importance of the alert
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_INVALID_ARGUMENT - if level is not one of the
-	 *                allowed class constants</li>
-	 *                </ul>
-	 * 
-	 * @see #ALERT_LOW_IMPORTANCE
-	 * @see #ALERT_HIGH_IMPORTANCE
-	 * @see #ALERT_CRITICAL
-	 */
-	public void alert(int level) {
-	    if (	level != ALERT_LOW_IMPORTANCE &&
-	            level != ALERT_HIGH_IMPORTANCE &&
-	            level != ALERT_CRITICAL) {
-	        SWT.error(SWT.ERROR_INVALID_ARGUMENT);
-	    }
-	    alertLevel = level;
-		(getDisplay()).syncExec(new Runnable() {
-			public void run() {
-				if(alertLevel == ALERT_LOW_IMPORTANCE){
-					OS.QApplication_beep();
-				}else if(alertLevel == ALERT_HIGH_IMPORTANCE){
-					OS.MobileDevice_flashLights(handleMobileDevice, 3000);
-					OS.MobileDevice_vibration(handleMobileDevice, 3000);
-				}else if(alertLevel == ALERT_CRITICAL){
-					OS.QApplication_beep();
-					OS.MobileDevice_flashLights(handleMobileDevice, 3000);
-					OS.MobileDevice_vibration(handleMobileDevice, 3000);
-				}
-			   
-			}
-		}); 
-	}
-	
-	
-	/**
-	 * Returns an array of Input objects describing the input features available to the device. 
-	 * The return value may be <code>null</code> if there are no input features available.
-	 * 
-	 * @exception SWTError <ul>
-	 *    <li>ERROR_CANNOT_GET_SELECTION - if the operation fails because 
-	 * 		of an operating system failure</li>
-	 * </ul> 
-	 *
-	 * @see Input
-	 */
-	public Input[] getInputs() {
-		if(inputs == null) {
-		    try {
-			    (getDisplay()).syncExec(new Runnable() {
-					public void run() {
-						int mask = OS.getHwInputs();
-						int nbInputs = 0;
-						
-						// finding out number of keyboards available
-						if((mask & OS.SYMBIAN_KEYBOARD_FULL)!=0){
-							nbInputs+=2;
-						}
-						
-						if((mask & OS.SYMBIAN_KEYBOARD_KEYPAD)!=0){
-							nbInputs+=2;
-						}
-						// create java counter part of Inputs and
-						// add location and type
-					    inputs = new Input[nbInputs];
-					    int i=0;
-					    int location;
-					    if((mask & OS.SYMBIAN_KEYBOARD_FULL)!=0){
-					    	if((mask & OS.SYMBIAN_KEYBOARD_KEYPAD)!=0){
-								location = MobileDevice.INTERNAL;
-							} else {
-								location = MobileDevice.LOCAL;
-							}
-					    	inputs[i] = new Input(i);
-					    	inputs[i].setLocation(location);
-					    	inputs[i].setType(Input.SOFTKEYS);
-					    	i+=1;
-					    	inputs[i] = new Input(i);
-					    	inputs[i].setLocation(location);
-					    	inputs[i].setType(Input.FULL_KEYBOARD);
-					    	i+=1;
-						}
-					    
-					    if((mask & OS.SYMBIAN_KEYBOARD_KEYPAD)!=0){
-					    	if((mask & OS.SYMBIAN_KEYBOARD_FULL)!=0){
-								location = MobileDevice.EXTERNAL;
-							} else {
-								location = MobileDevice.LOCAL;
-							}
-					    	inputs[i] = new Input(i);
-					    	inputs[i].setLocation(location);
-					    	inputs[i].setType(Input.SOFTKEYS);
-					    	i+=1;
-					    	inputs[i] = new Input(i);
-					    	inputs[i].setLocation(location);
-					    	inputs[i].setType(Input.KEYPAD);
-						}
-					}
-				});
-		    } catch(Throwable e) {
-		        SWT.error(SWT.ERROR_CANNOT_GET_SELECTION);	       
-		    }
-	    }
-	    return inputs;
-	}
-	
-	
-	/**
-	 * Returns an array of Screen objects describing the display features available to the device. 
-	 * The return value may be <code>null</code> if there are no display screens available.
-	 * 
-	 * @exception SWTError <ul>
-	 *    <li>ERROR_CANNOT_GET_SELECTION - if the operation fails because 
-	 * 		of an operating system failure</li>
-	 * </ul> 
-	 *
-	 * @see Screen
-	 */
-	public Screen[] getScreens() {
-		if(screens == null) {
-		    try {
-			    (getDisplay()).syncExec(new Runnable() {
-					public void run() {
-					    int nbScreens = OS.QDesktopWidget_screenCount(desktopWidgetHandle);
-					    activeScreenId = OS.getScreenDeviceNumber();
-					    screens = new Screen[nbScreens];
-					    for(int i=0; i<nbScreens; i++) {
-					        screens[i] = new Screen(i, desktopWidgetHandle);
-					    }
-					}
-				});
-		    } catch(Throwable e) {
-		        SWT.error(SWT.ERROR_CANNOT_GET_SELECTION);	       
-		    }
-	    }
-	    return screens;
-	}
-	
-	
-	/**
-	 * Returns singleton instance of MobileDevice class.
-	 * 
-	 * @return singleton of MobileDevice class. Must not be Null.
-	 * 
-	 * @exception SWTError <ul>
-	 *    <li>ERROR_CANNOT_GET_SELECTION - if the operation fails because of 
-	 * 		an operating system failure</li>
-	 * </ul> 
-	 */ 
-	public static MobileDevice getMobileDevice() {
-	    if(currentMobileDevice == null) {
-	        try {
-		        currentMobileDevice = new MobileDevice(); 
-		        Internal_PackageSupport.setMobileDevice(getDisplay(),currentMobileDevice);
-			    desktopWidgetHandle = OS.QApplication_desktop();
-			    hookEvents();
-	        } catch (Throwable e) {
-	            SWT.error(SWT.ERROR_CANNOT_GET_SELECTION);
-	        }
-	    }
-	    return currentMobileDevice;
-	}
-	 
-	 
-	/**
-	 * Returns whether device is opened. For devices that have no internal screens 
-	 * or input features, the method always returns <code>true</code>.
-	 */
-	public boolean isOpen() { 
-	    getDisplay();
+    /**
+     * Adds the listener to the collection of listeners who will be notified when a device 
+     * configuration change occurs, by calling one of the methods defined in the 
+     * <code>MobileDeviceListener</code> interface. 
+     * <p>
+     * <code>screenChanged</code> is called when a monitor configuration changes.<br>
+     * <code>inputChanged</code> is called when an input configuration changes.<br>
+     * <code>deviceChanged</code> is called when the device is opened or closed.<br>
+     *
+     * @param listener instance called when device events occur
+     *
+     * @exception IllegalArgumentException <ul>
+     *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+     * </ul>
+     * @exception SWTError <ul>
+     *    <li>ERROR_ITEM_NOT_ADDED - if the operation fails because of an operating system failure</li>
+     * </ul>
+     *
+     * @see #removeMobileDeviceListener
+     * @see MobileDeviceListener
+     */
+    public void addMobileDeviceListener(MobileDeviceListener listener) {
+        if (listener == null) {
+            SWT.error (SWT.ERROR_NULL_ARGUMENT);
+        }
+        mobileDeviceListeners.addElement(listener);
+    }
+    
+    
+    /**
+     * Alerts the user using device specific mechanisms such as sounds, flashing, or
+     * vibration. <code>Level</code> must be one of ALERT_LOW_IMPORTANCE,
+     * ALERT_HIGH_IMPORTANCE, or ALERT_CRITICAL. The method maps these levels to
+     * device specific features that may also be dependent upon user configuration
+     * or current profile.
+     * 
+     * @param level
+     *            constant describing the importance of the alert
+     * 
+     * @exception IllegalArgumentException
+     *                <ul>
+     *                <li>ERROR_INVALID_ARGUMENT - if level is not one of the
+     *                allowed class constants</li>
+     *                </ul>
+     * 
+     * @see #ALERT_LOW_IMPORTANCE
+     * @see #ALERT_HIGH_IMPORTANCE
+     * @see #ALERT_CRITICAL
+     */
+    public void alert(int level) {
+        if (    level != ALERT_LOW_IMPORTANCE &&
+                level != ALERT_HIGH_IMPORTANCE &&
+                level != ALERT_CRITICAL) {
+            SWT.error(SWT.ERROR_INVALID_ARGUMENT);
+        }
+        alertLevel = level;
+        (getDisplay()).syncExec(new Runnable() {
+            public void run() {
+                if(alertLevel == ALERT_LOW_IMPORTANCE){
+                    OS.QApplication_beep();
+                }else if(alertLevel == ALERT_HIGH_IMPORTANCE){
+                    OS.MobileDevice_flashLights(handleMobileDevice, 3000);
+                    OS.MobileDevice_vibration(handleMobileDevice, 3000);
+                }else if(alertLevel == ALERT_CRITICAL){
+                    OS.QApplication_beep();
+                    OS.MobileDevice_flashLights(handleMobileDevice, 3000);
+                    OS.MobileDevice_vibration(handleMobileDevice, 3000);
+                }
+               
+            }
+        }); 
+    }
+    
+    
+    /**
+     * Returns an array of Input objects describing the input features available to the device. 
+     * The return value may be <code>null</code> if there are no input features available.
+     * 
+     * @exception SWTError <ul>
+     *    <li>ERROR_CANNOT_GET_SELECTION - if the operation fails because 
+     *         of an operating system failure</li>
+     * </ul> 
+     *
+     * @see Input
+     */
+    public Input[] getInputs() {
+        if(inputs == null) {
+            try {
+                (getDisplay()).syncExec(new Runnable() {
+                    public void run() {
+                        int mask = OS.getHwInputs();
+                        int nbInputs = 0;
+                        
+                        // finding out number of keyboards available
+                        if((mask & OS.SYMBIAN_KEYBOARD_FULL)!=0){
+                            nbInputs+=2;
+                        }
+                        
+                        if((mask & OS.SYMBIAN_KEYBOARD_KEYPAD)!=0){
+                            nbInputs+=2;
+                        }
+                        // create java counter part of Inputs and
+                        // add location and type
+                        inputs = new Input[nbInputs];
+                        int i=0;
+                        int location;
+                        if((mask & OS.SYMBIAN_KEYBOARD_FULL)!=0){
+                            if((mask & OS.SYMBIAN_KEYBOARD_KEYPAD)!=0){
+                                location = MobileDevice.INTERNAL;
+                            } else {
+                                location = MobileDevice.LOCAL;
+                            }
+                            inputs[i] = new Input(i);
+                            inputs[i].setLocation(location);
+                            inputs[i].setType(Input.SOFTKEYS);
+                            i+=1;
+                            inputs[i] = new Input(i);
+                            inputs[i].setLocation(location);
+                            inputs[i].setType(Input.FULL_KEYBOARD);
+                            i+=1;
+                        }
+                        
+                        if((mask & OS.SYMBIAN_KEYBOARD_KEYPAD)!=0){
+                            if((mask & OS.SYMBIAN_KEYBOARD_FULL)!=0){
+                                location = MobileDevice.EXTERNAL;
+                            } else {
+                                location = MobileDevice.LOCAL;
+                            }
+                            inputs[i] = new Input(i);
+                            inputs[i].setLocation(location);
+                            inputs[i].setType(Input.SOFTKEYS);
+                            i+=1;
+                            inputs[i] = new Input(i);
+                            inputs[i].setLocation(location);
+                            inputs[i].setType(Input.KEYPAD);
+                        }
+                    }
+                });
+            } catch(Throwable e) {
+                SWT.error(SWT.ERROR_CANNOT_GET_SELECTION);           
+            }
+        }
+        return inputs;
+    }
+    
+    
+    /**
+     * Returns an array of Screen objects describing the display features available to the device. 
+     * The return value may be <code>null</code> if there are no display screens available.
+     * 
+     * @exception SWTError <ul>
+     *    <li>ERROR_CANNOT_GET_SELECTION - if the operation fails because 
+     *         of an operating system failure</li>
+     * </ul> 
+     *
+     * @see Screen
+     */
+    public Screen[] getScreens() {
+        if(screens == null) {
+            try {
+                (getDisplay()).syncExec(new Runnable() {
+                    public void run() {
+                        int nbScreens = OS.QDesktopWidget_screenCount(desktopWidgetHandle);
+                        activeScreenId = OS.getScreenDeviceNumber();
+                        screens = new Screen[nbScreens];
+                        for(int i=0; i<nbScreens; i++) {
+                            screens[i] = new Screen(i, desktopWidgetHandle);
+                        }
+                    }
+                });
+            } catch(Throwable e) {
+                SWT.error(SWT.ERROR_CANNOT_GET_SELECTION);           
+            }
+        }
+        return screens;
+    }
+    
+    
+    /**
+     * Returns singleton instance of MobileDevice class.
+     * 
+     * @return singleton of MobileDevice class. Must not be Null.
+     * 
+     * @exception SWTError <ul>
+     *    <li>ERROR_CANNOT_GET_SELECTION - if the operation fails because of 
+     *         an operating system failure</li>
+     * </ul> 
+     */ 
+    public static MobileDevice getMobileDevice() {
+        if(currentMobileDevice == null) {
+            try {
+                currentMobileDevice = new MobileDevice(); 
+                Internal_PackageSupport.setMobileDevice(getDisplay(),currentMobileDevice);
+                desktopWidgetHandle = OS.QApplication_desktop();
+                hookEvents();
+            } catch (Throwable e) {
+                SWT.error(SWT.ERROR_CANNOT_GET_SELECTION);
+            }
+        }
+        return currentMobileDevice;
+    }
+     
+     
+    /**
+     * Returns whether device is opened. For devices that have no internal screens 
+     * or input features, the method always returns <code>true</code>.
+     */
+    public boolean isOpen() { 
+        getDisplay();
 
-	    return isOpen; 
-	}
+        return isOpen; 
+    }
 
-	
-	/**
-	 * Call to dispose the Screen object.
-	 *
-	 */
-	void internal_dispose() {
-		if (inputs != null) {
-			for (int i = 0; i < inputs.length; i++) {
-				if (inputs[i] != null) {
-					inputs[i].internal_dispose();
-				}
-			}
-		}
+    
+    /**
+     * Call to dispose the Screen object.
+     *
+     */
+    void internal_dispose() {
+        if (inputs != null) {
+            for (int i = 0; i < inputs.length; i++) {
+                if (inputs[i] != null) {
+                    inputs[i].internal_dispose();
+                }
+            }
+        }
 
-		if (screens != null) {
-			for (int i = 0; i < screens.length; i++) {
-				if (screens[i] != null) {
-					screens[i].internal_dispose();
-				}
-			}
-		}
-		// actual native counter part is deleted in display
-		currentMobileDevice = null;
-		handleMobileDevice = 0;
-		inputs = null;
-		screens = null;
-		desktopWidgetHandle = 0;
-	}
-	
-	
-	/**
-	 * Removes the listener from the collection of listeners who will be notified when a device 
-	 * configuration change occurs. 
-	 *
-	 * @param listener instance called when device events occur
-	 *
-	 * @exception IllegalArgumentException <ul>
-	 *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-	 * </ul>
-	 * @exception SWTError <ul>
-	 *    <li>ERROR_ITEM_NOT_REMOVED - if the operation fails because 
-	 * 		of an operating system failure</li>
-	 * </ul>
-	 *
-	 * @see #addMobileDeviceListener
-	 * @see MobileDeviceListener
-	 */
-	public void removeMobileDeviceListener(MobileDeviceListener listener) {
-		if (listener == null) {
-			SWT.error (SWT.ERROR_NULL_ARGUMENT);
-		}
+        if (screens != null) {
+            for (int i = 0; i < screens.length; i++) {
+                if (screens[i] != null) {
+                    screens[i].internal_dispose();
+                }
+            }
+        }
+        // actual native counter part is deleted in display
+        currentMobileDevice = null;
+        handleMobileDevice = 0;
+        inputs = null;
+        screens = null;
+        desktopWidgetHandle = 0;
+    }
+    
+    
+    /**
+     * Removes the listener from the collection of listeners who will be notified when a device 
+     * configuration change occurs. 
+     *
+     * @param listener instance called when device events occur
+     *
+     * @exception IllegalArgumentException <ul>
+     *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+     * </ul>
+     * @exception SWTError <ul>
+     *    <li>ERROR_ITEM_NOT_REMOVED - if the operation fails because 
+     *         of an operating system failure</li>
+     * </ul>
+     *
+     * @see #addMobileDeviceListener
+     * @see MobileDeviceListener
+     */
+    public void removeMobileDeviceListener(MobileDeviceListener listener) {
+        if (listener == null) {
+            SWT.error (SWT.ERROR_NULL_ARGUMENT);
+        }
 
-		//remove listener
-		//Remove method of Vector class never fails,
-		//so ERROR_ITEM_NOT_REMOVED could never be thrown.
-		mobileDeviceListeners.removeElement(listener);
-	}
-	
-	 /**
-	  * Sets the status of the system virtual keyboard (if one is available).
-	  * By default, or when status is set to VK_NORMAL, a system virtual keyboard
-	  * is displayed when a widget capable of text input gains focus and is
-	  * hidden when that widget looses focus. However, there are cases where 
-	  * an application may wish to continuously display the virtual keyboard
-	  * or always keep it hidden. Setting the status to VK_ALWAYS_ON or VK_ALWAYS_OFF
-	  * will accomplish this and the effect is immediate. Changing focus will
-	  * then have no affect on the virtual keyboard. Note: By default, widgets which 
-	  * normally accept input but are set to <i>read only</i> do not cause the 
-	  * the virtual keyboard to display.
-	  *
-	  * @param status virtual keyboard mode. One of VK_NORMAL, VK_ALWAYS_ON, VK_ALWAYS_OFF
-	  * 
-	  * @exception IllegalArgumentException <ul>
-	  *    <li>ERROR_INVALID_ARGUMENT - if the status parameter is not valid</li>
-	  * </ul>
-	  *
-	  * @see #VK_NORMAL
-	  * @see #VK_ALWAYS_ON
-	  * @see #VK_ALWAYS_OFF
-	  */
-	public void setVKStatus(int status){
-		
-	}
+        //remove listener
+        //Remove method of Vector class never fails,
+        //so ERROR_ITEM_NOT_REMOVED could never be thrown.
+        mobileDeviceListeners.removeElement(listener);
+    }
+    
+     /**
+      * Sets the status of the system virtual keyboard (if one is available).
+      * By default, or when status is set to VK_NORMAL, a system virtual keyboard
+      * is displayed when a widget capable of text input gains focus and is
+      * hidden when that widget looses focus. However, there are cases where 
+      * an application may wish to continuously display the virtual keyboard
+      * or always keep it hidden. Setting the status to VK_ALWAYS_ON or VK_ALWAYS_OFF
+      * will accomplish this and the effect is immediate. Changing focus will
+      * then have no affect on the virtual keyboard. Note: By default, widgets which 
+      * normally accept input but are set to <i>read only</i> do not cause the 
+      * the virtual keyboard to display.
+      *
+      * @param status virtual keyboard mode. One of VK_NORMAL, VK_ALWAYS_ON, VK_ALWAYS_OFF
+      * 
+      * @exception IllegalArgumentException <ul>
+      *    <li>ERROR_INVALID_ARGUMENT - if the status parameter is not valid</li>
+      * </ul>
+      *
+      * @see #VK_NORMAL
+      * @see #VK_ALWAYS_ON
+      * @see #VK_ALWAYS_OFF
+      */
+    public void setVKStatus(int status){
+        
+    }
 }