Skip to content

Commit f2c94aa

Browse files
authored
feat(core): add startIntentSenderForResult Android API for plugins (#12682)
1 parent cefefa9 commit f2c94aa

File tree

4 files changed

+49
-1
lines changed

4 files changed

+49
-1
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"tauri": patch:enhance
3+
---
4+
5+
Add `Plugin#startIntentSenderForResult` Android API for mobile plugins.

crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import android.content.pm.PackageManager
1010
import android.net.Uri
1111
import android.os.Bundle
1212
import android.webkit.WebView
13+
import androidx.activity.result.IntentSenderRequest
1314
import androidx.core.app.ActivityCompat
1415
import app.tauri.FsUtils
1516
import app.tauri.Logger
@@ -86,6 +87,21 @@ abstract class Plugin(private val activity: Activity) {
8687
handle!!.startActivityForResult(invoke, intent, callbackName)
8788
}
8889

90+
/**
91+
* Like startActivityForResult() but taking an IntentSender to describe the activity to be started.
92+
*
93+
* If there is no registered activity callback for the method name passed in, the call will
94+
* be rejected. Make sure a valid activity result callback method is registered using the
95+
* [ActivityCallback] annotation.
96+
*
97+
* @param invoke the invoke object
98+
* @param intentSender the intent used to start an activity
99+
* @param callbackName the name of the callback to run when the launched activity is finished
100+
*/
101+
fun startIntentSenderForResult(invoke: Invoke, intentSender: IntentSenderRequest, callbackName: String) {
102+
handle!!.startIntentSenderForResult(invoke, intentSender, callbackName)
103+
}
104+
89105
/**
90106
* Get the plugin log tags.
91107
* @param subTags

crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginHandle.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import android.app.Activity
88
import android.content.Intent
99
import android.content.SharedPreferences
1010
import android.webkit.WebView
11+
import androidx.activity.result.IntentSenderRequest
1112
import androidx.core.app.ActivityCompat
1213
import app.tauri.PermissionHelper
1314
import app.tauri.PermissionState
@@ -46,6 +47,16 @@ class PluginHandle(private val manager: PluginManager, val name: String, val ins
4647
}
4748
}
4849

50+
fun startIntentSenderForResult(invoke: Invoke, intentSender: IntentSenderRequest, callbackName: String) {
51+
manager.startIntentSenderForResult(intentSender) { result ->
52+
val method = startActivityCallbackMethods[callbackName]
53+
if (method != null) {
54+
method.isAccessible = true
55+
method(instance, invoke, result)
56+
}
57+
}
58+
}
59+
4960
fun requestPermissions(
5061
invoke: Invoke,
5162
permissions: Array<String>,

crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44

55
package app.tauri.plugin
66

7+
import android.app.PendingIntent
78
import android.content.Context
89
import android.content.Intent
9-
import android.os.Bundle
1010
import android.webkit.WebView
1111
import androidx.activity.result.ActivityResult
1212
import androidx.activity.result.ActivityResultLauncher
13+
import androidx.activity.result.IntentSenderRequest
1314
import androidx.activity.result.contract.ActivityResultContracts
1415
import androidx.appcompat.app.AppCompatActivity
1516
import app.tauri.annotation.InvokeArg
@@ -33,9 +34,11 @@ class PluginManager(val activity: AppCompatActivity) {
3334

3435
private val plugins: HashMap<String, PluginHandle> = HashMap()
3536
private val startActivityForResultLauncher: ActivityResultLauncher<Intent>
37+
private val startIntentSenderForResultLauncher: ActivityResultLauncher<IntentSenderRequest>
3638
private val requestPermissionsLauncher: ActivityResultLauncher<Array<String>>
3739
private var requestPermissionsCallback: RequestPermissionsCallback? = null
3840
private var startActivityForResultCallback: ActivityResultCallback? = null
41+
private var startIntentSenderForResultCallback: ActivityResultCallback? = null
3942
private var jsonMapper: ObjectMapper
4043

4144
init {
@@ -47,6 +50,14 @@ class PluginManager(val activity: AppCompatActivity) {
4750
}
4851
}
4952

53+
startIntentSenderForResultLauncher =
54+
activity.registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()
55+
) { result ->
56+
if (startIntentSenderForResultCallback != null) {
57+
startIntentSenderForResultCallback!!.onResult(result)
58+
}
59+
}
60+
5061
requestPermissionsLauncher =
5162
activity.registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()
5263
) { result ->
@@ -89,6 +100,11 @@ class PluginManager(val activity: AppCompatActivity) {
89100
startActivityForResultLauncher.launch(intent)
90101
}
91102

103+
fun startIntentSenderForResult(intent: IntentSenderRequest, callback: ActivityResultCallback) {
104+
startIntentSenderForResultCallback = callback
105+
startIntentSenderForResultLauncher.launch(intent)
106+
}
107+
92108
fun requestPermissions(
93109
permissionStrings: Array<String>,
94110
callback: RequestPermissionsCallback

0 commit comments

Comments
 (0)