From d09a564296669dcffd03cd32b18f7a6454c7c472 Mon Sep 17 00:00:00 2001 From: Martin Guillon Date: Mon, 28 Dec 2020 13:47:00 +0100 Subject: [PATCH] fix: android modal not following activity windowSoftInputMode (#9042) * fix android modal not following activity windowSoftInputMode Also added an android modal parameter to set a custom windowSoftInputMode * fix softInputMode set too soon * Update packages/core/ui/core/view/index.android.ts Co-authored-by: Igor Randjelovic * Update packages/core/ui/core/view-base/index.d.ts Co-authored-by: Igor Randjelovic * Update packages/core/ui/core/view-base/index.ts Co-authored-by: Igor Randjelovic Co-authored-by: Igor Randjelovic --- packages/core/ui/core/view-base/index.d.ts | 5 +++++ packages/core/ui/core/view-base/index.ts | 6 ++++++ packages/core/ui/core/view/index.android.ts | 24 ++++++++++++++++++--- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/packages/core/ui/core/view-base/index.d.ts b/packages/core/ui/core/view-base/index.d.ts index 4e7313dbd..1c88ea81b 100644 --- a/packages/core/ui/core/view-base/index.d.ts +++ b/packages/core/ui/core/view-base/index.d.ts @@ -83,6 +83,11 @@ export interface ShowModalOptions { * An optional parameter specifying whether the modal view can be dismissed when not in full-screen mode. */ cancelable?: boolean; + /** + * An optional parameter specifying the windowSoftInputMode of the dialog window + * For possible values see https://developer.android.com/reference/android/view/WindowManager.LayoutParams#softInputMode + */ + windowSoftInputMode?: number; }; /** * An optional parameter specifying whether the modal view can be dismissed when not in full-screen mode. diff --git a/packages/core/ui/core/view-base/index.ts b/packages/core/ui/core/view-base/index.ts index 67e4010b0..39a585c24 100644 --- a/packages/core/ui/core/view-base/index.ts +++ b/packages/core/ui/core/view-base/index.ts @@ -87,6 +87,12 @@ export interface ShowModalOptions { * An optional parameter specifying whether the modal view can be dismissed when not in full-screen mode. */ cancelable?: boolean; + + /** + * An optional parameter specifying the windowSoftInputMode of the dialog window. + * For possible values see https://developer.android.com/reference/android/view/WindowManager.LayoutParams#softInputMode + */ + windowSoftInputMode?: number; }; /** * An optional parameter specifying whether the modal view can be dismissed when not in full-screen mode. diff --git a/packages/core/ui/core/view/index.android.ts b/packages/core/ui/core/view/index.android.ts index 0a3e50b7b..fe7b0b7d4 100644 --- a/packages/core/ui/core/view/index.android.ts +++ b/packages/core/ui/core/view/index.android.ts @@ -76,6 +76,7 @@ interface DialogOptions { animated: boolean; stretched: boolean; cancelable: boolean; + windowSoftInputMode: number; shownCallback: () => void; dismissCallback: () => void; } @@ -168,6 +169,7 @@ function initializeDialogFragment() { class DialogFragmentImpl extends androidx.fragment.app.DialogFragment { public owner: View; private _fullscreen: boolean; + private _windowSoftInputMode: number; private _animated: boolean; private _stretched: boolean; private _cancelable: boolean; @@ -192,6 +194,7 @@ function initializeDialogFragment() { this._stretched = options.stretched; this._dismissCallback = options.dismissCallback; this._shownCallback = options.shownCallback; + this._windowSoftInputMode = options.windowSoftInputMode; this.setStyle(androidx.fragment.app.DialogFragment.STYLE_NO_TITLE, 0); let theme = this.getTheme(); @@ -229,6 +232,16 @@ function initializeDialogFragment() { owner._setupAsRootView(this.getActivity()); owner._isAddedToNativeVisualTree = true; + // we need to set the window SoftInputMode here. + // it wont work is set in onStart + const window = this.getDialog().getWindow(); + if (this._windowSoftInputMode !== undefined) { + window.setSoftInputMode(this._windowSoftInputMode); + } else { + // the dialog seems to not follow the default activity softInputMode, + // thus set we set it here. + window.setSoftInputMode((owner._context).getWindow().getAttributes().softInputMode); + } return owner.nativeViewProtected; } @@ -672,10 +685,14 @@ export class View extends ViewCommon { df.setArguments(args); let cancelable = true; + let windowSoftInputMode: number; - if (options.android && (options).android.cancelable !== undefined) { - cancelable = !!(options).android.cancelable; - console.log('ShowModalOptions.android.cancelable is deprecated. Use ShowModalOptions.cancelable instead.'); + if (options.android) { + if ((options).android.cancelable !== undefined) { + cancelable = !!(options).android.cancelable; + console.log('ShowModalOptions.android.cancelable is deprecated. Use ShowModalOptions.cancelable instead.'); + } + windowSoftInputMode = (options).android.windowSoftInputMode; } cancelable = options.cancelable !== undefined ? !!options.cancelable : cancelable; @@ -686,6 +703,7 @@ export class View extends ViewCommon { animated: !!options.animated, stretched: !!options.stretched, cancelable: cancelable, + windowSoftInputMode: windowSoftInputMode, shownCallback: () => this._raiseShownModallyEvent(), dismissCallback: () => this.closeModal(), };