diff options
author | 2018-08-08 16:08:27 -0700 | |
---|---|---|
committer | 2018-10-02 12:24:18 -0700 | |
commit | 3720ed06a4be83f6cec4ad7233ed6b6773fb7403 (patch) | |
tree | e846ab76e17a018fd7199094f1fd0ed5d67ea0a8 | |
parent | 3fe5ead7632d6f9cb8ba7e06758faf836f4bea39 (diff) |
Implement Parcelling functions for InputWindowInfo
In preparation for parcelling across the SurfaceControl interface.
As a dependency we move the parcelling of InputChannels from
frameworks/base JNI code in to InputChannel.h.
Bug: 80101428
Bug: 113136004
Bug: 111440400
Test: None
Change-Id: Ib27f03282e9872274b834bb00737fd351e7a1b30
-rw-r--r-- | include/input/InputApplication.h (renamed from services/inputflinger/InputApplication.h) | 0 | ||||
-rw-r--r-- | include/input/InputTransport.h | 9 | ||||
-rw-r--r-- | include/input/InputWindow.h (renamed from services/inputflinger/InputWindow.h) | 9 | ||||
-rw-r--r-- | libs/gui/tests/Android.bp | 1 | ||||
-rw-r--r-- | libs/input/Android.bp | 3 | ||||
-rw-r--r-- | libs/input/InputApplication.cpp (renamed from services/inputflinger/InputApplication.cpp) | 2 | ||||
-rw-r--r-- | libs/input/InputTransport.cpp | 44 | ||||
-rw-r--r-- | libs/input/InputWindow.cpp (renamed from services/inputflinger/InputWindow.cpp) | 78 | ||||
-rw-r--r-- | libs/input/tests/Android.bp | 9 | ||||
-rw-r--r-- | libs/input/tests/InputWindow_test.cpp | 93 | ||||
-rw-r--r-- | services/inputflinger/Android.bp | 2 | ||||
-rw-r--r-- | services/inputflinger/InputDispatcher.h | 4 |
12 files changed, 239 insertions, 15 deletions
diff --git a/services/inputflinger/InputApplication.h b/include/input/InputApplication.h index 9b365b9f0d..9b365b9f0d 100644 --- a/services/inputflinger/InputApplication.h +++ b/include/input/InputApplication.h diff --git a/include/input/InputTransport.h b/include/input/InputTransport.h index 5fd86b48f7..4782c9b237 100644 --- a/include/input/InputTransport.h +++ b/include/input/InputTransport.h @@ -37,6 +37,7 @@ #include <utils/BitSet.h> namespace android { +class Parcel; /* * Intermediate representation used to send input events and related signals. @@ -143,6 +144,7 @@ protected: virtual ~InputChannel(); public: + InputChannel() = default; InputChannel(const std::string& name, int fd); /* Creates a pair of input channels. @@ -183,9 +185,14 @@ public: /* Returns a new object that has a duplicate of this channel's fd. */ sp<InputChannel> dup() const; + status_t write(Parcel& out) const; + status_t read(const Parcel& from); + private: + void setFd(int fd); + std::string mName; - int mFd; + int mFd = -1; }; /* diff --git a/services/inputflinger/InputWindow.h b/include/input/InputWindow.h index c481853e2c..7c284ddaf6 100644 --- a/services/inputflinger/InputWindow.h +++ b/include/input/InputWindow.h @@ -27,7 +27,7 @@ #include "InputApplication.h" namespace android { - +class Parcel; /* * Describes the properties of a window that can receive input. @@ -151,6 +151,9 @@ struct InputWindowInfo { bool supportsSplitTouch() const; bool overlaps(const InputWindowInfo* other) const; + + status_t write(Parcel& output) const; + static InputWindowInfo read(const Parcel& from); }; @@ -168,9 +171,7 @@ public: return mInfo; } - inline sp<InputChannel> getInputChannel() const { - return mInfo ? mInfo->inputChannel : nullptr; - } + sp<InputChannel> getInputChannel() const; inline std::string getName() const { return mInfo ? mInfo->name : "<invalid>"; diff --git a/libs/gui/tests/Android.bp b/libs/gui/tests/Android.bp index 02064c6cef..7ecadf836c 100644 --- a/libs/gui/tests/Android.bp +++ b/libs/gui/tests/Android.bp @@ -44,6 +44,7 @@ cc_test { "libgui", "libhidlbase", "libhidltransport", + "libinput", "libui", "libutils", "libnativewindow" diff --git a/libs/input/Android.bp b/libs/input/Android.bp index a2d6a8a798..72558a6d91 100644 --- a/libs/input/Android.bp +++ b/libs/input/Android.bp @@ -47,11 +47,14 @@ cc_library { "InputTransport.cpp", "VelocityControl.cpp", "VelocityTracker.cpp", + "InputApplication.cpp", + "InputWindow.cpp" ], shared_libs: [ "libutils", "libbinder", + "libui" ], sanitize: { diff --git a/services/inputflinger/InputApplication.cpp b/libs/input/InputApplication.cpp index c56dfe6879..a0d1668029 100644 --- a/services/inputflinger/InputApplication.cpp +++ b/libs/input/InputApplication.cpp @@ -16,7 +16,7 @@ #define LOG_TAG "InputApplication" -#include "InputApplication.h" +#include <input/InputApplication.h> #include <android/log.h> diff --git a/libs/input/InputTransport.cpp b/libs/input/InputTransport.cpp index 770d48397e..32444f9092 100644 --- a/libs/input/InputTransport.cpp +++ b/libs/input/InputTransport.cpp @@ -30,6 +30,7 @@ #include <cutils/properties.h> #include <log/log.h> +#include <binder/Parcel.h> #include <input/InputTransport.h> namespace android { @@ -100,15 +101,13 @@ size_t InputMessage::size() const { // --- InputChannel --- InputChannel::InputChannel(const std::string& name, int fd) : - mName(name), mFd(fd) { + mName(name) { #if DEBUG_CHANNEL_LIFECYCLE ALOGD("Input channel constructed: name='%s', fd=%d", mName.c_str(), fd); #endif - int result = fcntl(mFd, F_SETFL, O_NONBLOCK); - LOG_ALWAYS_FATAL_IF(result != 0, "channel '%s' ~ Could not make socket " - "non-blocking. errno=%d", mName.c_str(), errno); + setFd(fd); } InputChannel::~InputChannel() { @@ -120,6 +119,18 @@ InputChannel::~InputChannel() { ::close(mFd); } +void InputChannel::setFd(int fd) { + if (mFd > 0) { + ::close(mFd); + } + mFd = fd; + if (mFd > 0) { + int result = fcntl(mFd, F_SETFL, O_NONBLOCK); + LOG_ALWAYS_FATAL_IF(result != 0, "channel '%s' ~ Could not make socket " + "non-blocking. errno=%d", mName.c_str(), errno); + } +} + status_t InputChannel::openInputChannelPair(const std::string& name, sp<InputChannel>& outServerChannel, sp<InputChannel>& outClientChannel) { int sockets[2]; @@ -230,6 +241,31 @@ sp<InputChannel> InputChannel::dup() const { } +status_t InputChannel::write(Parcel& out) const { + status_t s = out.writeString8(String8(getName().c_str())); + + if (s != OK) { + return s; + } + + s = out.writeDupFileDescriptor(getFd()); + + return s; +} + +status_t InputChannel::read(const Parcel& from) { + mName = from.readString8(); + + int rawFd = from.readFileDescriptor(); + setFd(::dup(rawFd)); + + if (mFd < 0) { + return BAD_VALUE; + } + + return OK; +} + // --- InputPublisher --- InputPublisher::InputPublisher(const sp<InputChannel>& channel) : diff --git a/services/inputflinger/InputWindow.cpp b/libs/input/InputWindow.cpp index 0d1dfddb07..f94faba99b 100644 --- a/services/inputflinger/InputWindow.cpp +++ b/libs/input/InputWindow.cpp @@ -17,7 +17,9 @@ #define LOG_TAG "InputWindow" #define LOG_NDEBUG 0 -#include "InputWindow.h" +#include <binder/Parcel.h> +#include <input/InputWindow.h> +#include <input/InputTransport.h> #include <log/log.h> @@ -62,6 +64,76 @@ bool InputWindowInfo::overlaps(const InputWindowInfo* other) const { && frameTop < other->frameBottom && frameBottom > other->frameTop; } +status_t InputWindowInfo::write(Parcel& output) const { + if (inputChannel == nullptr) { + output.writeInt32(0); + return OK; + } + output.writeInt32(1); + status_t s = inputChannel->write(output); + if (s != OK) return s; + + output.writeString8(String8(name.c_str())); + output.writeInt32(layoutParamsFlags); + output.writeInt32(layoutParamsType); + output.writeInt64(dispatchingTimeout); + output.writeInt32(frameLeft); + output.writeInt32(frameTop); + output.writeInt32(frameRight); + output.writeInt32(frameBottom); + output.writeFloat(scaleFactor); + output.writeBool(visible); + output.writeBool(canReceiveKeys); + output.writeBool(hasFocus); + output.writeBool(hasWallpaper); + output.writeBool(paused); + output.writeInt32(layer); + output.writeInt32(ownerPid); + output.writeInt32(ownerUid); + output.writeInt32(inputFeatures); + output.writeInt32(displayId); + output.write(touchableRegion); + + return OK; +} + +InputWindowInfo InputWindowInfo::read(const Parcel& from) { + InputWindowInfo ret; + + if (from.readInt32() == 0) { + return ret; + + } + sp<InputChannel> inputChannel = new InputChannel(); + status_t s = inputChannel->read(from); + if (s != OK) { + return ret; + } + + ret.inputChannel = inputChannel; + ret.name = from.readString8().c_str(); + ret.layoutParamsFlags = from.readInt32(); + ret.layoutParamsType = from.readInt32(); + ret.dispatchingTimeout = from.readInt64(); + ret.frameLeft = from.readInt32(); + ret.frameTop = from.readInt32(); + ret.frameRight = from.readInt32(); + ret.frameBottom = from.readInt32(); + ret.scaleFactor = from.readFloat(); + ret.visible = from.readBool(); + ret.canReceiveKeys = from.readBool(); + ret.hasFocus = from.readBool(); + ret.hasWallpaper = from.readBool(); + ret.paused = from.readBool(); + ret.layer = from.readInt32(); + ret.ownerPid = from.readInt32(); + ret.ownerUid = from.readInt32(); + ret.inputFeatures = from.readInt32(); + ret.displayId = from.readInt32(); + from.read(ret.touchableRegion); + + return ret; +} // --- InputWindowHandle --- @@ -80,4 +152,8 @@ void InputWindowHandle::releaseInfo() { } } +sp<InputChannel> InputWindowHandle::getInputChannel() const { + return mInfo ? mInfo->inputChannel : nullptr; +} + } // namespace android diff --git a/libs/input/tests/Android.bp b/libs/input/tests/Android.bp index f06119f3f7..fdd945e90e 100644 --- a/libs/input/tests/Android.bp +++ b/libs/input/tests/Android.bp @@ -6,6 +6,7 @@ cc_test { "InputEvent_test.cpp", "InputPublisherAndConsumer_test.cpp", "VelocityTracker_test.cpp", + "InputWindow_test.cpp" ], cflags: [ "-Wall", @@ -34,4 +35,12 @@ cc_library_static { "-Wall", "-Werror", ], + shared_libs: [ + "libinput", + "libcutils", + "libutils", + "libbinder", + "libui", + "libbase", + ] } diff --git a/libs/input/tests/InputWindow_test.cpp b/libs/input/tests/InputWindow_test.cpp new file mode 100644 index 0000000000..39ad26e8c1 --- /dev/null +++ b/libs/input/tests/InputWindow_test.cpp @@ -0,0 +1,93 @@ +/* + * Copyright 2018 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. + */ + +#include <gtest/gtest.h> + +#include <binder/Parcel.h> + +#include <input/InputWindow.h> +#include <input/InputTransport.h> + +namespace android { +namespace test { + +TEST(InputWindowInfo, ParcellingWithoutChannel) { + InputWindowInfo i; + i.inputChannel = nullptr; + + Parcel p; + ASSERT_EQ(OK, i.write(p)); + p.setDataPosition(0); + InputWindowInfo i2 = InputWindowInfo::read(p); + ASSERT_TRUE(i2.inputChannel == nullptr); +} + +TEST(InputWindowInfo, Parcelling) { + sp<InputChannel> channel, junkChannel; + status_t result = InputChannel::openInputChannelPair("name", channel, junkChannel); + ASSERT_EQ(OK, result) << "openInputChannelPair should have returned valid channels"; + + InputWindowInfo i; + i.inputChannel = channel; + i.name = "Foobar"; + i.layoutParamsFlags = 7; + i.layoutParamsType = 39; + i.dispatchingTimeout = 12; + i.frameLeft = 93; + i.frameTop = 34; + i.frameRight = 16; + i.frameBottom = 19; + i.scaleFactor = 0.3; + i.visible = false; + i.canReceiveKeys = false; + i.hasFocus = false; + i.hasWallpaper = false; + i.paused = false; + i.layer = 7; + i.ownerPid = 19; + i.ownerUid = 24; + i.inputFeatures = 29; + i.displayId = 34; + + Parcel p; + i.write(p); + + p.setDataPosition(0); + InputWindowInfo i2 = InputWindowInfo::read(p); + ASSERT_EQ(i.inputChannel->getName(), i2.inputChannel->getName()); + ASSERT_EQ(i.name, i2.name); + ASSERT_EQ(i.layoutParamsFlags, i2.layoutParamsFlags); + ASSERT_EQ(i.layoutParamsType, i2.layoutParamsType); + ASSERT_EQ(i.dispatchingTimeout, i2.dispatchingTimeout); + ASSERT_EQ(i.frameLeft, i2.frameLeft); + ASSERT_EQ(i.frameTop, i2.frameTop); + ASSERT_EQ(i.frameRight, i2.frameRight); + ASSERT_EQ(i.frameBottom, i2.frameBottom); + ASSERT_EQ(i.scaleFactor, i2.scaleFactor); + ASSERT_EQ(i.visible, i2.visible); + ASSERT_EQ(i.canReceiveKeys, i2.canReceiveKeys); + ASSERT_EQ(i.hasFocus, i2.hasFocus); + ASSERT_EQ(i.hasWallpaper, i2.hasWallpaper); + ASSERT_EQ(i.paused, i2.paused); + ASSERT_EQ(i.layer, i2.layer); + ASSERT_EQ(i.ownerPid, i2.ownerPid); + ASSERT_EQ(i.ownerUid, i2.ownerUid); + ASSERT_EQ(i.inputFeatures, i2.inputFeatures); + ASSERT_EQ(i.displayId, i2.displayId); +} + +} // namespace test +} // namespace android diff --git a/services/inputflinger/Android.bp b/services/inputflinger/Android.bp index 45efb9fc08..9a65452f60 100644 --- a/services/inputflinger/Android.bp +++ b/services/inputflinger/Android.bp @@ -19,12 +19,10 @@ cc_library_shared { srcs: [ "EventHub.cpp", - "InputApplication.cpp", "InputDispatcher.cpp", "InputListener.cpp", "InputManager.cpp", "InputReader.cpp", - "InputWindow.cpp", ], shared_libs: [ diff --git a/services/inputflinger/InputDispatcher.h b/services/inputflinger/InputDispatcher.h index fdf75f68a6..5541ab2b2d 100644 --- a/services/inputflinger/InputDispatcher.h +++ b/services/inputflinger/InputDispatcher.h @@ -18,7 +18,9 @@ #define _UI_INPUT_DISPATCHER_H #include <input/Input.h> +#include <input/InputApplication.h> #include <input/InputTransport.h> +#include <input/InputWindow.h> #include <utils/KeyedVector.h> #include <utils/Vector.h> #include <utils/threads.h> @@ -33,8 +35,6 @@ #include <limits.h> #include <unordered_map> -#include "InputWindow.h" -#include "InputApplication.h" #include "InputListener.h" |