org.safs.android
Class SocketServerUI

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.SocketServerUI
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, SocketServerListener, ConnectionListener, NamedListener

public class SocketServerUI
extends javax.swing.JFrame
implements SocketServerListener, 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 local SocketServer implementing a SocketProtocol to communicate and control Android automation on a 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 SocketServerUI:

    java org.safs.android.SocketServerUI

  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 SocketServerUI status line should read "REMOTE READY".

  10. In SocketServerUI, type "launch" and press "Send". The target app launcher Activity should get launched.

  11. In SockerServerUI, 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 SocketServerUI 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. SocketServerUI 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.android.SocketServerListener
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
SocketServerUI()
           
SocketServerUI(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.SocketServerUI
 void onReceiveComment(java.lang.String message)
          Remote client has sent a loggable status comment message.
 void onReceiveConnection()
          Called when a 2-way sockets connection has been established.
 void onReceiveDebug(java.lang.String message)
           
 void onReceiveDetail(java.lang.String message)
          Remote client has sent a loggable status detail 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.
 void onReceiveSPCMap(java.lang.String message)
          Remote client has sent Process Container App Map Info to log to the App Map output file.
 void onReceiveSPCOut(java.lang.String message)
          Remote client has sent Process Container Object Info to log to the object output file.
 
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

SocketServerUI

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

SocketServerUI

public SocketServerUI(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

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

onReceiveDebug

public void onReceiveDebug(java.lang.String message)

onReceiveSPCOut

public void onReceiveSPCOut(java.lang.String message)
Description copied from interface: SocketServerListener
Remote client has sent Process Container Object Info to log to the object output file.

Specified by:
onReceiveSPCOut in interface SocketServerListener
See Also:
DroidEngine.sendSPCOut(String), MessengerService.onEngineSPCOUT(String), JavaSocketsHook.onReceiveSPCOut(String)

onReceiveSPCMap

public void onReceiveSPCMap(java.lang.String message)
Description copied from interface: SocketServerListener
Remote client has sent Process Container App Map Info to log to the App Map output file.

Specified by:
onReceiveSPCMap in interface SocketServerListener
See Also:
DroidEngine.sendSPCMap(String), MessengerService.onEngineSPCMAP(String), JavaSocketsHook.onReceiveSPCMap(String)

onReceiveReady

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

Specified by:
onReceiveReady in interface SocketServerListener
See Also:
DroidEngine.sendReady(), MessengerService.onEngineReady(), JavaSocketsHook.onReceiveReady()

onReceiveRunning

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

Specified by:
onReceiveRunning in interface SocketServerListener
See Also:
DroidEngine.sendRunning(), MessengerService.onEngineRunning(), JavaSocketsHook.onReceiveRunning()

onReceiveResult

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

Specified by:
onReceiveResult in interface SocketServerListener
Parameters:
rc - -- int statuscode
info - -- String statusinfo. Can be null. Can be an empty string.
See Also:
DroidEngine.sendServiceResult(int, String), MessengerService.onEngineResult(int, String), JavaSocketsHook.onReceiveResult(int, String)

onReceiveResultProperties

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

Specified by:
onReceiveResultProperties in interface SocketServerListener
See Also:
DroidEngine.sendServiceResult(java.util.Properties), MessengerService.onEngineResultProps(char[]), JavaSocketsHook.onReceiveResultProperties(java.util.Properties)

onReceiveComment

public void onReceiveComment(java.lang.String message)
Description copied from interface: SocketServerListener
Remote client has sent a loggable status comment message.

Specified by:
onReceiveComment in interface SocketServerListener
See Also:
DroidEngine.sendComment(String), MessengerService.onEngineComment(String), JavaSocketsHook.onReceiveComment(String)

onReceiveDetail

public void onReceiveDetail(java.lang.String message)
Description copied from interface: SocketServerListener
Remote client has sent a loggable status detail message.

Specified by:
onReceiveDetail in interface SocketServerListener
See Also:
DroidEngine.sendDetail(String), MessengerService.onEngineDetail(String), JavaSocketsHook.onReceiveDetail(String)

onReceiveException

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

Specified by:
onReceiveException in interface SocketServerListener
See Also:
DroidEngine.sendException(String), MessengerService.onEngineException(String), JavaSocketsHook.onReceiveException(String)

onReceiveMessage

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

Specified by:
onReceiveMessage in interface SocketServerListener
See Also:
DroidEngine.sendMessage(String), MessengerService.onEngineMessage(String), JavaSocketsHook.onReceiveMessage(String)

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.SocketServerUI

Parameters:
args - -- none