Skip to content

When using android:windowSoftInputMode="adjustResize" and env(safe-area-inset-top) in a Cordova app targeting targetSdkVersion 35, the app should behave as before #1848

@PedroRF123154

Description

@PedroRF123154

Bug Report

Problem

What is expected to happen?

When using android:windowSoftInputMode="adjustResize" and env(safe-area-inset-top) in a Cordova app targeting targetSdkVersion 35, the app should behave as before:

The keyboard should resize the WebView content properly.

The env(safe-area-inset-top) variable should apply correct top padding to accommodate notches/status bar.

What does actually happen?

When targeting SDK 35 (Android 15):

The keyboard behavior (adjustResize) no longer works correctly without applying manual WindowInsets handling.

The CSS variable env(safe-area-inset-top) returns 0px or is ignored in Android WebView, resulting in headers and content being overlapped by the status bar or notch.

A manual workaround using ViewTreeObserver and JavaScript is required to restore proper layout and safe-area behavior.

Information

When targeting SDK 35 (Android 15):

The keyboard behavior (adjustResize) no longer works correctly without applying manual WindowInsets handling.

The CSS variable env(safe-area-inset-top) returns 0px or is ignored in Android WebView, resulting in headers and content being overlapped by the status bar or notch.

A manual workaround using ViewTreeObserver and JavaScript is required to restore proper layout and safe-area behavior.

Command or Code

Environment, Platform, Device

Environment: Cordova + Android

Platform: Android 15 (API 35)

Devices: Multiple (Pixel, Samsung, Xiaomi)

Emulator and physical devices tested

Version information

Solution

  1. Add this Java class to your project: SoftInputAssist.java

This helper listens for keyboard changes and manually adjusts the layout:

** Open SoftInputAssist.java **
package mi.app.cordova;

import android.app.Activity;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;

public class SoftInputAssist {
    private final View rootView;
    private final View contentView;
    private int previousHeight;

    public SoftInputAssist(Activity activity) {
        rootView = activity.getWindow().getDecorView();
        contentView = activity.findViewById(android.R.id.content);

        rootView.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
            Rect r = new Rect();
            rootView.getWindowVisibleDisplayFrame(r);
            int heightDiff = rootView.getHeight() - (r.bottom - r.top);

            if (previousHeight != heightDiff) {
                previousHeight = heightDiff;
                contentView.setPadding(0, 0, 0, heightDiff);
            }
        });
    }
}
** Close SoftInputAssist.java **

2. Call SoftInputAssist from MainActivity.java

Modify your MainActivity like this:
```java
** Open MainActivity.java **
package mi.app.cordova;

import android.os.Bundle;
import org.apache.cordova.*;

public class MainActivity extends CordovaActivity {
    private SoftInputAssist softInputAssist;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // enable Cordova apps to be started in the background
        Bundle extras = getIntent().getExtras();
        if (extras != null && extras.getBoolean("cdvStartInBackground", false)) {
            moveTaskToBack(true);
        }

        // Carga el contenido principal de Cordova
        loadUrl(launchUrl);

        // Inicializa el listener para el teclado
        softInputAssist = new SoftInputAssist(this);
    }
}
** Close MainActivity.java **
## Checklist
<!-- Please check the boxes by putting an x in the [ ] like so: [x] -->

- [x] I searched for existing GitHub issues
- [ x] I updated all Cordova tooling to most recent version
- [ x] I included all the necessary information above

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions