diff --git a/.changes/android-activity-lifecycle.md b/.changes/android-activity-lifecycle.md index a825f3300..490614318 100644 --- a/.changes/android-activity-lifecycle.md +++ b/.changes/android-activity-lifecycle.md @@ -2,4 +2,19 @@ "wry": minor --- -Updated Android lifecycle JNI calls to pass the `WryActivity` instance for `start`, `resume`, `pause`, and `stop`, allowing Tao to emit window-specific lifecycle events. +Updated Android lifecycle JNI calls in `WryActivity` for Tao 0.36's renames: + +> - `create` to `onFirstActivityCreate` +> - `onActivityCreate` to `onCreate` +> - `start` to `onStart` +> - `resume` to `onResume` +> - `pause` to `onPause` +> - `stop` to `onStop` +> - Removed `onActivitySaveInstanceState` +> - `onActivityDestroy` to `onDestroy` +> - `onActivityLowMemory` to `onLowMemory` +> +> `onLowMemory` no longer takes any parameters. +> `onFirstActivityCreate` no longer takes any parameters. + +and also emitting them as window-specific events. diff --git a/Cargo.lock b/Cargo.lock index 3bbdd19fd..d7e9383bb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2809,9 +2809,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.35.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cf65722394c2ac443e80120064987f8914ee1d4e4e36e63cdf10f2990f01159" +checksum = "e9fa4618f999c4249db1681cba0a19b890718f274de7fa93c445d46bd3a8a999" dependencies = [ "bitflags 2.8.0", "block2 0.6.2", @@ -2829,6 +2829,7 @@ dependencies = [ "libc", "log", "ndk", + "ndk-context", "ndk-sys 0.6.0+11769913", "objc2 0.6.4", "objc2-app-kit 0.3.2", @@ -2849,9 +2850,9 @@ dependencies = [ [[package]] name = "tao-macros" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +checksum = "5f7eeb6d99155545da6150a1795945f16ac9c178deb2a5f2e74d776107bd5849" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 1d7b8be95..29a682218 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -196,13 +196,13 @@ sha2 = "0.10" base64 = "0.22" jni = "0.21" ndk = "0.9" -tao-macros = "0.1" +tao-macros = "0.1.4" libc = "0.2" dom_query = { version = "0.28.0", default-features = false } [dev-dependencies] pollster = "1.0.0" -tao = "0.35" +tao = "0.36" wgpu = "23" winit = "0.30" getrandom = "0.3" diff --git a/src/android/binding.rs b/src/android/binding.rs index fc2041a4f..552b1b6d1 100644 --- a/src/android/binding.rs +++ b/src/android/binding.rs @@ -35,7 +35,7 @@ macro_rules! android_binding { ($domain:ident, $package:ident, $wry:path) => {{ use $wry::{android_setup as _, prelude::*}; - android_fn!($domain, $package, Rust, wryCreate, []); + android_fn!($domain, $package, Rust, onFirstActivityCreateWry, []); android_fn!( $domain, $package, @@ -274,7 +274,7 @@ fn handle_request( } #[allow(non_snake_case)] -pub unsafe fn wryCreate(env: JNIEnv, _: JClass) { +pub unsafe fn onFirstActivityCreateWry(env: JNIEnv, _: JClass) { let mut main_pipe = MainPipe { env }; let looper = ThreadLooper::for_thread().unwrap(); diff --git a/src/android/kotlin/Rust.kt b/src/android/kotlin/Rust.kt index f10f47d58..f05ec7dbe 100644 --- a/src/android/kotlin/Rust.kt +++ b/src/android/kotlin/Rust.kt @@ -16,20 +16,19 @@ object Rust { System.loadLibrary("{{library}}") } - @JvmStatic external fun onActivityCreate(activity: WryActivity) - @JvmStatic external fun onActivityDestroy(activity: WryActivity) - @JvmStatic external fun onActivitySaveInstanceState() - @JvmStatic external fun onActivityLowMemory() + // Tao bindings + @JvmStatic external fun onFirstActivityCreate() + @JvmStatic external fun onCreate(activity: WryActivity) + @JvmStatic external fun onStart(activity: WryActivity) + @JvmStatic external fun onResume(activity: WryActivity) + @JvmStatic external fun onPause(activity: WryActivity) + @JvmStatic external fun onStop(activity: WryActivity) + @JvmStatic external fun onDestroy(activity: WryActivity) @JvmStatic external fun onWindowFocusChanged(activity: WryActivity, focus: Boolean) + @JvmStatic external fun onLowMemory() @JvmStatic external fun onNewIntent(intent: Intent) - @JvmStatic external fun create() - @JvmStatic external fun start(activity: WryActivity) - @JvmStatic external fun resume(activity: WryActivity) - @JvmStatic external fun pause(activity: WryActivity) - @JvmStatic external fun stop(activity: WryActivity) - - @JvmStatic external fun wryCreate() + @JvmStatic external fun onFirstActivityCreateWry() @JvmStatic external fun onWebviewDestroy(activity: WryActivity, webviewId: String) @JvmStatic external fun ipc(webviewId: String, url: String, message: String) diff --git a/src/android/kotlin/WryActivity.kt b/src/android/kotlin/WryActivity.kt index db38174db..06e872d28 100644 --- a/src/android/kotlin/WryActivity.kt +++ b/src/android/kotlin/WryActivity.kt @@ -9,10 +9,8 @@ import android.content.Intent import android.os.Build import android.os.Bundle import android.webkit.WebView -import android.view.KeyEvent import androidx.activity.OnBackPressedCallback import androidx.activity.result.ActivityResult -import androidx.activity.result.ActivityResultCallback import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity @@ -20,13 +18,14 @@ import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ProcessLifecycleOwner -private val ACTIVITY_ID_KEY = "__wryActivityId" +private const val ACTIVITY_ID_KEY = "__wryActivityId" object WryLifecycleObserver : DefaultLifecycleObserver { + // This only runs once: https://developer.android.com/reference/androidx/lifecycle/ProcessLifecycleOwner override fun onCreate(owner: LifecycleOwner) { super.onCreate(owner) - Rust.create() - Rust.wryCreate() + Rust.onFirstActivityCreate() + Rust.onFirstActivityCreateWry() } } @@ -125,13 +124,13 @@ abstract class WryActivity : AppCompatActivity() { activityListener?.invoke(result) } + Rust.onCreate(this) ProcessLifecycleOwner.get().lifecycle.addObserver(WryLifecycleObserver) - Rust.onActivityCreate(this) } override fun onStart() { super.onStart() - Rust.start(this) + Rust.onStart(this) } override fun onWindowFocusChanged(hasFocus: Boolean) { @@ -142,12 +141,11 @@ abstract class WryActivity : AppCompatActivity() { override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putInt(ACTIVITY_ID_KEY, id) - Rust.onActivitySaveInstanceState() } override fun onPause() { super.onPause() - Rust.pause(this) + Rust.onPause(this) if (::mWebView.isInitialized) { mWebView.onPause() } @@ -155,7 +153,7 @@ abstract class WryActivity : AppCompatActivity() { override fun onResume() { super.onResume() - Rust.resume(this) + Rust.onResume(this) if (::mWebView.isInitialized) { mWebView.onResume() } @@ -163,18 +161,18 @@ abstract class WryActivity : AppCompatActivity() { override fun onStop() { super.onStop() - Rust.stop(this) + Rust.onStop(this) } override fun onDestroy() { super.onDestroy() - Rust.onActivityDestroy(this) + Rust.onDestroy(this) Rust.onWebviewDestroy(this, if (::mWebView.isInitialized) { mWebView.id } else { "" }) } override fun onLowMemory() { super.onLowMemory() - Rust.onActivityLowMemory() + Rust.onLowMemory() } override fun onNewIntent(intent: Intent) { @@ -186,6 +184,7 @@ abstract class WryActivity : AppCompatActivity() { return Class.forName(name) } + // Called by tao through JNI fun startActivity(cls: Class<*>): Int { val intent = Intent(this, cls) val id = kotlin.random.Random.nextInt() diff --git a/src/android/mod.rs b/src/android/mod.rs index 967fa114a..00cd1e6ab 100644 --- a/src/android/mod.rs +++ b/src/android/mod.rs @@ -105,6 +105,10 @@ pub fn destroy_webview(activity_id: ActivityId, webview_id: &WebviewId) { /// /// This function must be run on the thread where the [`JNIEnv`] is registered and the looper is local, /// hence the requirement for a [`ThreadLooper`]. +/// +/// When used with tao, this is usually passed in like +/// `tao::android_binding!($domain, $app_name, $activity, android_setup, $main)` +/// to fill in `on_activity_create` which is run at the end of `onCreate` of an activiy pub unsafe fn android_setup( package: &str, mut env: JNIEnv,