From 593e53d43a2ee41f4e05f3ae29d9011e0e8750dc Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Fri, 16 Jan 2026 10:52:37 -0600 Subject: [PATCH 1/8] fix(SystemBars): Pass through insets if window not focused --- .../src/main/java/com/getcapacitor/plugin/SystemBars.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java index 2c7243b79..362d61417 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -137,7 +137,6 @@ public void onDOMReady() { getActivity().runOnUiThread(() -> { this.bridge.getWebView().evaluateJavascript(viewportMetaJSFunction, (res) -> { hasViewportCover = res.equals("true"); - getBridge().getWebView().requestApplyInsets(); }); }); @@ -162,7 +161,7 @@ private void initSafeAreaInsets() { private void initWindowInsetsListener() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && insetHandlingEnabled) { ViewCompat.setOnApplyWindowInsetsListener((View) getBridge().getWebView().getParent(), (v, insets) -> { - if (hasViewportCover) { + if (hasViewportCover && v.hasWindowFocus()) { Insets safeAreaInsets = calcSafeAreaInsets(insets); boolean keyboardVisible = insets.isVisible(WindowInsetsCompat.Type.ime()); From 6c97fea6010c24a2a70b14ba006087b5cddc9683 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Fri, 16 Jan 2026 11:36:10 -0600 Subject: [PATCH 2/8] Also check if the activity has a splash screen showing --- .../src/main/java/com/getcapacitor/plugin/SystemBars.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java index 362d61417..97d879828 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -161,7 +161,9 @@ private void initSafeAreaInsets() { private void initWindowInsetsListener() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && insetHandlingEnabled) { ViewCompat.setOnApplyWindowInsetsListener((View) getBridge().getWebView().getParent(), (v, insets) -> { - if (hasViewportCover && v.hasWindowFocus()) { + boolean hasSplashScreen = getActivity().getSplashScreen() != null; + + if (hasViewportCover && v.hasWindowFocus() && !hasSplashScreen) { Insets safeAreaInsets = calcSafeAreaInsets(insets); boolean keyboardVisible = insets.isVisible(WindowInsetsCompat.Type.ime()); From 391480a5bdda45e08069d3419d7963c408722b5a Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Mon, 19 Jan 2026 10:16:45 -0600 Subject: [PATCH 3/8] fmt --- .../src/main/java/com/getcapacitor/plugin/SystemBars.java | 1 + 1 file changed, 1 insertion(+) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java index 97d879828..cc72bc6cd 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -137,6 +137,7 @@ public void onDOMReady() { getActivity().runOnUiThread(() -> { this.bridge.getWebView().evaluateJavascript(viewportMetaJSFunction, (res) -> { hasViewportCover = res.equals("true"); + getBridge().getWebView().requestApplyInsets(); }); }); From 8d598d4d1e512ad56159184f052d512efcc3b82f Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Mon, 19 Jan 2026 11:12:04 -0600 Subject: [PATCH 4/8] Checking if view is being shown --- .../src/main/java/com/getcapacitor/plugin/SystemBars.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java index cc72bc6cd..f780178c3 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -162,9 +162,7 @@ private void initSafeAreaInsets() { private void initWindowInsetsListener() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && insetHandlingEnabled) { ViewCompat.setOnApplyWindowInsetsListener((View) getBridge().getWebView().getParent(), (v, insets) -> { - boolean hasSplashScreen = getActivity().getSplashScreen() != null; - - if (hasViewportCover && v.hasWindowFocus() && !hasSplashScreen) { + if (hasViewportCover && v.hasWindowFocus() && v.isShown()) { Insets safeAreaInsets = calcSafeAreaInsets(insets); boolean keyboardVisible = insets.isVisible(WindowInsetsCompat.Type.ime()); From c487c5c0ec7a733a1074ffd7b9343a8a6da5ed87 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Tue, 20 Jan 2026 09:48:20 -0600 Subject: [PATCH 5/8] add check for webview version --- .../java/com/getcapacitor/plugin/SystemBars.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java index f780178c3..764d126b1 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -1,5 +1,6 @@ package com.getcapacitor.plugin; +import android.content.pm.PackageInfo; import android.content.res.Configuration; import android.os.Build; import android.view.View; @@ -12,6 +13,8 @@ import androidx.core.view.WindowCompat; import androidx.core.view.WindowInsetsCompat; import androidx.core.view.WindowInsetsControllerCompat; +import androidx.webkit.WebViewCompat; + import com.getcapacitor.Plugin; import com.getcapacitor.PluginCall; import com.getcapacitor.PluginMethod; @@ -272,4 +275,14 @@ private String getStyleForTheme() { } return STYLE_DARK; } + + private Integer getWebViewMajorVersion() { + PackageInfo info = WebViewCompat.getCurrentWebViewPackage(getContext()); + if (info != null && info.versionName != null) { + String[] versionSegments = info.versionName.split("\\."); + return Integer.valueOf(versionSegments[0]); + } + + return 0; + } } From 0e19f660cef282bb368078c10b62c107005b5316 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Tue, 20 Jan 2026 10:15:36 -0600 Subject: [PATCH 6/8] Skipping margin manipulation when on a fixed webview --- .../com/getcapacitor/plugin/SystemBars.java | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java index 764d126b1..b7b570e9b 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -148,6 +148,9 @@ public void onDOMReady() { private Insets calcSafeAreaInsets(WindowInsetsCompat insets) { Insets safeArea = insets.getInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout()); + if(insets.isVisible(WindowInsetsCompat.Type.ime())) { + return Insets.of(safeArea.left, safeArea.top, safeArea.right, 0); + } return Insets.of(safeArea.left, safeArea.top, safeArea.right, safeArea.bottom); } @@ -165,21 +168,25 @@ private void initSafeAreaInsets() { private void initWindowInsetsListener() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && insetHandlingEnabled) { ViewCompat.setOnApplyWindowInsetsListener((View) getBridge().getWebView().getParent(), (v, insets) -> { - if (hasViewportCover && v.hasWindowFocus() && v.isShown()) { - Insets safeAreaInsets = calcSafeAreaInsets(insets); - boolean keyboardVisible = insets.isVisible(WindowInsetsCompat.Type.ime()); + boolean hasBrokenWebViewVersion = getWebViewMajorVersion() <= 130; - if (keyboardVisible) { - safeAreaInsets = Insets.of(safeAreaInsets.left, safeAreaInsets.top, safeAreaInsets.right, 0); + if (hasViewportCover) { + Insets safeAreaInsets = calcSafeAreaInsets(insets); + injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); + } - Insets imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime()); - setViewMargins(v, Insets.of(0, 0, 0, imeInsets.bottom)); - } else { - setViewMargins(v, Insets.NONE); + if (hasBrokenWebViewVersion) { + if (hasViewportCover && v.hasWindowFocus() && v.isShown()) { + boolean keyboardVisible = insets.isVisible(WindowInsetsCompat.Type.ime()); + if (keyboardVisible) { + Insets imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime()); + setViewMargins(v, Insets.of(0, 0, 0, imeInsets.bottom)); + } else { + setViewMargins(v, Insets.NONE); + } + + return WindowInsetsCompat.CONSUMED; } - - injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); - return WindowInsetsCompat.CONSUMED; } return insets; From d9f1469de804a3cb4b10ae1baa0ce925b79bc1a1 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Tue, 20 Jan 2026 10:16:13 -0600 Subject: [PATCH 7/8] fmt --- .../src/main/java/com/getcapacitor/plugin/SystemBars.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java index b7b570e9b..024b9d078 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -14,7 +14,6 @@ import androidx.core.view.WindowInsetsCompat; import androidx.core.view.WindowInsetsControllerCompat; import androidx.webkit.WebViewCompat; - import com.getcapacitor.Plugin; import com.getcapacitor.PluginCall; import com.getcapacitor.PluginMethod; @@ -140,7 +139,7 @@ public void onDOMReady() { getActivity().runOnUiThread(() -> { this.bridge.getWebView().evaluateJavascript(viewportMetaJSFunction, (res) -> { hasViewportCover = res.equals("true"); - + getBridge().getWebView().requestApplyInsets(); }); }); @@ -148,7 +147,7 @@ public void onDOMReady() { private Insets calcSafeAreaInsets(WindowInsetsCompat insets) { Insets safeArea = insets.getInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout()); - if(insets.isVisible(WindowInsetsCompat.Type.ime())) { + if (insets.isVisible(WindowInsetsCompat.Type.ime())) { return Insets.of(safeArea.left, safeArea.top, safeArea.right, 0); } return Insets.of(safeArea.left, safeArea.top, safeArea.right, safeArea.bottom); From 9ce91eb79e8c01b42e21da05bdfad656da2893d3 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Wed, 21 Jan 2026 09:54:28 -0600 Subject: [PATCH 8/8] fixing broken webview version number --- .../src/main/java/com/getcapacitor/plugin/SystemBars.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java index 024b9d078..a03d6fb19 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -167,7 +167,7 @@ private void initSafeAreaInsets() { private void initWindowInsetsListener() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && insetHandlingEnabled) { ViewCompat.setOnApplyWindowInsetsListener((View) getBridge().getWebView().getParent(), (v, insets) -> { - boolean hasBrokenWebViewVersion = getWebViewMajorVersion() <= 130; + boolean hasBrokenWebViewVersion = getWebViewMajorVersion() <= 139; if (hasViewportCover) { Insets safeAreaInsets = calcSafeAreaInsets(insets);