/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.monkeyrunner.controller; import com.android.chimpchat.core.PhysicalButton; import com.android.chimpchat.core.TouchPressType; import com.android.chimpchat.core.IChimpImage; import com.android.chimpchat.core.IChimpDevice; import java.awt.KeyEventDispatcher; import java.awt.KeyboardFocusManager; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JToolBar; import javax.swing.SwingUtilities; import javax.swing.Timer; /** * Main window for MonkeyController. */ public class MonkeyControllerFrame extends JFrame { private static final Logger LOG = Logger.getLogger(MonkeyControllerFrame.class.getName()); private final JButton refreshButton = new JButton("Refresh"); private final JButton variablesButton = new JButton("Variable"); private final JLabel imageLabel = new JLabel(); private final VariableFrame variableFrame; private final IChimpDevice device; private BufferedImage currentImage; private final TouchPressType DOWN_AND_UP = TouchPressType.DOWN_AND_UP; private final Timer timer = new Timer(1000, new ActionListener() { public void actionPerformed(ActionEvent e) { updateScreen(); } }); private class PressAction extends AbstractAction { private final PhysicalButton button; public PressAction(PhysicalButton button) { this.button = button; } /* When this fails, it no longer throws a runtime exception, * but merely will log the failure. */ public void actionPerformed(ActionEvent event) { device.press(button.getKeyName(), DOWN_AND_UP); updateScreen(); } } private JButton createToolbarButton(PhysicalButton hardButton) { JButton button = new JButton(new PressAction(hardButton)); button.setText(hardButton.getKeyName()); return button; } public MonkeyControllerFrame(IChimpDevice chimpDevice) { super("MonkeyController"); this.device = chimpDevice; setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); JToolBar toolbar = new JToolBar(); toolbar.add(createToolbarButton(PhysicalButton.HOME)); toolbar.add(createToolbarButton(PhysicalButton.BACK)); toolbar.add(createToolbarButton(PhysicalButton.SEARCH)); toolbar.add(createToolbarButton(PhysicalButton.MENU)); add(toolbar); add(refreshButton); add(variablesButton); add(imageLabel); refreshButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { updateScreen(); } }); variableFrame = new VariableFrame(); variablesButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { variableFrame.setVisible(true); } }); /* Similar to above, when the following two methods fail, they * no longer throw a runtime exception, but merely will log the failure. */ imageLabel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent event) { device.touch(event.getX(), event.getY(), DOWN_AND_UP); updateScreen(); } }); KeyboardFocusManager focusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); focusManager.addKeyEventDispatcher(new KeyEventDispatcher() { public boolean dispatchKeyEvent(KeyEvent event) { if (KeyEvent.KEY_TYPED == event.getID()) { device.type(Character.toString(event.getKeyChar())); } return false; } }); SwingUtilities.invokeLater(new Runnable(){ public void run() { init(); variableFrame.init(device); } }); pack(); } private void updateScreen() { IChimpImage snapshot = device.takeSnapshot(); currentImage = snapshot.createBufferedImage(); imageLabel.setIcon(new ImageIcon(currentImage)); pack(); } private void init() { updateScreen(); timer.start(); } }