/* * Copyright (C) 2007 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.dumprendertree; import android.webkit.WebView; import android.view.KeyEvent; import android.util.*; import java.util.Arrays; public class WebViewEventSender implements EventSender { WebViewEventSender(WebView webView) { mWebView = webView; } public void resetMouse() { mouseX = mouseY = 0; } public void enableDOMUIEventLogging(int DOMNode) { // TODO Auto-generated method stub } public void fireKeyboardEventsToElement(int DOMNode) { // TODO Auto-generated method stub } public void keyDown(String character, String[] withModifiers) { Log.e("EventSender", "KeyDown: " + character + "(" + character.getBytes()[0] + ") Modifiers: " + Arrays.toString(withModifiers)); KeyEvent modifier = null; if (withModifiers != null && withModifiers.length > 0) { for (int i = 0; i < withModifiers.length; i++) { int keyCode = modifierMapper(withModifiers[i]); modifier = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode); mWebView.onKeyDown(modifier.getKeyCode(), modifier); } } int keyCode = keyMapper(character.toLowerCase().toCharArray()[0]); KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode); mWebView.onKeyDown(event.getKeyCode(), event); } public void keyDown(String character) { keyDown(character, null); } public void leapForward(int milliseconds) { // TODO Auto-generated method stub } public void mouseClick() { mouseDown(); mouseUp(); } public void mouseDown() { /* KeyEvent event = new KeyEvent( KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER); mWebView.onKeyDown(event.getKeyCode(), event); */ } public void mouseMoveTo(int X, int Y) { if (X > mouseX) { KeyEvent event = new KeyEvent( KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_RIGHT); mWebView.onKeyDown(event.getKeyCode(), event); mWebView.onKeyUp(event.getKeyCode(), event); } else if ( X < mouseX ) { KeyEvent event = new KeyEvent( KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_LEFT); mWebView.onKeyDown(event.getKeyCode(), event); mWebView.onKeyUp(event.getKeyCode(), event); } if (Y > mouseY) { KeyEvent event = new KeyEvent( KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_DOWN); mWebView.onKeyDown(event.getKeyCode(), event); mWebView.onKeyUp(event.getKeyCode(), event); } else if (Y < mouseY ) { KeyEvent event = new KeyEvent( KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_UP); mWebView.onKeyDown(event.getKeyCode(), event); mWebView.onKeyUp(event.getKeyCode(), event); } mouseX= X; mouseY= Y; } public void mouseUp() { /* KeyEvent event = new KeyEvent( KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER); mWebView.onKeyDown(event.getKeyCode(), event);*/ } // Assumes lowercase chars, case needs to be // handled by calling function. static int keyMapper(char c) { // handle numbers if (c >= '0' && c<= '9') { int offset = c - '0'; return KeyEvent.KEYCODE_0 + offset; } // handle characters if (c >= 'a' && c <= 'z') { int offset = c - 'a'; return KeyEvent.KEYCODE_A + offset; } // handle all others switch (c) { case '*': return KeyEvent.KEYCODE_STAR; case '#': return KeyEvent.KEYCODE_POUND; case ',': return KeyEvent.KEYCODE_COMMA; case '.': return KeyEvent.KEYCODE_PERIOD; case '\t': return KeyEvent.KEYCODE_TAB; case ' ': return KeyEvent.KEYCODE_SPACE; case '\n': return KeyEvent.KEYCODE_ENTER; case '\b': case 0x7F: return KeyEvent.KEYCODE_DEL; case '~': return KeyEvent.KEYCODE_GRAVE; case '-': return KeyEvent.KEYCODE_MINUS; case '=': return KeyEvent.KEYCODE_EQUALS; case '(': return KeyEvent.KEYCODE_LEFT_BRACKET; case ')': return KeyEvent.KEYCODE_RIGHT_BRACKET; case '\\': return KeyEvent.KEYCODE_BACKSLASH; case ';': return KeyEvent.KEYCODE_SEMICOLON; case '\'': return KeyEvent.KEYCODE_APOSTROPHE; case '/': return KeyEvent.KEYCODE_SLASH; default: break; } return c; } static int modifierMapper(String modifier) { if (modifier.equals("ctrlKey")) { return KeyEvent.KEYCODE_ALT_LEFT; } else if (modifier.equals("shiftKey")) { return KeyEvent.KEYCODE_SHIFT_LEFT; } else if (modifier.equals("altKey")) { return KeyEvent.KEYCODE_SYM; } else if (modifier.equals("metaKey")) { return KeyEvent.KEYCODE_UNKNOWN; } return KeyEvent.KEYCODE_UNKNOWN; } private WebView mWebView = null; private int mouseX; private int mouseY; }