* * 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. server ; import android. util . Log ; import android. view . Display; import android. view . MotionEvent; import android. view . Surface; import android. view . WindowManagerPolicy; import java . io . FileInputStream ; import java . util . StringTokenizer ; import java . io . File ; import java . io . FileNotFoundException ; import java . io . FileOutputStream ; import java . io . IOException ; public class InputDevice { /** Amount that trackball needs to move in order to generate a key event. */ static final int TRACKBALL_MOVEMENT_THRESHOLD = 6; //once edit static final String CALIBRATION_FILE = "/data/etc/pointercal" ; //edit ends final int id ; final int classes; final String name ; final AbsoluteInfo absX; final AbsoluteInfo absY; final AbsoluteInfo absPressure; final AbsoluteInfo absSize; //once edit static TransformInfo tInfo; //edit ends long mDownTime = 0; int mMetaKeysState = 0; static File desFile; final MotionState mAbs = new MotionState( 0, 0) ; final MotionState mRel = new MotionState( TRACKBALL_MOVEMENT_THRESHOLD, TRACKBALL_MOVEMENT_THRESHOLD) ; static class MotionState { int xPrecision; int yPrecision; float xMoveScale; float yMoveScale; MotionEvent currentMove = null ; boolean changed = false; boolean down = false; boolean lastDown = false; long downTime = 0; int x = 0; int y = 0; int pressure = 1; int size = 0; MotionState( int mx, int my) { xPrecision = mx; yPrecision = my; xMoveScale = mx ! = 0 ? ( 1. 0f/ mx) : 1. 0f; yMoveScale = my ! = 0 ? ( 1. 0f/ my) : 1. 0f; } MotionEvent generateMotion( InputDevice device, long curTime, boolean isAbs, Display display, int orientation, int metaState) { if ( ! changed) { return null ; } //once edit String prop = System . getProperty ( "ts.config.calibrate" , "noset" ) ; if ( prop. equalsIgnoreCase ( "start" ) ) { Log . i( "XXW prop" , prop) ; Log . i( "XXW" , "prop.equalsIgnoreCase start" ) ; device. tInfo = null ; } else if ( prop. equalsIgnoreCase ( "done" ) ) { Log . i( "XXW prop" , prop) ; Log . i( "XXW" , "prop.equalsIgnoreCase done" ) ; readCalibrate( ) ; System . setProperty ( "ts.config.calibrate" , "end" ) ; } else { Log . i( "XXW prop" , prop) ; Log . i( "XXW" , "prop.equalsIgnoreCase else" ) ; } //edit ends float scaledX = x; float scaledY = y; float temp; float scaledPressure = 1. 0f; float scaledSize = 0; int edgeFlags = 0; if ( isAbs) { int w = display. getWidth ( ) - 1; int h = display. getHeight ( ) - 1; if ( orientation = = Surface. ROTATION_90 | | orientation = = Surface. ROTATION_270) { int tmp = w; w = h; h = tmp; } if ( device. absX ! = null ) { //once edit if ( device. tInfo ! = null ) { scaledX = ( device. tInfo. x1 * x + device. tInfo. y1 * y + device. tInfo. z1) / device. tInfo. s; Log . i( "XXW" , "x: " + x) ; Log . i( "XXW" , "trans x: " + scaledX) ; } else //edit ends scaledX = ( ( scaledX- device. absX. minValue) / device. absX. range) * w; } if ( device. absY ! = null ) { //once edit if ( device. tInfo ! = null ) { scaledY = ( device. tInfo. x2 * x + device. tInfo. y2 * y + device. tInfo. z2) / device. tInfo. s; Log . i( "XXW" , "y: " + y) ; Log . i( "XXW" , "trans y: " + scaledY) ; } else //edit ends scaledY = ( ( scaledY- device. absY. minValue) / device. absY. range) * h; } if ( device. absPressure ! = null ) { scaledPressure = ( ( pressure- device. absPressure. minValue) / ( float ) device. absPressure. range) ; } if ( device. absSize ! = null ) { scaledSize = ( ( size - device. absSize. minValue) / ( float ) device. absSize. range) ; } switch ( orientation) { case Surface. ROTATION_90: temp = scaledX; scaledX = scaledY; scaledY = w- temp; break ; case Surface. ROTATION_180: scaledX = w- scaledX; scaledY = h- scaledY; break ; case Surface. ROTATION_270: temp = scaledX; scaledX = h- scaledY; scaledY = temp; break ; } if ( scaledX = = 0) { edgeFlags + = MotionEvent. EDGE_LEFT; } else if ( scaledX = = display. getWidth ( ) - 1. 0f) { edgeFlags + = MotionEvent. EDGE_RIGHT; } if ( scaledY = = 0) { edgeFlags + = MotionEvent. EDGE_TOP; } else if ( scaledY = = display. getHeight ( ) - 1. 0f) { edgeFlags + = MotionEvent. EDGE_BOTTOM; } } else { scaledX * = xMoveScale; scaledY * = yMoveScale; switch ( orientation) { case Surface. ROTATION_90: temp = scaledX; scaledX = scaledY; scaledY = - temp; break ; case Surface. ROTATION_180: scaledX = - scaledX; scaledY = - scaledY; break ; case Surface. ROTATION_270: temp = scaledX; scaledX = - scaledY; scaledY = temp; break ; } } changed = false; if ( down ! = lastDown) { int action ; lastDown = down; if ( down) { action = MotionEvent. ACTION_DOWN; downTime = curTime; } else { action = MotionEvent. ACTION_UP; } currentMove = null ; if ( ! isAbs) { x = y = 0; } return MotionEvent. obtain( downTime, curTime, action , scaledX, scaledY, scaledPressure, scaledSize, metaState, xPrecision, yPrecision, device. id , edgeFlags) ; } else { if ( currentMove ! = null ) { if ( false) Log . i( "InputDevice" , "Adding batch x=" + scaledX + " y=" + scaledY + " to " + currentMove) ; currentMove. addBatch ( curTime, scaledX, scaledY, scaledPressure, scaledSize, metaState) ; if ( WindowManagerPolicy. WATCH_POINTER) { Log . i( "KeyInputQueue" , "Updating: " + currentMove) ; } return null ; } MotionEvent me = MotionEvent. obtain( downTime, curTime, MotionEvent. ACTION_MOVE, scaledX, scaledY, scaledPressure, scaledSize, metaState, xPrecision, yPrecision, device. id , edgeFlags) ; currentMove = me; return me; } } } static class AbsoluteInfo { int minValue; int maxValue; int range; int flat; int fuzz; } ; //once edit static class TransformInfo { float x1; float y1; float z1; float x2; float y2; float z2; float s; } ; //edit ends InputDevice( int _id, int _classes, String _name, AbsoluteInfo _absX, AbsoluteInfo _absY, AbsoluteInfo _absPressure, AbsoluteInfo _absSize) { id = _id; classes = _classes; name = _name; absX = _absX; absY = _absY; absPressure = _absPressure; absSize = _absSize; //once edit desFile = new File ( CALIBRATION_FILE) ; readCalibrate( ) ; //edit ends } static void readCalibrate( ) { //xxw added Log . i( "XXW" , "readCalibrate!" ) ; TransformInfo t = null ; try { FileInputStream is = new FileInputStream ( CALIBRATION_FILE) ; byte [ ] mBuffer = new byte [ 64] ; int len = is. read ( mBuffer) ; is. close ( ) ; if ( len > 0) { int i; for ( i = 0 ; i < len ; i+ + ) { if ( mBuffer[ i] = = '/n' | | mBuffer[ i] = = 0) { break ; } } len = i; } StringTokenizer st = new StringTokenizer ( new String ( mBuffer, 0, 0, len) ) ; t = new TransformInfo ( ) ; t. x1 = Integer . parseInt ( st. nextToken ( ) ) ; t. y1 = Integer . parseInt ( st. nextToken ( ) ) ; t. z1 = Integer . parseInt ( st. nextToken ( ) ) ; t. x2 = Integer . parseInt ( st. nextToken ( ) ) ; t. y2 = Integer . parseInt ( st. nextToken ( ) ) ; t. z2 = Integer . parseInt ( st. nextToken ( ) ) ; t. s = Integer . parseInt ( st. nextToken ( ) ) ; } catch ( java . io . FileNotFoundException e) { Log . i( "XXW" , "FileNotFound!" ) ; } catch ( java . io . IOException e) { Log . i( "XXW" , "IOException" ) ; } tInfo = t; Log . i( "XXW" , "readCalibrate done!" ) ; } } ; |