Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2984b7af authored by Robert Carr's avatar Robert Carr Committed by Rob Carr
Browse files

InputDispatcher: Fix support for INPUT_FEATURE_NO_INPUT_CHANNEL

In preparation for an occlusion detection fix, we are going to begin
sending windows with NO_INPUT_CHANNEL to InputFlinger. There are 3
obstacles we address here:
   1. InputDispatcher ignores windows with no InputChannel when updating
      input windows. We modify the code to allow such windows if they have
      INPUT_FEATURE_NO_INPUT_CHANNEL.
   2. The parcelling code currently has an optimization to avoid sending the rest
      of the fields if token is null. We rebase this optimization on
      whether or not a name is set.
   3. InputWindowHandle::getName checks if there is a token to consider the window
      invalid. We instead check if a name is set.

Bug: 152064592
Test: Existing tests pass
Change-Id: I8a85f46b6c44866c7f73daafa5e8ff4c9251c366
parent 8c0eb7fd
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -213,7 +213,7 @@ public:
    }

    inline std::string getName() const {
        return mInfo.token ? mInfo.name : "<invalid>";
        return !mInfo.name.empty() ? mInfo.name : "<invalid>";
    }

    inline nsecs_t getDispatchingTimeout(nsecs_t defaultValue) const {
+2 −7
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ bool InputWindowInfo::overlaps(const InputWindowInfo* other) const {
}

status_t InputWindowInfo::write(Parcel& output) const {
    if (token == nullptr) {
    if (name.empty()) {
        output.writeInt32(0);
        return OK;
    }
@@ -110,12 +110,7 @@ InputWindowInfo InputWindowInfo::read(const Parcel& from) {
        return ret;
    }

    sp<IBinder> token = from.readStrongBinder();
    if (token == nullptr) {
        return ret;
    }

    ret.token = token;
    ret.token = from.readStrongBinder();
    ret.id = from.readInt32();
    ret.name = from.readString8().c_str();
    ret.layoutParamsFlags = from.readInt32();
+1 −1
Original line number Diff line number Diff line
@@ -3598,9 +3598,9 @@ void InputDispatcher::updateWindowHandlesForDisplayLocked(
            if (canReceiveInput && !noInputChannel) {
                ALOGV("Window handle %s has no registered input channel",
                      handle->getName().c_str());
            }
                continue;
            }
        }

        if (info->displayId != displayId) {
            ALOGE("Window %s updated by wrong display %d, should belong to display %d",