From e769299289d93afea70278b9fb75a7fc4068a36c Mon Sep 17 00:00:00 2001 From: Dimitris - Rafail Katsampas Date: Mon, 8 Dec 2025 18:07:30 +0200 Subject: [PATCH] fix(android): Android 16 back press navigation failure --- packages/core/ui/frame/index.android.ts | 47 +++++++++++-------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/packages/core/ui/frame/index.android.ts b/packages/core/ui/frame/index.android.ts index 3dfaa70450..b76a6fd80b 100644 --- a/packages/core/ui/frame/index.android.ts +++ b/packages/core/ui/frame/index.android.ts @@ -17,7 +17,7 @@ import { AndroidActivityBackPressedEventData, AndroidActivityNewIntentEventData, import { Application } from '../../application/application'; import { isEmbedded, setEmbeddedView } from '../embedding'; import { CALLBACKS, FRAMEID, framesCache, setFragmentCallbacks } from './frame-helper-for-android'; -import { Device } from '../../platform'; +import { SDK_VERSION } from '../../utils'; export * from './frame-common'; export { setFragmentClass } from './fragment'; @@ -765,34 +765,28 @@ function startActivity(activity: androidx.appcompat.app.AppCompatActivity, frame let OnBackPressedCallback; -if (parseInt(Device.sdkVersion) >= 33) { +if (SDK_VERSION >= 33) { OnBackPressedCallback = (androidx.activity.OnBackPressedCallback).extend('com.tns.OnBackPressedCallback', { handleOnBackPressed() { if (Trace.isEnabled()) { Trace.write('NativeScriptActivity.onBackPressed;', Trace.categories.NativeLifecycle); } - const activity = this['_activity']?.get(); - + const activity = this['_activity']?.get() as androidx.appcompat.app.AppCompatActivity; if (!activity) { if (Trace.isEnabled()) { Trace.write('NativeScriptActivity.onBackPressed; Activity is null, calling super', Trace.categories.NativeLifecycle); } this.setEnabled(false); - return; } const args = { eventName: 'activityBackPressed', - object: Application, - android: Application.android, - activity: activity, - cancel: false, }; @@ -802,33 +796,32 @@ if (parseInt(Device.sdkVersion) >= 33) { return; } - const view = activity._rootView; - - let callSuper = false; + const callbacks: AndroidActivityCallbacks = activity[CALLBACKS]; + let callSuper: boolean = false; - const viewArgs = { - eventName: 'activityBackPressed', + if (callbacks) { + const view = callbacks.getRootView(); - object: view, + if (view) { + const viewArgs = { + eventName: 'activityBackPressed', + object: view, + activity: activity, + cancel: false, + }; - activity: activity, + view.notify(viewArgs); - cancel: false, - }; - - view?.notify(viewArgs); - - // In the case of Frame, use this callback only if it was overridden, since the original will cause navigation issues - - if (!viewArgs.cancel && (view?.onBackPressed === Frame.prototype.onBackPressed || !view?.onBackPressed())) { - callSuper = view instanceof Frame ? !Frame.goBack() : true; + // In the case of Frame, use this callback only if it was overridden, since the original will cause navigation issues + if (!viewArgs.cancel && (view.onBackPressed === Frame.prototype.onBackPressed || !view.onBackPressed())) { + callSuper = view instanceof Frame ? !Frame.goBack() : true; + } + } } if (callSuper) { this.setEnabled(false); - activity.getOnBackPressedDispatcher().onBackPressed(); - this.setEnabled(true); } },