Merge "Fix ViewRoot bug attempting to finish synthetic KeyEvents." into gingerbread
This commit is contained in:
@ -52,7 +52,6 @@ import android.Manifest;
|
|||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
|
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
import java.io.FileDescriptor;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -1869,7 +1868,7 @@ public final class ViewRoot extends Handler implements ViewParent,
|
|||||||
if (LOCAL_LOGV) Log.v(
|
if (LOCAL_LOGV) Log.v(
|
||||||
TAG, "Dispatching key "
|
TAG, "Dispatching key "
|
||||||
+ msg.obj + " to " + mView);
|
+ msg.obj + " to " + mView);
|
||||||
deliverKeyEvent((KeyEvent)msg.obj, true);
|
deliverKeyEvent((KeyEvent)msg.obj, msg.arg1 != 0);
|
||||||
break;
|
break;
|
||||||
case DISPATCH_POINTER: {
|
case DISPATCH_POINTER: {
|
||||||
MotionEvent event = (MotionEvent) msg.obj;
|
MotionEvent event = (MotionEvent) msg.obj;
|
||||||
@ -2021,9 +2020,14 @@ public final class ViewRoot extends Handler implements ViewParent,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void finishKeyEvent(KeyEvent event) {
|
private void finishKeyEvent(KeyEvent event) {
|
||||||
|
if (LOCAL_LOGV) Log.v(TAG, "Telling window manager key is finished");
|
||||||
|
|
||||||
if (mFinishedCallback != null) {
|
if (mFinishedCallback != null) {
|
||||||
mFinishedCallback.run();
|
mFinishedCallback.run();
|
||||||
mFinishedCallback = null;
|
mFinishedCallback = null;
|
||||||
|
} else {
|
||||||
|
Slog.w(TAG, "Attempted to tell the input queue that the current key event "
|
||||||
|
+ "is finished but there is no key event actually in progress.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2483,8 +2487,6 @@ public final class ViewRoot extends Handler implements ViewParent,
|
|||||||
? mView.dispatchKeyEventPreIme(event) : true;
|
? mView.dispatchKeyEventPreIme(event) : true;
|
||||||
if (handled) {
|
if (handled) {
|
||||||
if (sendDone) {
|
if (sendDone) {
|
||||||
if (LOCAL_LOGV) Log.v(
|
|
||||||
TAG, "Telling window manager key is finished");
|
|
||||||
finishKeyEvent(event);
|
finishKeyEvent(event);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@ -2516,8 +2518,6 @@ public final class ViewRoot extends Handler implements ViewParent,
|
|||||||
deliverKeyEventToViewHierarchy(event, sendDone);
|
deliverKeyEventToViewHierarchy(event, sendDone);
|
||||||
return;
|
return;
|
||||||
} else if (sendDone) {
|
} else if (sendDone) {
|
||||||
if (LOCAL_LOGV) Log.v(
|
|
||||||
TAG, "Telling window manager key is finished");
|
|
||||||
finishKeyEvent(event);
|
finishKeyEvent(event);
|
||||||
} else {
|
} else {
|
||||||
Log.w(TAG, "handleFinishedEvent(seq=" + seq
|
Log.w(TAG, "handleFinishedEvent(seq=" + seq
|
||||||
@ -2591,8 +2591,6 @@ public final class ViewRoot extends Handler implements ViewParent,
|
|||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
if (sendDone) {
|
if (sendDone) {
|
||||||
if (LOCAL_LOGV) Log.v(
|
|
||||||
TAG, "Telling window manager key is finished");
|
|
||||||
finishKeyEvent(event);
|
finishKeyEvent(event);
|
||||||
}
|
}
|
||||||
// Let the exception fall through -- the looper will catch
|
// Let the exception fall through -- the looper will catch
|
||||||
@ -2776,9 +2774,14 @@ public final class ViewRoot extends Handler implements ViewParent,
|
|||||||
|
|
||||||
private final InputHandler mInputHandler = new InputHandler() {
|
private final InputHandler mInputHandler = new InputHandler() {
|
||||||
public void handleKey(KeyEvent event, Runnable finishedCallback) {
|
public void handleKey(KeyEvent event, Runnable finishedCallback) {
|
||||||
|
if (mFinishedCallback != null) {
|
||||||
|
Slog.w(TAG, "Received a new key event from the input queue but there is "
|
||||||
|
+ "already an unfinished key event in progress.");
|
||||||
|
}
|
||||||
|
|
||||||
mFinishedCallback = finishedCallback;
|
mFinishedCallback = finishedCallback;
|
||||||
|
|
||||||
dispatchKey(event);
|
dispatchKey(event, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleMotion(MotionEvent event, Runnable finishedCallback) {
|
public void handleMotion(MotionEvent event, Runnable finishedCallback) {
|
||||||
@ -2789,9 +2792,13 @@ public final class ViewRoot extends Handler implements ViewParent,
|
|||||||
};
|
};
|
||||||
|
|
||||||
public void dispatchKey(KeyEvent event) {
|
public void dispatchKey(KeyEvent event) {
|
||||||
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
dispatchKey(event, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void dispatchKey(KeyEvent event, boolean sendDone) {
|
||||||
//noinspection ConstantConditions
|
//noinspection ConstantConditions
|
||||||
if (false && event.getKeyCode() == KeyEvent.KEYCODE_CAMERA) {
|
if (false && event.getAction() == KeyEvent.ACTION_DOWN) {
|
||||||
|
if (event.getKeyCode() == KeyEvent.KEYCODE_CAMERA) {
|
||||||
if (Config.LOGD) Log.d("keydisp",
|
if (Config.LOGD) Log.d("keydisp",
|
||||||
"===================================================");
|
"===================================================");
|
||||||
if (Config.LOGD) Log.d("keydisp", "Focused view Hierarchy is:");
|
if (Config.LOGD) Log.d("keydisp", "Focused view Hierarchy is:");
|
||||||
@ -2804,6 +2811,7 @@ public final class ViewRoot extends Handler implements ViewParent,
|
|||||||
|
|
||||||
Message msg = obtainMessage(DISPATCH_KEY);
|
Message msg = obtainMessage(DISPATCH_KEY);
|
||||||
msg.obj = event;
|
msg.obj = event;
|
||||||
|
msg.arg1 = sendDone ? 1 : 0;
|
||||||
|
|
||||||
if (LOCAL_LOGV) Log.v(
|
if (LOCAL_LOGV) Log.v(
|
||||||
TAG, "sending key " + event + " to " + mView);
|
TAG, "sending key " + event + " to " + mView);
|
||||||
|
Reference in New Issue
Block a user