bug(splash-screen): splashImmersive and splashFullScreen have no effect on Android 8–10

Abierto
#2,636 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
74/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
android, java

Línea de trabajo

Read the Android splash screen legacy path in show(), buildViews(), legacyImmersive(), and legacyFullscreen(). Check how the splashImage and spinnerBar windows are added and which window receives system UI flags; reproduce on Android API 26–29. Done when the configured immersive and fullscreen modes hide the expected system bars and the splash covers the status bar area from its first frame.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

platform: android

🤖 Automated review by Claude — posted via @ibrahimkhatib365's account; not written by them personally.

Bug Report

Plugin(s)

@capacitor/splash-screen 8.0.2. The same code is in the current main.

Capacitor Version
Installed Dependencies:

  @capacitor/cli: 8.5.2
  @capacitor/core: 8.5.2
  @capacitor/android: 8.5.2
  @capacitor/ios: 8.5.2
Platform(s)

Android 8–10 (API 26–29), the legacy splash path. Reproduced on API 28.

Current Behavior

With splashImmersive: true (or splashFullScreen: true), the launch splash keeps the navigation bar and status bar visible below Android 11.

In show(), the legacy path adds two windows: splashImage first, then spinnerBar. spinnerBar is always created in buildViews() and always added, even with showSpinner: false. legacyImmersive() and legacyFullscreen() then set the system UI flags on splashImage only. Below Android 11 the focused window decides the system bars, and that's spinnerBar, the window added last, which has no flags. So the flags never take effect.

A related gap: both windows are added with the activity's flags, without FLAG_LAYOUT_NO_LIMITS, so the splash image starts below the status bar. While it shows, the status bar area shows the activity window behind it. During startup that window changes colour (theme background, then the WebView), so the status bar flickers before settling on the splash colour.

Expected Behavior

Below Android 11, splashImmersive hides the system bars and splashFullScreen hides the status bar while the splash shows, the same as on Android 11+. The splash covers the status bar area from the first frame.

Code Reproduction
  1. npm init @capacitor/app and add @capacitor/splash-screen. Set SplashScreen.launchShowDuration: 3000 and splashImmersive: true in capacitor.config.
  2. Run on an Android 9 (API 28) emulator. The plugin takes the legacy path there (see #2635).
  3. Launch the app: the navigation buttons, and the status bar above the splash, stay visible for the whole splash.
Other Technical Details
  • Reproduced on an Android 9 (API 28) emulator
  • minSdkVersion 26
Additional Context

We work around it with a patch, which applies flags to the focused window and lets the image draw under the status bar:

             // Required to enable the view to actually fade
             params.format = PixelFormat.TRANSLUCENT;

+            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
+                params.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
+            }
+
             try {
                 windowManager.addView(splashImage, params);
 ...
                 windowManager.addView(spinnerBar, params);

+                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S && config.isImmersive()) {
+                    spinnerBar.setSystemUiVisibility(
+                        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+                    );
+                }

We only hide the navigation bar, because we wanted the status bar kept. A general fix would apply the same flags as legacyImmersive() / legacyFullscreen() to spinnerBar too, or to whichever window is added last. Avoid IMMERSIVE_STICKY on the spinner, because on some versions it shows the system's "Viewing full screen" hint over the splash.

We haven't checked Android 11 (API 30). Its insets-controller branch also targets splashImage's window, so it may have the same problem.

Related: #2635 (the same legacy path, on reopen).

Lenguaje dominante
Java
Estrellas
688
Forks
691
Merge medio
1 d 5 h
PR fusionados (30 d)
5

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de ionic-team/capacitor-plugins

Todos los issues de ionic-team/capacitor-plugins

Issues similares

Más issues de Java

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.