summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Craig Mautner <cmautner@google.com> 2014-06-23 14:57:02 -0700
committer Craig Mautner <cmautner@google.com> 2014-06-23 15:01:27 -0700
commit13f6ea78b0aa98ffea6ea644770e4320ec9a2242 (patch)
tree35c32cb334131076c867fbdb484705b6446c8071
parent61606cec5ceb705910dec94222b22e66a0365094 (diff)
Avoid unnecessary timeouts.
And fix a couple of other inefficiencies. Fixes bug 15444410. Change-Id: Idad95d4e4d70bc7d2965e1bd6ff3d3135b73dd9c
-rw-r--r--core/java/android/view/WindowManagerInternal.java2
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindowManager.java18
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java38
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();
}
}
}