diff --git a/api/current.xml b/api/current.xml index fa54a109ef1b7..68a1c76bb1c45 100644 --- a/api/current.xml +++ b/api/current.xml @@ -36906,6 +36906,17 @@ visibility="public" > + + + + must have had a * frame assigned. * - * @return Return true if layout state may have changed (so that another - * layout will be performed). + * @return Return any bit set of {@link #FINISH_LAYOUT_REDO_LAYOUT} + * and {@link #FINISH_LAYOUT_REDO_CONFIG}. */ - public boolean finishLayoutLw(); + public int finishLayoutLw(); + /** Layout state may have changed (so another layout will be performed) */ + static final int FINISH_LAYOUT_REDO_LAYOUT = 0x0001; + /** Configuration state may have changed */ + static final int FINISH_LAYOUT_REDO_CONFIG = 0x0002; + /** Wallpaper may need to move */ + static final int FINISH_LAYOUT_REDO_WALLPAPER = 0x0004; + /** * Called when animation of the windows is about to start. * diff --git a/services/java/com/android/server/DockObserver.java b/services/java/com/android/server/DockObserver.java index 8a4b45d9f3d4e..a70134d3f5fb6 100644 --- a/services/java/com/android/server/DockObserver.java +++ b/services/java/com/android/server/DockObserver.java @@ -74,7 +74,8 @@ class DockObserver extends UEventObserver { if (category != null) { intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(category); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); try { mContext.startActivity(intent); } catch (ActivityNotFoundException e) { diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index 3c76cf2490896..38d2304fbcb4a 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -143,6 +143,7 @@ public class WindowManagerService extends IWindowManager.Stub static final boolean DEBUG_REORDER = false; static final boolean DEBUG_WALLPAPER = false; static final boolean SHOW_TRANSACTIONS = false; + static final boolean HIDE_STACK_CRAWLS = true; static final boolean MEASURE_LATENCY = false; static private LatencyTimer lt; @@ -622,7 +623,7 @@ public class WindowManagerService extends IWindowManager.Stub private void placeWindowAfter(Object pos, WindowState window) { final int i = mWindows.indexOf(pos); - if (localLOGV || DEBUG_FOCUS) Log.v( + if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Log.v( TAG, "Adding window " + window + " at " + (i+1) + " of " + mWindows.size() + " (after " + pos + ")"); mWindows.add(i+1, window); @@ -630,7 +631,7 @@ public class WindowManagerService extends IWindowManager.Stub private void placeWindowBefore(Object pos, WindowState window) { final int i = mWindows.indexOf(pos); - if (localLOGV || DEBUG_FOCUS) Log.v( + if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Log.v( TAG, "Adding window " + window + " at " + i + " of " + mWindows.size() + " (before " + pos + ")"); mWindows.add(i, window); @@ -687,6 +688,9 @@ public class WindowManagerService extends IWindowManager.Stub //apptoken note that the window could be a floating window //that was created later or a window at the top of the list of //windows associated with this token. + if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Log.v( + TAG, "Adding window " + win + " at " + + (newIdx+1) + " of " + N); localmWindows.add(newIdx+1, win); } } @@ -766,9 +770,9 @@ public class WindowManagerService extends IWindowManager.Stub break; } } - if (localLOGV || DEBUG_FOCUS) Log.v( - TAG, "Adding window " + win + " at " - + i + " of " + N); + if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Log.v( + TAG, "Adding window " + win + " at " + + i + " of " + N); localmWindows.add(i, win); } } @@ -783,9 +787,9 @@ public class WindowManagerService extends IWindowManager.Stub } } if (i < 0) i = 0; - if (localLOGV || DEBUG_FOCUS) Log.v( - TAG, "Adding window " + win + " at " - + i + " of " + N); + if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Log.v( + TAG, "Adding window " + win + " at " + + i + " of " + N); localmWindows.add(i, win); } if (addToToken) { @@ -955,7 +959,7 @@ public class WindowManagerService extends IWindowManager.Stub if (w != null) { if (willMove) { RuntimeException e = new RuntimeException(); - e.fillInStackTrace(); + if (!HIDE_STACK_CRAWLS) e.fillInStackTrace(); if (DEBUG_INPUT_METHOD) Log.w(TAG, "Moving IM target from " + mInputMethodTarget + " to " + w, e); mInputMethodTarget = w; @@ -969,7 +973,7 @@ public class WindowManagerService extends IWindowManager.Stub } if (willMove) { RuntimeException e = new RuntimeException(); - e.fillInStackTrace(); + if (!HIDE_STACK_CRAWLS) e.fillInStackTrace(); if (DEBUG_INPUT_METHOD) Log.w(TAG, "Moving IM target from " + mInputMethodTarget + " to null", e); mInputMethodTarget = null; @@ -982,6 +986,8 @@ public class WindowManagerService extends IWindowManager.Stub int pos = findDesiredInputMethodWindowIndexLocked(true); if (pos >= 0) { win.mTargetAppToken = mInputMethodTarget.mAppToken; + if (DEBUG_WINDOW_MOVEMENT) Log.v( + TAG, "Adding input method window " + win + " at " + pos); mWindows.add(pos, win); moveInputMethodDialogsLocked(pos+1); return; @@ -1022,6 +1028,7 @@ public class WindowManagerService extends IWindowManager.Stub int wpos = mWindows.indexOf(win); if (wpos >= 0) { if (wpos < interestingPos) interestingPos--; + if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Temp removing at " + wpos + ": " + win); mWindows.remove(wpos); int NC = win.mChildWindows.size(); while (NC > 0) { @@ -1030,6 +1037,8 @@ public class WindowManagerService extends IWindowManager.Stub int cpos = mWindows.indexOf(cw); if (cpos >= 0) { if (cpos < interestingPos) interestingPos--; + if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Temp removing child at " + + cpos + ": " + cw); mWindows.remove(cpos); } } @@ -1044,6 +1053,8 @@ public class WindowManagerService extends IWindowManager.Stub // this case should be rare, so it shouldn't be that big a deal. int wpos = mWindows.indexOf(win); if (wpos >= 0) { + if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "ReAdd removing from " + wpos + + ": " + win); mWindows.remove(wpos); reAddWindowLocked(wpos, win); } @@ -1472,6 +1483,8 @@ public class WindowManagerService extends IWindowManager.Stub // not in the list. int oldIndex = localmWindows.indexOf(wallpaper); if (oldIndex >= 0) { + if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Wallpaper removing at " + + oldIndex + ": " + wallpaper); localmWindows.remove(oldIndex); if (oldIndex < foundI) { foundI--; @@ -1479,7 +1492,8 @@ public class WindowManagerService extends IWindowManager.Stub } // Now stick it in. - if (DEBUG_WALLPAPER) Log.v(TAG, "Moving wallpaper " + wallpaper + if (DEBUG_WALLPAPER || DEBUG_WINDOW_MOVEMENT) Log.v(TAG, + "Moving wallpaper " + wallpaper + " from " + oldIndex + " to " + foundI); localmWindows.add(foundI, wallpaper); @@ -2003,6 +2017,7 @@ public class WindowManagerService extends IWindowManager.Stub mWindowMap.remove(win.mClient.asBinder()); mWindows.remove(win); + if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Final remove of window: " + win); if (mInputMethodWindow == win) { mInputMethodWindow = null; @@ -2447,7 +2462,7 @@ public class WindowManagerService extends IWindowManager.Stub if (a != null) { if (DEBUG_ANIM) { RuntimeException e = new RuntimeException(); - e.fillInStackTrace(); + if (!HIDE_STACK_CRAWLS) e.fillInStackTrace(); Log.v(TAG, "Loaded animation " + a + " for " + win, e); } win.setAnimation(a); @@ -2551,7 +2566,7 @@ public class WindowManagerService extends IWindowManager.Stub if (a != null) { if (DEBUG_ANIM) { RuntimeException e = new RuntimeException(); - e.fillInStackTrace(); + if (!HIDE_STACK_CRAWLS) e.fillInStackTrace(); Log.v(TAG, "Loaded animation " + a + " for " + wtoken, e); } wtoken.setAnimation(a); @@ -3093,6 +3108,8 @@ public class WindowManagerService extends IWindowManager.Stub startingWindow.mToken = wtoken; startingWindow.mRootToken = wtoken; startingWindow.mAppToken = wtoken; + if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, + "Removing starting window: " + startingWindow); mWindows.remove(startingWindow); ttoken.windows.remove(startingWindow); ttoken.allAppWindows.remove(startingWindow); @@ -3320,7 +3337,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_APP_TRANSITIONS || DEBUG_ORIENTATION) { RuntimeException e = new RuntimeException(); - e.fillInStackTrace(); + if (!HIDE_STACK_CRAWLS) e.fillInStackTrace(); Log.v(TAG, "setAppVisibility(" + token + ", " + visible + "): mNextAppTransition=" + mNextAppTransition + " hidden=" + wtoken.hidden @@ -3412,7 +3429,7 @@ public class WindowManagerService extends IWindowManager.Stub int configChanges) { if (DEBUG_ORIENTATION) { RuntimeException e = new RuntimeException(); - e.fillInStackTrace(); + if (!HIDE_STACK_CRAWLS) e.fillInStackTrace(); Log.i(TAG, "Set freezing of " + wtoken.appToken + ": hidden=" + wtoken.hidden + " freezing=" + wtoken.freezingScreen, e); @@ -3512,6 +3529,12 @@ public class WindowManagerService extends IWindowManager.Stub if (delayed) { // set the token aside because it has an active animation to be finished mExitingAppTokens.add(wtoken); + } else { + // Make sure there is no animation running on this token, + // so any windows associated with it will be removed as + // soon as their animations are complete + wtoken.animation = null; + wtoken.animating = false; } mAppTokens.remove(wtoken); wtoken.removed = true; @@ -3547,7 +3570,7 @@ public class WindowManagerService extends IWindowManager.Stub final int NW = token.windows.size(); for (int i=0; i 0) { @@ -6999,13 +7022,13 @@ public class WindowManagerService extends IWindowManager.Stub try { if (DEBUG_VISIBILITY) { RuntimeException e = new RuntimeException(); - e.fillInStackTrace(); + if (!HIDE_STACK_CRAWLS) e.fillInStackTrace(); Log.w(TAG, "Window " + this + " destroying surface " + mSurface + ", session " + mSession, e); } if (SHOW_TRANSACTIONS) { RuntimeException ex = new RuntimeException(); - ex.fillInStackTrace(); + if (!HIDE_STACK_CRAWLS) ex.fillInStackTrace(); Log.i(TAG, " SURFACE " + mSurface + ": DESTROY (" + mAttrs.getTitle() + ")", ex); } @@ -7060,7 +7083,7 @@ public class WindowManagerService extends IWindowManager.Stub boolean performShowLocked() { if (DEBUG_VISIBILITY) { RuntimeException e = new RuntimeException(); - e.fillInStackTrace(); + if (!HIDE_STACK_CRAWLS) e.fillInStackTrace(); Log.v(TAG, "performShow on " + this + ": readyToShow=" + mReadyToShow + " readyForDisplay=" + isReadyForDisplay() + " starting=" + (mAttrs.type == TYPE_APPLICATION_STARTING), e); @@ -8662,6 +8685,7 @@ public class WindowManagerService extends IWindowManager.Stub final void rebuildAppWindowListLocked() { int NW = mWindows.size(); int i; + int numRemoved = 0; // First remove all existing app windows. i=0; @@ -8671,6 +8695,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Rebuild removing window: " + win); NW--; + numRemoved++; continue; } i++; @@ -8691,6 +8716,11 @@ public class WindowManagerService extends IWindowManager.Stub for (int j=0; j 2) { Log.w(TAG, "Layout repeat aborted after too many iterations"); mLayoutNeeded = false; + if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG) != 0) { + Configuration newConfig = updateOrientationFromAppTokensLocked( + null, null); + if (newConfig != null) { + mLayoutNeeded = true; + mH.sendEmptyMessage(H.COMPUTE_AND_SEND_NEW_CONFIGURATION); + } + } } else { repeats++; + if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG) != 0) { + Configuration newConfig = updateOrientationFromAppTokensLocked( + null, null); + if (newConfig != null) { + mH.sendEmptyMessage(H.COMPUTE_AND_SEND_NEW_CONFIGURATION); + } + } } } } @@ -9784,6 +9835,11 @@ public class WindowManagerService extends IWindowManager.Stub for (i=mExitingAppTokens.size()-1; i>=0; i--) { AppWindowToken token = mExitingAppTokens.get(i); if (!token.hasVisible && !mClosingApps.contains(token)) { + // Make sure there is no animation running on this token, + // so any windows associated with it will be removed as + // soon as their animations are complete + token.animation = null; + token.animating = false; mAppTokens.remove(token); mExitingAppTokens.remove(i); }