Merge "Fix 2 graphical issues for drag resizing."
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 170c783..fef2d43 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -2322,10 +2322,12 @@
mResizeMode = freeformResizing
? RESIZE_MODE_FREEFORM
: RESIZE_MODE_DOCKED_DIVIDER;
+ final boolean backdropSizeMatchesFrame =
+ mWinFrame.width() == mPendingBackDropFrame.width()
+ && mWinFrame.height() == mPendingBackDropFrame.height();
// TODO: Need cutout?
- startDragResizing(mPendingBackDropFrame,
- mWinFrame.equals(mPendingBackDropFrame), mPendingVisibleInsets,
- mPendingStableInsets, mResizeMode);
+ startDragResizing(mPendingBackDropFrame, !backdropSizeMatchesFrame,
+ mPendingVisibleInsets, mPendingStableInsets, mResizeMode);
} else {
// We shouldn't come here, but if we come we should end the resize.
endDragResizing();
diff --git a/core/java/com/android/internal/policy/BackdropFrameRenderer.java b/core/java/com/android/internal/policy/BackdropFrameRenderer.java
index f14007b..cc958f4 100644
--- a/core/java/com/android/internal/policy/BackdropFrameRenderer.java
+++ b/core/java/com/android/internal/policy/BackdropFrameRenderer.java
@@ -69,7 +69,6 @@
private ColorDrawable mNavigationBarColor;
private boolean mOldFullscreen;
private boolean mFullscreen;
- private final int mResizeMode;
private final Rect mOldSystemInsets = new Rect();
private final Rect mOldStableInsets = new Rect();
private final Rect mSystemInsets = new Rect();
@@ -79,7 +78,7 @@
public BackdropFrameRenderer(DecorView decorView, ThreadedRenderer renderer, Rect initialBounds,
Drawable resizingBackgroundDrawable, Drawable captionBackgroundDrawable,
Drawable userCaptionBackgroundDrawable, int statusBarColor, int navigationBarColor,
- boolean fullscreen, Rect systemInsets, Rect stableInsets, int resizeMode) {
+ boolean fullscreen, Rect systemInsets, Rect stableInsets) {
setName("ResizeFrame");
mRenderer = renderer;
@@ -100,7 +99,6 @@
mStableInsets.set(stableInsets);
mOldSystemInsets.set(systemInsets);
mOldStableInsets.set(stableInsets);
- mResizeMode = resizeMode;
// Kick off our draw thread.
start();
@@ -109,33 +107,35 @@
void onResourcesLoaded(DecorView decorView, Drawable resizingBackgroundDrawable,
Drawable captionBackgroundDrawableDrawable, Drawable userCaptionBackgroundDrawable,
int statusBarColor, int navigationBarColor) {
- mDecorView = decorView;
- mResizingBackgroundDrawable = resizingBackgroundDrawable != null
- && resizingBackgroundDrawable.getConstantState() != null
- ? resizingBackgroundDrawable.getConstantState().newDrawable()
- : null;
- mCaptionBackgroundDrawable = captionBackgroundDrawableDrawable != null
- && captionBackgroundDrawableDrawable.getConstantState() != null
- ? captionBackgroundDrawableDrawable.getConstantState().newDrawable()
- : null;
- mUserCaptionBackgroundDrawable = userCaptionBackgroundDrawable != null
- && userCaptionBackgroundDrawable.getConstantState() != null
- ? userCaptionBackgroundDrawable.getConstantState().newDrawable()
- : null;
- if (mCaptionBackgroundDrawable == null) {
- mCaptionBackgroundDrawable = mResizingBackgroundDrawable;
- }
- if (statusBarColor != 0) {
- mStatusBarColor = new ColorDrawable(statusBarColor);
- addSystemBarNodeIfNeeded();
- } else {
- mStatusBarColor = null;
- }
- if (navigationBarColor != 0) {
- mNavigationBarColor = new ColorDrawable(navigationBarColor);
- addSystemBarNodeIfNeeded();
- } else {
- mNavigationBarColor = null;
+ synchronized (this) {
+ mDecorView = decorView;
+ mResizingBackgroundDrawable = resizingBackgroundDrawable != null
+ && resizingBackgroundDrawable.getConstantState() != null
+ ? resizingBackgroundDrawable.getConstantState().newDrawable()
+ : null;
+ mCaptionBackgroundDrawable = captionBackgroundDrawableDrawable != null
+ && captionBackgroundDrawableDrawable.getConstantState() != null
+ ? captionBackgroundDrawableDrawable.getConstantState().newDrawable()
+ : null;
+ mUserCaptionBackgroundDrawable = userCaptionBackgroundDrawable != null
+ && userCaptionBackgroundDrawable.getConstantState() != null
+ ? userCaptionBackgroundDrawable.getConstantState().newDrawable()
+ : null;
+ if (mCaptionBackgroundDrawable == null) {
+ mCaptionBackgroundDrawable = mResizingBackgroundDrawable;
+ }
+ if (statusBarColor != 0) {
+ mStatusBarColor = new ColorDrawable(statusBarColor);
+ addSystemBarNodeIfNeeded();
+ } else {
+ mStatusBarColor = null;
+ }
+ if (navigationBarColor != 0) {
+ mNavigationBarColor = new ColorDrawable(navigationBarColor);
+ addSystemBarNodeIfNeeded();
+ } else {
+ mNavigationBarColor = null;
+ }
}
}
@@ -186,7 +186,7 @@
* All resources of the renderer will be released. This function can be called from the
* the UI thread as well as the renderer thread.
*/
- public void releaseRenderer() {
+ void releaseRenderer() {
synchronized (this) {
if (mRenderer != null) {
// Invalidate the current content bounds.
@@ -268,7 +268,7 @@
* @param ySize The height of the content.
* @return true if a frame should be requested after the content is drawn; false otherwise.
*/
- public boolean onContentDrawn(int xOffset, int yOffset, int xSize, int ySize) {
+ boolean onContentDrawn(int xOffset, int yOffset, int xSize, int ySize) {
synchronized (this) {
final boolean firstCall = mLastContentWidth == 0;
// The current content buffer is drawn here.
@@ -291,7 +291,7 @@
}
}
- public void onRequestDraw(boolean reportNextDraw) {
+ void onRequestDraw(boolean reportNextDraw) {
synchronized (this) {
mReportNextDraw = reportNextDraw;
mOldTargetRect.set(0, 0, 0, 0);
@@ -329,8 +329,8 @@
return;
}
- // Since the surface is spanning the entire screen, we have to add the start offset of
- // the bounds to get to the surface location.
+ // Content may not be drawn at the surface origin, so we want to keep the offset when we're
+ // resizing it.
final int left = mLastXOffset + newBounds.left;
final int top = mLastYOffset + newBounds.top;
final int width = newBounds.width();
@@ -414,6 +414,8 @@
}
void setUserCaptionBackgroundDrawable(Drawable userCaptionBackgroundDrawable) {
- mUserCaptionBackgroundDrawable = userCaptionBackgroundDrawable;
+ synchronized (this) {
+ mUserCaptionBackgroundDrawable = userCaptionBackgroundDrawable;
+ }
}
}
diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java
index 94140ab..aa7bdb6 100644
--- a/core/java/com/android/internal/policy/DecorView.java
+++ b/core/java/com/android/internal/policy/DecorView.java
@@ -2093,7 +2093,7 @@
initialBounds, mResizingBackgroundDrawable, mCaptionBackgroundDrawable,
mUserCaptionBackgroundDrawable, getCurrentColor(mStatusColorViewState),
getCurrentColor(mNavigationColorViewState), fullscreen, systemInsets,
- stableInsets, resizeMode);
+ stableInsets);
// Get rid of the shadow while we are resizing. Shadow drawing takes considerable time.
// If we want to get the shadow shown while resizing, we would need to elevate a new
@@ -2229,7 +2229,14 @@
// or it didn't change.
if ((wasAdjustedForStack || mElevationAdjustedForStack)
&& getElevation() != elevation) {
- mWindow.setElevation(elevation);
+ if (!isResizing()) {
+ mWindow.setElevation(elevation);
+ } else {
+ // Just suppress the shadow when resizing, don't adjust surface insets because it'll
+ // cause a flicker when drag resize for freeform window starts. #onContentDrawn()
+ // will compensate the offset when passing to BackdropFrameRenderer.
+ setElevation(elevation);
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index f16008d..2f89d5c 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -2949,7 +2949,12 @@
// isDragResizing() or isDragResizeChanged() is true.
boolean resizing = isDragResizing() || isDragResizeChanged();
if (getWindowConfiguration().useWindowFrameForBackdrop() || !resizing) {
- return frame;
+ // Surface position is now inherited from parent, and BackdropFrameRenderer uses
+ // backdrop frame to position content. Thus we just keep the size of backdrop frame, and
+ // remove the offset to avoid double offset from display origin.
+ mTmpRect.set(frame);
+ mTmpRect.offsetTo(0, 0);
+ return mTmpRect;
}
final DisplayInfo displayInfo = getDisplayInfo();
mTmpRect.set(0, 0, displayInfo.logicalWidth, displayInfo.logicalHeight);