DO NOT MERGE Do not call drawableChanged pre Q

Some apps rely on not updating the window format when changing the
background of the DecorView. To keep the compatibilty with these app we
add only call DecoreView.drawableChanged() when the window background is
changed on app targetting Q and above.

Test: Manually test by lunching Instagram TV and pressing return twice.
The window should aninate with no flickering.
Bug: 136987724

Change-Id: I3593d30dc6f10519008151974e475f0dad86fc64
This commit is contained in:
Vadim Caen
2019-07-24 16:24:33 +02:00
committed by Jorim Jaggi
parent 486503c74e
commit 843f9dee8b
2 changed files with 18 additions and 2 deletions

View File

@@ -967,6 +967,19 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*/
static boolean sBrokenInsetsDispatch;
/**
* Prior to Q, calling
* {@link com.android.internal.policy.DecorView#setBackgroundDrawable(Drawable)}
* did not call update the window format so the opacity of the background was not correctly
* applied to the window. Some applications rely on this misbehavior to work properly.
* <p>
* From Q, {@link com.android.internal.policy.DecorView#setBackgroundDrawable(Drawable)} is
* the same as {@link com.android.internal.policy.DecorView#setWindowBackground(Drawable)}
* which updates the window format.
* @hide
*/
protected static boolean sBrokenWindowBackground;
/** @hide */
@IntDef({NOT_FOCUSABLE, FOCUSABLE, FOCUSABLE_AUTO})
@Retention(RetentionPolicy.SOURCE)
@@ -5104,6 +5117,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
sBrokenInsetsDispatch = ViewRootImpl.sNewInsetsMode != NEW_INSETS_MODE_FULL
|| targetSdkVersion < Build.VERSION_CODES.Q;
sBrokenWindowBackground = targetSdkVersion < Build.VERSION_CODES.Q;
sCompatibilityDone = true;
}
}

View File

@@ -983,13 +983,14 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
@Override
public void setBackgroundDrawable(Drawable background) {
// TODO: This should route through setWindowBackground, but late in the release to make this
// change.
if (mOriginalBackgroundDrawable != background) {
mOriginalBackgroundDrawable = background;
updateBackgroundDrawable();
drawableChanged();
if (!View.sBrokenWindowBackground) {
drawableChanged();
}
}
}