diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 94fecc973b898..3e1c5fff735f1 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -26,7 +26,6 @@ import android.util.DisplayMetrics; import android.util.EventLog; import android.util.Slog; import android.util.TypedValue; -import android.view.Display; import android.view.Surface; import com.android.server.EventLogTags; @@ -371,7 +370,7 @@ public class TaskStack { for (int appNdx = appWindowTokens.size() - 1; appNdx >= 0; --appNdx) { final WindowList appWindows = appWindowTokens.get(appNdx).allAppWindows; for (int winNdx = appWindows.size() - 1; winNdx >= 0; --winNdx) { - mService.removeWindowInnerLocked(null, appWindows.get(winNdx)); + mService.removeWindowInnerLocked(appWindows.get(winNdx)); doAnotherLayoutPass = true; } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index dd4bbb7a42a27..885465b5f0e3a 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -64,11 +64,9 @@ import android.database.ContentObserver; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; -import android.graphics.Matrix; import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.Rect; -import android.graphics.RectF; import android.graphics.Region; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManagerInternal; @@ -127,7 +125,6 @@ import android.view.Surface; import android.view.SurfaceControl; import android.view.SurfaceSession; import android.view.View; -import android.view.ViewTreeObserver; import android.view.WindowManager; import android.view.WindowManagerGlobal; import android.view.WindowManagerPolicy; @@ -136,7 +133,6 @@ import android.view.WindowManagerPolicy.FakeWindow; import android.view.WindowManagerPolicy.PointerEventListener; import android.view.animation.Animation; import android.view.animation.AnimationUtils; -import android.view.animation.Transformation; import java.io.BufferedWriter; import java.io.DataInputStream; @@ -413,7 +409,7 @@ public class WindowManagerService extends IWindowManager.Stub * This is set when we have run out of memory, and will either be an empty * list or contain windows that need to be force removed. */ - ArrayList mForceRemoves; + final ArrayList mForceRemoves = new ArrayList<>(); /** * Windows that clients are waiting to have drawn. @@ -1736,10 +1732,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - static final int ADJUST_WALLPAPER_LAYERS_CHANGED = 1<<1; - static final int ADJUST_WALLPAPER_VISIBILITY_CHANGED = 1<<2; - - int adjustWallpaperWindowsLocked() { + boolean adjustWallpaperWindowsLocked() { mInnerFields.mWallpaperMayChange = false; boolean targetChanged = false; @@ -1966,13 +1959,12 @@ public class WindowManagerService extends IWindowManager.Stub // Start stepping backwards from here, ensuring that our wallpaper windows // are correctly placed. - int changed = 0; + boolean changed = false; for (int curTokenNdx = mWallpaperTokens.size() - 1; curTokenNdx >= 0; curTokenNdx--) { WindowToken token = mWallpaperTokens.get(curTokenNdx); if (token.hidden == visible) { if (DEBUG_WALLPAPER_LIGHT) Slog.d(TAG, "Wallpaper token " + token + " hidden=" + !visible); - changed |= ADJUST_WALLPAPER_VISIBILITY_CHANGED; token.hidden = !visible; // Need to do a layout to ensure the wallpaper now has the correct size. getDefaultDisplayContentLocked().layoutNeeded = true; @@ -2033,7 +2025,7 @@ public class WindowManagerService extends IWindowManager.Stub windows.add(insertionIndex, wallpaper); mWindowsChanged = true; - changed |= ADJUST_WALLPAPER_LAYERS_CHANGED; + changed = true; } } @@ -2654,7 +2646,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - removeWindowInnerLocked(session, win); + removeWindowInnerLocked(win); // Removing a visible window will effect the computed orientation // So just update orientation if needed. if (wasVisible && updateOrientationFromAppTokensLocked(false)) { @@ -2664,7 +2656,7 @@ public class WindowManagerService extends IWindowManager.Stub Binder.restoreCallingIdentity(origId); } - void removeWindowInnerLocked(Session session, WindowState win) { + void removeWindowInnerLocked(WindowState win) { if (win.mRemoved) { // Nothing to do. return; @@ -2674,7 +2666,7 @@ public class WindowManagerService extends IWindowManager.Stub WindowState cwin = win.mChildWindows.get(i); Slog.w(TAG, "Force-removing child win " + cwin + " from container " + win); - removeWindowInnerLocked(cwin.mSession, cwin); + removeWindowInnerLocked(cwin); } win.mRemoved = true; @@ -3781,6 +3773,9 @@ public class WindowManagerService extends IWindowManager.Stub private Configuration updateOrientationFromAppTokensLocked( Configuration currentConfig, IBinder freezeThisOneIfNeeded) { + if (!mDisplayReady) { + return null; + } Configuration config = null; if (updateOrientationFromAppTokensLocked(false)) { @@ -3799,20 +3794,19 @@ public class WindowManagerService extends IWindowManager.Stub // the value of the previous configuration. mTempConfiguration.setToDefaults(); mTempConfiguration.fontScale = currentConfig.fontScale; - if (computeScreenConfigurationLocked(mTempConfiguration)) { - if (currentConfig.diff(mTempConfiguration) != 0) { - mWaitingForConfig = true; - final DisplayContent displayContent = getDefaultDisplayContentLocked(); - displayContent.layoutNeeded = true; - int anim[] = new int[2]; - if (displayContent.isDimming()) { - anim[0] = anim[1] = 0; - } else { - mPolicy.selectRotationAnimationLw(anim); - } - startFreezingDisplayLocked(false, anim[0], anim[1]); - config = new Configuration(mTempConfiguration); + computeScreenConfigurationLocked(mTempConfiguration); + if (currentConfig.diff(mTempConfiguration) != 0) { + mWaitingForConfig = true; + final DisplayContent displayContent = getDefaultDisplayContentLocked(); + displayContent.layoutNeeded = true; + int anim[] = new int[2]; + if (displayContent.isDimming()) { + anim[0] = anim[1] = 0; + } else { + mPolicy.selectRotationAnimationLw(anim); } + startFreezingDisplayLocked(false, anim[0], anim[1]); + config = new Configuration(mTempConfiguration); } } @@ -6917,9 +6911,11 @@ public class WindowManagerService extends IWindowManager.Stub public Configuration computeNewConfiguration() { synchronized (mWindowMap) { + if (!mDisplayReady) { + return null; + } Configuration config = computeNewConfigurationLocked(); - if (config == null && mWaitingForConfig) { - // Nothing changed but we are waiting for something... stop that! + if (mWaitingForConfig) { mWaitingForConfig = false; mLastFinishedFreezeSource = "new-config"; performLayoutAndPlaceSurfacesLocked(); @@ -6931,9 +6927,7 @@ public class WindowManagerService extends IWindowManager.Stub Configuration computeNewConfigurationLocked() { Configuration config = new Configuration(); config.fontScale = 0; - if (!computeScreenConfigurationLocked(config)) { - return null; - } + computeScreenConfigurationLocked(config); return config; } @@ -7040,11 +7034,8 @@ public class WindowManagerService extends IWindowManager.Stub return sw; } + /** Do not call if mDisplayReady == false */ DisplayInfo updateDisplayAndOrientationLocked() { - if (!mDisplayReady) { - return null; - } - // TODO(multidisplay): For now, apply Configuration to main screen only. final DisplayContent displayContent = getDefaultDisplayContentLocked(); @@ -7101,11 +7092,9 @@ public class WindowManagerService extends IWindowManager.Stub return displayInfo; } - boolean computeScreenConfigurationLocked(Configuration config) { + /** Do not call if mDisplayReady == false */ + void computeScreenConfigurationLocked(Configuration config) { final DisplayInfo displayInfo = updateDisplayAndOrientationLocked(); - if (displayInfo == null) { - return false; - } final int dw = displayInfo.logicalWidth; final int dh = displayInfo.logicalHeight; @@ -7190,8 +7179,6 @@ public class WindowManagerService extends IWindowManager.Stub config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO; config.navigationHidden = Configuration.NAVIGATIONHIDDEN_NO; mPolicy.adjustConfigurationLw(config, keyboardPresence, navigationPresence); - - return true; } public boolean isHardKeyboardAvailable() { @@ -8320,17 +8307,17 @@ public class WindowManagerService extends IWindowManager.Stub // displayContent must not be null private void reconfigureDisplayLocked(DisplayContent displayContent) { // TODO: Multidisplay: for now only use with default display. + if (!mDisplayReady) { + return; + } configureDisplayPolicyLocked(displayContent); displayContent.layoutNeeded = true; boolean configChanged = updateOrientationFromAppTokensLocked(false); mTempConfiguration.setToDefaults(); mTempConfiguration.fontScale = mCurConfiguration.fontScale; - if (computeScreenConfigurationLocked(mTempConfiguration)) { - if (mCurConfiguration.diff(mTempConfiguration) != 0) { - configChanged = true; - } - } + computeScreenConfigurationLocked(mTempConfiguration); + configChanged |= mCurConfiguration.diff(mTempConfiguration) != 0; if (configChanged) { mWaitingForConfig = true; @@ -8631,29 +8618,24 @@ public class WindowManagerService extends IWindowManager.Stub Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "wmLayout"); mInLayout = true; - boolean recoveringMemory = false; - try { - if (mForceRemoves != null) { - recoveringMemory = true; - // Wait a little bit for things to settle down, and off we go. - for (int i=0; i(); - } - long callingIdentity = Binder.clearCallingIdentity(); try { // There was some problem... first, do a sanity check of the @@ -10353,6 +10326,10 @@ public class WindowManagerService extends IWindowManager.Stub + ", flags=" + win.mAttrs.flags + ", canReceive=" + win.canReceiveKeys()); + if (!win.canReceiveKeys()) { + continue; + } + AppWindowToken wtoken = win.mAppToken; // If this window's application has been removed, just skip it. @@ -10362,10 +10339,6 @@ public class WindowManagerService extends IWindowManager.Stub continue; } - if (!win.canReceiveKeys()) { - continue; - } - // Descend through all of the app tokens and find the first that either matches // win.mAppToken (return win) or mFocusedApp (return null). if (wtoken != null && win.mAttrs.type != TYPE_APPLICATION_STARTING &&