org.safs.sockets
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.sockets.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

public class SocketServerUI
extends javax.swing.JFrame
implements SocketServerListener, java.awt.event.ActionListener

Crude Test app for initial manual testing of remote control for Android Automation with Robotium. This app provides a minimalist crude UI for manually entering and sending messages over TCP Sockets to control the on-device test app.

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.sockets.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. In SocketServerUI, type "shutdown_hook" and press "Send". The remote Droid Engine and SAFS Messenger Service should all shutdown and the icon in the Droid Notification area should disappear.

  13. 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.sockets.SocketServerListener
DEFAULT_NAME, KEY_LOGCOMMENT, KEY_LOGCOMMENT_FAILED, KEY_LOGCOMMENT_GENERIC, KEY_LOGCOMMENT_PARAMS, KEY_LOGDETAIL, KEY_LOGDETAIL_FAILED, KEY_LOGDETAIL_GENERIC, KEY_LOGDETAIL_PARAMS, KEY_LOGTYPE, KEY_STATUSCODE, KEY_STATUSINFO
 
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)
           
 java.lang.String getListenerName()
           
static void main(java.lang.String[] args)
           
 void onReceiveComment(java.lang.String message)
          Remote client has sent a loggable status comment message.
 void onReceiveConnection()
          Remote client has successfully connected.
 void onReceiveDebug(java.lang.String message)
          Remote client has sent a SAFS Debug Log message to be logged.
 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 onReceiveMessage(java.lang.String message)
          Remote client has sent an arbitrary message.
 void onReceiveReady()
          Remote client has issued the READY event
 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 onReceiveShutdown()
          Remote client has issued the SHUTDOWN event and should be considered no longer available.
 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.
 void onSocketServerShutdown(int cause)
          The SocketServer to which we are listening has shutdown its processing Thread.
 
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

onSocketServerShutdown

public void onSocketServerShutdown(int cause)
Description copied from interface: SocketServerListener
The SocketServer to which we are listening has shutdown its processing Thread. This might be the result of exhausting all possible connection or communication scenarios--or other shutdown activities both normal or unexpected.

Specified by:
onSocketServerShutdown in interface SocketServerListener

getListenerName

public java.lang.String getListenerName()
Specified by:
getListenerName in interface SocketServerListener
Returns:
String unique/printable/loggable name of the listener

onReceiveConnection

public void onReceiveConnection()
Description copied from interface: SocketServerListener
Remote client has successfully connected.

Specified by:
onReceiveConnection in interface SocketServerListener

onReceiveDebug

public void onReceiveDebug(java.lang.String message)
Description copied from interface: SocketServerListener
Remote client has sent a SAFS Debug Log message to be logged.

Specified by:
onReceiveDebug in interface SocketServerListener

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

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

onReceiveReady

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

Specified by:
onReceiveReady in interface SocketServerListener

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

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.

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

onReceiveShutdown

public void onReceiveShutdown()
Description copied from interface: SocketServerListener
Remote client has issued the SHUTDOWN event and should be considered no longer available.

Specified by:
onReceiveShutdown in interface SocketServerListener

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

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

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

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

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)
Parameters:
args -