*
*
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!"
)
;
}
}
;
|