Hey,
my final MainActivity.java is following (another edit for other problem had to be made)
package com.my.app
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.getcapacitor.BridgeActivity;
public class MainActivity extends BridgeActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getBridge().getWebView().post(() -> {
View webView = getBridge().getWebView();
View parent = (View) webView.getParent();
// Neutralize SystemBars plugin's parent insets listener (prevents double-stacking
// with the EdgeToEdge plugin which handles the WebView directly).
ViewCompat.setOnApplyWindowInsetsListener(parent, (v, insets) -> {
v.setPadding(0, 0, 0, 0);
return insets;
});
// Override the EdgeToEdge plugin's WebView listener so it applies only system bar
// margins and NOT IME (keyboard) margins. Applying IME margins resizes the WebView,
// which causes Chromium to invalidate the input connection and immediately call
// hideSoftInputFromWindow — making the keyboard close right after it opens.
ViewCompat.setOnApplyWindowInsetsListener(webView, (v, insets) -> {
Insets bars = insets.getInsets(
WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout()
);
ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
mlp.topMargin = bars.top;
mlp.bottomMargin = bars.bottom;
mlp.leftMargin = bars.left;
mlp.rightMargin = bars.right;
v.setLayoutParams(mlp);
return WindowInsetsCompat.CONSUMED;
});
webView.requestApplyInsets();
});
}
}
capacitor.config.ts:
import type {CapacitorConfig} from '@capacitor/cli';
const config: CapacitorConfig = {
appId: 'XXX',
appName: 'XXX',
webDir: 'XXX/browser',
plugins: {
EdgeToEdge:{
backgroundColor:'#333333'
}
}
};
export default config;
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8" ?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Permissions -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location.gps" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation"
android:name=".MainActivity"
android:label="@string/title_activity_main"
android:theme="@style/AppTheme.NoActionBarLaunch"
android:launchMode="singleTask"
android:exported="true"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" />
</provider>
</application>
</manifest>
package.json
{
"name": "XX",
"version": "1.10.0",
"build": "486",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"watch": "ng build --watch --configuration development",
"test": "ng test",
"sass": "sass --watch ./src/assets/scss:./src/assets/css/",
"sass-min": "sass ./src/assets/scss:./src/assets/css/ --style compressed"
},
"private": true,
"dependencies": {
"@angular-slider/ngx-slider": "^17.0.2",
"@angular/animations": "^17.3.12",
"@angular/cdk": "^17.3.10",
"@angular/common": "^17.3.12",
"@angular/compiler": "^17.3.12",
"@angular/core": "^17.3.12",
"@angular/fire": "^17.1.0",
"@angular/forms": "^17.3.12",
"@angular/google-maps": "^17.3.10",
"@angular/material": "^17.3.10",
"@angular/platform-browser": "^17.3.12",
"@angular/platform-browser-dynamic": "^17.1.0",
"@angular/router": "^17.3.12",
"@capacitor-mlkit/barcode-scanning": "file:../../plugins/capacitor-mlkit/packages/barcode-scanning",
"@capacitor/android": "^8.2.0",
"@capacitor/app": "^8.0.1",
"@capacitor/browser": "^8.0.2",
"@capacitor/cli": "^8.2.0",
"@capacitor/clipboard": "^8.0.1",
"@capacitor/core": "^8.2.0",
"@capacitor/geolocation": "^8.1.0",
"@capacitor/google-maps": "^8.0.1",
"@capacitor/ios": "^8.2.0",
"@capacitor/status-bar": "^8.0.1",
"@capawesome/capacitor-android-edge-to-edge-support": "^8.0.0",
"@googlemaps/markerclusterer": "^2.6.2",
"@ng-bootstrap/ng-bootstrap": "^16.0.0",
"@ng-select/ng-select": "^12.0.7",
"@ngx-translate/core": "^15.0.0",
"@ngx-translate/http-loader": "^8.0.0",
"@popperjs/core": "^2.11.8",
"angularx-flatpickr": "^7.3.0",
"angularx-qrcode": "^17.0.1",
"apexcharts": "^3.45.2",
"barcode-detector": "^3.0.5",
"bootstrap": "^5.3.2",
"deepl-node": "^1.21.0",
"dotenv": "^17.2.3",
"html2canvas": "^1.4.1",
"libphonenumber-js": "^1.11.15",
"ng-apexcharts": "1.10.0",
"ngx-color-picker": "^16.0.0",
"ngx-colors": "^3.5.3",
"ngx-easy-table": "^15.7.0",
"ngx-editor": "^17.5.4",
"ngx-image-compress": "^18.1.5",
"ngx-pull-to-refresh": "^17.0.0",
"ngx-toastr": "^18.0.0",
"overlayscrollbars-ngx": "^0.5.1",
"rxjs": "~7.8.0",
"sass": "^1.70.0",
"tslib": "^2.3.0",
"zone.js": "~0.14.3"
},
"devDependencies": {
"@angular-devkit/build-angular": "^17.1.2",
"@angular/cli": "^17.1.2",
"@angular/compiler-cli": "^17.1.0",
"@capacitor/assets": "^3.0.5",
"@types/cleave.js": "^1.4.12",
"@types/googlemaps": "^3.43.3",
"@types/jasmine": "~5.1.0",
"jasmine-core": "~5.1.0",
"karma": "~6.4.0",
"karma-chrome-launcher": "~3.2.0",
"karma-coverage": "~2.2.0",
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "~2.1.0",
"ts-mockito": "^2.6.1",
"typescript": "^5.3.3"
}
}
gradle-wrapper.prooperties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
min sdk 25
target sdk 35
Hope it willbe useful.