From a16fe36115faf290533eeef7d9c7540f4c780628 Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Fri, 11 Mar 2022 11:40:56 +0800 Subject: [PATCH] Adjust branding image layout if needed. THe branding image could overlaps the icon, adjust the layout or hide it according the window size at runtime. Bug: 203366774 Test: modify wm size, verify the branding image won't overlaps on icon. Change-Id: I094c8f2a3f1c8f5fbc87e2234ab2c03daae86c7c --- .../java/android/window/SplashScreenView.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/core/java/android/window/SplashScreenView.java b/core/java/android/window/SplashScreenView.java index 10d7ecab4ffa9..67f9f484e3a58 100644 --- a/core/java/android/window/SplashScreenView.java +++ b/core/java/android/window/SplashScreenView.java @@ -104,6 +104,9 @@ public final class SplashScreenView extends FrameLayout { private Duration mIconAnimationDuration; private Instant mIconAnimationStart; + private final Rect mTmpRect = new Rect(); + private final int[] mTmpPos = new int[2]; + // The host activity when transfer view to it. private Activity mHostActivity; @@ -582,6 +585,45 @@ public final class SplashScreenView extends FrameLayout { releaseAnimationSurfaceHost(); } + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + + mBrandingImageView.getDrawingRect(mTmpRect); + final int brandingHeight = mTmpRect.height(); + if (brandingHeight == 0 || mIconView == null) { + return; + } + final int visibility = mBrandingImageView.getVisibility(); + if (visibility != VISIBLE) { + return; + } + final int currentHeight = b - t; + + mIconView.getLocationInWindow(mTmpPos); + mIconView.getDrawingRect(mTmpRect); + final int iconHeight = mTmpRect.height(); + + final ViewGroup.MarginLayoutParams params = + (ViewGroup.MarginLayoutParams) mBrandingImageView.getLayoutParams(); + if (params == null) { + Log.e(TAG, "Unable to adjust branding image layout, layout changed?"); + return; + } + final int marginBottom = params.bottomMargin; + final int remainingHeight = currentHeight - mTmpPos[1] - iconHeight; + final int remainingMaxMargin = remainingHeight - brandingHeight; + if (remainingHeight < brandingHeight) { + // unable to show the branding image, hide it + mBrandingImageView.setVisibility(GONE); + } else if (remainingMaxMargin < marginBottom) { + // shorter than original margin + params.bottomMargin = (int) Math.round(remainingMaxMargin / 2.0); + mBrandingImageView.setLayoutParams(params); + } + // nothing need to adjust + } + private void releaseAnimationSurfaceHost() { if (mSurfaceHost != null && !mIsCopied) { if (DEBUG) { @@ -762,6 +804,9 @@ public final class SplashScreenView extends FrameLayout { final Rect initialBounds = drawable.copyBounds(); final int width = initialBounds.width(); final int height = initialBounds.height(); + if (width <= 0 || height <= 0) { + return null; + } final Bitmap snapshot = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); final Canvas bmpCanvas = new Canvas(snapshot);