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

Commit f452d0b9 authored by arthurhung's avatar arthurhung
Browse files

Move drag event to InputDispatcher (5/n)

This CL add 'notifyDropWindow' to tell the policy about the dropping
window has been detected. That could help the drag controller to handle
the drop event and dispatch the clip data to the corresponding client.

Bug: 158242495
Test: atest inputflinger_tests
Change-Id: If7bce072dff5bdacb7eb765f94eb73ed63a58170
parent ead2fee4
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -113,6 +113,8 @@ private:


    void setPointerCapture(bool enabled) override {}
    void setPointerCapture(bool enabled) override {}


    void notifyDropWindow(const sp<IBinder>&, float x, float y) override {}

    InputDispatcherConfiguration mConfig;
    InputDispatcherConfiguration mConfig;
};
};


+2 −0
Original line number Original line Diff line number Diff line
@@ -287,6 +287,8 @@ struct CommandEntry {
    int32_t pid;
    int32_t pid;
    nsecs_t consumeTime; // time when the event was consumed by InputConsumer
    nsecs_t consumeTime; // time when the event was consumed by InputConsumer
    int32_t displayId;
    int32_t displayId;
    float x;
    float y;
};
};


} // namespace android::inputdispatcher
} // namespace android::inputdispatcher
+20 −0
Original line number Original line Diff line number Diff line
@@ -2345,6 +2345,10 @@ void InputDispatcher::addDragEventLocked(const MotionEntry& entry, TouchState& s
        }
        }
    } else if (maskedAction == AMOTION_EVENT_ACTION_UP ||
    } else if (maskedAction == AMOTION_EVENT_ACTION_UP ||
               maskedAction == AMOTION_EVENT_ACTION_CANCEL) {
               maskedAction == AMOTION_EVENT_ACTION_CANCEL) {
        if (state.dragHoverWindowHandle && maskedAction == AMOTION_EVENT_ACTION_UP) {
            vec2 local = state.dragHoverWindowHandle->getInfo()->transform.transform(x, y);
            notifyDropWindowLocked(state.dragHoverWindowHandle->getToken(), local.x, local.y);
        }
        state.dragWindow = nullptr;
        state.dragWindow = nullptr;
        state.dragHoverWindowHandle = nullptr;
        state.dragHoverWindowHandle = nullptr;
    }
    }
@@ -5302,6 +5306,15 @@ void InputDispatcher::notifyFocusChangedLocked(const sp<IBinder>& oldToken,
    postCommandLocked(std::move(commandEntry));
    postCommandLocked(std::move(commandEntry));
}
}


void InputDispatcher::notifyDropWindowLocked(const sp<IBinder>& token, float x, float y) {
    std::unique_ptr<CommandEntry> commandEntry =
            std::make_unique<CommandEntry>(&InputDispatcher::doNotifyDropWindowLockedInterruptible);
    commandEntry->newToken = token;
    commandEntry->x = x;
    commandEntry->y = y;
    postCommandLocked(std::move(commandEntry));
}

void InputDispatcher::onAnrLocked(const sp<Connection>& connection) {
void InputDispatcher::onAnrLocked(const sp<Connection>& connection) {
    if (connection == nullptr) {
    if (connection == nullptr) {
        LOG_ALWAYS_FATAL("Caller must check for nullness");
        LOG_ALWAYS_FATAL("Caller must check for nullness");
@@ -5411,6 +5424,13 @@ void InputDispatcher::doNotifyFocusChangedLockedInterruptible(CommandEntry* comm
    mLock.lock();
    mLock.lock();
}
}


void InputDispatcher::doNotifyDropWindowLockedInterruptible(CommandEntry* commandEntry) {
    sp<IBinder> newToken = commandEntry->newToken;
    mLock.unlock();
    mPolicy->notifyDropWindow(newToken, commandEntry->x, commandEntry->y);
    mLock.lock();
}

void InputDispatcher::doNotifyNoFocusedWindowAnrLockedInterruptible(CommandEntry* commandEntry) {
void InputDispatcher::doNotifyNoFocusedWindowAnrLockedInterruptible(CommandEntry* commandEntry) {
    mLock.unlock();
    mLock.unlock();


+3 −0
Original line number Original line Diff line number Diff line
@@ -592,6 +592,7 @@ private:
    void onFocusChangedLocked(const FocusResolver::FocusChanges& changes) REQUIRES(mLock);
    void onFocusChangedLocked(const FocusResolver::FocusChanges& changes) REQUIRES(mLock);
    void notifyFocusChangedLocked(const sp<IBinder>& oldFocus, const sp<IBinder>& newFocus)
    void notifyFocusChangedLocked(const sp<IBinder>& oldFocus, const sp<IBinder>& newFocus)
            REQUIRES(mLock);
            REQUIRES(mLock);
    void notifyDropWindowLocked(const sp<IBinder>& token, float x, float y) REQUIRES(mLock);
    void onAnrLocked(const sp<Connection>& connection) REQUIRES(mLock);
    void onAnrLocked(const sp<Connection>& connection) REQUIRES(mLock);
    void onAnrLocked(std::shared_ptr<InputApplicationHandle> application) REQUIRES(mLock);
    void onAnrLocked(std::shared_ptr<InputApplicationHandle> application) REQUIRES(mLock);
    void onUntrustedTouchLocked(const std::string& obscuringPackage) REQUIRES(mLock);
    void onUntrustedTouchLocked(const std::string& obscuringPackage) REQUIRES(mLock);
@@ -607,6 +608,8 @@ private:
            REQUIRES(mLock);
            REQUIRES(mLock);
    void doNotifyInputChannelBrokenLockedInterruptible(CommandEntry* commandEntry) REQUIRES(mLock);
    void doNotifyInputChannelBrokenLockedInterruptible(CommandEntry* commandEntry) REQUIRES(mLock);
    void doNotifyFocusChangedLockedInterruptible(CommandEntry* commandEntry) REQUIRES(mLock);
    void doNotifyFocusChangedLockedInterruptible(CommandEntry* commandEntry) REQUIRES(mLock);
    void doNotifyDropWindowLockedInterruptible(CommandEntry* commandEntry) REQUIRES(mLock);

    // ANR-related callbacks - start
    // ANR-related callbacks - start
    void doNotifyNoFocusedWindowAnrLockedInterruptible(CommandEntry* commandEntry) REQUIRES(mLock);
    void doNotifyNoFocusedWindowAnrLockedInterruptible(CommandEntry* commandEntry) REQUIRES(mLock);
    void doNotifyWindowUnresponsiveLockedInterruptible(CommandEntry* commandEntry) REQUIRES(mLock);
    void doNotifyWindowUnresponsiveLockedInterruptible(CommandEntry* commandEntry) REQUIRES(mLock);
+3 −0
Original line number Original line Diff line number Diff line
@@ -157,6 +157,9 @@ public:
     * InputDispatcher is solely responsible for updating the Pointer Capture state.
     * InputDispatcher is solely responsible for updating the Pointer Capture state.
     */
     */
    virtual void setPointerCapture(bool enabled) = 0;
    virtual void setPointerCapture(bool enabled) = 0;

    /* Notifies the policy that the drag window has moved over to another window */
    virtual void notifyDropWindow(const sp<IBinder>& token, float x, float y) = 0;
};
};


} // namespace android
} // namespace android
Loading