diff options
| author | 2022-04-15 02:55:34 +0000 | |
|---|---|---|
| committer | 2022-04-15 02:55:34 +0000 | |
| commit | 6957af7bbaf56ddb266d919945d0f26653ac74d4 (patch) | |
| tree | cadfb72a35a7221919a6dbaec7e4ef300c78eff0 | |
| parent | cd29bb55407c1b0593c1e0671108e27e85231e2a (diff) | |
| parent | 98895b80e2979ebe24572506fde6e332c49506a6 (diff) | |
Merge "Clear the system bars color when removing the splash screen window." into tm-dev am: 2aac68104f am: 98895b80e2
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17493268
Change-Id: I0b2dd58ba804e9704457629e94303c1c9d0d7944
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
4 files changed, 62 insertions, 90 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 852dd974ae42..7d68eb92f206 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -4114,8 +4114,8 @@ public final class ActivityThread extends ClientTransactionHandler @NonNull SurfaceControl startingWindowLeash) { final SplashScreenView.Builder builder = new SplashScreenView.Builder(r.activity); final SplashScreenView view = builder.createFromParcel(parcelable).build(); + view.attachHostWindow(r.window); decorView.addView(view); - view.attachHostActivityAndSetSystemUIColors(r.activity, r.window); view.requestLayout(); view.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() { diff --git a/core/java/android/window/SplashScreenView.java b/core/java/android/window/SplashScreenView.java index 2d1deb2a57bb..bc9f74ecec99 100644 --- a/core/java/android/window/SplashScreenView.java +++ b/core/java/android/window/SplashScreenView.java @@ -16,9 +16,6 @@ package android.window; import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; -import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; -import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION; -import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; import static com.android.internal.jank.InteractionJankMonitor.CUJ_SPLASHSCREEN_AVD; @@ -29,11 +26,9 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.TestApi; import android.annotation.UiThread; -import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; @@ -52,15 +47,12 @@ import android.view.SurfaceView; import android.view.View; import android.view.ViewGroup; import android.view.Window; -import android.view.WindowInsetsController; -import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.ImageView; import com.android.internal.R; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.policy.DecorView; -import com.android.internal.util.ContrastColorUtil; import java.time.Duration; import java.time.Instant; @@ -87,12 +79,6 @@ public final class SplashScreenView extends FrameLayout { private static final String TAG = SplashScreenView.class.getSimpleName(); private static final boolean DEBUG = Build.IS_DEBUGGABLE; - private static final int LIGHT_BARS_MASK = - WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS - | WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS; - private static final int WINDOW_FLAG_MASK = FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS - | FLAG_TRANSLUCENT_NAVIGATION | FLAG_TRANSLUCENT_STATUS; - private boolean mNotCopyable; private boolean mIsCopied; private int mInitBackgroundColor; @@ -107,9 +93,6 @@ public final class SplashScreenView extends FrameLayout { private final Rect mTmpRect = new Rect(); private final int[] mTmpPos = new int[2]; - // The host activity when transfer view to it. - private Activity mHostActivity; - @Nullable private SurfaceControlViewHost.SurfacePackage mSurfacePackageCopy; @Nullable @@ -123,14 +106,7 @@ public final class SplashScreenView extends FrameLayout { // cache original window and status private Window mWindow; - private int mAppWindowFlags; - private int mStatusBarColor; - private int mNavigationBarColor; - private int mSystemBarsAppearance; private boolean mHasRemoved; - private boolean mNavigationContrastEnforced; - private boolean mStatusContrastEnforced; - private boolean mDecorFitsSystemWindows; /** * Internal builder to create a SplashScreenView object. @@ -570,7 +546,6 @@ public final class SplashScreenView extends FrameLayout { if (decorView != null) { decorView.removeView(this); } - restoreSystemUIColors(); mWindow = null; } mHasRemoved = true; @@ -651,56 +626,12 @@ public final class SplashScreenView extends FrameLayout { } /** - * Called when this view is attached to an activity. This also makes SystemUI colors - * transparent so the content of splash screen view can draw fully. + * Called when this view is attached to a window of an activity. * * @hide */ - public void attachHostActivityAndSetSystemUIColors(Activity activity, Window window) { - mHostActivity = activity; + public void attachHostWindow(Window window) { mWindow = window; - final WindowManager.LayoutParams attr = window.getAttributes(); - mAppWindowFlags = attr.flags; - mStatusBarColor = window.getStatusBarColor(); - mNavigationBarColor = window.getNavigationBarColor(); - mSystemBarsAppearance = window.getInsetsController().getSystemBarsAppearance(); - mNavigationContrastEnforced = window.isNavigationBarContrastEnforced(); - mStatusContrastEnforced = window.isStatusBarContrastEnforced(); - mDecorFitsSystemWindows = window.decorFitsSystemWindows(); - - applySystemBarsContrastColor(window.getInsetsController(), mInitBackgroundColor); - // Let app draw the background of bars. - window.addFlags(FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); - // Use specified bar colors instead of window background. - window.clearFlags(FLAG_TRANSLUCENT_STATUS | FLAG_TRANSLUCENT_NAVIGATION); - window.setStatusBarColor(Color.TRANSPARENT); - window.setNavigationBarColor(Color.TRANSPARENT); - window.setDecorFitsSystemWindows(false); - window.setStatusBarContrastEnforced(false); - window.setNavigationBarContrastEnforced(false); - } - - /** Called when this view is removed from the host activity. */ - private void restoreSystemUIColors() { - mWindow.setFlags(mAppWindowFlags, WINDOW_FLAG_MASK); - mWindow.setStatusBarColor(mStatusBarColor); - mWindow.setNavigationBarColor(mNavigationBarColor); - mWindow.getInsetsController().setSystemBarsAppearance(mSystemBarsAppearance, - LIGHT_BARS_MASK); - mWindow.setDecorFitsSystemWindows(mDecorFitsSystemWindows); - mWindow.setStatusBarContrastEnforced(mStatusContrastEnforced); - mWindow.setNavigationBarContrastEnforced(mNavigationContrastEnforced); - } - - /** - * Makes the icon color of system bars contrast. - * @hide - */ - public static void applySystemBarsContrastColor(WindowInsetsController windowInsetsController, - int backgroundColor) { - final int lightBarAppearance = ContrastColorUtil.isColorLight(backgroundColor) - ? LIGHT_BARS_MASK : 0; - windowInsetsController.setSystemBarsAppearance(lightBarAppearance, LIGHT_BARS_MASK); } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java index 75a999bcb292..d89ddd2074f0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java @@ -56,7 +56,6 @@ import android.util.ArrayMap; import android.util.Slog; import android.view.ContextThemeWrapper; import android.view.SurfaceControl; -import android.view.View; import android.window.SplashScreenView; import android.window.StartingWindowInfo; import android.window.StartingWindowInfo.StartingWindowType; @@ -543,22 +542,6 @@ public class SplashscreenContentDrawer { mBrandingImageHeight); } final SplashScreenView splashScreenView = builder.build(); - if (mSuggestType != STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN) { - splashScreenView.addOnAttachStateChangeListener( - new View.OnAttachStateChangeListener() { - @Override - public void onViewAttachedToWindow(View v) { - SplashScreenView.applySystemBarsContrastColor( - v.getWindowInsetsController(), - splashScreenView.getInitBackgroundColor()); - } - - @Override - public void onViewDetachedFromWindow(View v) { - } - }); - } - Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); return splashScreenView; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java index 11f23e3e941b..464ab1ae2a8c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java @@ -50,6 +50,7 @@ import android.view.Choreographer; import android.view.Display; import android.view.SurfaceControlViewHost; import android.view.View; +import android.view.WindowInsetsController; import android.view.WindowManager; import android.view.WindowManagerGlobal; import android.widget.FrameLayout; @@ -63,6 +64,7 @@ import android.window.TaskSnapshot; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.common.ProtoLog; +import com.android.internal.util.ContrastColorUtil; import com.android.launcher3.icons.IconProvider; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.TransactionPool; @@ -121,6 +123,9 @@ public class StartingSurfaceDrawer { private StartingSurface.SysuiProxy mSysuiProxy; private final StartingWindowRemovalInfo mTmpRemovalInfo = new StartingWindowRemovalInfo(); + private static final int LIGHT_BARS_MASK = + WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS + | WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS; /** * The minimum duration during which the splash screen is shown when the splash screen icon is * animated. @@ -361,9 +366,27 @@ public class StartingSurfaceDrawer { // the window before first round relayoutWindow, which will happen after insets // animation. mChoreographer.postCallback(CALLBACK_INSETS_ANIMATION, setViewSynchronized, null); - // Block until we get the background color. final StartingWindowRecord record = mStartingWindowRecords.get(taskId); + record.parseAppSystemBarColor(context); + // Block until we get the background color. final SplashScreenView contentView = viewSupplier.get(); + if (suggestType != STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN) { + contentView.addOnAttachStateChangeListener( + new View.OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View v) { + final int lightBarAppearance = ContrastColorUtil.isColorLight( + contentView.getInitBackgroundColor()) + ? LIGHT_BARS_MASK : 0; + contentView.getWindowInsetsController().setSystemBarsAppearance( + lightBarAppearance, LIGHT_BARS_MASK); + } + + @Override + public void onViewDetachedFromWindow(View v) { + } + }); + } record.mBGColor = contentView.getInitBackgroundColor(); } else { // release the icon view host @@ -613,6 +636,7 @@ public class StartingSurfaceDrawer { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_STARTING_WINDOW, "Removing splash screen window for task: %d", taskId); if (record.mContentView != null) { + record.clearSystemBarColor(); if (immediately || record.mSuggestType == STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN) { removeWindowInner(record.mDecorView, false); @@ -670,6 +694,8 @@ public class StartingSurfaceDrawer { private @StartingWindowType int mSuggestType; private int mBGColor; private final long mCreateTime; + private int mSystemBarAppearance; + private boolean mDrawsSystemBarBackgrounds; StartingWindowRecord(IBinder appToken, View decorView, TaskSnapshotWindow taskSnapshotWindow, @StartingWindowType int suggestType) { @@ -690,5 +716,37 @@ public class StartingSurfaceDrawer { mContentView = splashScreenView; mSetSplashScreen = true; } + + private void parseAppSystemBarColor(Context context) { + final TypedArray a = context.obtainStyledAttributes(R.styleable.Window); + mDrawsSystemBarBackgrounds = a.getBoolean( + R.styleable.Window_windowDrawsSystemBarBackgrounds, false); + if (a.getBoolean(R.styleable.Window_windowLightStatusBar, false)) { + mSystemBarAppearance |= WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS; + } + if (a.getBoolean(R.styleable.Window_windowLightNavigationBar, false)) { + mSystemBarAppearance |= WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS; + } + a.recycle(); + } + + // Reset the system bar color which set by splash screen, make it align to the app. + private void clearSystemBarColor() { + if (mDecorView == null) { + return; + } + if (mDecorView.getLayoutParams() instanceof WindowManager.LayoutParams) { + final WindowManager.LayoutParams lp = + (WindowManager.LayoutParams) mDecorView.getLayoutParams(); + if (mDrawsSystemBarBackgrounds) { + lp.flags |= WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; + } else { + lp.flags &= ~WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; + } + mDecorView.setLayoutParams(lp); + } + mDecorView.getWindowInsetsController().setSystemBarsAppearance( + mSystemBarAppearance, LIGHT_BARS_MASK); + } } } |