diff --git a/crates/ability/src/app.rs b/crates/ability/src/app.rs index 46f80a1..c5d1936 100644 --- a/crates/ability/src/app.rs +++ b/crates/ability/src/app.rs @@ -490,6 +490,16 @@ impl OpenHarmonyApp { self.back_press_interceptor.replace(Some(static_handler)); } + + /// Get back press interceptor result + /// Returns true to intercept back press, false to pass through + pub fn get_back_press_interceptor(&self) -> bool { + self.back_press_interceptor + .borrow_mut() + .as_mut() + .map(|h| h()) + .unwrap_or(true) + } } impl Default for OpenHarmonyApp { diff --git a/crates/ability/src/lifecycle.rs b/crates/ability/src/lifecycle.rs index ff3bdf0..dde19af 100644 --- a/crates/ability/src/lifecycle.rs +++ b/crates/ability/src/lifecycle.rs @@ -21,7 +21,6 @@ pub struct EnvironmentCallback<'a> { pub struct WindowStageEventCallback<'a> { pub on_window_stage_create: Function<'a, (), ()>, pub on_window_stage_destroy: Function<'a, (), ()>, - pub on_back_press_intercept: Function<'a, (), bool>, pub on_ability_create: Function<'a, (), ()>, pub on_ability_destroy: Function<'a, (), ()>, pub on_ability_save_state: Function<'a, (), ()>, @@ -232,18 +231,6 @@ pub fn create_lifecycle_handle<'a>( Ok(()) })?; - let on_back_press_intercept_app = app.clone(); - let on_back_press_intercept = - env.create_function_from_closure("on_back_press_intercept", move |_ctx| { - let intercept = on_back_press_intercept_app - .back_press_interceptor - .borrow_mut() - .as_mut() - .map(|h| h()) - .unwrap_or(true); - Ok(intercept) - })?; - let on_ability_create_app = app.clone(); let on_ability_create = env.create_function_from_closure("on_ability_create", move |_ctx| { if let Some(ref mut h) = *on_ability_create_app.event_loop.borrow_mut() { @@ -306,7 +293,6 @@ pub fn create_lifecycle_handle<'a>( window_stage_event_callback: WindowStageEventCallback { on_window_stage_create, on_window_stage_destroy, - on_back_press_intercept, on_ability_create, on_ability_destroy, on_ability_save_state, diff --git a/crates/derive/src/lib.rs b/crates/derive/src/lib.rs index 7034505..de16c56 100644 --- a/crates/derive/src/lib.rs +++ b/crates/derive/src/lib.rs @@ -153,6 +153,14 @@ pub fn ability(attr: TokenStream, item: TokenStream) -> TokenStream { #protocol_registrations_apply + /// Get back press interceptor result + /// Can be called from ArkTS page lifecycle (onBackPress) + /// Returns true to intercept back press, false to pass through + #[napi_derive_ohos::napi] + pub fn on_back_press_intercept() -> bool { + (*APP).get_back_press_interceptor() + } + #[napi_derive_ohos::napi] pub fn init<'a>( env: &'a napi_ohos::Env, diff --git a/package/CHANGELOG.md b/package/CHANGELOG.md index 971c53d..135810f 100644 --- a/package/CHANGELOG.md +++ b/package/CHANGELOG.md @@ -1,3 +1,7 @@ +# 0.4.0-beta.4 +- Fix onBackPress trigger logic + +--- # 0.4.0-beta.3 - Add avoidArea event - Add onBackPress event diff --git a/package/oh-package.json5 b/package/oh-package.json5 index c3551e7..3b930aa 100644 --- a/package/oh-package.json5 +++ b/package/oh-package.json5 @@ -4,7 +4,7 @@ "name": "@ohos-rs/ability", "description": "Adaptor for OpenHarmony/HarmonyNext Application with Rust", "main": "index.ets", - "version": "0.4.0-beta.3", + "version": "0.4.0-beta.4", "repository": "https://github.com/harmony-contrib/openharmony-ability.git", "dependencies": {}, "keywords": [ diff --git a/rust_ability/ability_rust/src/main/ets/ability/RustAbility.ets b/rust_ability/ability_rust/src/main/ets/ability/RustAbility.ets index f65ea05..0d3aea7 100644 --- a/rust_ability/ability_rust/src/main/ets/ability/RustAbility.ets +++ b/rust_ability/ability_rust/src/main/ets/ability/RustAbility.ets @@ -100,9 +100,4 @@ export class RustAbility extends UIAbility { wantParam[STATE_KEY] = ret as string; return AbilityConstant.OnSaveResult.RECOVERY_AGREE; } - - onBackPress(): boolean { - const intercept = this.lifecycle?.windowStageEventCallback.onBackPressIntercept(); - return intercept ?? true; - } } diff --git a/rust_ability/ability_rust/src/main/ets/ability/type.ets b/rust_ability/ability_rust/src/main/ets/ability/type.ets index 8bc7b97..b3445f8 100644 --- a/rust_ability/ability_rust/src/main/ets/ability/type.ets +++ b/rust_ability/ability_rust/src/main/ets/ability/type.ets @@ -18,7 +18,6 @@ export interface KeyboardCallback { export interface WindowStageEventCallback { onWindowStageCreate: () => void; onWindowStageDestroy: () => void; - onBackPressIntercept: () => boolean; onAbilityCreate: (arg: string) => void; onAbilityDestroy: () => void; onAbilitySaveState: () => string; diff --git a/rust_ability/ability_rust/src/main/ets/components/MainPage.ets b/rust_ability/ability_rust/src/main/ets/components/MainPage.ets index cb9b691..f419152 100644 --- a/rust_ability/ability_rust/src/main/ets/components/MainPage.ets +++ b/rust_ability/ability_rust/src/main/ets/components/MainPage.ets @@ -1,10 +1,27 @@ import { DefaultXComponent } from "./DefaultXComponent"; +import { Loadable } from "../helper/loadable"; export const RouteName = "RustAbility"; @Entry({ routeName: RouteName }) @Component struct Index { + @StorageProp("moduleName") name: string = ""; + private nativeModule: ESObject = null; + + async aboutToAppear(): Promise { + const moduleName = `lib${this.name}.so`; + this.nativeModule = await Loadable.load(moduleName, "async"); + } + + onBackPress(): boolean { + // Call the back press interceptor from Rust + if (typeof this.nativeModule?.on_back_press_intercept === "function") { + return this.nativeModule.on_back_press_intercept(); + } + return false; + } + build() { Row() { Column() {