diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/view/ViewRootImpl.java | 32 | ||||
-rw-r--r-- | core/java/android/view/WindowManager.java | 9 | ||||
-rw-r--r-- | core/jni/android_view_InputChannel.cpp | 27 | ||||
-rw-r--r-- | core/jni/android_view_InputQueue.cpp | 15 |
4 files changed, 56 insertions, 27 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index a0cc287..5c045bb 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -454,7 +454,10 @@ public final class ViewRootImpl extends Handler implements ViewParent, // manager, to make sure we do the relayout before receiving // any other events from the system. requestLayout(); - mInputChannel = new InputChannel(); + if ((mWindowAttributes.inputFeatures + & WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0) { + mInputChannel = new InputChannel(); + } try { res = sWindowSession.add(mWindow, mWindowAttributes, getHostVisibility(), mAttachInfo.mContentInsets, @@ -524,12 +527,14 @@ public final class ViewRootImpl extends Handler implements ViewParent, mInputQueueCallback = ((RootViewSurfaceTaker)view).willYouTakeTheInputQueue(); } - if (mInputQueueCallback != null) { - mInputQueue = new InputQueue(mInputChannel); - mInputQueueCallback.onInputQueueCreated(mInputQueue); - } else { - InputQueue.registerInputChannel(mInputChannel, mInputHandler, - Looper.myQueue()); + if (mInputChannel != null) { + if (mInputQueueCallback != null) { + mInputQueue = new InputQueue(mInputChannel); + mInputQueueCallback.onInputQueueCreated(mInputQueue); + } else { + InputQueue.registerInputChannel(mInputChannel, mInputHandler, + Looper.myQueue()); + } } view.assignParent(this); @@ -2152,13 +2157,12 @@ public final class ViewRootImpl extends Handler implements ViewParent, mSurface.release(); - if (mInputChannel != null) { - if (mInputQueueCallback != null) { - mInputQueueCallback.onInputQueueDestroyed(mInputQueue); - mInputQueueCallback = null; - } else { - InputQueue.unregisterInputChannel(mInputChannel); - } + if (mInputQueueCallback != null && mInputQueue != null) { + mInputQueueCallback.onInputQueueDestroyed(mInputQueue); + mInputQueueCallback = null; + mInputQueue = null; + } else if (mInputChannel != null) { + InputQueue.unregisterInputChannel(mInputChannel); } try { sWindowSession.remove(mWindow); diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index fdd9b2c..52d25d9 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -1029,9 +1029,18 @@ public interface WindowManager extends ViewManager { public static final int INPUT_FEATURE_DISABLE_POINTER_GESTURES = 0x00000001; /** + * Does not construct an input channel for this window. The channel will therefore + * be incapable of receiving input. + * + * @hide + */ + public static final int INPUT_FEATURE_NO_INPUT_CHANNEL = 0x00000002; + + /** * Control special features of the input subsystem. * * @see #INPUT_FEATURE_DISABLE_TOUCH_PAD_GESTURES + * @see #INPUT_FEATURE_NO_INPUT_CHANNEL * @hide */ public int inputFeatures; diff --git a/core/jni/android_view_InputChannel.cpp b/core/jni/android_view_InputChannel.cpp index 0c2801c..5fcf8fa 100644 --- a/core/jni/android_view_InputChannel.cpp +++ b/core/jni/android_view_InputChannel.cpp @@ -111,7 +111,9 @@ static jobject android_view_InputChannel_createInputChannel(JNIEnv* env, NativeInputChannel* nativeInputChannel) { jobject inputChannelObj = env->NewObject(gInputChannelClassInfo.clazz, gInputChannelClassInfo.ctor); - android_view_InputChannel_setNativeInputChannel(env, inputChannelObj, nativeInputChannel); + if (inputChannelObj) { + android_view_InputChannel_setNativeInputChannel(env, inputChannelObj, nativeInputChannel); + } return inputChannelObj; } @@ -126,18 +128,29 @@ static jobjectArray android_view_InputChannel_nativeOpenInputChannelPair(JNIEnv* status_t result = InputChannel::openInputChannelPair(name, serverChannel, clientChannel); if (result) { - LOGE("Could not open input channel pair. status=%d", result); - jniThrowRuntimeException(env, "Could not open input channel pair."); + String8 message; + message.appendFormat("Could not open input channel pair. status=%d", result); + jniThrowRuntimeException(env, message.string()); + return NULL; + } + + jobjectArray channelPair = env->NewObjectArray(2, gInputChannelClassInfo.clazz, NULL); + if (env->ExceptionCheck()) { return NULL; } - // TODO more robust error checking jobject serverChannelObj = android_view_InputChannel_createInputChannel(env, new NativeInputChannel(serverChannel)); + if (env->ExceptionCheck()) { + return NULL; + } + jobject clientChannelObj = android_view_InputChannel_createInputChannel(env, new NativeInputChannel(clientChannel)); + if (env->ExceptionCheck()) { + return NULL; + } - jobjectArray channelPair = env->NewObjectArray(2, gInputChannelClassInfo.clazz, NULL); env->SetObjectArrayElement(channelPair, 0, serverChannelObj); env->SetObjectArrayElement(channelPair, 1, clientChannelObj); return channelPair; @@ -161,7 +174,7 @@ static void android_view_InputChannel_nativeDispose(JNIEnv* env, jobject obj, jb static void android_view_InputChannel_nativeTransferTo(JNIEnv* env, jobject obj, jobject otherObj) { - if (android_view_InputChannel_getInputChannel(env, otherObj) != NULL) { + if (android_view_InputChannel_getNativeInputChannel(env, otherObj) != NULL) { jniThrowException(env, "java/lang/IllegalStateException", "Other object already has a native input channel."); return; @@ -175,7 +188,7 @@ static void android_view_InputChannel_nativeTransferTo(JNIEnv* env, jobject obj, static void android_view_InputChannel_nativeReadFromParcel(JNIEnv* env, jobject obj, jobject parcelObj) { - if (android_view_InputChannel_getInputChannel(env, obj) != NULL) { + if (android_view_InputChannel_getNativeInputChannel(env, obj) != NULL) { jniThrowException(env, "java/lang/IllegalStateException", "This object already has a native input channel."); return; diff --git a/core/jni/android_view_InputQueue.cpp b/core/jni/android_view_InputQueue.cpp index 80c4871..300c04a 100644 --- a/core/jni/android_view_InputQueue.cpp +++ b/core/jni/android_view_InputQueue.cpp @@ -455,8 +455,9 @@ static void android_view_InputQueue_nativeRegisterInputChannel(JNIEnv* env, jcla env, inputChannelObj, inputHandlerObj, messageQueueObj); if (status) { - jniThrowRuntimeException(env, "Failed to register input channel. " - "Check logs for details."); + String8 message; + message.appendFormat("Failed to register input channel. status=%d", status); + jniThrowRuntimeException(env, message.string()); } } @@ -465,8 +466,9 @@ static void android_view_InputQueue_nativeUnregisterInputChannel(JNIEnv* env, jc status_t status = gNativeInputQueue.unregisterInputChannel(env, inputChannelObj); if (status) { - jniThrowRuntimeException(env, "Failed to unregister input channel. " - "Check logs for details."); + String8 message; + message.appendFormat("Failed to unregister input channel. status=%d", status); + jniThrowRuntimeException(env, message.string()); } } @@ -479,8 +481,9 @@ static void android_view_InputQueue_nativeFinished(JNIEnv* env, jclass clazz, // was no longer registered (DEAD_OBJECT) since it is a common race that can occur // during application shutdown. The input dispatcher recovers gracefully anyways. if (status != OK && status != DEAD_OBJECT) { - jniThrowRuntimeException(env, "Failed to finish input event. " - "Check logs for details."); + String8 message; + message.appendFormat("Failed to finish input event. status=%d", status); + jniThrowRuntimeException(env, message.string()); } } |