Use new object to sync DimAnimator.

The controls for the DimAnimator were going through the H Handler
to sync with the Animator. We are switching to using the
LayoutToAnimator object for passing data from layout to animator.

Change-Id: Ib6d0afabba781c88bcc1c525e3ae424cf19ac1ad
This commit is contained in:
Craig Mautner
2012-07-03 19:03:02 -07:00
parent 462823948e
commit a76fdb7713
3 changed files with 39 additions and 36 deletions

View File

@@ -9,7 +9,6 @@ import static com.android.server.wm.WindowManagerService.LayoutFields.SET_UPDATE
import static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_MAY_CHANGE;
import static com.android.server.wm.WindowManagerService.LayoutFields.SET_FORCE_HIDING_CHANGED;
import static com.android.server.wm.WindowManagerService.H.SET_DIM_PARAMETERS;
import static com.android.server.wm.WindowManagerService.H.UPDATE_ANIM_PARAMETERS;
import android.content.Context;
@@ -108,6 +107,7 @@ public class WindowAnimator {
};
mWindowAnimationBackgroundSurface = new DimSurface(mService.mFxSession);
mDimAnimator = new DimAnimator(mService.mFxSession);
}
/** Locked on mAnimToLayout */
@@ -133,6 +133,24 @@ public class WindowAnimator {
mWinAnimators = new ArrayList<WindowStateAnimator>(layoutToAnim.mWinAnimators);
mWallpaperTarget = layoutToAnim.mWallpaperTarget;
// Set the new DimAnimator params.
DimAnimator.Parameters dimParams = layoutToAnim.mDimParams;
if (dimParams == null) {
mDimParams = dimParams;
} else {
final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator;
// Only set dim params on the highest dimmed layer.
final WindowStateAnimator existingDimWinAnimator = mDimParams == null
? null : mDimParams.mDimWinAnimator;
// Don't turn on for an unshown surface, or for any layer but the highest dimmed one.
if (newWinAnimator.mSurfaceShown &&
(existingDimWinAnimator == null || !existingDimWinAnimator.mSurfaceShown
|| existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
mDimParams = dimParams;
}
}
}
}
@@ -571,28 +589,6 @@ public class WindowAnimator {
mInnerDh = appHeight;
}
void startDimming(final WindowStateAnimator winAnimator, final float target,
final int width, final int height) {
if (mDimAnimator == null) {
mDimAnimator = new DimAnimator(mService.mFxSession);
}
// Only set dim params on the highest dimmed layer.
final WindowStateAnimator dimWinAnimator = mDimParams == null
? null : mDimParams.mDimWinAnimator;
// Don't turn on for an unshown surface, or for any layer but the highest dimmed one.
if (winAnimator.mSurfaceShown &&
(dimWinAnimator == null || !dimWinAnimator.mSurfaceShown
|| dimWinAnimator.mAnimLayer < winAnimator.mAnimLayer)) {
mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS,
new DimAnimator.Parameters(winAnimator, width, height, target)));
}
}
// TODO(cmautner): Move into Handler
void stopDimming() {
mService.mH.sendMessage(mService.mH.obtainMessage(SET_DIM_PARAMETERS, null));
}
boolean isDimming() {
return mDimParams != null;
}

View File

@@ -6914,8 +6914,7 @@ public class WindowManagerService extends IWindowManager.Stub
public static final int ANIMATOR_WHAT_OFFSET = 100000;
public static final int SET_TRANSPARENT_REGION = ANIMATOR_WHAT_OFFSET + 1;
public static final int SET_WALLPAPER_OFFSET = ANIMATOR_WHAT_OFFSET + 2;
public static final int SET_DIM_PARAMETERS = ANIMATOR_WHAT_OFFSET + 3;
public static final int CLEAR_PENDING_ACTIONS = ANIMATOR_WHAT_OFFSET + 4;
public static final int CLEAR_PENDING_ACTIONS = ANIMATOR_WHAT_OFFSET + 3;
private Session mLastReportedHold;
@@ -7412,13 +7411,6 @@ public class WindowManagerService extends IWindowManager.Stub
break;
}
case SET_DIM_PARAMETERS: {
mAnimator.mDimParams = (DimAnimator.Parameters) msg.obj;
scheduleAnimationLocked();
break;
}
case CLEAR_PENDING_ACTIONS: {
mAnimator.clearPendingActions();
break;
@@ -8539,8 +8531,7 @@ public class WindowManagerService extends IWindowManager.Stub
width = innerDw;
height = innerDh;
}
mAnimator.startDimming(winAnimator, w.mExiting ? 0 : w.mAttrs.dimAmount,
width, height);
startDimming(winAnimator, w.mExiting ? 0 : w.mAttrs.dimAmount, width, height);
}
}
}
@@ -8806,7 +8797,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
if (!mInnerFields.mDimming && mAnimator.isDimming()) {
mAnimator.stopDimming();
stopDimming();
}
} catch (RuntimeException e) {
Log.wtf(TAG, "Unhandled exception in Window Manager", e);
@@ -9149,6 +9140,22 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
void setAnimDimParams(DimAnimator.Parameters params) {
synchronized (mLayoutToAnim) {
mLayoutToAnim.mDimParams = params;
scheduleAnimationLocked();
}
}
void startDimming(final WindowStateAnimator winAnimator, final float target,
final int width, final int height) {
setAnimDimParams(new DimAnimator.Parameters(winAnimator, width, height, target));
}
void stopDimming() {
setAnimDimParams(null);
}
boolean reclaimSomeSurfaceMemoryLocked(WindowStateAnimator winAnimator, String operation,
boolean secure) {
final Surface surface = winAnimator.mSurface;

View File

@@ -1104,7 +1104,7 @@ class WindowStateAnimator {
mAnimator.mPendingLayoutChanges |=
WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
if ((w.mAttrs.flags & LayoutParams.FLAG_DIM_BEHIND) != 0) {
mAnimator.startDimming(this, w.mExiting ? 0 : w.mAttrs.dimAmount,
mService.startDimming(this, w.mExiting ? 0 : w.mAttrs.dimAmount,
mService.mAppDisplayWidth, mService.mAppDisplayHeight);
}
} catch (RuntimeException e) {