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

Commit 0c8939f4 authored by Jeff Brown's avatar Jeff Brown Committed by Android Git Automerger
Browse files

am 9284b454: am b9eb949b: Merge "Fix input dispatcher regression on launcher...

am 9284b454: am b9eb949b: Merge "Fix input dispatcher regression on launcher drag&drop." into gingerbread

Merge commit '9284b454e28a49f514f9caddaace15b91d41165c'

* commit '9284b454e28a49f514f9caddaace15b91d41165c':
  Fix input dispatcher regression on launcher drag&drop.
parents ef0cddc8 8505b801
Loading
Loading
Loading
Loading
+30 −49
Original line number Original line Diff line number Diff line
@@ -776,6 +776,9 @@ void InputDispatcher::resumeAfterTargetsNotReadyTimeoutLocked(nsecs_t newTimeout
        // Give up.
        // Give up.
        mInputTargetWaitTimeoutExpired = true;
        mInputTargetWaitTimeoutExpired = true;


        // Release the touch target.
        releaseTouchedWindowLocked();

        // Input state will not be realistic.  Mark it out of sync.
        // Input state will not be realistic.  Mark it out of sync.
        if (inputChannel.get()) {
        if (inputChannel.get()) {
            ssize_t connectionIndex = getConnectionIndexLocked(inputChannel);
            ssize_t connectionIndex = getConnectionIndexLocked(inputChannel);
@@ -2159,9 +2162,8 @@ void InputDispatcher::setInputWindows(const Vector<InputWindow>& inputWindows) {
    { // acquire lock
    { // acquire lock
        AutoMutex _l(mLock);
        AutoMutex _l(mLock);


        sp<InputChannel> oldFocusedWindowChannel = mFocusedWindow
        // Clear old window pointers but remember their associated channels.
                ? mFocusedWindow->inputChannel : NULL;
        mFocusedWindow = NULL;
        int32_t oldFocusedWindowLayer = mFocusedWindow ? mFocusedWindow->layer : -1;


        sp<InputChannel> touchedWindowChannel;
        sp<InputChannel> touchedWindowChannel;
        if (mTouchedWindow) {
        if (mTouchedWindow) {
@@ -2175,11 +2177,11 @@ void InputDispatcher::setInputWindows(const Vector<InputWindow>& inputWindows) {
            }
            }
            mTouchedWallpaperWindows.clear();
            mTouchedWallpaperWindows.clear();
        }
        }

        mFocusedWindow = NULL;
        mWallpaperWindows.clear();
        mWallpaperWindows.clear();

        mWindows.clear();
        mWindows.clear();

        // Loop over new windows and rebuild the necessary window pointers for
        // tracking focus and touch.
        mWindows.appendVector(inputWindows);
        mWindows.appendVector(inputWindows);


        size_t numWindows = mWindows.size();
        size_t numWindows = mWindows.size();
@@ -2203,41 +2205,8 @@ void InputDispatcher::setInputWindows(const Vector<InputWindow>& inputWindows) {
                mTouchedWindow = window;
                mTouchedWindow = window;
            }
            }
        }
        }

        mTempTouchedWallpaperChannels.clear();
        mTempTouchedWallpaperChannels.clear();


        bool preempt = false;
        if (mFocusedWindow
                && mFocusedWindow->inputChannel != oldFocusedWindowChannel
                && mFocusedWindow->canReceiveKeys) {
            // If the new input focus is an error window or appears above the current
            // input focus, drop the current touched window so that we can start
            // delivering events to the new input focus as soon as possible.
            if (mFocusedWindow->layoutParamsFlags & InputWindow::FLAG_SYSTEM_ERROR) {
#if DEBUG_FOCUS
                LOGD("Preempting: New SYSTEM_ERROR window; resetting state");
#endif
                preempt = true;
            } else if (oldFocusedWindowChannel.get() != NULL
                    && mFocusedWindow->layer > oldFocusedWindowLayer) {
#if DEBUG_FOCUS
                LOGD("Preempting: Transferring focus to new window at higher layer: "
                        "old win layer=%d, new win layer=%d",
                        oldFocusedWindowLayer, mFocusedWindow->layer);
#endif
                preempt = true;
            }
        }
        if (mTouchedWindow && ! mTouchedWindow->visible) {
#if DEBUG_FOCUS
            LOGD("Preempting: Touched window became invisible.");
#endif
            preempt = true;
        }
        if (preempt) {
            releaseTouchedWindowLocked();
        }

#if DEBUG_FOCUS
#if DEBUG_FOCUS
        logDispatchStateLocked();
        logDispatchStateLocked();
#endif
#endif
@@ -2312,7 +2281,17 @@ void InputDispatcher::setInputDispatchMode(bool enabled, bool frozen) {
void InputDispatcher::logDispatchStateLocked() {
void InputDispatcher::logDispatchStateLocked() {
    String8 dump;
    String8 dump;
    dumpDispatchStateLocked(dump);
    dumpDispatchStateLocked(dump);
    LOGD("%s", dump.string());

    char* text = dump.lockBuffer(dump.size());
    char* start = text;
    while (*start != '\0') {
        char* end = strchr(start, '\n');
        if (*end == '\n') {
            *(end++) = '\0';
        }
        LOGD("%s", start);
        start = end;
    }
}
}


void InputDispatcher::dumpDispatchStateLocked(String8& dump) {
void InputDispatcher::dumpDispatchStateLocked(String8& dump) {
@@ -2326,28 +2305,30 @@ void InputDispatcher::dumpDispatchStateLocked(String8& dump) {
    } else {
    } else {
        dump.append("  focusedApplication: <null>\n");
        dump.append("  focusedApplication: <null>\n");
    }
    }
    dump.appendFormat("  focusedWindow: '%s'\n",
    dump.appendFormat("  focusedWindow: name='%s'\n",
            mFocusedWindow != NULL ? mFocusedWindow->inputChannel->getName().string() : "<null>");
            mFocusedWindow != NULL ? mFocusedWindow->name.string() : "<null>");
    dump.appendFormat("  touchedWindow: '%s', touchDown=%d\n",
    dump.appendFormat("  touchedWindow: name='%s', touchDown=%d\n",
            mTouchedWindow != NULL ? mTouchedWindow->inputChannel->getName().string() : "<null>",
            mTouchedWindow != NULL ? mTouchedWindow->name.string() : "<null>",
            mTouchDown);
            mTouchDown);
    for (size_t i = 0; i < mTouchedWallpaperWindows.size(); i++) {
    for (size_t i = 0; i < mTouchedWallpaperWindows.size(); i++) {
        dump.appendFormat("  touchedWallpaperWindows[%d]: '%s'\n",
        dump.appendFormat("  touchedWallpaperWindows[%d]: name='%s'\n",
                i, mTouchedWallpaperWindows[i]->inputChannel->getName().string());
                i, mTouchedWallpaperWindows[i]->name.string());
    }
    }
    for (size_t i = 0; i < mWindows.size(); i++) {
    for (size_t i = 0; i < mWindows.size(); i++) {
        dump.appendFormat("  windows[%d]: '%s', paused=%s, hasFocus=%s, hasWallpaper=%s, "
        dump.appendFormat("  windows[%d]: name='%s', paused=%s, hasFocus=%s, hasWallpaper=%s, "
                "visible=%s, flags=0x%08x, type=0x%08x, "
                "visible=%s, canReceiveKeys=%s, flags=0x%08x, type=0x%08x, layer=%d, "
                "frame=[%d,%d][%d,%d], "
                "frame=[%d,%d][%d,%d], "
                "visibleFrame=[%d,%d][%d,%d], "
                "visibleFrame=[%d,%d][%d,%d], "
                "touchableArea=[%d,%d][%d,%d], "
                "touchableArea=[%d,%d][%d,%d], "
                "ownerPid=%d, ownerUid=%d, dispatchingTimeout=%0.3fms\n",
                "ownerPid=%d, ownerUid=%d, dispatchingTimeout=%0.3fms\n",
                i, mWindows[i].inputChannel->getName().string(),
                i, mWindows[i].name.string(),
                toString(mWindows[i].paused),
                toString(mWindows[i].paused),
                toString(mWindows[i].hasFocus),
                toString(mWindows[i].hasFocus),
                toString(mWindows[i].hasWallpaper),
                toString(mWindows[i].hasWallpaper),
                toString(mWindows[i].visible),
                toString(mWindows[i].visible),
                toString(mWindows[i].canReceiveKeys),
                mWindows[i].layoutParamsFlags, mWindows[i].layoutParamsType,
                mWindows[i].layoutParamsFlags, mWindows[i].layoutParamsType,
                mWindows[i].layer,
                mWindows[i].frameLeft, mWindows[i].frameTop,
                mWindows[i].frameLeft, mWindows[i].frameTop,
                mWindows[i].frameRight, mWindows[i].frameBottom,
                mWindows[i].frameRight, mWindows[i].frameBottom,
                mWindows[i].visibleFrameLeft, mWindows[i].visibleFrameTop,
                mWindows[i].visibleFrameLeft, mWindows[i].visibleFrameTop,