Skip to content

Commit 052db7c

Browse files
Craig MautnerAndroid (Google) Code Review
authored andcommitted
Merge "Further isolate layout side from animation side."
2 parents 489041d + 322e403 commit 052db7c

File tree

6 files changed

+139
-95
lines changed

6 files changed

+139
-95
lines changed

services/java/com/android/server/wm/AppWindowAnimator.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@
1010
import android.view.animation.Transformation;
1111

1212
import java.io.PrintWriter;
13+
import java.util.ArrayList;
1314

14-
/**
15-
*
16-
*/
1715
public class AppWindowAnimator {
1816
static final String TAG = "AppWindowAnimator";
1917

@@ -48,12 +46,15 @@ public class AppWindowAnimator {
4846
Animation thumbnailAnimation;
4947
final Transformation thumbnailTransformation = new Transformation();
5048

49+
/** WindowStateAnimator from mAppAnimator.allAppWindows as of last performLayout */
50+
ArrayList<WindowStateAnimator> mAllAppWinAnimators;
51+
5152
static final Animation sDummyAnimation = new DummyAnimation();
5253

53-
public AppWindowAnimator(final WindowManagerService service, final AppWindowToken atoken) {
54-
mService = service;
54+
public AppWindowAnimator(final AppWindowToken atoken) {
5555
mAppToken = atoken;
56-
mAnimator = service.mAnimator;
56+
mService = atoken.service;
57+
mAnimator = atoken.mAnimator;
5758
}
5859

5960
public void setAnimation(Animation anim, boolean initialized) {
@@ -255,9 +256,9 @@ boolean stepAnimationLocked(long currentTime, int dw, int dh) {
255256

256257
transformation.clear();
257258

258-
final int N = mAppToken.windows.size();
259+
final int N = mAllAppWinAnimators.size();
259260
for (int i=0; i<N; i++) {
260-
mAppToken.windows.get(i).mWinAnimator.finishExit();
261+
mAllAppWinAnimators.get(i).finishExit();
261262
}
262263
mAppToken.updateReportedVisibilityLocked();
263264

@@ -266,9 +267,9 @@ boolean stepAnimationLocked(long currentTime, int dw, int dh) {
266267

267268
boolean showAllWindowsLocked() {
268269
boolean isAnimating = false;
269-
final int NW = mAppToken.allAppWindows.size();
270+
final int NW = mAllAppWinAnimators.size();
270271
for (int i=0; i<NW; i++) {
271-
WindowStateAnimator winAnimator = mAppToken.allAppWindows.get(i).mWinAnimator;
272+
WindowStateAnimator winAnimator = mAllAppWinAnimators.get(i);
272273
if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
273274
"performing show on: " + winAnimator);
274275
winAnimator.performShowLocked();

services/java/com/android/server/wm/AppWindowToken.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class AppWindowToken extends WindowToken {
104104
appToken = _token;
105105
mInputApplicationHandle = new InputApplicationHandle(this);
106106
mAnimator = service.mAnimator;
107-
mAppAnimator = new AppWindowAnimator(_service, this);
107+
mAppAnimator = new AppWindowAnimator(this);
108108
}
109109

110110
void sendAppVisibilityToClients() {

services/java/com/android/server/wm/WindowAnimator.java

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import android.view.animation.Animation;
2222

2323
import com.android.internal.policy.impl.PhoneWindowManager;
24+
import com.android.server.wm.WindowManagerService.AppWindowAnimParams;
2425
import com.android.server.wm.WindowManagerService.LayoutToAnimatorParams;
2526

2627
import java.io.PrintWriter;
@@ -87,6 +88,8 @@ public class WindowAnimator {
8788
WindowState mLowerWallpaperTarget = null;
8889
WindowState mUpperWallpaperTarget = null;
8990

91+
ArrayList<AppWindowAnimator> mAppAnimators = new ArrayList<AppWindowAnimator>();
92+
9093
ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
9194

9295
/** Parameters being passed from this into mService. */
@@ -143,6 +146,11 @@ private void copyLayoutToAnimParamsLocked() {
143146
synchronized(layoutToAnim) {
144147
layoutToAnim.mAnimationScheduled = false;
145148

149+
if (!layoutToAnim.mParamsModified) {
150+
return;
151+
}
152+
layoutToAnim.mParamsModified = false;
153+
146154
if ((layoutToAnim.mChanges & LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED) != 0) {
147155
layoutToAnim.mChanges &= ~LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED;
148156
mWallpaperTokens = new ArrayList<WindowToken>(layoutToAnim.mWallpaperTokens);
@@ -173,6 +181,16 @@ private void copyLayoutToAnimParamsLocked() {
173181
mDimParams = dimParams;
174182
}
175183
}
184+
185+
mAppAnimators.clear();
186+
final int N = layoutToAnim.mAppWindowAnimParams.size();
187+
for (int i = 0; i < N; i++) {
188+
final AppWindowAnimParams params = layoutToAnim.mAppWindowAnimParams.get(i);
189+
AppWindowAnimator appAnimator = params.mAppAnimator;
190+
appAnimator.mAllAppWinAnimators =
191+
new ArrayList<WindowStateAnimator>(params.mWinAnimators);
192+
mAppAnimators.add(appAnimator);
193+
}
176194
}
177195
}
178196

@@ -197,11 +215,10 @@ void hideWallpapersLocked(final WindowState w) {
197215
}
198216

199217
private void updateWindowsAppsAndRotationAnimationsLocked() {
200-
final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
201218
int i;
202-
final int NAT = appTokens.size();
219+
final int NAT = mAppAnimators.size();
203220
for (i=0; i<NAT; i++) {
204-
final AppWindowAnimator appAnimator = appTokens.get(i).mAppAnimator;
221+
final AppWindowAnimator appAnimator = mAppAnimators.get(i);
205222
final boolean wasAnimating = appAnimator.animation != null
206223
&& appAnimator.animation != AppWindowAnimator.sDummyAnimation;
207224
if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
@@ -373,8 +390,7 @@ private void updateWindowsLocked() {
373390
}
374391
}
375392
}
376-
final AppWindowAnimator appAnimator =
377-
atoken == null ? null : atoken.mAppAnimator;
393+
final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
378394
if (appAnimator != null && appAnimator.thumbnail != null) {
379395
if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
380396
appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
@@ -438,8 +454,7 @@ private void updateWallpaperLocked() {
438454
// If this window's app token is running a detached wallpaper
439455
// animation, make a note so we can ensure the wallpaper is
440456
// displayed behind it.
441-
final AppWindowAnimator appAnimator =
442-
win.mAppToken == null ? null : win.mAppToken.mAppAnimator;
457+
final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
443458
if (appAnimator != null && appAnimator.animation != null
444459
&& appAnimator.animating) {
445460
if ((flags & FLAG_SHOW_WALLPAPER) != 0
@@ -495,18 +510,18 @@ private void updateWallpaperLocked() {
495510
private void testTokenMayBeDrawnLocked() {
496511
// See if any windows have been drawn, so they (and others
497512
// associated with them) can now be shown.
498-
final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
499-
final int NT = appTokens.size();
513+
final int NT = mAppAnimators.size();
500514
for (int i=0; i<NT; i++) {
501-
AppWindowToken wtoken = appTokens.get(i);
515+
AppWindowAnimator appAnimator = mAppAnimators.get(i);
516+
AppWindowToken wtoken = appAnimator.mAppToken;
502517
final boolean allDrawn = wtoken.allDrawn;
503-
if (allDrawn != wtoken.mAppAnimator.allDrawn) {
504-
wtoken.mAppAnimator.allDrawn = allDrawn;
518+
if (allDrawn != appAnimator.allDrawn) {
519+
appAnimator.allDrawn = allDrawn;
505520
if (allDrawn) {
506521
// The token has now changed state to having all
507522
// windows shown... what to do, what to do?
508-
if (wtoken.mAppAnimator.freezingScreen) {
509-
wtoken.mAppAnimator.showAllWindowsLocked();
523+
if (appAnimator.freezingScreen) {
524+
appAnimator.showAllWindowsLocked();
510525
mService.unsetAppFreezingScreenLocked(wtoken, false, true);
511526
if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
512527
"Setting mOrientationChangeComplete=true because wtoken "
@@ -523,7 +538,7 @@ private void testTokenMayBeDrawnLocked() {
523538

524539
// We can now show all of the drawn windows!
525540
if (!mService.mOpeningApps.contains(wtoken)) {
526-
mAnimating |= wtoken.mAppAnimator.showAllWindowsLocked();
541+
mAnimating |= appAnimator.showAllWindowsLocked();
527542
}
528543
}
529544
}

services/java/com/android/server/wm/WindowManagerService.java

Lines changed: 75 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -648,7 +648,25 @@ class LayoutFields {
648648
}
649649
final LayoutFields mInnerFields = new LayoutFields();
650650

651+
static class AppWindowAnimParams {
652+
AppWindowAnimator mAppAnimator;
653+
ArrayList<WindowStateAnimator> mWinAnimators;
654+
655+
public AppWindowAnimParams(final AppWindowAnimator appAnimator) {
656+
mAppAnimator = appAnimator;
657+
658+
final AppWindowToken wtoken = appAnimator.mAppToken;
659+
mWinAnimators = new ArrayList<WindowStateAnimator>();
660+
final int N = wtoken.allAppWindows.size();
661+
for (int i = 0; i < N; i++) {
662+
mWinAnimators.add(wtoken.allAppWindows.get(i).mWinAnimator);
663+
}
664+
}
665+
}
666+
651667
static class LayoutToAnimatorParams {
668+
boolean mParamsModified;
669+
652670
static final long WALLPAPER_TOKENS_CHANGED = 1 << 0;
653671
long mChanges;
654672

@@ -659,6 +677,7 @@ static class LayoutToAnimatorParams {
659677
WindowState mUpperWallpaperTarget;
660678
DimAnimator.Parameters mDimParams;
661679
ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
680+
ArrayList<AppWindowAnimParams> mAppWindowAnimParams = new ArrayList<AppWindowAnimParams>();
662681
}
663682
/** Params from WindowManagerService to WindowAnimator. Do not modify or read without first
664683
* locking on either mWindowMap or mAnimator and then on mLayoutToAnim */
@@ -7324,50 +7343,9 @@ public void handleMessage(Message msg) {
73247343
case UPDATE_ANIM_PARAMETERS: {
73257344
// Used to send multiple changes from the animation side to the layout side.
73267345
synchronized (mWindowMap) {
7327-
final WindowAnimator.AnimatorToLayoutParams animToLayout =
7328-
mAnimator.mAnimToLayout;
7329-
synchronized (animToLayout) {
7330-
animToLayout.mUpdateQueued = false;
7331-
boolean doRequest = false;
7332-
final int bulkUpdateParams = animToLayout.mBulkUpdateParams;
7333-
// TODO(cmautner): As the number of bits grows, use masks of bit groups to
7334-
// eliminate unnecessary tests.
7335-
if ((bulkUpdateParams & LayoutFields.SET_UPDATE_ROTATION) != 0) {
7336-
mInnerFields.mUpdateRotation = true;
7337-
doRequest = true;
7338-
}
7339-
if ((bulkUpdateParams & LayoutFields.SET_WALLPAPER_MAY_CHANGE) != 0) {
7340-
mInnerFields.mWallpaperMayChange = true;
7341-
doRequest = true;
7342-
}
7343-
if ((bulkUpdateParams & LayoutFields.SET_FORCE_HIDING_CHANGED) != 0) {
7344-
mInnerFields.mWallpaperForceHidingChanged = true;
7345-
doRequest = true;
7346-
}
7347-
if ((bulkUpdateParams & LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE)
7348-
== 0) {
7349-
mInnerFields.mOrientationChangeComplete = false;
7350-
} else {
7351-
mInnerFields.mOrientationChangeComplete = true;
7352-
if (mWindowsFreezingScreen) {
7353-
doRequest = true;
7354-
}
7355-
}
7356-
if ((bulkUpdateParams & LayoutFields.SET_TURN_ON_SCREEN) != 0) {
7357-
mTurnOnScreen = true;
7358-
}
7359-
7360-
mPendingLayoutChanges |= animToLayout.mPendingLayoutChanges;
7361-
if (mPendingLayoutChanges != 0) {
7362-
doRequest = true;
7363-
}
7364-
7365-
mWindowDetachedWallpaper = animToLayout.mWindowDetachedWallpaper;
7366-
7367-
if (doRequest) {
7368-
mH.sendEmptyMessage(CLEAR_PENDING_ACTIONS);
7369-
performLayoutAndPlaceSurfacesLocked();
7370-
}
7346+
if (copyAnimToLayoutParamsLocked()) {
7347+
mH.sendEmptyMessage(CLEAR_PENDING_ACTIONS);
7348+
performLayoutAndPlaceSurfacesLocked();
73717349
}
73727350
}
73737351
break;
@@ -9109,16 +9087,26 @@ void updateLayoutToAnimationLocked() {
91099087
// Copy local params to transfer params.
91109088
ArrayList<WindowStateAnimator> winAnimators = layoutToAnim.mWinAnimators;
91119089
winAnimators.clear();
9112-
final int N = mWindows.size();
9090+
int N = mWindows.size();
91139091
for (int i = 0; i < N; i++) {
91149092
final WindowStateAnimator winAnimator = mWindows.get(i).mWinAnimator;
91159093
if (winAnimator.mSurface != null) {
91169094
winAnimators.add(winAnimator);
91179095
}
91189096
}
9097+
91199098
layoutToAnim.mWallpaperTarget = mWallpaperTarget;
91209099
layoutToAnim.mLowerWallpaperTarget = mLowerWallpaperTarget;
91219100
layoutToAnim.mUpperWallpaperTarget = mUpperWallpaperTarget;
9101+
9102+
final ArrayList<AppWindowAnimParams> paramList = layoutToAnim.mAppWindowAnimParams;
9103+
paramList.clear();
9104+
N = mAnimatingAppTokens.size();
9105+
for (int i = 0; i < N; i++) {
9106+
paramList.add(new AppWindowAnimParams(mAnimatingAppTokens.get(i).mAppAnimator));
9107+
}
9108+
9109+
layoutToAnim.mParamsModified = true;
91229110
scheduleAnimationLocked();
91239111
}
91249112
}
@@ -9146,6 +9134,48 @@ void stopDimming() {
91469134
setAnimDimParams(null);
91479135
}
91489136

9137+
private boolean copyAnimToLayoutParamsLocked() {
9138+
boolean doRequest = false;
9139+
final WindowAnimator.AnimatorToLayoutParams animToLayout = mAnimator.mAnimToLayout;
9140+
synchronized (animToLayout) {
9141+
animToLayout.mUpdateQueued = false;
9142+
final int bulkUpdateParams = animToLayout.mBulkUpdateParams;
9143+
// TODO(cmautner): As the number of bits grows, use masks of bit groups to
9144+
// eliminate unnecessary tests.
9145+
if ((bulkUpdateParams & LayoutFields.SET_UPDATE_ROTATION) != 0) {
9146+
mInnerFields.mUpdateRotation = true;
9147+
doRequest = true;
9148+
}
9149+
if ((bulkUpdateParams & LayoutFields.SET_WALLPAPER_MAY_CHANGE) != 0) {
9150+
mInnerFields.mWallpaperMayChange = true;
9151+
doRequest = true;
9152+
}
9153+
if ((bulkUpdateParams & LayoutFields.SET_FORCE_HIDING_CHANGED) != 0) {
9154+
mInnerFields.mWallpaperForceHidingChanged = true;
9155+
doRequest = true;
9156+
}
9157+
if ((bulkUpdateParams & LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE) == 0) {
9158+
mInnerFields.mOrientationChangeComplete = false;
9159+
} else {
9160+
mInnerFields.mOrientationChangeComplete = true;
9161+
if (mWindowsFreezingScreen) {
9162+
doRequest = true;
9163+
}
9164+
}
9165+
if ((bulkUpdateParams & LayoutFields.SET_TURN_ON_SCREEN) != 0) {
9166+
mTurnOnScreen = true;
9167+
}
9168+
9169+
mPendingLayoutChanges |= animToLayout.mPendingLayoutChanges;
9170+
if (mPendingLayoutChanges != 0) {
9171+
doRequest = true;
9172+
}
9173+
9174+
mWindowDetachedWallpaper = animToLayout.mWindowDetachedWallpaper;
9175+
}
9176+
return doRequest;
9177+
}
9178+
91499179
boolean reclaimSomeSurfaceMemoryLocked(WindowStateAnimator winAnimator, String operation,
91509180
boolean secure) {
91519181
final Surface surface = winAnimator.mSurface;

services/java/com/android/server/wm/WindowState.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -317,9 +317,6 @@ final class WindowState implements WindowManagerPolicy.WindowState {
317317
mIsFloatingLayer = mIsImWindow || mIsWallpaper;
318318
}
319319

320-
mWinAnimator = new WindowStateAnimator(this);
321-
mWinAnimator.mAlpha = a.alpha;
322-
323320
WindowState appWin = this;
324321
while (appWin.mAttachedWindow != null) {
325322
appWin = appWin.mAttachedWindow;
@@ -335,6 +332,9 @@ final class WindowState implements WindowManagerPolicy.WindowState {
335332
mRootToken = appToken;
336333
mAppToken = appToken.appWindowToken;
337334

335+
mWinAnimator = new WindowStateAnimator(this);
336+
mWinAnimator.mAlpha = a.alpha;
337+
338338
mRequestedWidth = 0;
339339
mRequestedHeight = 0;
340340
mLastRequestedWidth = 0;

0 commit comments

Comments
 (0)