diff options
13 files changed, 218 insertions, 126 deletions
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index a71a258..1e9bc54 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -2069,6 +2069,13 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } + case KEYGUARD_GOING_AWAY_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + keyguardGoingAway(data.readInt() != 0, data.readInt() != 0); + reply.writeNoException(); + return true; + } + case SHOULD_UP_RECREATE_TASK_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder token = data.readStrongBinder(); @@ -5179,6 +5186,19 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); } + public void keyguardGoingAway(boolean disableWindowAnimations, + boolean keyguardGoingToNotificationShade) throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + data.writeInt(disableWindowAnimations ? 1 : 0); + data.writeInt(keyguardGoingToNotificationShade ? 1 : 0); + mRemote.transact(KEYGUARD_GOING_AWAY_TRANSACTION, data, reply, 0); + reply.readException(); + data.recycle(); + reply.recycle(); + } + public boolean shouldUpRecreateTask(IBinder token, String destAffinity) throws RemoteException { Parcel data = Parcel.obtain(); diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 5829fbe..05a936c 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -403,6 +403,9 @@ public interface IActivityManager extends IInterface { public void keyguardWaitingForActivityDrawn() throws RemoteException; + public void keyguardGoingAway(boolean disableWindowAnimations, + boolean keyguardGoingToNotificationShade) throws RemoteException; + public boolean shouldUpRecreateTask(IBinder token, String destAffinity) throws RemoteException; @@ -842,4 +845,5 @@ public interface IActivityManager extends IInterface { int SHOW_LOCK_TASK_ESCAPE_MESSAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+294; int UPDATE_DEVICE_OWNER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+295; int UPDATE_PREFERRED_SETUP_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+296; + int KEYGUARD_GOING_AWAY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+297; } diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl index 9fc80fc..0fefdc7 100644 --- a/core/java/android/view/IWindow.aidl +++ b/core/java/android/view/IWindow.aidl @@ -80,11 +80,17 @@ oneway interface IWindow { int localValue, int localChanges); /** - * If the window manager returned RELAYOUT_RES_ANIMATING - * from relayout(), this method will be called when the animation - * is done. + * The window is beginning to animate. The application should stop drawing frames until the + * window is not animating anymore, indicated by being called {@link #windowEndAnimating}. + * + * @param remainingFrameCount how many frames the app might still draw before stopping drawing */ - void doneAnimating(); + void onAnimationStarted(int remainingFrameCount); + + /** + * The window has ended animating. See {@link #onAnimationStarted}. + */ + void onAnimationStopped(); /** * Called for non-application windows when the enter animation has completed. diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 57c6cbf..371d97b 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -220,6 +220,9 @@ public final class ViewRootImpl implements ViewParent, boolean mLastWasImTarget; boolean mWindowsAnimating; boolean mDrawDuringWindowsAnimating; + + /** How many frames the app is still allowed to draw when a window animation is happening. */ + private int mRemainingFrameCount; boolean mIsDrawing; int mLastSystemUiVisibility; int mClientWindowLayoutFlags; @@ -1569,10 +1572,6 @@ public final class ViewRootImpl implements ViewParent, } final int surfaceGenerationId = mSurface.getGenerationId(); relayoutResult = relayoutWindow(params, viewVisibility, insetsPending); - if (!mDrawDuringWindowsAnimating && - (relayoutResult & WindowManagerGlobal.RELAYOUT_RES_ANIMATING) != 0) { - mWindowsAnimating = true; - } if (DEBUG_LAYOUT) Log.v(TAG, "relayout: frame=" + frame.toShortString() + " overscan=" + mPendingOverscanInsets.toShortString() @@ -1996,14 +1995,11 @@ public final class ViewRootImpl implements ViewParent, + mView.findFocus()); } } - if ((relayoutResult & WindowManagerGlobal.RELAYOUT_RES_ANIMATING) != 0) { - // The first time we relayout the window, if the system is - // doing window animations, we want to hold of on any future - // draws until the animation is done. - mWindowsAnimating = true; - } } else if (mWindowsAnimating) { - skipDraw = true; + if (mRemainingFrameCount <= 0) { + skipDraw = true; + } + mRemainingFrameCount--; } mFirst = false; @@ -2800,7 +2796,7 @@ public final class ViewRootImpl implements ViewParent, public void setDrawDuringWindowsAnimating(boolean value) { mDrawDuringWindowsAnimating = value; if (value) { - handleDispatchDoneAnimating(); + handleDispatchWindowAnimationStopped(); } } @@ -3152,11 +3148,12 @@ public final class ViewRootImpl implements ViewParent, private final static int MSG_UPDATE_CONFIGURATION = 18; private final static int MSG_PROCESS_INPUT_EVENTS = 19; private final static int MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST = 21; - private final static int MSG_DISPATCH_DONE_ANIMATING = 22; - private final static int MSG_INVALIDATE_WORLD = 23; - private final static int MSG_WINDOW_MOVED = 24; - private final static int MSG_SYNTHESIZE_INPUT_EVENT = 25; - private final static int MSG_DISPATCH_WINDOW_SHOWN = 26; + private final static int MSG_INVALIDATE_WORLD = 22; + private final static int MSG_WINDOW_MOVED = 23; + private final static int MSG_SYNTHESIZE_INPUT_EVENT = 24; + private final static int MSG_DISPATCH_WINDOW_SHOWN = 25; + private final static int MSG_DISPATCH_WINDOW_ANIMATION_STOPPED = 26; + private final static int MSG_DISPATCH_WINDOW_ANIMATION_STARTED = 27; final class ViewRootHandler extends Handler { @Override @@ -3200,8 +3197,10 @@ public final class ViewRootImpl implements ViewParent, return "MSG_PROCESS_INPUT_EVENTS"; case MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST: return "MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST"; - case MSG_DISPATCH_DONE_ANIMATING: - return "MSG_DISPATCH_DONE_ANIMATING"; + case MSG_DISPATCH_WINDOW_ANIMATION_STARTED: + return "MSG_DISPATCH_WINDOW_ANIMATION_STARTED"; + case MSG_DISPATCH_WINDOW_ANIMATION_STOPPED: + return "MSG_DISPATCH_WINDOW_ANIMATION_STOPPED"; case MSG_WINDOW_MOVED: return "MSG_WINDOW_MOVED"; case MSG_SYNTHESIZE_INPUT_EVENT: @@ -3421,8 +3420,12 @@ public final class ViewRootImpl implements ViewParent, case MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST: { setAccessibilityFocus(null, null); } break; - case MSG_DISPATCH_DONE_ANIMATING: { - handleDispatchDoneAnimating(); + case MSG_DISPATCH_WINDOW_ANIMATION_STARTED: { + int remainingFrameCount = msg.arg1; + handleDispatchWindowAnimationStarted(remainingFrameCount); + } break; + case MSG_DISPATCH_WINDOW_ANIMATION_STOPPED: { + handleDispatchWindowAnimationStopped(); } break; case MSG_INVALIDATE_WORLD: { if (mView != null) { @@ -4038,7 +4041,7 @@ public final class ViewRootImpl implements ViewParent, } else { // If delivering a new non-key event, make sure the window is // now allowed to start updating. - handleDispatchDoneAnimating(); + handleDispatchWindowAnimationStopped(); final int source = q.mEvent.getSource(); if ((source & InputDevice.SOURCE_CLASS_POINTER) != 0) { return processPointerEvent(q); @@ -4068,7 +4071,7 @@ public final class ViewRootImpl implements ViewParent, if (event.getAction() != KeyEvent.ACTION_UP) { // If delivering a new key event, make sure the window is // now allowed to start updating. - handleDispatchDoneAnimating(); + handleDispatchWindowAnimationStopped(); } // Deliver the key to the view hierarchy. @@ -5285,7 +5288,14 @@ public final class ViewRootImpl implements ViewParent, } } - public void handleDispatchDoneAnimating() { + public void handleDispatchWindowAnimationStarted(int remainingFrameCount) { + if (!mDrawDuringWindowsAnimating) { + mRemainingFrameCount = remainingFrameCount; + mWindowsAnimating = true; + } + } + + public void handleDispatchWindowAnimationStopped() { if (mWindowsAnimating) { mWindowsAnimating = false; if (!mDirty.isEmpty() || mIsAnimating || mFullRedrawNeeded) { @@ -6189,8 +6199,13 @@ public final class ViewRootImpl implements ViewParent, mHandler.sendMessage(mHandler.obtainMessage(MSG_DISPATCH_SYSTEM_UI_VISIBILITY, args)); } - public void dispatchDoneAnimating() { - mHandler.sendEmptyMessage(MSG_DISPATCH_DONE_ANIMATING); + public void dispatchWindowAnimationStarted(int remainingFrameCount) { + mHandler.obtainMessage(MSG_DISPATCH_WINDOW_ANIMATION_STARTED, + remainingFrameCount, 0 /* unused */).sendToTarget(); + } + + public void dispatchWindowAnimationStopped() { + mHandler.sendEmptyMessage(MSG_DISPATCH_WINDOW_ANIMATION_STOPPED); } public void dispatchCheckFocus() { @@ -6713,10 +6728,18 @@ public final class ViewRootImpl implements ViewParent, } @Override - public void doneAnimating() { + public void onAnimationStarted(int remainingFrameCount) { + final ViewRootImpl viewAncestor = mViewAncestor.get(); + if (viewAncestor != null) { + viewAncestor.dispatchWindowAnimationStarted(remainingFrameCount); + } + } + + @Override + public void onAnimationStopped() { final ViewRootImpl viewAncestor = mViewAncestor.get(); if (viewAncestor != null) { - viewAncestor.dispatchDoneAnimating(); + viewAncestor.dispatchWindowAnimationStopped(); } } diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java index e7a7ba8..c16578e 100644 --- a/core/java/android/view/WindowManagerGlobal.java +++ b/core/java/android/view/WindowManagerGlobal.java @@ -69,12 +69,6 @@ public final class WindowManagerGlobal { public static final int RELAYOUT_RES_SURFACE_CHANGED = 0x4; /** - * The window manager is currently animating. It will call - * IWindow.doneAnimating() when done. - */ - public static final int RELAYOUT_RES_ANIMATING = 0x8; - - /** * Flag for relayout: the client will be later giving * internal insets; as a result, the window will not impact other window * layouts until the insets are given. diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java index 993ab58..e27ba13 100644 --- a/core/java/com/android/internal/view/BaseIWindow.java +++ b/core/java/com/android/internal/view/BaseIWindow.java @@ -100,7 +100,11 @@ public class BaseIWindow extends IWindow.Stub { } @Override - public void doneAnimating() { + public void onAnimationStarted(int remainingFrameCount) { + } + + @Override + public void onAnimationStopped() { } @Override diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 6479dc5..74962ec 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -1335,7 +1335,7 @@ public class KeyguardViewMediator extends SystemUI { // Don't actually hide the Keyguard at the moment, wait for window // manager until it tells us it's safe to do so with // startKeyguardExitAnimation. - mWM.keyguardGoingAway( + ActivityManagerNative.getDefault().keyguardGoingAway( mStatusBarKeyguardViewManager.shouldDisableWindowAnimationsForUnlock(), mStatusBarKeyguardViewManager.isGoingToNotificationShade()); } catch (RemoteException e) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f4671a9..0ee1ae4 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -2573,7 +2573,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (mFocusedActivity.userId != mLastFocusedUserId) { mHandler.removeMessages(FOREGROUND_PROFILE_CHANGED_MSG); mHandler.sendMessage(mHandler.obtainMessage(FOREGROUND_PROFILE_CHANGED_MSG, - mFocusedActivity.userId, 0)); + mFocusedActivity.userId, 0)); mLastFocusedUserId = mFocusedActivity.userId; } } @@ -5962,7 +5962,7 @@ public final class ActivityManagerService extends ActivityManagerNative void postFinishBooting(boolean finishBooting, boolean enableScreen) { mHandler.sendMessage(mHandler.obtainMessage(FINISH_BOOTING_MSG, - finishBooting? 1 : 0, enableScreen ? 1 : 0)); + finishBooting ? 1 : 0, enableScreen ? 1 : 0)); } void enableScreenAfterBoot() { @@ -6002,6 +6002,26 @@ public final class ActivityManagerService extends ActivityManagerNative } } + @Override + public void keyguardGoingAway(boolean disableWindowAnimations, + boolean keyguardGoingToNotificationShade) { + enforceNotIsolatedCaller("keyguardGoingAway"); + final long token = Binder.clearCallingIdentity(); + try { + synchronized (this) { + if (DEBUG_LOCKSCREEN) logLockScreen(""); + mWindowManager.keyguardGoingAway(disableWindowAnimations, + keyguardGoingToNotificationShade); + if (mLockScreenShown == LOCK_SCREEN_SHOWN) { + mLockScreenShown = LOCK_SCREEN_HIDDEN; + updateSleepIfNeededLocked(); + } + } + } finally { + Binder.restoreCallingIdentity(token); + } + } + final void finishBooting() { synchronized (this) { if (!mBootAnimationComplete) { diff --git a/services/core/java/com/android/server/wm/AppWindowAnimator.java b/services/core/java/com/android/server/wm/AppWindowAnimator.java index 55ec9fc..21011e8 100644 --- a/services/core/java/com/android/server/wm/AppWindowAnimator.java +++ b/services/core/java/com/android/server/wm/AppWindowAnimator.java @@ -36,6 +36,7 @@ public class AppWindowAnimator { final WindowAnimator mAnimator; boolean animating; + boolean wasAnimating; Animation animation; boolean hasTransformation; final Transformation transformation = new Transformation(); diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index 52071cc..9169351 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -30,9 +30,9 @@ import static com.android.server.wm.WindowManagerService.LayoutFields.SET_ORIENT import static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_ACTION_PENDING; import android.content.Context; +import android.os.RemoteException; import android.util.Slog; import android.util.SparseArray; -import android.util.SparseIntArray; import android.util.TimeUtils; import android.view.Display; import android.view.SurfaceControl; @@ -98,15 +98,13 @@ public class WindowAnimator { // forceHiding states. static final int KEYGUARD_NOT_SHOWN = 0; - static final int KEYGUARD_ANIMATING_IN = 1; - static final int KEYGUARD_SHOWN = 2; - static final int KEYGUARD_ANIMATING_OUT = 3; + static final int KEYGUARD_SHOWN = 1; + static final int KEYGUARD_ANIMATING_OUT = 2; int mForceHiding = KEYGUARD_NOT_SHOWN; private String forceHidingToString() { switch (mForceHiding) { case KEYGUARD_NOT_SHOWN: return "KEYGUARD_NOT_SHOWN"; - case KEYGUARD_ANIMATING_IN: return "KEYGUARD_ANIMATING_IN"; case KEYGUARD_SHOWN: return "KEYGUARD_SHOWN"; case KEYGUARD_ANIMATING_OUT:return "KEYGUARD_ANIMATING_OUT"; default: return "KEYGUARD STATE UNKNOWN " + mForceHiding; @@ -157,11 +155,11 @@ public class WindowAnimator { final AppTokenList tokens = tasks.get(taskNdx).mAppTokens; for (int tokenNdx = tokens.size() - 1; tokenNdx >= 0; --tokenNdx) { final AppWindowAnimator appAnimator = tokens.get(tokenNdx).mAppAnimator; - final boolean wasAnimating = appAnimator.animation != null - && appAnimator.animation != AppWindowAnimator.sDummyAnimation; + appAnimator.wasAnimating = appAnimator.animating; if (appAnimator.stepAnimationLocked(mCurrentTime, displayId)) { + appAnimator.animating = true; mAnimating = mAppWindowAnimating = true; - } else if (wasAnimating) { + } else if (appAnimator.wasAnimating) { // stopped animating, do one more pass through the layout setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER, @@ -173,14 +171,13 @@ public class WindowAnimator { } final AppTokenList exitingAppTokens = stack.mExitingAppTokens; - final int NEAT = exitingAppTokens.size(); - for (int i = 0; i < NEAT; i++) { + final int exitingCount = exitingAppTokens.size(); + for (int i = 0; i < exitingCount; i++) { final AppWindowAnimator appAnimator = exitingAppTokens.get(i).mAppAnimator; - final boolean wasAnimating = appAnimator.animation != null - && appAnimator.animation != AppWindowAnimator.sDummyAnimation; + appAnimator.wasAnimating = appAnimator.animating; if (appAnimator.stepAnimationLocked(mCurrentTime, displayId)) { mAnimating = mAppWindowAnimating = true; - } else if (wasAnimating) { + } else if (appAnimator.wasAnimating) { // stopped animating, do one more pass through the layout setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER, "exiting appToken " + appAnimator.mAppToken + " done", displayId); @@ -206,9 +203,7 @@ public class WindowAnimator { || (win.mAttrs.flags & FLAG_SHOW_WHEN_LOCKED) != 0 && win.isAnimatingLw() // Show error dialogs over apps that dismiss keyguard. || (win.mAttrs.privateFlags & PRIVATE_FLAG_SYSTEM_ERROR) != 0))); - return ((mForceHiding == KEYGUARD_ANIMATING_IN) - && (!win.mWinAnimator.isAnimating() || hideWhenLocked)) - || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked); + return (mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked; } private void updateWindowsLocked(final int displayId) { @@ -259,8 +254,27 @@ public class WindowAnimator { if (winAnimator.mSurfaceControl != null) { final boolean wasAnimating = winAnimator.mWasAnimating; final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime); + winAnimator.mWasAnimating = nowAnimating; mAnimating |= nowAnimating; + boolean appWindowAnimating = winAnimator.mAppAnimator != null + && winAnimator.mAppAnimator.animating; + boolean wasAppWindowAnimating = winAnimator.mAppAnimator != null + && winAnimator.mAppAnimator.wasAnimating; + boolean anyAnimating = appWindowAnimating || nowAnimating; + boolean anyWasAnimating = wasAppWindowAnimating || wasAnimating; + + try { + if (anyAnimating && !anyWasAnimating) { + win.mClient.onAnimationStarted( + winAnimator.mKeyguardGoingAwayAnimation ? 1 : 0); + } else if (!anyAnimating && anyWasAnimating) { + win.mClient.onAnimationStopped(); + } + } catch (RemoteException e) { + Slog.w(TAG, "Failed to dispatch window animation state change.", e); + } + if (WindowManagerService.DEBUG_WALLPAPER) { Slog.v(TAG, win + ": wasAnimating=" + wasAnimating + ", nowAnimating=" + nowAnimating); @@ -297,11 +311,7 @@ public class WindowAnimator { } if (win.isReadyForDisplay()) { if (nowAnimating) { - if (winAnimator.mAnimationIsEntrance) { - mForceHiding = KEYGUARD_ANIMATING_IN; - } else { - mForceHiding = KEYGUARD_ANIMATING_OUT; - } + mForceHiding = KEYGUARD_ANIMATING_OUT; } else { mForceHiding = win.isDrawnLw() ? KEYGUARD_SHOWN : KEYGUARD_NOT_SHOWN; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 57bad51..77694b6 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -16,44 +16,13 @@ package com.android.server.wm; -import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID; -import static android.view.WindowManager.LayoutParams.*; - -import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; -import android.app.AppOpsManager; -import android.os.Build; -import android.os.SystemService; -import android.util.ArraySet; -import android.util.TimeUtils; -import android.view.IWindowId; - -import android.view.IWindowSessionCallback; -import android.view.WindowContentFrameStats; -import com.android.internal.app.IAssistScreenshotReceiver; -import com.android.internal.app.IBatteryStats; -import com.android.internal.util.FastPrintWriter; -import com.android.internal.view.IInputContext; -import com.android.internal.view.IInputMethodClient; -import com.android.internal.view.IInputMethodManager; -import com.android.internal.view.WindowManagerPolicyThread; -import com.android.server.AttributeCache; -import com.android.server.DisplayThread; -import com.android.server.EventLogTags; -import com.android.server.FgThread; -import com.android.server.LocalServices; -import com.android.server.UiThread; -import com.android.server.Watchdog; -import com.android.server.am.BatteryStatsService; -import com.android.server.input.InputManagerService; -import com.android.server.power.ShutdownThread; -import com.android.server.policy.PhoneWindowManager; - import android.Manifest; +import android.animation.ValueAnimator; import android.app.ActivityManagerNative; +import android.app.AppOpsManager; import android.app.IActivityManager; import android.app.StatusBarManager; import android.app.admin.DevicePolicyManager; -import android.animation.ValueAnimator; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; @@ -75,6 +44,7 @@ import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManagerInternal; import android.net.Uri; import android.os.Binder; +import android.os.Build; import android.os.Bundle; import android.os.Debug; import android.os.Handler; @@ -92,17 +62,20 @@ import android.os.ServiceManager; import android.os.StrictMode; import android.os.SystemClock; import android.os.SystemProperties; +import android.os.SystemService; import android.os.Trace; import android.os.UserHandle; import android.os.WorkSource; import android.provider.Settings; +import android.util.ArraySet; import android.util.DisplayMetrics; import android.util.EventLog; import android.util.Log; -import android.util.SparseArray; import android.util.Pair; import android.util.Slog; +import android.util.SparseArray; import android.util.SparseIntArray; +import android.util.TimeUtils; import android.util.TypedValue; import android.view.Choreographer; import android.view.Display; @@ -113,8 +86,10 @@ import android.view.IInputFilter; import android.view.IOnKeyguardExitResult; import android.view.IRotationWatcher; import android.view.IWindow; +import android.view.IWindowId; import android.view.IWindowManager; import android.view.IWindowSession; +import android.view.IWindowSessionCallback; import android.view.InputChannel; import android.view.InputDevice; import android.view.InputEvent; @@ -122,21 +97,41 @@ import android.view.InputEventReceiver; import android.view.KeyEvent; import android.view.MagnificationSpec; import android.view.MotionEvent; -import android.view.WindowManagerInternal; -import android.view.Surface.OutOfResourcesException; import android.view.Surface; +import android.view.Surface.OutOfResourcesException; import android.view.SurfaceControl; import android.view.SurfaceSession; import android.view.View; +import android.view.WindowContentFrameStats; import android.view.WindowManager; +import android.view.WindowManager.LayoutParams; import android.view.WindowManagerGlobal; +import android.view.WindowManagerInternal; import android.view.WindowManagerPolicy; -import android.view.WindowManager.LayoutParams; import android.view.WindowManagerPolicy.FakeWindow; import android.view.WindowManagerPolicy.PointerEventListener; import android.view.animation.Animation; import android.view.animation.AnimationUtils; +import com.android.internal.app.IAssistScreenshotReceiver; +import com.android.internal.app.IBatteryStats; +import com.android.internal.util.FastPrintWriter; +import com.android.internal.view.IInputContext; +import com.android.internal.view.IInputMethodClient; +import com.android.internal.view.IInputMethodManager; +import com.android.internal.view.WindowManagerPolicyThread; +import com.android.server.AttributeCache; +import com.android.server.DisplayThread; +import com.android.server.EventLogTags; +import com.android.server.FgThread; +import com.android.server.LocalServices; +import com.android.server.UiThread; +import com.android.server.Watchdog; +import com.android.server.am.BatteryStatsService; +import com.android.server.input.InputManagerService; +import com.android.server.policy.PhoneWindowManager; +import com.android.server.power.ShutdownThread; + import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.File; @@ -157,6 +152,41 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; +import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; +import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW; +import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; +import static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND; +import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; +import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; +import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; +import static android.view.WindowManager.LayoutParams.FLAG_SECURE; +import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; +import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; +import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; +import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; +import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST; +import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY; +import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; +import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; +import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; +import static android.view.WindowManager.LayoutParams.TYPE_BOOT_PROGRESS; +import static android.view.WindowManager.LayoutParams.TYPE_DREAM; +import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; +import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG; +import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG; +import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_SCRIM; +import static android.view.WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION; +import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; +import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; +import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; +import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION; +import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; +import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; +import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID; + /** {@hide} */ public class WindowManagerService extends IWindowManager.Stub implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs { @@ -426,12 +456,6 @@ public class WindowManagerService extends IWindowManager.Stub Runnable mWaitingForDrawnCallback; /** - * Windows that have called relayout() while we were running animations, - * so we need to tell when the animation is done. - */ - final ArrayList<WindowState> mRelayoutWhileAnimating = new ArrayList<WindowState>(); - - /** * Used when rebuilding window list to keep track of windows that have * been removed. */ @@ -3340,10 +3364,6 @@ public class WindowManagerService extends IWindowManager.Stub TAG, "Relayout of " + win + ": focusMayChange=" + focusMayChange); inTouchMode = mInTouchMode; - animating = mAnimator.mAnimating && win.mWinAnimator.isAnimating(); - if (animating && !mRelayoutWhileAnimating.contains(win)) { - mRelayoutWhileAnimating.add(win); - } mInputMonitor.updateInputWindowsLw(true /*force*/); @@ -3360,8 +3380,7 @@ public class WindowManagerService extends IWindowManager.Stub return (inTouchMode ? WindowManagerGlobal.RELAYOUT_RES_IN_TOUCH_MODE : 0) | (toBeDisplayed ? WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME : 0) - | (surfaceChanged ? WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED : 0) - | (animating ? WindowManagerGlobal.RELAYOUT_RES_ANIMATING : 0); + | (surfaceChanged ? WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED : 0); } public void performDeferredDestroyWindow(Session session, IWindow client) { @@ -10239,16 +10258,6 @@ public class WindowManagerService extends IWindowManager.Stub } } - if (!mAnimator.mAnimating && mRelayoutWhileAnimating.size() > 0) { - for (int j=mRelayoutWhileAnimating.size()-1; j>=0; j--) { - try { - mRelayoutWhileAnimating.get(j).mClient.doneAnimating(); - } catch (RemoteException e) { - } - } - mRelayoutWhileAnimating.clear(); - } - if (wallpaperDestroyed) { defaultDisplay.pendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index cdd9503..ec89b37 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -276,9 +276,6 @@ class WindowStateAnimator { // This must be called while inside a transaction. Returns true if // there is more animation to run. boolean stepAnimationLocked(long currentTime) { - // Save the animation state as it was before this step so WindowManagerService can tell if - // we just started or just stopped animating by comparing mWasAnimating with isAnimating(). - mWasAnimating = mAnimating; final DisplayContent displayContent = mWin.getDisplayContent(); if (displayContent != null && mService.okToDisplay()) { // We will run animations as long as the display isn't frozen. diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java index 4c4454d..bcb98db 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java @@ -91,7 +91,11 @@ public final class BridgeWindow implements IWindow { } @Override - public void doneAnimating() { + public void windowBeginAnimating(int remainingFrameCount) { + } + + @Override + public void windowEndAnimating() { } @Override |