diff options
| author | 2014-06-23 14:57:02 -0700 | |
|---|---|---|
| committer | 2014-06-23 15:01:27 -0700 | |
| commit | 13f6ea78b0aa98ffea6ea644770e4320ec9a2242 (patch) | |
| tree | 35c32cb334131076c867fbdb484705b6446c8071 | |
| parent | 61606cec5ceb705910dec94222b22e66a0365094 (diff) | |
Avoid unnecessary timeouts.
And fix a couple of other inefficiencies.
Fixes bug 15444410.
Change-Id: Idad95d4e4d70bc7d2965e1bd6ff3d3135b73dd9c
3 files changed, 30 insertions, 28 deletions
diff --git a/core/java/android/view/WindowManagerInternal.java b/core/java/android/view/WindowManagerInternal.java index a92bf59c539d..bf5c84efb49b 100644 --- a/core/java/android/view/WindowManagerInternal.java +++ b/core/java/android/view/WindowManagerInternal.java @@ -167,5 +167,5 @@ public abstract class WindowManagerInternal { * Invalidate all visible windows. Then report back on the callback once all windows have * redrawn. */ - public abstract void waitForAllWindowsDrawn(IRemoteCallback callback, long timeout); + public abstract void waitForAllWindowsDrawn(Runnable callback, long timeout); } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 637061d045f5..ba4866589f09 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -42,7 +42,6 @@ import android.database.ContentObserver; import android.graphics.PixelFormat; import android.graphics.Rect; import android.media.AudioManager; -import android.media.AudioSystem; import android.media.IAudioService; import android.media.Ringtone; import android.media.RingtoneManager; @@ -51,7 +50,6 @@ import android.os.Bundle; import android.os.FactoryTest; import android.os.Handler; import android.os.IBinder; -import android.os.IRemoteCallback; import android.os.Looper; import android.os.Message; import android.os.Messenger; @@ -105,7 +103,6 @@ import com.android.internal.policy.PolicyManager; import com.android.internal.policy.impl.keyguard.KeyguardServiceDelegate; import com.android.internal.policy.impl.keyguard.KeyguardServiceDelegate.ShowListener; import com.android.internal.statusbar.IStatusBarService; -import com.android.internal.telephony.ITelephony; import com.android.internal.widget.PointerLocationView; import com.android.server.LocalServices; @@ -270,10 +267,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { // The following are only accessed on the mHandler thread. boolean mKeyguardDrawComplete; boolean mWindowManagerDrawComplete; - ArrayList<ScreenOnListener> mScreenOnListeners = new ArrayList<ScreenOnListener>(); - final IRemoteCallback mWindowManagerDrawCallback = new IRemoteCallback.Stub() { + ScreenOnListener mScreenOnListener; + final Runnable mWindowManagerDrawCallback = new Runnable() { @Override - public void sendResult(Bundle data) { + public void run() { if (DEBUG_WAKEUP) Slog.i(TAG, "All windows ready for display!"); mHandler.sendEmptyMessage(MSG_WINDOW_MANAGER_DRAWN_COMPLETE); } @@ -4543,7 +4540,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Called on the mHandler thread. private void handleWakingUp(final ScreenOnListener screenOnListener) { if (screenOnListener != null) { - mScreenOnListeners.add(screenOnListener); + mScreenOnListener = screenOnListener; } synchronized (mLock) { @@ -4575,8 +4572,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { return; } + ScreenOnListener screenOnListener; synchronized (mLock) { mScreenOnFully = true; + screenOnListener = mScreenOnListener; + mScreenOnListener = null; } try { @@ -4584,8 +4584,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { } catch (RemoteException unhandled) { } - for (int i = mScreenOnListeners.size() - 1; i >=0; --i) { - mScreenOnListeners.remove(i).onScreenOn(); + if (screenOnListener != null) { + screenOnListener.onScreenOn(); } setKeyguardDrawn(); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index d04d668a8ef0..3c837063dca3 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -411,7 +411,7 @@ public class WindowManagerService extends IWindowManager.Stub /** * And the callback to make when they've all been drawn. */ - IRemoteCallback mWaitingForDrawnCallback; + Runnable mWaitingForDrawnCallback; /** * Windows that have called relayout() while we were running animations, @@ -7561,7 +7561,7 @@ public class WindowManagerService extends IWindowManager.Stub } case WAITING_FOR_DRAWN_TIMEOUT: { - IRemoteCallback callback = null; + Runnable callback = null; synchronized (mWindowMap) { Slog.w(TAG, "Timeout waiting for drawn: undrawn=" + mWaitingForDrawn); mWaitingForDrawn.clear(); @@ -7569,10 +7569,7 @@ public class WindowManagerService extends IWindowManager.Stub mWaitingForDrawnCallback = null; } if (callback != null) { - try { - callback.sendResult(null); - } catch (RemoteException e) { - } + callback.run(); } break; } @@ -7626,16 +7623,13 @@ public class WindowManagerService extends IWindowManager.Stub } break; case ALL_WINDOWS_DRAWN: { - IRemoteCallback callback; + Runnable callback; synchronized (mWindowMap) { callback = mWaitingForDrawnCallback; mWaitingForDrawnCallback = null; } if (callback != null) { - try { - callback.sendResult(null); - } catch (RemoteException e) { - } + callback.run(); } } case NEW_ANIMATOR_SCALE: { @@ -9555,8 +9549,9 @@ public class WindowManagerService extends IWindowManager.Stub } } - if (mInnerFields.mOrientationChangeComplete && !defaultDisplay.layoutNeeded - && !mInnerFields.mUpdateRotation) { + if (mWaitingForDrawnCallback != null || + (mInnerFields.mOrientationChangeComplete && !defaultDisplay.layoutNeeded && + !mInnerFields.mUpdateRotation)) { checkDrawnWindowsLocked(); } @@ -11141,24 +11136,31 @@ public class WindowManagerService extends IWindowManager.Stub } } - public void waitForAllWindowsDrawn(IRemoteCallback callback, long timeout) { + public void waitForAllWindowsDrawn(Runnable callback, long timeout) { synchronized (mWindowMap) { mWaitingForDrawnCallback = callback; final WindowList windows = getDefaultWindowListLocked(); for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) { final WindowState win = windows.get(winNdx); - if (win.mHasSurface) { - win.mWinAnimator.mDrawState = WindowStateAnimator.DRAW_PENDING; + if (win.mHasSurface && win.isWinVisibleLw()) { + if (!win.mIsWallpaper) { + // Don't force wallpaper to redraw. + win.mWinAnimator.mDrawState = WindowStateAnimator.DRAW_PENDING; + } // Force add to mResizingWindows. win.mLastContentInsets.set(-1, -1, -1, -1); mWaitingForDrawn.add(win); } } requestTraversalLocked(); - mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT); + } + mH.removeMessages(H.WAITING_FOR_DRAWN_TIMEOUT); + if (mWaitingForDrawn.isEmpty()) { + callback.run(); + } else { mH.sendEmptyMessageDelayed(H.WAITING_FOR_DRAWN_TIMEOUT, timeout); + checkDrawnWindowsLocked(); } - checkDrawnWindowsLocked(); } } } |