am 24a0b71a: Merge "Clip touch event at SoftInputWindow to handle the event from Inset" into honeycomb

* commit '24a0b71a67ca98fbb94ff6ff321acb155d8a1014':
  Clip touch event at SoftInputWindow to handle the event from Inset
This commit is contained in:
Ken Wakasa
2011-01-25 07:28:12 -08:00
committed by Android Git Automerger

View File

@@ -19,11 +19,16 @@ package android.inputmethodservice;
import android.app.Dialog;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Rect;
import android.os.IBinder;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import java.lang.Math;
/**
* A SoftInputWindow is a Dialog that is intended to be used for a top-level input
* method window. It will be displayed along the edge of the screen, moving
@@ -32,6 +37,7 @@ import android.view.WindowManager;
*/
class SoftInputWindow extends Dialog {
final KeyEvent.DispatcherState mDispatcherState;
private final Rect mBounds = new Rect();
public void setToken(IBinder token) {
WindowManager.LayoutParams lp = getWindow().getAttributes();
@@ -64,6 +70,13 @@ class SoftInputWindow extends Dialog {
mDispatcherState.reset();
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
getWindow().getDecorView().getHitRect(mBounds);
final MotionEvent event = clipMotionEvent(ev, mBounds);
return super.dispatchTouchEvent(event);
}
/**
* Get the size of the DockWindow.
*
@@ -150,4 +163,48 @@ class SoftInputWindow extends Dialog {
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_DIM_BEHIND);
}
private static MotionEvent clipMotionEvent(MotionEvent me, Rect bounds) {
final int pointerCount = me.getPointerCount();
boolean shouldClip = false;
for (int pointerIndex = 0; pointerIndex < pointerCount; pointerIndex++) {
final int x = (int)me.getX(pointerIndex);
final int y = (int)me.getY(pointerIndex);
if (!bounds.contains(x, y)) {
shouldClip = true;
break;
}
}
if (!shouldClip)
return me;
if (pointerCount == 1) {
final int x = (int)me.getX();
final int y = (int)me.getY();
me.setLocation(
Math.max(bounds.left, Math.min(x, bounds.right - 1)),
Math.max(bounds.top, Math.min(y, bounds.bottom - 1)));
return me;
}
final int[] pointerIds = new int[pointerCount];
final MotionEvent.PointerCoords[] pointerCoords =
new MotionEvent.PointerCoords[pointerCount];
for (int pointerIndex = 0; pointerIndex < pointerCount; pointerIndex++) {
pointerIds[pointerIndex] = me.getPointerId(pointerIndex);
final MotionEvent.PointerCoords coords = new MotionEvent.PointerCoords();
me.getPointerCoords(pointerIndex, coords);
pointerCoords[pointerIndex] = coords;
final int x = (int)coords.x;
final int y = (int)coords.y;
if (!bounds.contains(x, y)) {
coords.x = Math.max(bounds.left, Math.min(x, bounds.right - 1));
coords.y = Math.max(bounds.top, Math.min(y, bounds.bottom - 1));
}
}
return MotionEvent.obtain(
me.getDownTime(), me.getEventTime(), me.getAction(), pointerCount, pointerIds,
pointerCoords, me.getMetaState(), me.getXPrecision(), me.getYPrecision(),
me.getDeviceId(), me.getEdgeFlags(), me.getSource(), me.getFlags());
}
}