-
Notifications
You must be signed in to change notification settings - Fork 0
Coder Agent: Fix an Android SDK bug where tapping the chat text input field causes the chat UI to crash into a lo #23
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -7,6 +7,7 @@ | |||||||||||||||||||||||||||||||
| import android.content.Intent; | ||||||||||||||||||||||||||||||||
| import android.content.pm.ActivityInfo; | ||||||||||||||||||||||||||||||||
| import android.content.pm.PackageManager; | ||||||||||||||||||||||||||||||||
| import android.content.res.Configuration; | ||||||||||||||||||||||||||||||||
| import android.graphics.Bitmap; | ||||||||||||||||||||||||||||||||
| import android.graphics.BitmapFactory; | ||||||||||||||||||||||||||||||||
| import android.graphics.Color; | ||||||||||||||||||||||||||||||||
|
|
@@ -197,6 +198,11 @@ public void handleOnBackPressed() { | |||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| this.requestWindowFeature(Window.FEATURE_NO_TITLE); | ||||||||||||||||||||||||||||||||
| try { | ||||||||||||||||||||||||||||||||
| // SOFT_INPUT_ADJUST_RESIZE is deprecated on API 30+ but still honoured | ||||||||||||||||||||||||||||||||
| // for apps that target SDK < 35 (this SDK targets 33). Setting it | ||||||||||||||||||||||||||||||||
| // unconditionally ensures the window shrinks for the keyboard on every | ||||||||||||||||||||||||||||||||
| // device – including Android 16 / Samsung One UI 8.0 – so the WebView | ||||||||||||||||||||||||||||||||
| // content remains visible without needing a separate IME-insets handler. | ||||||||||||||||||||||||||||||||
| getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); | ||||||||||||||||||||||||||||||||
| if (getSupportActionBar() != null) { | ||||||||||||||||||||||||||||||||
| getSupportActionBar().hide(); | ||||||||||||||||||||||||||||||||
|
|
@@ -214,25 +220,24 @@ public void handleOnBackPressed() { | |||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| final FrameLayout webViewContainer = findViewById(R.id.webview_container); | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| // Handle system-bar insets (status bar, navigation bar) so the | ||||||||||||||||||||||||||||||||
| // WebView content is not drawn behind them. We intentionally | ||||||||||||||||||||||||||||||||
| // do NOT include IME insets here: the keyboard resize is fully | ||||||||||||||||||||||||||||||||
| // handled by SOFT_INPUT_ADJUST_RESIZE which shrinks the window | ||||||||||||||||||||||||||||||||
| // itself. Adding IME padding on top of that would double-shift | ||||||||||||||||||||||||||||||||
| // the content -- the root cause of the blank-screen-on-keyboard | ||||||||||||||||||||||||||||||||
| // bug on Android 16 / Samsung One UI 8.0. | ||||||||||||||||||||||||||||||||
| ViewCompat.setOnApplyWindowInsetsListener(webViewContainer, | ||||||||||||||||||||||||||||||||
| (view, insets) -> { | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| // status + navigation bars (stable system bars) | ||||||||||||||||||||||||||||||||
| Insets bars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| // on Android 11+ this is the real keyboard height; | ||||||||||||||||||||||||||||||||
| // on older versions it’s 0 – but then the IME is reported as a system‑bar inset | ||||||||||||||||||||||||||||||||
| Insets ime = insets.getInsets(WindowInsetsCompat.Type.ime()); | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| int topInset = bars.top; // keep the status‑bar height | ||||||||||||||||||||||||||||||||
| int bottomInset = Math.max(bars.bottom, ime.bottom); // choose the larger of nav‑bar or IME | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| view.setPadding(view.getPaddingLeft(), | ||||||||||||||||||||||||||||||||
| topInset, | ||||||||||||||||||||||||||||||||
| bars.top, | ||||||||||||||||||||||||||||||||
| view.getPaddingRight(), | ||||||||||||||||||||||||||||||||
| bottomInset); | ||||||||||||||||||||||||||||||||
| bars.bottom); | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| return insets; // DON’T consume – let child views see the same insets | ||||||||||||||||||||||||||||||||
| return insets; | ||||||||||||||||||||||||||||||||
| }); | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| int backgroundColor = Color.parseColor(GleapConfig.getInstance().getBackgroundColor()); | ||||||||||||||||||||||||||||||||
|
|
@@ -285,9 +290,19 @@ public void invoke() { | |||||||||||||||||||||||||||||||
| @Override | ||||||||||||||||||||||||||||||||
| public void run() { | ||||||||||||||||||||||||||||||||
| url += GleapURLGenerator.generateURL(); | ||||||||||||||||||||||||||||||||
| initBrowser(); | ||||||||||||||||||||||||||||||||
| if (savedInstanceState != null) { | ||||||||||||||||||||||||||||||||
| webView.restoreState(savedInstanceState); | ||||||||||||||||||||||||||||||||
| // Activity was recreated (e.g. process killed in background). | ||||||||||||||||||||||||||||||||
| // Set up WebView clients/settings but skip loading a new URL; | ||||||||||||||||||||||||||||||||
| // restoreState will navigate back to the previous page. | ||||||||||||||||||||||||||||||||
| initBrowserSettings(); | ||||||||||||||||||||||||||||||||
| android.webkit.WebBackForwardList restored = webView.restoreState(savedInstanceState); | ||||||||||||||||||||||||||||||||
| if (restored == null) { | ||||||||||||||||||||||||||||||||
| // restoreState failed — fall back to a full reload. | ||||||||||||||||||||||||||||||||
| webView.loadUrl(url); | ||||||||||||||||||||||||||||||||
|
Comment on lines
+299
to
+301
|
||||||||||||||||||||||||||||||||
| if (restored == null) { | |
| // restoreState failed — fall back to a full reload. | |
| webView.loadUrl(url); | |
| if (restored == null || restored.getSize() == 0) { | |
| // restoreState failed — fall back to a full reload. | |
| webView.loadUrl(url); | |
| } else { | |
| // Successfully restored a previous page. Ensure that the | |
| // WebView is visible and the loader is hidden, since the | |
| // restored content might not re-emit the JS "ping". | |
| webView.setVisibility(View.VISIBLE); | |
| View loader = findViewById(R.id.loader); | |
| if (loader != null) { | |
| loader.setVisibility(View.GONE); | |
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The activity now claims to handle a very broad set of
configChanges(includingdensityanduiMode). When these are listed, Android will not recreate the Activity and will also not automatically re-apply updated resources for those configuration changes, which can cause incorrect theming/scaling after dark-mode changes or display-size/density changes. Consider narrowing this list to only the minimum needed to prevent the keyboard-related recreation (and leave other changes to the default recreation behavior).