org.safs.android
Class RemoteControlUI

java.lang.Object
  extended by java.awt.Component
      extended by java.awt.Container
          extended by java.awt.Window
              extended by java.awt.Frame
                  extended by javax.swing.JFrame
                      extended by org.safs.android.RemoteControlUI
All Implemented Interfaces:
java.awt.event.ActionListener, java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable, java.util.EventListener, javax.accessibility.Accessible, javax.swing.RootPaneContainer, javax.swing.WindowConstants, ConnectionListener, NamedListener, SocketProtocolListener

public class RemoteControlUI
extends javax.swing.JFrame
implements SocketProtocolListener, java.awt.event.ActionListener

Crude Test app for initial manual testing of remote control for SAFS Android Automation with Robotium. This app provides a minimalist crude UI for manually entering and sending messages over a LocalControlRunner implementing a SocketProtocol to communicate and control Android automation on a remote device or emulator.

Note this has only been tested on an emulator. There may be additional code required in all pieces to test this on a real device. Primarily because of how we attempt to connect to TCP Sockets. Thus, you must have a working Emulator and AVD to test this. Command used to launch the emulator with an appropriate AVD:

emulator -no-snapstorage -avd SprintEvo

Steps to test the remote control concept:

  1. Insure the Android SAFSACCS Project (SAFS Messenger Service) has been built and installed on the device or emulator:
    ant debug
    adb install -r bin\SAFSACCS-debug.apk

  2. Insure the DroidEngine Test App AndroidManifest.xml has the correct android:targetPackage setting for the application to be tested--whatever that is:
        <instrumentation android:name="org.safs.android.engine.DroidEngine"
                      android:targetPackage="com.android.example.spinner"
                      android:label="General-Purpose SAFS Droid Automation Framework"/>
     

  3. Insure the DroidEngine Test App has been built and installed on the device or emulator:
    ant debug
    adb install -r bin\SAFSDroidAutomation-debug.apk

  4. Insure the application to be tested has been installed on the device or emulator.

  5. For the emulator, insure port forwarding has been activated:

    adb forward tcp:2411 tcp:2410

  6. In a separate CMD window, monitor "adb logcat"

  7. In a separate CMD window, launch the DroidEngine test:

    adb shell am instrument -w org.safs.android.engine/org.safs.android.engine.DroidEngine

    You should see a SAFS Messenger Service appear in the Notification area on the device\emulator and there should be logcat messages showing the status of the Droid Test App registering with the SAFS Messenger Service.

  8. Launch the RemoteControlUI:

    java org.safs.android.RemoteControlUI

  9. Press the "Connect" button to attempt to establish remote control connection with the SAFS Messenger Service. Monitor the logcat to see the status of this. If everything worked the RemoteControlUI status line should read "REMOTE READY".

  10. Type "launch" and press "Send". The target app launcher Activity should get launched.

  11. Type "close" and press "Send". The target app should shutdown.

  12. Press the "Dispatch" button to perform a roundtrip dispatch of a Properties object.
    The adb logcat window should show the properties received remotely on the DroidEngine and the RemoteControlUI should then show the same properties PLUS statuscode and statusinfo properties returned back from the DroidEngine.

  13. Press the "Shutdown" button and the remote Droid Engine and SAFS Messenger Service should both shutdown and the Notification icon on the device or emulator should disappear.

  14. RemoteControlUI will not be able to connect again until you relaunch the Instrumentation test again and the appropriate Notification is present on the emulator or device.

See Also:
Serialized Form

Nested Class Summary
 
Nested classes/interfaces inherited from class javax.swing.JFrame
javax.swing.JFrame.AccessibleJFrame
 
Nested classes/interfaces inherited from class java.awt.Frame
java.awt.Frame.AccessibleAWTFrame
 
Nested classes/interfaces inherited from class java.awt.Window
java.awt.Window.AccessibleAWTWindow
 
Nested classes/interfaces inherited from class java.awt.Container
java.awt.Container.AccessibleAWTContainer
 
Nested classes/interfaces inherited from class java.awt.Component
java.awt.Component.AccessibleAWTComponent, java.awt.Component.BltBufferStrategy, java.awt.Component.FlipBufferStrategy
 
Field Summary
 
Fields inherited from class javax.swing.JFrame
accessibleContext, EXIT_ON_CLOSE, rootPane, rootPaneCheckingEnabled
 
Fields inherited from class java.awt.Frame
CROSSHAIR_CURSOR, DEFAULT_CURSOR, E_RESIZE_CURSOR, HAND_CURSOR, ICONIFIED, MAXIMIZED_BOTH, MAXIMIZED_HORIZ, MAXIMIZED_VERT, MOVE_CURSOR, N_RESIZE_CURSOR, NE_RESIZE_CURSOR, NORMAL, NW_RESIZE_CURSOR, S_RESIZE_CURSOR, SE_RESIZE_CURSOR, SW_RESIZE_CURSOR, TEXT_CURSOR, W_RESIZE_CURSOR, WAIT_CURSOR
 
Fields inherited from class java.awt.Component
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
 
Fields inherited from interface org.safs.sockets.SocketProtocolListener
DEFAULT_NAME
 
Fields inherited from interface javax.swing.WindowConstants
DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE
 
Fields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
 
Constructor Summary
RemoteControlUI()
           
RemoteControlUI(java.lang.String title)
           
 
Method Summary
 void actionPerformed(java.awt.event.ActionEvent e)
           
protected  void disableInteraction()
           
protected  void enableInteraction()
           
 java.lang.String getListenerName()
          Unique name to identify the listener.
static void main(java.lang.String[] args)
          java org.safs.android.RemoteControlUI
 void onReceiveConnection()
          Called when a 2-way sockets connection has been established.
 void onReceiveDebug(java.lang.String message)
           
 void onReceiveException(java.lang.String message)
          Remote client has thrown/issued an Exception message.
 void onReceiveLocalShutdown(int cause)
          A local source has issued a SHUTDOWN event/command.
 void onReceiveMessage(java.lang.String message)
          Remote client has sent an arbitrary message.
 void onReceiveReady()
          Remote client has issued the READY event
 void onReceiveRemoteShutdown(int cause)
          A remote source has issued a SHUTDOWN event/command.
 void onReceiveResult(int rc, java.lang.String info)
          Remote client has issued the RESULT event and is returning a simple statuscode and statusinfo response.
 void onReceiveResultProperties(java.util.Properties result)
          Remote client has issued the RESULT event and is returning result information in Properties.
 void onReceiveRunning()
          Remote client has issued the RUNNING event--usually resulting from a DISPATCH event.
protected  void shutdownRemoteControl()
           
 
Methods inherited from class javax.swing.JFrame
addImpl, createRootPane, frameInit, getAccessibleContext, getContentPane, getDefaultCloseOperation, getGlassPane, getJMenuBar, getLayeredPane, getRootPane, isDefaultLookAndFeelDecorated, isRootPaneCheckingEnabled, paramString, processWindowEvent, remove, setContentPane, setDefaultCloseOperation, setDefaultLookAndFeelDecorated, setGlassPane, setIconImage, setJMenuBar, setLayeredPane, setLayout, setRootPane, setRootPaneCheckingEnabled, update
 
Methods inherited from class java.awt.Frame
addNotify, finalize, getCursorType, getExtendedState, getFrames, getIconImage, getMaximizedBounds, getMenuBar, getState, getTitle, isResizable, isUndecorated, remove, removeNotify, setCursor, setExtendedState, setMaximizedBounds, setMenuBar, setResizable, setState, setTitle, setUndecorated
 
Methods inherited from class java.awt.Window
addPropertyChangeListener, addPropertyChangeListener, addWindowFocusListener, addWindowListener, addWindowStateListener, applyResourceBundle, applyResourceBundle, createBufferStrategy, createBufferStrategy, dispose, getBufferStrategy, getFocusableWindowState, getFocusCycleRootAncestor, getFocusOwner, getFocusTraversalKeys, getGraphicsConfiguration, getInputContext, getListeners, getLocale, getMostRecentFocusOwner, getOwnedWindows, getOwner, getToolkit, getWarningString, getWindowFocusListeners, getWindowListeners, getWindowStateListeners, hide, isActive, isAlwaysOnTop, isFocusableWindow, isFocusCycleRoot, isFocused, isLocationByPlatform, isShowing, pack, postEvent, processEvent, processWindowFocusEvent, processWindowStateEvent, removeWindowFocusListener, removeWindowListener, removeWindowStateListener, setAlwaysOnTop, setBounds, setCursor, setFocusableWindowState, setFocusCycleRoot, setLocationByPlatform, setLocationRelativeTo, show, toBack, toFront
 
Methods inherited from class java.awt.Container
add, add, add, add, add, addContainerListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalPolicy, getInsets, getLayout, getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paint, paintComponents, preferredSize, print, printComponents, processContainerEvent, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, transferFocusBackward, transferFocusDownCycle, validate, validateTree
 
Methods inherited from class java.awt.Component
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disable, disableEvents, dispatchEvent, enable, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphics, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isOpaque, isPreferredSizeSet, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, reshape, resize, resize, setBackground, setBounds, setComponentOrientation, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setLocation, setLocation, setMaximumSize, setMinimumSize, setName, setPreferredSize, setSize, setSize, setVisible, show, size, toString, transferFocus, transferFocusUpCycle
 
Methods inherited from class java.lang.Object
clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface java.awt.MenuContainer
getFont, postEvent
 

Constructor Detail

RemoteControlUI

public RemoteControlUI()
                throws java.awt.HeadlessException
Throws:
java.awt.HeadlessException

RemoteControlUI

public RemoteControlUI(java.lang.String title)
                throws java.awt.HeadlessException
Throws:
java.awt.HeadlessException
Method Detail

disableInteraction

protected void disableInteraction()

enableInteraction

protected void enableInteraction()

getListenerName

public java.lang.String getListenerName()
Description copied from interface: NamedListener
Unique name to identify the listener.

Specified by:
getListenerName in interface NamedListener
Returns:
name of listener. Might be null.

onReceiveConnection

public void onReceiveConnection()
Description copied from interface: ConnectionListener
Called when a 2-way sockets connection has been established.

Specified by:
onReceiveConnection in interface ConnectionListener

onReceiveDebug

public void onReceiveDebug(java.lang.String message)

onReceiveReady

public void onReceiveReady()
Description copied from interface: SocketProtocolListener
Remote client has issued the READY event

Specified by:
onReceiveReady in interface SocketProtocolListener

onReceiveRunning

public void onReceiveRunning()
Description copied from interface: SocketProtocolListener
Remote client has issued the RUNNING event--usually resulting from a DISPATCH event.

Specified by:
onReceiveRunning in interface SocketProtocolListener

onReceiveResult

public void onReceiveResult(int rc,
                            java.lang.String info)
Description copied from interface: SocketProtocolListener
Remote client has issued the RESULT event and is returning a simple statuscode and statusinfo response.

Specified by:
onReceiveResult in interface SocketProtocolListener
Parameters:
rc - -- int statuscode
info - -- String statusinfo. Can be null. Can be an empty string.

onReceiveResultProperties

public void onReceiveResultProperties(java.util.Properties result)
Description copied from interface: SocketProtocolListener
Remote client has issued the RESULT event and is returning result information in Properties.

Specified by:
onReceiveResultProperties in interface SocketProtocolListener

onReceiveMessage

public void onReceiveMessage(java.lang.String message)
Description copied from interface: SocketProtocolListener
Remote client has sent an arbitrary message. This is for custom communication between an engine and a remote client.

Specified by:
onReceiveMessage in interface SocketProtocolListener

actionPerformed

public void actionPerformed(java.awt.event.ActionEvent e)
Specified by:
actionPerformed in interface java.awt.event.ActionListener

main

public static void main(java.lang.String[] args)
java org.safs.android.RemoteControlUI

Parameters:
args - -- none

shutdownRemoteControl

protected void shutdownRemoteControl()

onReceiveLocalShutdown

public void onReceiveLocalShutdown(int cause)
Description copied from interface: ConnectionListener
A local source has issued a SHUTDOWN event/command.

Specified by:
onReceiveLocalShutdown in interface ConnectionListener
Parameters:
cause - is used to indicate whether the shutdown is due to normal or abnormal circumstances.
See Also:
SocketProtocol.STATUS_SHUTDOWN_NORMAL, SocketProtocol.STATUS_SHUTDOWN_REMOTE_CLIENT

onReceiveRemoteShutdown

public void onReceiveRemoteShutdown(int cause)
Description copied from interface: ConnectionListener
A remote source has issued a SHUTDOWN event/command.

Specified by:
onReceiveRemoteShutdown in interface ConnectionListener
Parameters:
cause - is used to indicate whether the shutdown is due to normal or abnormal circumstances.
See Also:
SocketProtocol.STATUS_SHUTDOWN_NORMAL, SocketProtocol.STATUS_SHUTDOWN_REMOTE_CLIENT

onReceiveException

public void onReceiveException(java.lang.String message)
Description copied from interface: SocketProtocolListener
Remote client has thrown/issued an Exception message.

Specified by:
onReceiveException in interface SocketProtocolListener