diff --git a/.changes/startIntentSenderForResult.md b/.changes/startIntentSenderForResult.md new file mode 100644 index 000000000000..fa9cc36fa7ef --- /dev/null +++ b/.changes/startIntentSenderForResult.md @@ -0,0 +1,5 @@ +--- +"tauri": patch:enhance +--- + +Add `Plugin#startIntentSenderForResult` Android API for mobile plugins. diff --git a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt index 456ee271f1f4..3a6cde9bf9e4 100644 --- a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt +++ b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt @@ -10,6 +10,7 @@ import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle import android.webkit.WebView +import androidx.activity.result.IntentSenderRequest import androidx.core.app.ActivityCompat import app.tauri.FsUtils import app.tauri.Logger @@ -86,6 +87,21 @@ abstract class Plugin(private val activity: Activity) { handle!!.startActivityForResult(invoke, intent, callbackName) } + /** + * Like startActivityForResult() but taking an IntentSender to describe the activity to be started. + * + * If there is no registered activity callback for the method name passed in, the call will + * be rejected. Make sure a valid activity result callback method is registered using the + * [ActivityCallback] annotation. + * + * @param invoke the invoke object + * @param intentSender the intent used to start an activity + * @param callbackName the name of the callback to run when the launched activity is finished + */ + fun startIntentSenderForResult(invoke: Invoke, intentSender: IntentSenderRequest, callbackName: String) { + handle!!.startIntentSenderForResult(invoke, intentSender, callbackName) + } + /** * Get the plugin log tags. * @param subTags diff --git a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginHandle.kt b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginHandle.kt index ff946bbc75cf..8296c815b8e6 100644 --- a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginHandle.kt +++ b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginHandle.kt @@ -8,6 +8,7 @@ import android.app.Activity import android.content.Intent import android.content.SharedPreferences import android.webkit.WebView +import androidx.activity.result.IntentSenderRequest import androidx.core.app.ActivityCompat import app.tauri.PermissionHelper import app.tauri.PermissionState @@ -46,6 +47,16 @@ class PluginHandle(private val manager: PluginManager, val name: String, val ins } } + fun startIntentSenderForResult(invoke: Invoke, intentSender: IntentSenderRequest, callbackName: String) { + manager.startIntentSenderForResult(intentSender) { result -> + val method = startActivityCallbackMethods[callbackName] + if (method != null) { + method.isAccessible = true + method(instance, invoke, result) + } + } + } + fun requestPermissions( invoke: Invoke, permissions: Array, diff --git a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt index 1b4a3b8ab13c..afa110cb9126 100644 --- a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt +++ b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt @@ -4,12 +4,13 @@ package app.tauri.plugin +import android.app.PendingIntent import android.content.Context import android.content.Intent -import android.os.Bundle import android.webkit.WebView import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.IntentSenderRequest import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import app.tauri.annotation.InvokeArg @@ -33,9 +34,11 @@ class PluginManager(val activity: AppCompatActivity) { private val plugins: HashMap = HashMap() private val startActivityForResultLauncher: ActivityResultLauncher + private val startIntentSenderForResultLauncher: ActivityResultLauncher private val requestPermissionsLauncher: ActivityResultLauncher> private var requestPermissionsCallback: RequestPermissionsCallback? = null private var startActivityForResultCallback: ActivityResultCallback? = null + private var startIntentSenderForResultCallback: ActivityResultCallback? = null private var jsonMapper: ObjectMapper init { @@ -47,6 +50,14 @@ class PluginManager(val activity: AppCompatActivity) { } } + startIntentSenderForResultLauncher = + activity.registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult() + ) { result -> + if (startIntentSenderForResultCallback != null) { + startIntentSenderForResultCallback!!.onResult(result) + } + } + requestPermissionsLauncher = activity.registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions() ) { result -> @@ -89,6 +100,11 @@ class PluginManager(val activity: AppCompatActivity) { startActivityForResultLauncher.launch(intent) } + fun startIntentSenderForResult(intent: IntentSenderRequest, callback: ActivityResultCallback) { + startIntentSenderForResultCallback = callback + startIntentSenderForResultLauncher.launch(intent) + } + fun requestPermissions( permissionStrings: Array, callback: RequestPermissionsCallback