diff options
author | 2020-07-09 17:03:21 -0500 | |
---|---|---|
committer | 2020-07-20 14:46:20 -0500 | |
commit | ce5ab0807a71ce53793dd2f8721f5258943b7f0a (patch) | |
tree | 341972c76d894923861c1d92cc34c161693adf81 | |
parent | 98da25e58d33e7dadc2dc473b7563afcb232e3de (diff) |
Use std::shared_ptr for InputChannel
Modernize the code by moving away from RefBase.
We can further improve this by switching to unique_ptr in some places.
Current refactor is to get off of RefBase only.
Test: interact with cf after device boots
Bug: 142581626
Change-Id: Ib90fc721970113310b87411bcc2ba62e30ddfd01
23 files changed, 200 insertions, 232 deletions
diff --git a/include/input/InputTransport.h b/include/input/InputTransport.h index 09cebefc14..f337d009a0 100644 --- a/include/input/InputTransport.h +++ b/include/input/InputTransport.h @@ -183,18 +183,6 @@ struct InputMessage { } }; -struct InputChannelInfo : public Parcelable { - std::string mName; - android::base::unique_fd mFd; - sp<IBinder> mToken; - - InputChannelInfo() = default; - InputChannelInfo(const std::string& name, android::base::unique_fd fd, sp<IBinder> token) - : mName(name), mFd(std::move(fd)), mToken(token){}; - status_t readFromParcel(const android::Parcel* parcel) override; - status_t writeToParcel(android::Parcel* parcel) const override; -}; - /* * An input channel consists of a local unix domain socket used to send and receive * input messages across processes. Each channel has a descriptive name for debugging purposes. @@ -203,14 +191,15 @@ struct InputChannelInfo : public Parcelable { * * The input channel is closed when all references to it are released. */ -class InputChannel : public RefBase { +class InputChannel : public Parcelable { public: - InputChannel(); + static std::shared_ptr<InputChannel> create(const std::string& name, + android::base::unique_fd fd, sp<IBinder> token); + InputChannel() = default; + InputChannel(const InputChannel& other) + : mName(other.mName), mFd(::dup(other.mFd)), mToken(other.mToken){}; + InputChannel(const std::string name, android::base::unique_fd fd, sp<IBinder> token); virtual ~InputChannel(); - - static sp<InputChannel> create(const std::string& name, android::base::unique_fd fd, - sp<IBinder> token); - /** * Create a pair of input channels. * The two returned input channels are equivalent, and are labeled as "server" and "client" @@ -219,12 +208,12 @@ public: * Return OK on success. */ static status_t openInputChannelPair(const std::string& name, - sp<InputChannel>& outServerChannel, sp<InputChannel>& outClientChannel); + std::shared_ptr<InputChannel>& outServerChannel, + std::shared_ptr<InputChannel>& outClientChannel); - inline std::string getName() const { return mInfo.mName; } - inline int getFd() const { return mInfo.mFd.get(); } - inline sp<IBinder> getToken() const { return mInfo.mToken; } - inline InputChannelInfo& getInfo() { return mInfo; } + inline std::string getName() const { return mName; } + inline const android::base::unique_fd& getFd() const { return mFd; } + inline sp<IBinder> getToken() const { return mToken; } /* Send a message to the other endpoint. * @@ -252,11 +241,10 @@ public: status_t receiveMessage(InputMessage* msg); /* Return a new object that has a duplicate of this channel's fd. */ - sp<InputChannel> dup() const; - - status_t readFromParcel(const android::Parcel* parcel); + std::shared_ptr<InputChannel> dup() const; - status_t writeToParcel(android::Parcel* parcel) const; + status_t readFromParcel(const android::Parcel* parcel) override; + status_t writeToParcel(android::Parcel* parcel) const override; /** * The connection token is used to identify the input connection, i.e. @@ -273,22 +261,23 @@ public: sp<IBinder> getConnectionToken() const; bool operator==(const InputChannel& inputChannel) const { - struct stat lhsInfo, rhsInfo; - if (fstat(mInfo.mFd.get(), &lhsInfo) != 0) { + struct stat lhs, rhs; + if (fstat(mFd.get(), &lhs) != 0) { return false; } - if (fstat(inputChannel.getFd(), &rhsInfo) != 0) { + if (fstat(inputChannel.getFd(), &rhs) != 0) { return false; } // If file descriptors are pointing to same inode they are duplicated fds. - return inputChannel.getName() == getName() && - inputChannel.getConnectionToken() == mInfo.mToken && - lhsInfo.st_ino == rhsInfo.st_ino; + return inputChannel.getName() == getName() && inputChannel.getConnectionToken() == mToken && + lhs.st_ino == rhs.st_ino; } private: - InputChannel(const std::string& name, android::base::unique_fd fd, sp<IBinder> token); - InputChannelInfo mInfo; + std::string mName; + android::base::unique_fd mFd; + + sp<IBinder> mToken; }; /* @@ -297,13 +286,13 @@ private: class InputPublisher { public: /* Creates a publisher associated with an input channel. */ - explicit InputPublisher(const sp<InputChannel>& channel); + explicit InputPublisher(const std::shared_ptr<InputChannel>& channel); /* Destroys the publisher and releases its input channel. */ ~InputPublisher(); /* Gets the underlying input channel. */ - inline sp<InputChannel> getChannel() { return mChannel; } + inline std::shared_ptr<InputChannel> getChannel() { return mChannel; } /* Publishes a key event to the input channel. * @@ -360,7 +349,7 @@ public: status_t receiveFinishedSignal(uint32_t* outSeq, bool* outHandled); private: - sp<InputChannel> mChannel; + std::shared_ptr<InputChannel> mChannel; }; /* @@ -369,13 +358,13 @@ private: class InputConsumer { public: /* Creates a consumer associated with an input channel. */ - explicit InputConsumer(const sp<InputChannel>& channel); + explicit InputConsumer(const std::shared_ptr<InputChannel>& channel); /* Destroys the consumer and releases its input channel. */ ~InputConsumer(); /* Gets the underlying input channel. */ - inline sp<InputChannel> getChannel() { return mChannel; } + inline std::shared_ptr<InputChannel> getChannel() { return mChannel; } /* Consumes an input event from the input channel and copies its contents into * an InputEvent object created using the specified factory. @@ -451,8 +440,7 @@ private: // True if touch resampling is enabled. const bool mResampleTouch; - // The input channel. - sp<InputChannel> mChannel; + std::shared_ptr<InputChannel> mChannel; // The current input message. InputMessage mMsg; diff --git a/libs/gui/tests/EndToEndNativeInputTest.cpp b/libs/gui/tests/EndToEndNativeInputTest.cpp index 383d5916a4..7ec2c1a913 100644 --- a/libs/gui/tests/EndToEndNativeInputTest.cpp +++ b/libs/gui/tests/EndToEndNativeInputTest.cpp @@ -72,7 +72,7 @@ public: InputChannel::openInputChannelPair("testchannels", mServerChannel, mClientChannel); mInputFlinger = getInputFlinger(); - mInputFlinger->registerInputChannel(mServerChannel->getInfo()); + mInputFlinger->registerInputChannel(*mServerChannel); populateInputInfo(width, height); @@ -154,7 +154,7 @@ public: EXPECT_EQ(0, mev->getFlags() & VERIFIED_MOTION_EVENT_FLAGS); } - ~InputSurface() { mInputFlinger->unregisterInputChannel(mServerChannel->getInfo()); } + ~InputSurface() { mInputFlinger->unregisterInputChannel(*mServerChannel); } void doTransaction(std::function<void(SurfaceComposerClient::Transaction&, const sp<SurfaceControl>&)> transactionBody) { @@ -211,7 +211,8 @@ private: } public: sp<SurfaceControl> mSurfaceControl; - sp<InputChannel> mServerChannel, mClientChannel; + std::shared_ptr<InputChannel> mServerChannel; + std::shared_ptr<InputChannel> mClientChannel; sp<IInputFlinger> mInputFlinger; InputWindowInfo mInputInfo; diff --git a/libs/input/InputTransport.cpp b/libs/input/InputTransport.cpp index 60ad578ceb..1bbddea8db 100644 --- a/libs/input/InputTransport.cpp +++ b/libs/input/InputTransport.cpp @@ -241,65 +241,42 @@ void InputMessage::getSanitizedCopy(InputMessage* msg) const { } } -// --- InputChannelInfo --- - -status_t InputChannelInfo::writeToParcel(android::Parcel* parcel) const { - if (parcel == nullptr) { - ALOGE("%s: Null parcel", __func__); - return BAD_VALUE; - } - status_t status = parcel->writeStrongBinder(mToken) - ?: parcel->writeUtf8AsUtf16(mName) ?: parcel->writeUniqueFileDescriptor(mFd); - return status; -} - -status_t InputChannelInfo::readFromParcel(const android::Parcel* parcel) { - if (parcel == nullptr) { - ALOGE("%s: Null parcel", __func__); - return BAD_VALUE; - } - mToken = parcel->readStrongBinder(); - status_t status = parcel->readUtf8FromUtf16(&mName) ?: parcel->readUniqueFileDescriptor(&mFd); - return status; -} - // --- InputChannel --- -sp<InputChannel> InputChannel::create(const std::string& name, android::base::unique_fd fd, - sp<IBinder> token) { +std::shared_ptr<InputChannel> InputChannel::create(const std::string& name, + android::base::unique_fd fd, sp<IBinder> token) { const int result = fcntl(fd, F_SETFL, O_NONBLOCK); if (result != 0) { LOG_ALWAYS_FATAL("channel '%s' ~ Could not make socket non-blocking: %s", name.c_str(), strerror(errno)); return nullptr; } - return new InputChannel(name, std::move(fd), token); + // using 'new' to access a non-public constructor + return std::shared_ptr<InputChannel>(new InputChannel(name, std::move(fd), token)); } -InputChannel::InputChannel(const std::string& name, android::base::unique_fd fd, sp<IBinder> token) - : mInfo(name, std::move(fd), token) { +InputChannel::InputChannel(const std::string name, android::base::unique_fd fd, sp<IBinder> token) + : mName(std::move(name)), mFd(std::move(fd)), mToken(std::move(token)) { if (DEBUG_CHANNEL_LIFECYCLE) { - ALOGD("Input channel constructed: name='%s', fd=%d", mInfo.mName.c_str(), mInfo.mFd.get()); + ALOGD("Input channel constructed: name='%s', fd=%d", getName().c_str(), getFd().get()); } } -InputChannel::InputChannel() {} - InputChannel::~InputChannel() { if (DEBUG_CHANNEL_LIFECYCLE) { - ALOGD("Input channel destroyed: name='%s', fd=%d", getName().c_str(), getFd()); + ALOGD("Input channel destroyed: name='%s', fd=%d", getName().c_str(), getFd().get()); } } status_t InputChannel::openInputChannelPair(const std::string& name, - sp<InputChannel>& outServerChannel, sp<InputChannel>& outClientChannel) { + std::shared_ptr<InputChannel>& outServerChannel, + std::shared_ptr<InputChannel>& outClientChannel) { int sockets[2]; if (socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets)) { status_t result = -errno; - ALOGE("channel '%s' ~ Could not create socket pair. errno=%d", - name.c_str(), errno); - outServerChannel.clear(); - outClientChannel.clear(); + ALOGE("channel '%s' ~ Could not create socket pair. errno=%d", name.c_str(), errno); + outServerChannel.reset(); + outClientChannel.reset(); return result; } @@ -399,10 +376,10 @@ status_t InputChannel::receiveMessage(InputMessage* msg) { return OK; } -sp<InputChannel> InputChannel::dup() const { +std::shared_ptr<InputChannel> InputChannel::dup() const { android::base::unique_fd newFd(::dup(getFd())); if (!newFd.ok()) { - ALOGE("Could not duplicate fd %i for channel %s: %s", getFd(), getName().c_str(), + ALOGE("Could not duplicate fd %i for channel %s: %s", getFd().get(), getName().c_str(), strerror(errno)); const bool hitFdLimit = errno == EMFILE || errno == ENFILE; // If this process is out of file descriptors, then throwing that might end up exploding @@ -417,22 +394,30 @@ sp<InputChannel> InputChannel::dup() const { } status_t InputChannel::writeToParcel(android::Parcel* parcel) const { - return mInfo.writeToParcel(parcel); + if (parcel == nullptr) { + ALOGE("%s: Null parcel", __func__); + return BAD_VALUE; + } + return parcel->writeStrongBinder(mToken) + ?: parcel->writeUtf8AsUtf16(mName) ?: parcel->writeUniqueFileDescriptor(mFd); } status_t InputChannel::readFromParcel(const android::Parcel* parcel) { - return mInfo.readFromParcel(parcel); + if (parcel == nullptr) { + ALOGE("%s: Null parcel", __func__); + return BAD_VALUE; + } + mToken = parcel->readStrongBinder(); + return parcel->readUtf8FromUtf16(&mName) ?: parcel->readUniqueFileDescriptor(&mFd); } sp<IBinder> InputChannel::getConnectionToken() const { - return mInfo.mToken; + return mToken; } // --- InputPublisher --- -InputPublisher::InputPublisher(const sp<InputChannel>& channel) : - mChannel(channel) { -} +InputPublisher::InputPublisher(const std::shared_ptr<InputChannel>& channel) : mChannel(channel) {} InputPublisher::~InputPublisher() { } @@ -596,10 +581,8 @@ status_t InputPublisher::receiveFinishedSignal(uint32_t* outSeq, bool* outHandle // --- InputConsumer --- -InputConsumer::InputConsumer(const sp<InputChannel>& channel) : - mResampleTouch(isTouchResamplingEnabled()), - mChannel(channel), mMsgDeferred(false) { -} +InputConsumer::InputConsumer(const std::shared_ptr<InputChannel>& channel) + : mResampleTouch(isTouchResamplingEnabled()), mChannel(channel), mMsgDeferred(false) {} InputConsumer::~InputConsumer() { } diff --git a/libs/input/android/InputChannelInfo.aidl b/libs/input/android/InputChannel.aidl index 2e83b966f1..c2d1112dd3 100644 --- a/libs/input/android/InputChannelInfo.aidl +++ b/libs/input/android/InputChannel.aidl @@ -17,4 +17,4 @@ package android; -parcelable InputChannelInfo cpp_header "input/InputTransport.h"; +parcelable InputChannel cpp_header "input/InputTransport.h"; diff --git a/libs/input/android/os/IInputFlinger.aidl b/libs/input/android/os/IInputFlinger.aidl index 8ff9dae47e..4c7fddc87c 100644 --- a/libs/input/android/os/IInputFlinger.aidl +++ b/libs/input/android/os/IInputFlinger.aidl @@ -16,7 +16,7 @@ package android.os; -import android.InputChannelInfo; +import android.InputChannel; import android.InputWindowInfo; import android.os.ISetInputWindowsListener; @@ -25,6 +25,6 @@ interface IInputFlinger { void setInputWindows(in InputWindowInfo[] inputHandles, in @nullable ISetInputWindowsListener setInputWindowsListener); - void registerInputChannel(in InputChannelInfo info); - void unregisterInputChannel(in InputChannelInfo info); + void registerInputChannel(in InputChannel channel); + void unregisterInputChannel(in InputChannel channel); } diff --git a/libs/input/tests/InputChannel_test.cpp b/libs/input/tests/InputChannel_test.cpp index 4187ca95d2..cc1382bbcb 100644 --- a/libs/input/tests/InputChannel_test.cpp +++ b/libs/input/tests/InputChannel_test.cpp @@ -47,7 +47,7 @@ TEST_F(InputChannelTest, ConstructorAndDestructor_TakesOwnershipOfFileDescriptor android::base::unique_fd sendFd(pipe.sendFd); - sp<InputChannel> inputChannel = + std::shared_ptr<InputChannel> inputChannel = InputChannel::create("channel name", std::move(sendFd), new BBinder()); EXPECT_NE(inputChannel, nullptr) << "channel should be successfully created"; @@ -62,14 +62,14 @@ TEST_F(InputChannelTest, ConstructorAndDestructor_TakesOwnershipOfFileDescriptor TEST_F(InputChannelTest, SetAndGetToken) { Pipe pipe; sp<IBinder> token = new BBinder(); - sp<InputChannel> channel = + std::shared_ptr<InputChannel> channel = InputChannel::create("test channel", android::base::unique_fd(pipe.sendFd), token); EXPECT_EQ(token, channel->getConnectionToken()); } TEST_F(InputChannelTest, OpenInputChannelPair_ReturnsAPairOfConnectedChannels) { - sp<InputChannel> serverChannel, clientChannel; + std::shared_ptr<InputChannel> serverChannel, clientChannel; status_t result = InputChannel::openInputChannelPair("channel name", serverChannel, clientChannel); @@ -120,7 +120,7 @@ TEST_F(InputChannelTest, OpenInputChannelPair_ReturnsAPairOfConnectedChannels) { } TEST_F(InputChannelTest, ReceiveSignal_WhenNoSignalPresent_ReturnsAnError) { - sp<InputChannel> serverChannel, clientChannel; + std::shared_ptr<InputChannel> serverChannel, clientChannel; status_t result = InputChannel::openInputChannelPair("channel name", serverChannel, clientChannel); @@ -134,7 +134,7 @@ TEST_F(InputChannelTest, ReceiveSignal_WhenNoSignalPresent_ReturnsAnError) { } TEST_F(InputChannelTest, ReceiveSignal_WhenPeerClosed_ReturnsAnError) { - sp<InputChannel> serverChannel, clientChannel; + std::shared_ptr<InputChannel> serverChannel, clientChannel; status_t result = InputChannel::openInputChannelPair("channel name", serverChannel, clientChannel); @@ -142,7 +142,7 @@ TEST_F(InputChannelTest, ReceiveSignal_WhenPeerClosed_ReturnsAnError) { ASSERT_EQ(OK, result) << "should have successfully opened a channel pair"; - serverChannel.clear(); // close server channel + serverChannel.reset(); // close server channel InputMessage msg; EXPECT_EQ(DEAD_OBJECT, clientChannel->receiveMessage(&msg)) @@ -150,7 +150,7 @@ TEST_F(InputChannelTest, ReceiveSignal_WhenPeerClosed_ReturnsAnError) { } TEST_F(InputChannelTest, SendSignal_WhenPeerClosed_ReturnsAnError) { - sp<InputChannel> serverChannel, clientChannel; + std::shared_ptr<InputChannel> serverChannel, clientChannel; status_t result = InputChannel::openInputChannelPair("channel name", serverChannel, clientChannel); @@ -158,7 +158,7 @@ TEST_F(InputChannelTest, SendSignal_WhenPeerClosed_ReturnsAnError) { ASSERT_EQ(OK, result) << "should have successfully opened a channel pair"; - serverChannel.clear(); // close server channel + serverChannel.reset(); // close server channel InputMessage msg; msg.header.type = InputMessage::Type::KEY; @@ -167,7 +167,7 @@ TEST_F(InputChannelTest, SendSignal_WhenPeerClosed_ReturnsAnError) { } TEST_F(InputChannelTest, SendAndReceive_MotionClassification) { - sp<InputChannel> serverChannel, clientChannel; + std::shared_ptr<InputChannel> serverChannel, clientChannel; status_t result = InputChannel::openInputChannelPair("channel name", serverChannel, clientChannel); ASSERT_EQ(OK, result) @@ -199,7 +199,7 @@ TEST_F(InputChannelTest, SendAndReceive_MotionClassification) { } TEST_F(InputChannelTest, InputChannelParcelAndUnparcel) { - sp<InputChannel> serverChannel, clientChannel; + std::shared_ptr<InputChannel> serverChannel, clientChannel; status_t result = InputChannel::openInputChannelPair("channel parceling", serverChannel, clientChannel); @@ -218,14 +218,14 @@ TEST_F(InputChannelTest, InputChannelParcelAndUnparcel) { } TEST_F(InputChannelTest, DuplicateChannelAndAssertEqual) { - sp<InputChannel> serverChannel, clientChannel; + std::shared_ptr<InputChannel> serverChannel, clientChannel; status_t result = InputChannel::openInputChannelPair("channel dup", serverChannel, clientChannel); ASSERT_EQ(OK, result) << "should have successfully opened a channel pair"; - sp<InputChannel> dupChan = serverChannel->dup(); + std::shared_ptr<InputChannel> dupChan = serverChannel->dup(); EXPECT_EQ(*serverChannel == *dupChan, true) << "inputchannel should be equal after duplication"; } diff --git a/libs/input/tests/InputPublisherAndConsumer_test.cpp b/libs/input/tests/InputPublisherAndConsumer_test.cpp index 8e2eec85ed..3a7d20bfa2 100644 --- a/libs/input/tests/InputPublisherAndConsumer_test.cpp +++ b/libs/input/tests/InputPublisherAndConsumer_test.cpp @@ -30,7 +30,7 @@ namespace android { class InputPublisherAndConsumerTest : public testing::Test { protected: - sp<InputChannel> serverChannel, clientChannel; + std::shared_ptr<InputChannel> serverChannel, clientChannel; InputPublisher* mPublisher; InputConsumer* mConsumer; PreallocatedInputEventFactory mEventFactory; @@ -55,8 +55,8 @@ protected: mConsumer = nullptr; } - serverChannel.clear(); - clientChannel.clear(); + serverChannel.reset(); + clientChannel.reset(); } void PublishAndConsumeKeyEvent(); diff --git a/services/inputflinger/InputManager.cpp b/services/inputflinger/InputManager.cpp index c5f60ade96..088c6f1f48 100644 --- a/services/inputflinger/InputManager.cpp +++ b/services/inputflinger/InputManager.cpp @@ -119,7 +119,7 @@ binder::Status InputManager::setInputWindows( } // Used by tests only. -binder::Status InputManager::registerInputChannel(const InputChannelInfo& info) { +binder::Status InputManager::registerInputChannel(const InputChannel& channel) { IPCThreadState* ipc = IPCThreadState::self(); const int uid = ipc->getCallingUid(); if (uid != AID_SHELL && uid != AID_ROOT) { @@ -127,15 +127,12 @@ binder::Status InputManager::registerInputChannel(const InputChannelInfo& info) "from non shell/root entity (PID: %d)", ipc->getCallingPid()); return binder::Status::ok(); } - android::base::unique_fd newFd(::dup(info.mFd)); - sp<InputChannel> channel = InputChannel::create(info.mName, std::move(newFd), info.mToken); - mDispatcher->registerInputChannel(channel); + + mDispatcher->registerInputChannel(channel.dup()); return binder::Status::ok(); } -binder::Status InputManager::unregisterInputChannel(const InputChannelInfo& info) { - android::base::unique_fd newFd(::dup(info.mFd)); - sp<InputChannel> channel = InputChannel::create(info.mName, std::move(newFd), info.mToken); +binder::Status InputManager::unregisterInputChannel(const InputChannel& channel) { mDispatcher->unregisterInputChannel(channel); return binder::Status::ok(); } diff --git a/services/inputflinger/InputManager.h b/services/inputflinger/InputManager.h index 4993b54b5c..0503e8161e 100644 --- a/services/inputflinger/InputManager.h +++ b/services/inputflinger/InputManager.h @@ -108,8 +108,8 @@ public: const std::vector<InputWindowInfo>& handles, const sp<ISetInputWindowsListener>& setInputWindowsListener) override; - binder::Status registerInputChannel(const InputChannelInfo& info) override; - binder::Status unregisterInputChannel(const InputChannelInfo& info) override; + binder::Status registerInputChannel(const InputChannel& channel) override; + binder::Status unregisterInputChannel(const InputChannel& channel) override; private: sp<InputReaderInterface> mReader; diff --git a/services/inputflinger/benchmarks/InputDispatcher_benchmarks.cpp b/services/inputflinger/benchmarks/InputDispatcher_benchmarks.cpp index a15b7b25ef..3d66d30d18 100644 --- a/services/inputflinger/benchmarks/InputDispatcher_benchmarks.cpp +++ b/services/inputflinger/benchmarks/InputDispatcher_benchmarks.cpp @@ -135,7 +135,7 @@ protected: virtual ~FakeInputReceiver() {} sp<InputDispatcher> mDispatcher; - sp<InputChannel> mServerChannel, mClientChannel; + std::shared_ptr<InputChannel> mServerChannel, mClientChannel; std::unique_ptr<InputConsumer> mConsumer; PreallocatedInputEventFactory mEventFactory; }; diff --git a/services/inputflinger/dispatcher/Connection.cpp b/services/inputflinger/dispatcher/Connection.cpp index f5ea563311..cee9c39abd 100644 --- a/services/inputflinger/dispatcher/Connection.cpp +++ b/services/inputflinger/dispatcher/Connection.cpp @@ -20,7 +20,7 @@ namespace android::inputdispatcher { -Connection::Connection(const sp<InputChannel>& inputChannel, bool monitor, +Connection::Connection(const std::shared_ptr<InputChannel>& inputChannel, bool monitor, const IdGenerator& idGenerator) : status(STATUS_NORMAL), inputChannel(inputChannel), diff --git a/services/inputflinger/dispatcher/Connection.h b/services/inputflinger/dispatcher/Connection.h index 3b33f29dff..c4262ad2d8 100644 --- a/services/inputflinger/dispatcher/Connection.h +++ b/services/inputflinger/dispatcher/Connection.h @@ -42,7 +42,7 @@ public: }; Status status; - sp<InputChannel> inputChannel; // never null + std::shared_ptr<InputChannel> inputChannel; // never null bool monitor; InputPublisher inputPublisher; InputState inputState; @@ -59,7 +59,8 @@ public: // yet received a "finished" response from the application. std::deque<DispatchEntry*> waitQueue; - Connection(const sp<InputChannel>& inputChannel, bool monitor, const IdGenerator& idGenerator); + Connection(const std::shared_ptr<InputChannel>& inputChannel, bool monitor, + const IdGenerator& idGenerator); inline const std::string getInputChannelName() const { return inputChannel->getName(); } diff --git a/services/inputflinger/dispatcher/Entry.h b/services/inputflinger/dispatcher/Entry.h index 6b7697dde6..4147e41510 100644 --- a/services/inputflinger/dispatcher/Entry.h +++ b/services/inputflinger/dispatcher/Entry.h @@ -262,7 +262,7 @@ struct CommandEntry { int32_t userActivityEventType; uint32_t seq; bool handled; - sp<InputChannel> inputChannel; + std::shared_ptr<InputChannel> inputChannel; sp<IBinder> oldToken; sp<IBinder> newToken; }; diff --git a/services/inputflinger/dispatcher/InputDispatcher.cpp b/services/inputflinger/dispatcher/InputDispatcher.cpp index 3bdbcce79b..da098984b1 100644 --- a/services/inputflinger/dispatcher/InputDispatcher.cpp +++ b/services/inputflinger/dispatcher/InputDispatcher.cpp @@ -433,7 +433,7 @@ InputDispatcher::~InputDispatcher() { while (!mConnectionsByFd.empty()) { sp<Connection> connection = mConnectionsByFd.begin()->second; - unregisterInputChannel(connection->inputChannel); + unregisterInputChannel(*connection->inputChannel); } } @@ -1105,7 +1105,7 @@ void InputDispatcher::enqueueFocusEventLocked(const InputWindowHandle& window, b } void InputDispatcher::dispatchFocusLocked(nsecs_t currentTime, FocusEntry* entry) { - sp<InputChannel> channel = getInputChannelLocked(entry->connectionToken); + std::shared_ptr<InputChannel> channel = getInputChannelLocked(entry->connectionToken); if (channel == nullptr) { return; // Window has gone away } @@ -2029,7 +2029,8 @@ void InputDispatcher::addWindowTargetLocked(const sp<InputWindowHandle>& windowH if (it == inputTargets.end()) { InputTarget inputTarget; - sp<InputChannel> inputChannel = getInputChannelLocked(windowHandle->getToken()); + std::shared_ptr<InputChannel> inputChannel = + getInputChannelLocked(windowHandle->getToken()); if (inputChannel == nullptr) { ALOGW("Window %s already unregistered input channel", windowHandle->getName().c_str()); return; @@ -2844,7 +2845,7 @@ int InputDispatcher::handleReceiveCallback(int fd, int events, void* data) { } // Unregister the channel. - d->unregisterInputChannelLocked(connection->inputChannel, notify); + d->unregisterInputChannelLocked(*connection->inputChannel, notify); return 0; // remove the callback } // release lock } @@ -2874,7 +2875,7 @@ void InputDispatcher::synthesizeCancelationEventsForMonitorsLocked( } void InputDispatcher::synthesizeCancelationEventsForInputChannelLocked( - const sp<InputChannel>& channel, const CancelationOptions& options) { + const std::shared_ptr<InputChannel>& channel, const CancelationOptions& options) { sp<Connection> connection = getConnectionLocked(channel->getConnectionToken()); if (connection == nullptr) { return; @@ -3690,7 +3691,8 @@ bool InputDispatcher::hasWindowHandleLocked(const sp<InputWindowHandle>& windowH return false; } -sp<InputChannel> InputDispatcher::getInputChannelLocked(const sp<IBinder>& token) const { +std::shared_ptr<InputChannel> InputDispatcher::getInputChannelLocked( + const sp<IBinder>& token) const { size_t count = mInputChannelsByToken.count(token); if (count == 0) { return nullptr; @@ -3815,7 +3817,7 @@ void InputDispatcher::setInputWindowsLocked( ALOGD("Focus left window: %s in display %" PRId32, oldFocusedWindowHandle->getName().c_str(), displayId); } - sp<InputChannel> focusedInputChannel = + std::shared_ptr<InputChannel> focusedInputChannel = getInputChannelLocked(oldFocusedWindowHandle->getToken()); if (focusedInputChannel != nullptr) { CancelationOptions options(CancelationOptions::CANCEL_NON_POINTER_EVENTS, @@ -3850,7 +3852,7 @@ void InputDispatcher::setInputWindowsLocked( ALOGD("Touched window was removed: %s in display %" PRId32, touchedWindow.windowHandle->getName().c_str(), displayId); } - sp<InputChannel> touchedInputChannel = + std::shared_ptr<InputChannel> touchedInputChannel = getInputChannelLocked(touchedWindow.windowHandle->getToken()); if (touchedInputChannel != nullptr) { CancelationOptions options(CancelationOptions::CANCEL_POINTER_EVENTS, @@ -3929,7 +3931,7 @@ void InputDispatcher::setFocusedDisplay(int32_t displayId) { sp<InputWindowHandle> oldFocusedWindowHandle = getValueByKey(mFocusedWindowHandlesByDisplay, mFocusedDisplayId); if (oldFocusedWindowHandle != nullptr) { - sp<InputChannel> inputChannel = + std::shared_ptr<InputChannel> inputChannel = getInputChannelLocked(oldFocusedWindowHandle->getToken()); if (inputChannel != nullptr) { CancelationOptions @@ -4376,13 +4378,13 @@ void InputDispatcher::dumpMonitors(std::string& dump, const std::vector<Monitor> const size_t numMonitors = monitors.size(); for (size_t i = 0; i < numMonitors; i++) { const Monitor& monitor = monitors[i]; - const sp<InputChannel>& channel = monitor.inputChannel; + const std::shared_ptr<InputChannel>& channel = monitor.inputChannel; dump += StringPrintf(INDENT2 "%zu: '%s', ", i, channel->getName().c_str()); dump += "\n"; } } -status_t InputDispatcher::registerInputChannel(const sp<InputChannel>& inputChannel) { +status_t InputDispatcher::registerInputChannel(const std::shared_ptr<InputChannel>& inputChannel) { #if DEBUG_REGISTRATION ALOGD("channel '%s' ~ registerInputChannel", inputChannel->getName().c_str()); #endif @@ -4410,7 +4412,7 @@ status_t InputDispatcher::registerInputChannel(const sp<InputChannel>& inputChan return OK; } -status_t InputDispatcher::registerInputMonitor(const sp<InputChannel>& inputChannel, +status_t InputDispatcher::registerInputMonitor(const std::shared_ptr<InputChannel>& inputChannel, int32_t displayId, bool isGestureMonitor) { { // acquire lock std::scoped_lock _l(mLock); @@ -4442,9 +4444,9 @@ status_t InputDispatcher::registerInputMonitor(const sp<InputChannel>& inputChan return OK; } -status_t InputDispatcher::unregisterInputChannel(const sp<InputChannel>& inputChannel) { +status_t InputDispatcher::unregisterInputChannel(const InputChannel& inputChannel) { #if DEBUG_REGISTRATION - ALOGD("channel '%s' ~ unregisterInputChannel", inputChannel->getName().c_str()); + ALOGD("channel '%s' ~ unregisterInputChannel", inputChannel.getName().c_str()); #endif { // acquire lock @@ -4462,23 +4464,23 @@ status_t InputDispatcher::unregisterInputChannel(const sp<InputChannel>& inputCh return OK; } -status_t InputDispatcher::unregisterInputChannelLocked(const sp<InputChannel>& inputChannel, +status_t InputDispatcher::unregisterInputChannelLocked(const InputChannel& inputChannel, bool notify) { - sp<Connection> connection = getConnectionLocked(inputChannel->getConnectionToken()); + sp<Connection> connection = getConnectionLocked(inputChannel.getConnectionToken()); if (connection == nullptr) { ALOGW("Attempted to unregister already unregistered input channel '%s'", - inputChannel->getName().c_str()); + inputChannel.getName().c_str()); return BAD_VALUE; } removeConnectionLocked(connection); - mInputChannelsByToken.erase(inputChannel->getConnectionToken()); + mInputChannelsByToken.erase(inputChannel.getConnectionToken()); if (connection->monitor) { removeMonitorChannelLocked(inputChannel); } - mLooper->removeFd(inputChannel->getFd()); + mLooper->removeFd(inputChannel.getFd()); nsecs_t currentTime = now(); abortBrokenDispatchCycleLocked(currentTime, connection, notify); @@ -4487,19 +4489,19 @@ status_t InputDispatcher::unregisterInputChannelLocked(const sp<InputChannel>& i return OK; } -void InputDispatcher::removeMonitorChannelLocked(const sp<InputChannel>& inputChannel) { +void InputDispatcher::removeMonitorChannelLocked(const InputChannel& inputChannel) { removeMonitorChannelLocked(inputChannel, mGlobalMonitorsByDisplay); removeMonitorChannelLocked(inputChannel, mGestureMonitorsByDisplay); } void InputDispatcher::removeMonitorChannelLocked( - const sp<InputChannel>& inputChannel, + const InputChannel& inputChannel, std::unordered_map<int32_t, std::vector<Monitor>>& monitorsByDisplay) { for (auto it = monitorsByDisplay.begin(); it != monitorsByDisplay.end();) { std::vector<Monitor>& monitors = it->second; const size_t numMonitors = monitors.size(); for (size_t i = 0; i < numMonitors; i++) { - if (monitors[i].inputChannel == inputChannel) { + if (*monitors[i].inputChannel == inputChannel) { monitors.erase(monitors.begin() + i); break; } @@ -4550,7 +4552,8 @@ status_t InputDispatcher::pilferPointers(const sp<IBinder>& token) { options.deviceId = deviceId; options.displayId = displayId; for (const TouchedWindow& window : state.windows) { - sp<InputChannel> channel = getInputChannelLocked(window.windowHandle->getToken()); + std::shared_ptr<InputChannel> channel = + getInputChannelLocked(window.windowHandle->getToken()); if (channel != nullptr) { synthesizeCancelationEventsForInputChannelLocked(channel, options); } diff --git a/services/inputflinger/dispatcher/InputDispatcher.h b/services/inputflinger/dispatcher/InputDispatcher.h index 824bbf5808..ba7ace0987 100644 --- a/services/inputflinger/dispatcher/InputDispatcher.h +++ b/services/inputflinger/dispatcher/InputDispatcher.h @@ -124,10 +124,11 @@ public: virtual bool transferTouchFocus(const sp<IBinder>& fromToken, const sp<IBinder>& toToken) override; - virtual status_t registerInputChannel(const sp<InputChannel>& inputChannel) override; - virtual status_t registerInputMonitor(const sp<InputChannel>& inputChannel, int32_t displayId, - bool isGestureMonitor) override; - virtual status_t unregisterInputChannel(const sp<InputChannel>& inputChannel) override; + virtual status_t registerInputChannel( + const std::shared_ptr<InputChannel>& inputChannel) override; + virtual status_t registerInputMonitor(const std::shared_ptr<InputChannel>& inputChannel, + int32_t displayId, bool isGestureMonitor) override; + virtual status_t unregisterInputChannel(const InputChannel& inputChannel) override; virtual status_t pilferPointers(const sp<IBinder>& token) override; private: @@ -210,8 +211,8 @@ private: return std::hash<IBinder*>{}(b.get()); } }; - std::unordered_map<sp<IBinder>, sp<InputChannel>, IBinderHash> mInputChannelsByToken - GUARDED_BY(mLock); + std::unordered_map<sp<IBinder>, std::shared_ptr<InputChannel>, IBinderHash> + mInputChannelsByToken GUARDED_BY(mLock); // Finds the display ID of the gesture monitor identified by the provided token. std::optional<int32_t> findGestureMonitorDisplayByTokenLocked(const sp<IBinder>& token) @@ -301,7 +302,8 @@ private: REQUIRES(mLock); sp<InputWindowHandle> getWindowHandleLocked(const sp<IBinder>& windowHandleToken) const REQUIRES(mLock); - sp<InputChannel> getInputChannelLocked(const sp<IBinder>& windowToken) const REQUIRES(mLock); + std::shared_ptr<InputChannel> getInputChannelLocked(const sp<IBinder>& windowToken) const + REQUIRES(mLock); bool hasWindowHandleLocked(const sp<InputWindowHandle>& windowHandle) const REQUIRES(mLock); /* @@ -459,8 +461,8 @@ private: void synthesizeCancelationEventsForMonitorsLocked( const CancelationOptions& options, std::unordered_map<int32_t, std::vector<Monitor>>& monitorsByDisplay) REQUIRES(mLock); - void synthesizeCancelationEventsForInputChannelLocked(const sp<InputChannel>& channel, - const CancelationOptions& options) + void synthesizeCancelationEventsForInputChannelLocked( + const std::shared_ptr<InputChannel>& channel, const CancelationOptions& options) REQUIRES(mLock); void synthesizeCancelationEventsForConnectionLocked(const sp<Connection>& connection, const CancelationOptions& options) @@ -481,11 +483,11 @@ private: void logDispatchStateLocked() REQUIRES(mLock); // Registration. - void removeMonitorChannelLocked(const sp<InputChannel>& inputChannel) REQUIRES(mLock); + void removeMonitorChannelLocked(const InputChannel& inputChannel) REQUIRES(mLock); void removeMonitorChannelLocked( - const sp<InputChannel>& inputChannel, + const InputChannel& inputChannel, std::unordered_map<int32_t, std::vector<Monitor>>& monitorsByDisplay) REQUIRES(mLock); - status_t unregisterInputChannelLocked(const sp<InputChannel>& inputChannel, bool notify) + status_t unregisterInputChannelLocked(const InputChannel& inputChannel, bool notify) REQUIRES(mLock); // Interesting events that we might like to log or tell the framework about. diff --git a/services/inputflinger/dispatcher/InputTarget.h b/services/inputflinger/dispatcher/InputTarget.h index 499a75fdac..eeb6ee8df9 100644 --- a/services/inputflinger/dispatcher/InputTarget.h +++ b/services/inputflinger/dispatcher/InputTarget.h @@ -106,7 +106,7 @@ struct InputTarget { }; // The input channel to be targeted. - sp<InputChannel> inputChannel; + std::shared_ptr<InputChannel> inputChannel; // Flags for the input target. int32_t flags = 0; diff --git a/services/inputflinger/dispatcher/Monitor.cpp b/services/inputflinger/dispatcher/Monitor.cpp index 289b0848bf..b34767459f 100644 --- a/services/inputflinger/dispatcher/Monitor.cpp +++ b/services/inputflinger/dispatcher/Monitor.cpp @@ -19,7 +19,7 @@ namespace android::inputdispatcher { // --- Monitor --- -Monitor::Monitor(const sp<InputChannel>& inputChannel) : inputChannel(inputChannel) {} +Monitor::Monitor(const std::shared_ptr<InputChannel>& inputChannel) : inputChannel(inputChannel) {} // --- TouchedMonitor --- TouchedMonitor::TouchedMonitor(const Monitor& monitor, float xOffset, float yOffset) diff --git a/services/inputflinger/dispatcher/Monitor.h b/services/inputflinger/dispatcher/Monitor.h index b67c9eb507..fc0b0200c6 100644 --- a/services/inputflinger/dispatcher/Monitor.h +++ b/services/inputflinger/dispatcher/Monitor.h @@ -22,9 +22,9 @@ namespace android::inputdispatcher { struct Monitor { - sp<InputChannel> inputChannel; // never null + std::shared_ptr<InputChannel> inputChannel; // never null - explicit Monitor(const sp<InputChannel>& inputChannel); + explicit Monitor(const std::shared_ptr<InputChannel>& inputChannel); }; // For tracking the offsets we need to apply when adding gesture monitor targets. diff --git a/services/inputflinger/dispatcher/include/InputDispatcherInterface.h b/services/inputflinger/dispatcher/include/InputDispatcherInterface.h index f25131c7c7..272b0a6695 100644 --- a/services/inputflinger/dispatcher/include/InputDispatcherInterface.h +++ b/services/inputflinger/dispatcher/include/InputDispatcherInterface.h @@ -152,7 +152,7 @@ public: * * This method may be called on any thread (usually by the input manager). */ - virtual status_t registerInputChannel(const sp<InputChannel>& inputChannel) = 0; + virtual status_t registerInputChannel(const std::shared_ptr<InputChannel>& inputChannel) = 0; /* Registers input channels to be used to monitor input events. * @@ -162,14 +162,14 @@ public: * * This method may be called on any thread (usually by the input manager). */ - virtual status_t registerInputMonitor(const sp<InputChannel>& inputChannel, int32_t displayId, - bool gestureMonitor) = 0; + virtual status_t registerInputMonitor(const std::shared_ptr<InputChannel>& inputChannel, + int32_t displayId, bool gestureMonitor) = 0; /* Unregister input channels that will no longer receive input events. * * This method may be called on any thread (usually by the input manager). */ - virtual status_t unregisterInputChannel(const sp<InputChannel>& inputChannel) = 0; + virtual status_t unregisterInputChannel(const InputChannel& inputChannel) = 0; /* Allows an input monitor steal the current pointer stream away from normal input windows. * diff --git a/services/inputflinger/host/InputFlinger.h b/services/inputflinger/host/InputFlinger.h index 9364a2a767..cd655e0ff5 100644 --- a/services/inputflinger/host/InputFlinger.h +++ b/services/inputflinger/host/InputFlinger.h @@ -48,8 +48,8 @@ public: const sp<ISetInputWindowsListener>&) { return binder::Status::ok(); } - binder::Status registerInputChannel(const InputChannelInfo&) { return binder::Status::ok(); } - binder::Status unregisterInputChannel(const InputChannelInfo&) { return binder::Status::ok(); } + binder::Status registerInputChannel(const InputChannel&) { return binder::Status::ok(); } + binder::Status unregisterInputChannel(const InputChannel&) { return binder::Status::ok(); } private: virtual ~InputFlinger(); diff --git a/services/inputflinger/tests/IInputFlingerQuery.aidl b/services/inputflinger/tests/IInputFlingerQuery.aidl index 1edc08965f..755373b517 100644 --- a/services/inputflinger/tests/IInputFlingerQuery.aidl +++ b/services/inputflinger/tests/IInputFlingerQuery.aidl @@ -14,7 +14,7 @@ * limitations under the License. */ -import android.InputChannelInfo; +import android.InputChannel; import android.InputWindowInfo; import android.os.ISetInputWindowsListener; @@ -23,5 +23,5 @@ interface IInputFlingerQuery { /* Test interfaces */ void getInputWindows(out InputWindowInfo[] inputHandles); - void getInputChannels(out InputChannelInfo[] infos); + void getInputChannels(out InputChannel[] channels); } diff --git a/services/inputflinger/tests/InputDispatcher_test.cpp b/services/inputflinger/tests/InputDispatcher_test.cpp index c749806190..89314e141c 100644 --- a/services/inputflinger/tests/InputDispatcher_test.cpp +++ b/services/inputflinger/tests/InputDispatcher_test.cpp @@ -602,7 +602,8 @@ public: class FakeInputReceiver { public: - explicit FakeInputReceiver(const sp<InputChannel>& clientChannel, const std::string name) + explicit FakeInputReceiver(const std::shared_ptr<InputChannel>& clientChannel, + const std::string name) : mName(name) { mConsumer = std::make_unique<InputConsumer>(clientChannel); } @@ -754,7 +755,7 @@ public: int32_t displayId, sp<IBinder> token = nullptr) : mName(name) { if (token == nullptr) { - sp<InputChannel> serverChannel, clientChannel; + std::shared_ptr<InputChannel> serverChannel, clientChannel; InputChannel::openInputChannelPair(name, serverChannel, clientChannel); mInputReceiver = std::make_unique<FakeInputReceiver>(clientChannel, name); dispatcher->registerInputChannel(serverChannel); @@ -1767,7 +1768,7 @@ class FakeMonitorReceiver { public: FakeMonitorReceiver(const sp<InputDispatcher>& dispatcher, const std::string name, int32_t displayId, bool isGestureMonitor = false) { - sp<InputChannel> serverChannel, clientChannel; + std::shared_ptr<InputChannel> serverChannel, clientChannel; InputChannel::openInputChannelPair(name, serverChannel, clientChannel); mInputReceiver = std::make_unique<FakeInputReceiver>(clientChannel, name); dispatcher->registerInputMonitor(serverChannel, displayId, isGestureMonitor); diff --git a/services/inputflinger/tests/InputFlingerService_test.cpp b/services/inputflinger/tests/InputFlingerService_test.cpp index 193fe77878..b88bc52aa1 100644 --- a/services/inputflinger/tests/InputFlingerService_test.cpp +++ b/services/inputflinger/tests/InputFlingerService_test.cpp @@ -113,7 +113,7 @@ protected: private: sp<SetInputWindowsListener> mSetInputWindowsListener; - sp<InputChannel> mServerChannel, mClientChannel; + std::shared_ptr<InputChannel> mServerChannel, mClientChannel; InputWindowInfo mInfo; std::mutex mLock; std::condition_variable mSetInputWindowsFinishedCondition; @@ -136,7 +136,7 @@ public: void checkFdFlags(const android::base::unique_fd& fd); binder::Status getInputWindows(std::vector<::android::InputWindowInfo>* inputHandles); - binder::Status getInputChannels(std::vector<::android::InputChannelInfo>* infos); + binder::Status getInputChannels(std::vector<::android::InputChannel>* channels); status_t dump(int fd, const Vector<String16>& args) override; @@ -144,20 +144,20 @@ public: const std::vector<InputWindowInfo>& handles, const sp<ISetInputWindowsListener>& setInputWindowsListener) override; - binder::Status registerInputChannel(const InputChannelInfo& channel) override; - binder::Status unregisterInputChannel(const InputChannelInfo& channel) override; + binder::Status registerInputChannel(const InputChannel& channel) override; + binder::Status unregisterInputChannel(const InputChannel& channel) override; private: mutable Mutex mLock; std::unordered_map<int32_t, std::vector<sp<InputWindowHandle>>> mHandlesPerDisplay; - std::vector<sp<InputChannel>> mInputChannels; + std::vector<std::shared_ptr<InputChannel>> mInputChannels; }; class TestInputQuery : public BnInputFlingerQuery { public: TestInputQuery(sp<android::TestInputManager> manager) : mManager(manager){}; binder::Status getInputWindows(std::vector<::android::InputWindowInfo>* inputHandles) override; - binder::Status getInputChannels(std::vector<::android::InputChannelInfo>* infos) override; + binder::Status getInputChannels(std::vector<::android::InputChannel>* channels) override; private: sp<android::TestInputManager> mManager; @@ -168,8 +168,8 @@ binder::Status TestInputQuery::getInputWindows( return mManager->getInputWindows(inputHandles); } -binder::Status TestInputQuery::getInputChannels(std::vector<::android::InputChannelInfo>* infos) { - return mManager->getInputChannels(infos); +binder::Status TestInputQuery::getInputChannels(std::vector<::android::InputChannel>* channels) { + return mManager->getInputChannels(channels); } binder::Status SetInputWindowsListener::onSetInputWindowsFinished() { @@ -200,27 +200,23 @@ void TestInputManager::checkFdFlags(const android::base::unique_fd& fd) { EXPECT_EQ(result & O_NONBLOCK, O_NONBLOCK); } -binder::Status TestInputManager::registerInputChannel(const InputChannelInfo& info) { +binder::Status TestInputManager::registerInputChannel(const InputChannel& channel) { AutoMutex _l(mLock); // check Fd flags - checkFdFlags(info.mFd); + checkFdFlags(channel.getFd()); - android::base::unique_fd newFd(::dup(info.mFd)); - sp<InputChannel> channel = InputChannel::create(info.mName, std::move(newFd), info.mToken); - mInputChannels.push_back(channel); + mInputChannels.push_back(channel.dup()); return binder::Status::ok(); } -binder::Status TestInputManager::unregisterInputChannel(const InputChannelInfo& info) { +binder::Status TestInputManager::unregisterInputChannel(const InputChannel& channel) { AutoMutex _l(mLock); // check Fd flags - checkFdFlags(info.mFd); - android::base::unique_fd newFd(::dup(info.mFd)); - sp<InputChannel> channel = InputChannel::create(info.mName, std::move(newFd), info.mToken); + checkFdFlags(channel.getFd()); auto it = std::find_if(mInputChannels.begin(), mInputChannels.end(), - [&](sp<InputChannel>& it) { return *it == *channel; }); + [&](std::shared_ptr<InputChannel>& c) { return *c == channel; }); if (it != mInputChannels.end()) { mInputChannels.erase(it); } @@ -247,11 +243,10 @@ binder::Status TestInputManager::getInputWindows( return binder::Status::ok(); } -binder::Status TestInputManager::getInputChannels(std::vector<::android::InputChannelInfo>* infos) { - infos->clear(); - for (auto& channel : mInputChannels) { - auto chanDup = channel->dup(); - infos->push_back(std::move(chanDup->getInfo())); +binder::Status TestInputManager::getInputChannels(std::vector<::android::InputChannel>* channels) { + channels->clear(); + for (std::shared_ptr<InputChannel>& channel : mInputChannels) { + channels->push_back(*channel); } return binder::Status::ok(); } @@ -320,12 +315,6 @@ void InputFlingerServiceTest::setInputWindowsByInfos(std::vector<InputWindowInfo mService->setInputWindows(infos, mSetInputWindowsListener); // Verify listener call EXPECT_NE(mSetInputWindowsFinishedCondition.wait_for(lock, 1s), std::cv_status::timeout); - // Verify input windows from service - std::vector<::android::InputWindowInfo> inputHandles; - mQuery->getInputWindows(&inputHandles); - for (auto& inputInfo : inputHandles) { - verifyInputWindowInfo(inputInfo); - } } /** @@ -334,54 +323,57 @@ void InputFlingerServiceTest::setInputWindowsByInfos(std::vector<InputWindowInfo TEST_F(InputFlingerServiceTest, InputWindow_SetInputWindows) { std::vector<InputWindowInfo> infos = {getInfo()}; setInputWindowsByInfos(infos); + + // Verify input windows from service + std::vector<::android::InputWindowInfo> windowInfos; + mQuery->getInputWindows(&windowInfos); + for (const ::android::InputWindowInfo& windowInfo : windowInfos) { + verifyInputWindowInfo(windowInfo); + } } /** * Test InputFlinger service interface registerInputChannel */ TEST_F(InputFlingerServiceTest, InputWindow_RegisterInputChannel) { - sp<InputChannel> serverChannel, clientChannel; + std::shared_ptr<InputChannel> serverChannel, clientChannel; InputChannel::openInputChannelPair("testchannels", serverChannel, clientChannel); - mService->registerInputChannel(serverChannel->getInfo()); - - std::vector<::android::InputChannelInfo> infos(2); - mQuery->getInputChannels(&infos); - EXPECT_EQ(infos.size(), 1UL); + mService->registerInputChannel(*serverChannel); - auto& info = infos[0]; - android::base::unique_fd newFd(::dup(info.mFd)); - sp<InputChannel> channel = InputChannel::create(info.mName, std::move(newFd), info.mToken); - EXPECT_EQ(*channel, *serverChannel); + std::vector<::android::InputChannel> channels; + mQuery->getInputChannels(&channels); + ASSERT_EQ(channels.size(), 1UL); + EXPECT_EQ(channels[0], *serverChannel); - mService->unregisterInputChannel(serverChannel->getInfo()); - mQuery->getInputChannels(&infos); - EXPECT_EQ(infos.size(), 0UL); + mService->unregisterInputChannel(*serverChannel); + mQuery->getInputChannels(&channels); + EXPECT_EQ(channels.size(), 0UL); } /** * Test InputFlinger service interface registerInputChannel with invalid cases */ TEST_F(InputFlingerServiceTest, InputWindow_RegisterInputChannelInvalid) { - sp<InputChannel> serverChannel, clientChannel; + std::shared_ptr<InputChannel> serverChannel, clientChannel; InputChannel::openInputChannelPair("testchannels", serverChannel, clientChannel); - std::vector<::android::InputChannelInfo> infos(2); - mQuery->getInputChannels(&infos); - EXPECT_EQ(infos.size(), 0UL); + std::vector<::android::InputChannel> channels; + mQuery->getInputChannels(&channels); + EXPECT_EQ(channels.size(), 0UL); - mService->registerInputChannel(InputChannelInfo()); - mService->unregisterInputChannel(clientChannel->getInfo()); + mService->registerInputChannel(InputChannel()); + mService->unregisterInputChannel(*clientChannel); - mService->registerInputChannel(serverChannel->getInfo()); - mService->registerInputChannel(clientChannel->getInfo()); - mQuery->getInputChannels(&infos); - EXPECT_EQ(infos.size(), 2UL); + mService->registerInputChannel(*serverChannel); + mService->registerInputChannel(*clientChannel); + mQuery->getInputChannels(&channels); + EXPECT_EQ(channels.size(), 2UL); - mService->unregisterInputChannel(clientChannel->getInfo()); - mService->unregisterInputChannel(serverChannel->getInfo()); - mQuery->getInputChannels(&infos); - EXPECT_EQ(infos.size(), 0UL); + mService->unregisterInputChannel(*clientChannel); + mService->unregisterInputChannel(*serverChannel); + mQuery->getInputChannels(&channels); + EXPECT_EQ(channels.size(), 0UL); } } // namespace android |