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

Commit 3a22cd90 authored by Jeff Brown's avatar Jeff Brown
Browse files

Reduce number of calls to updateInputWindows by 60%.

Change-Id: Ida9069dd58be2070f3c9d312aa9d868bd98eb8e2
parent 2cb866b9
Loading
Loading
Loading
Loading
+78 −34
Original line number Diff line number Diff line
@@ -680,6 +680,7 @@ public class WindowManagerService extends IWindowManager.Stub

            // stop intercepting input
            mDragState.unregister();
            mInputMonitor.setUpdateInputWindowsNeededLw();
            mInputMonitor.updateInputWindowsLw();

            // Retain the parameters of any deferred rotation operation so
@@ -2401,7 +2402,8 @@ public class WindowManagerService extends IWindowManager.Stub

            boolean focusChanged = false;
            if (win.canReceiveKeys()) {
                focusChanged = updateFocusedWindowLocked(UPDATE_FOCUS_WILL_ASSIGN_LAYERS);
                focusChanged = updateFocusedWindowLocked(UPDATE_FOCUS_WILL_ASSIGN_LAYERS,
                        false /*updateInputWindows*/);
                if (focusChanged) {
                    imMayMove = false;
                }
@@ -2418,8 +2420,9 @@ public class WindowManagerService extends IWindowManager.Stub
            //dump();

            if (focusChanged) {
                finishUpdateFocusedWindowAfterAssignLayersLocked();
                finishUpdateFocusedWindowAfterAssignLayersLocked(false /*updateInputWindows*/);
            }
            mInputMonitor.updateInputWindowsLw();

            if (localLOGV) Slog.v(
                TAG, "New client " + client.asBinder()
@@ -2496,8 +2499,10 @@ public class WindowManagerService extends IWindowManager.Stub
                win.mExiting = true;
                win.mRemoveOnExit = true;
                mLayoutNeeded = true;
                updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES);
                updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
                        false /*updateInputWindows*/);
                performLayoutAndPlaceSurfacesLocked();
                mInputMonitor.updateInputWindowsLw();
                if (win.mAppToken != null) {
                    win.mAppToken.updateReportedVisibilityLocked();
                }
@@ -2515,7 +2520,7 @@ public class WindowManagerService extends IWindowManager.Stub
                && updateOrientationFromAppTokensLocked(false)) {
            mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
        }
        updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL);
        updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
        Binder.restoreCallingIdentity(origId);
    }

@@ -2613,6 +2618,7 @@ public class WindowManagerService extends IWindowManager.Stub
            }
        }
        
        mInputMonitor.setUpdateInputWindowsNeededLw();
        mInputMonitor.updateInputWindowsLw();
    }

@@ -2863,6 +2869,7 @@ public class WindowManagerService extends IWindowManager.Stub
                        outSurface.release();
                    }
                } catch (Exception e) {
                    mInputMonitor.setUpdateInputWindowsNeededLw();
                    mInputMonitor.updateInputWindowsLw();
                    
                    Slog.w(TAG, "Exception thrown when creating surface for client "
@@ -2950,7 +2957,8 @@ public class WindowManagerService extends IWindowManager.Stub

            if (focusMayChange) {
                //System.out.println("Focus may change: " + win.mAttrs.getTitle());
                if (updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES)) {
                if (updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
                        false /*updateInputWindows*/)) {
                    imMayMove = false;
                }
                //System.out.println("Relayout " + win + ": focus=" + mCurrentFocus);
@@ -3006,6 +3014,7 @@ public class WindowManagerService extends IWindowManager.Stub

            inTouchMode = mInTouchMode;
            
            mInputMonitor.setUpdateInputWindowsNeededLw();
            mInputMonitor.updateInputWindowsLw();
        }

@@ -3378,7 +3387,8 @@ public class WindowManagerService extends IWindowManager.Stub
                    if (changed) {
                        mLayoutNeeded = true;
                        performLayoutAndPlaceSurfacesLocked();
                        updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL);
                        updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL,
                                false /*updateInputWindows*/);
                    }

                    if (delayed) {
@@ -3388,6 +3398,7 @@ public class WindowManagerService extends IWindowManager.Stub
                    }
                }

                mInputMonitor.setUpdateInputWindowsNeededLw();
                mInputMonitor.updateInputWindowsLw();
            } else {
                Slog.w(TAG, "Attempted to remove non-existing token: " + token);
@@ -3707,7 +3718,7 @@ public class WindowManagerService extends IWindowManager.Stub

            if (moveFocusNow && changed) {
                final long origId = Binder.clearCallingIdentity();
                updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL);
                updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
                Binder.restoreCallingIdentity(origId);
            }
        }
@@ -3882,7 +3893,8 @@ public class WindowManagerService extends IWindowManager.Stub
                            ttoken.updateLayers();
                        }

                        updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES);
                        updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
                                true /*updateInputWindows*/);
                        mLayoutNeeded = true;
                        performLayoutAndPlaceSurfacesLocked();
                        Binder.restoreCallingIdentity(origId);
@@ -4042,12 +4054,13 @@ public class WindowManagerService extends IWindowManager.Stub

            if (changed) {
                mLayoutNeeded = true;
                mInputMonitor.setUpdateInputWindowsNeededLw();
                if (performLayout) {
                    updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES);
                    updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
                            false /*updateInputWindows*/);
                    performLayoutAndPlaceSurfacesLocked();
                } else {
                    mInputMonitor.updateInputWindowsLw();
                }
                mInputMonitor.updateInputWindowsLw();
            }
        }

@@ -4302,7 +4315,7 @@ public class WindowManagerService extends IWindowManager.Stub
                if (mFocusedApp == wtoken) {
                    if (DEBUG_FOCUS) Slog.v(TAG, "Removing focused app token:" + wtoken);
                    mFocusedApp = null;
                    updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL);
                    updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL, true /*updateInputWindows*/);
                    mInputMonitor.setFocusedAppLw(null);
                }
            } else {
@@ -4481,9 +4494,11 @@ public class WindowManagerService extends IWindowManager.Stub
                reAddAppWindowsLocked(findWindowOffsetLocked(index), wtoken);
                if (DEBUG_REORDER) Slog.v(TAG, "Final window list:");
                if (DEBUG_REORDER) dumpWindowsLocked();
                updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES);
                updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
                        false /*updateInputWindows*/);
                mLayoutNeeded = true;
                performLayoutAndPlaceSurfacesLocked();
                mInputMonitor.updateInputWindowsLw();
            }
            Binder.restoreCallingIdentity(origId);
        }
@@ -4520,11 +4535,13 @@ public class WindowManagerService extends IWindowManager.Stub
        pos = reAddAppWindowsLocked(pos, wtoken);

        if (updateFocusAndLayout) {
            if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES)) {
            if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
                    false /*updateInputWindows*/)) {
                assignLayersLocked();
            }
            mLayoutNeeded = true;
            performLayoutAndPlaceSurfacesLocked();
            mInputMonitor.updateInputWindowsLw();
        }
    }

@@ -4550,11 +4567,13 @@ public class WindowManagerService extends IWindowManager.Stub
            }
        }

        if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES)) {
        if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
                false /*updateInputWindows*/)) {
            assignLayersLocked();
        }
        mLayoutNeeded = true;
        performLayoutAndPlaceSurfacesLocked();
        mInputMonitor.updateInputWindowsLw();

        //dump();
    }
@@ -5797,6 +5816,9 @@ public class WindowManagerService extends IWindowManager.Stub
        // When true, input dispatch proceeds normally.  Otherwise all events are dropped.
        private boolean mInputDispatchEnabled = true;

        // When true, need to call updateInputWindowsLw().
        private boolean mUpdateInputWindowsNeeded = true;

        // Temporary list of windows information to provide to the input dispatcher.
        private InputWindowList mTempInputWindows = new InputWindowList();
        
@@ -5891,8 +5913,17 @@ public class WindowManagerService extends IWindowManager.Stub
            inputWindow.touchableRegion.setEmpty();
        }

        public void setUpdateInputWindowsNeededLw() {
            mUpdateInputWindowsNeeded = true;
        }

        /* Updates the cached window information provided to the input dispatcher. */
        public void updateInputWindowsLw() {
            if (!mUpdateInputWindowsNeeded) {
                return;
            }
            mUpdateInputWindowsNeeded = false;

            // Populate the input window list with information about all of the windows that
            // could potentially receive input.
            // As an optimization, we could try to prune the list of windows but this turns
@@ -6021,7 +6052,7 @@ public class WindowManagerService extends IWindowManager.Stub
        /* Called when the current input focus changes.
         * Layer assignment is assumed to be complete by the time this is called.
         */
        public void setInputFocusLw(WindowState newWindow) {
        public void setInputFocusLw(WindowState newWindow, boolean updateInputWindows) {
            if (DEBUG_INPUT) {
                Slog.d(TAG, "Input focus has changed to " + newWindow);
            }
@@ -6035,9 +6066,13 @@ public class WindowManagerService extends IWindowManager.Stub
                }

                mInputFocus = newWindow;
                setUpdateInputWindowsNeededLw();

                if (updateInputWindows) {
                    updateInputWindowsLw();
                }
            }
        }
        
        public void setFocusedAppLw(AppWindowToken newApp) {
            // Focused app has changed.
@@ -6062,6 +6097,7 @@ public class WindowManagerService extends IWindowManager.Stub
                }
                
                window.paused = true;
                setUpdateInputWindowsNeededLw();
                updateInputWindowsLw();
            }
        }
@@ -6073,6 +6109,7 @@ public class WindowManagerService extends IWindowManager.Stub
                }
                
                window.paused = false;
                setUpdateInputWindowsNeededLw();
                updateInputWindowsLw();
            }
        }
@@ -6549,12 +6586,14 @@ public class WindowManagerService extends IWindowManager.Stub
                // the actual drag event dispatch stuff in the dragstate

                mDragState.register();
                mInputMonitor.setUpdateInputWindowsNeededLw();
                mInputMonitor.updateInputWindowsLw();
                if (!mInputManager.transferTouchFocus(callingWin.mInputChannel,
                        mDragState.mServerChannel)) {
                    Slog.e(TAG, "Unable to transfer touch focus");
                    mDragState.unregister();
                    mDragState = null;
                    mInputMonitor.setUpdateInputWindowsNeededLw();
                    mInputMonitor.updateInputWindowsLw();
                    return false;
                }
@@ -9151,6 +9190,7 @@ public class WindowManagerService extends IWindowManager.Stub
                        // !!! TODO: ANR the app that has failed to start the drag in time
                        if (mDragState != null) {
                            mDragState.unregister();
                            mInputMonitor.setUpdateInputWindowsNeededLw();
                            mInputMonitor.updateInputWindowsLw();
                            mDragState.reset();
                            mDragState = null;
@@ -9441,7 +9481,7 @@ public class WindowManagerService extends IWindowManager.Stub
        }
    }

    private final int performLayoutLockedInner(boolean initial) {
    private final int performLayoutLockedInner(boolean initial, boolean updateInputWindows) {
        if (!mLayoutNeeded) {
            return 0;
        }
@@ -9549,7 +9589,10 @@ public class WindowManagerService extends IWindowManager.Stub
        }
        
        // Window frames may have changed.  Tell the input dispatcher about it.
        mInputMonitor.setUpdateInputWindowsNeededLw();
        if (updateInputWindows) {
            mInputMonitor.updateInputWindowsLw();
        }

        return mPolicy.finishLayoutLw();
    }
@@ -9570,7 +9613,8 @@ public class WindowManagerService extends IWindowManager.Stub

        if (mFocusMayChange) {
            mFocusMayChange = false;
            updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES);
            updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES,
                    false /*updateInputWindows*/);
        }
        
        // Initialize state of exiting tokens.
@@ -9646,7 +9690,7 @@ public class WindowManagerService extends IWindowManager.Stub
                
                // FIRST LOOP: Perform a layout, if needed.
                if (repeats < 4) {
                    changes = performLayoutLockedInner(repeats == 0);
                    changes = performLayoutLockedInner(repeats == 0, false /*updateInputWindows*/);
                    if (changes != 0) {
                        continue;
                    }
@@ -10103,7 +10147,8 @@ public class WindowManagerService extends IWindowManager.Stub
                        if (!moveInputMethodWindowsIfNeededLocked(true)) {
                            assignLayersLocked();
                        }
                        updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES);
                        updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
                                false /*updateInputWindows*/);
                        mFocusMayChange = false;
                    }
                }
@@ -10212,7 +10257,8 @@ public class WindowManagerService extends IWindowManager.Stub

                if (mFocusMayChange) {
                    mFocusMayChange = false;
                    if (updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES)) {
                    if (updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
                            false /*updateInputWindows*/)) {
                        changes |= PhoneWindowManager.FINISH_LAYOUT_REDO_ANIM;
                        adjResult = 0;
                    }
@@ -10224,8 +10270,6 @@ public class WindowManagerService extends IWindowManager.Stub

                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: changes=0x"
                        + Integer.toHexString(changes));
                
                mInputMonitor.updateInputWindowsLw();
            } while (changes != 0);

            // THIRD LOOP: Update the surfaces of all windows.
@@ -10679,8 +10723,6 @@ public class WindowManagerService extends IWindowManager.Stub
            Slog.e(TAG, "Unhandled exception in Window Manager", e);
        }

        mInputMonitor.updateInputWindowsLw();
        
        Surface.closeTransaction();

        if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces");
@@ -10810,6 +10852,8 @@ public class WindowManagerService extends IWindowManager.Stub
            requestAnimationLocked(currentTime+(1000/60)-SystemClock.uptimeMillis());
        }

        // Finally update all input windows now that the window changes have stabilized.
        mInputMonitor.setUpdateInputWindowsNeededLw();
        mInputMonitor.updateInputWindowsLw();

        setHoldScreenLocked(holdScreen != null);
@@ -10988,7 +11032,7 @@ public class WindowManagerService extends IWindowManager.Stub
        }
    }

    private boolean updateFocusedWindowLocked(int mode) {
    private boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) {
        WindowState newFocus = computeFocusedWindowLocked();
        if (mCurrentFocus != newFocus) {
            // This check makes sure that we don't already have the focus
@@ -11009,7 +11053,7 @@ public class WindowManagerService extends IWindowManager.Stub
                    mLayoutNeeded = true;
                }
                if (mode == UPDATE_FOCUS_PLACING_SURFACES) {
                    performLayoutLockedInner(true);
                    performLayoutLockedInner(true /*initial*/, updateInputWindows);
                } else if (mode == UPDATE_FOCUS_WILL_PLACE_SURFACES) {
                    // Client will do the layout, but we need to assign layers
                    // for handleNewWindowLocked() below.
@@ -11020,15 +11064,15 @@ public class WindowManagerService extends IWindowManager.Stub
            if (mode != UPDATE_FOCUS_WILL_ASSIGN_LAYERS) {
                // If we defer assigning layers, then the caller is responsible for
                // doing this part.
                finishUpdateFocusedWindowAfterAssignLayersLocked();
                finishUpdateFocusedWindowAfterAssignLayersLocked(updateInputWindows);
            }
            return true;
        }
        return false;
    }
    
    private void finishUpdateFocusedWindowAfterAssignLayersLocked() {
        mInputMonitor.setInputFocusLw(mCurrentFocus);
    private void finishUpdateFocusedWindowAfterAssignLayersLocked(boolean updateInputWindows) {
        mInputMonitor.setInputFocusLw(mCurrentFocus, updateInputWindows);
    }

    private WindowState computeFocusedWindowLocked() {