diff --git a/packages/core/ui/action-bar/index.android.ts b/packages/core/ui/action-bar/index.android.ts index 126e443572..fd0366af3c 100644 --- a/packages/core/ui/action-bar/index.android.ts +++ b/packages/core/ui/action-bar/index.android.ts @@ -164,8 +164,44 @@ export class ActionBar extends ActionBarBase { } public createNativeView() { - return new androidx.appcompat.widget.Toolbar(this._context); - } + const toolbar = new androidx.appcompat.widget.Toolbar(this._context); + + // --- PATCH: Fix ActionBar overlaying status bar on Android 16+ --- + try { + const apiLevel = android.os.Build.VERSION.SDK_INT; + if (apiLevel >= 29) { + toolbar.setFitsSystemWindows(true); + + toolbar.setOnApplyWindowInsetsListener( + new android.view.View.OnApplyWindowInsetsListener({ + onApplyWindowInsets(view, insets) { + try { + const topInset = (typeof insets.getSystemWindowInsetTop === "function") + ? insets.getSystemWindowInsetTop() + : (insets.getInsets ? insets.getInsets(android.view.WindowInsets.Type.statusBars()).top : 0); + + view.setPadding( + view.getPaddingLeft(), + topInset, + view.getPaddingRight(), + view.getPaddingBottom() + ); + } catch (e) { + console.log("ActionBar inset patch error:", e); + } + return insets; + } + }) + ); + } + } catch (err) { + console.log("Failed to apply ActionBar status bar fix:", err); + } + // --- END PATCH --- + + return toolbar; +} + public initNativeView(): void { super.initNativeView(); diff --git a/packages/core/ui/frame/frame-common.ts b/packages/core/ui/frame/frame-common.ts index 33edd741c1..e53251374d 100644 --- a/packages/core/ui/frame/frame-common.ts +++ b/packages/core/ui/frame/frame-common.ts @@ -427,25 +427,43 @@ export class FrameBase extends CustomLayoutView { @profile public performNavigation(navigationContext: NavigationContext) { - this._executingContext = navigationContext; - - const backstackEntry = navigationContext.entry; - const isBackNavigation = navigationContext.navigationType === NavigationType.back; - this._onNavigatingTo(backstackEntry, isBackNavigation); - const navigationTransition = this._getNavigationTransition(backstackEntry.entry); - if (navigationTransition?.instance) { - const state = SharedTransition.getState(navigationTransition?.instance.id); - SharedTransition.updateState(navigationTransition?.instance.id, { - // Allow setting custom page context to override default (from) page - // helpful for deeply nested frame navigation setups (eg: Nested Tab Navigation) - // when sharing elements in this condition, the (from) page would - // get overridden on each frame preventing shared element matching - page: state?.page || this.currentPage, - toPage: this, - }); - } - this._navigateCore(backstackEntry); - } + this._executingContext = navigationContext; + + const backstackEntry = navigationContext.entry; + const isBackNavigation = navigationContext.navigationType === NavigationType.Back; + + // --- PATCH START --- + try { + const entryContext = backstackEntry?.entry?.context; + const entryBindingContext = backstackEntry?.entry?.bindingContext; + const resolvedPage = backstackEntry?.resolvedPage; + + if (resolvedPage && entryContext !== undefined && entryContext !== null) { + (resolvedPage as any)._navigationContext = entryContext; + + if (entryBindingContext == null && resolvedPage.bindingContext == null) { + try { + resolvedPage.bindingContext = entryContext; + } catch (_) {} + } + } + } catch (_) {} + // --- PATCH END --- + + this._onNavigatingTo(backstackEntry, isBackNavigation); + + const navigationTransition = this._getNavigationTransition(backstackEntry); + if (navigationTransition?.instance) { + const state = SharedTransition.getState(navigationTransition?.instance.id); + SharedTransition.updateState(navigationTransition?.instance.id, { + page: state?.page || this.currentPage, + toPage: this, + }); + } + + this._navigateCore(backstackEntry); +} + @profile performGoBack(navigationContext: NavigationContext) {