Skip to content

Commit b81f01b

Browse files
committed
feat(share_plus): Add the intent options for the Android platform
1 parent 8e5fab7 commit b81f01b

File tree

15 files changed

+562
-188
lines changed

15 files changed

+562
-188
lines changed

packages/share_plus/share_plus/README.md

+20
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,26 @@ All three methods return a `ShareResult` object which contains the following inf
138138

139139
Note: `status` will be `ShareResultStatus.unavailable` if the platform does not support identifying the user action.
140140

141+
## Platform-Specific Features
142+
143+
Use `PlatformOptions` to configure platform features.
144+
145+
### Android
146+
147+
Supports fine-grained configuration of intent in Android. You can use `AndroidIntentOptions` to specify the app to share.
148+
149+
```dart
150+
Share.share('check out my website https://example.com', platformOptions:PlatformOptions(
151+
androidIntentOptions: AndroidIntentOptions(
152+
packageName: 'com.example.app',
153+
componentName: "com.example.app.ShareActivity",
154+
flags: [
155+
AndroidIntentFlag.FLAG_ACTIVITY_CLEAR_TOP,
156+
AndroidIntentFlag.FLAG_ACTIVITY_NEW_TASK,
157+
]
158+
));
159+
```
160+
141161
## Known Issues
142162

143163
### Sharing data created with XFile.fromData

packages/share_plus/share_plus/android/src/main/kotlin/dev/fluttercommunity/plus/share/MethodCallHandler.kt

+26
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package dev.fluttercommunity.plus.share
22

3+
import android.content.ComponentName
4+
import android.content.Intent
35
import android.os.Build
46
import io.flutter.BuildConfig
57
import io.flutter.plugin.common.MethodCall
@@ -29,6 +31,7 @@ internal class MethodCallHandler(
2931
call.argument<Any>("uri") as String,
3032
subject = null,
3133
withResult = isWithResult,
34+
shareIntent = obtainIntent(call)
3235
)
3336
success(isWithResult, result)
3437
}
@@ -38,6 +41,7 @@ internal class MethodCallHandler(
3841
call.argument<Any>("text") as String,
3942
call.argument<Any>("subject") as String?,
4043
isWithResult,
44+
shareIntent = obtainIntent(call)
4145
)
4246
success(isWithResult, result)
4347
}
@@ -49,6 +53,7 @@ internal class MethodCallHandler(
4953
call.argument<String?>("text"),
5054
call.argument<String?>("subject"),
5155
isWithResult,
56+
shareIntent = obtainIntent(call)
5257
)
5358
success(isWithResult, result)
5459
}
@@ -61,6 +66,27 @@ internal class MethodCallHandler(
6166
}
6267
}
6368

69+
private fun obtainIntent(call: MethodCall): Intent {
70+
val flags = call.argument<Int?>("flags")
71+
val packageName = call.argument<String?>("packageName")
72+
val componentName = call.argument<String?>("componentName")
73+
74+
return Intent().apply {
75+
if (flags != null) {
76+
addFlags(flags);
77+
}
78+
when {
79+
!componentName.isNullOrBlank() && !packageName.isNullOrBlank() -> {
80+
setComponent(ComponentName(packageName, componentName))
81+
}
82+
83+
!packageName.isNullOrBlank() -> {
84+
setPackage(packageName)
85+
}
86+
}
87+
}
88+
}
89+
6490
private fun success(
6591
isWithResult: Boolean,
6692
result: MethodChannel.Result

packages/share_plus/share_plus/android/src/main/kotlin/dev/fluttercommunity/plus/share/Share.kt

+4-5
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ internal class Share(
5555
this.activity = activity
5656
}
5757

58-
fun share(text: String, subject: String?, withResult: Boolean) {
59-
val shareIntent = Intent().apply {
58+
fun share(text: String, subject: String?, withResult: Boolean,shareIntent: Intent) {
59+
shareIntent.apply {
6060
action = Intent.ACTION_SEND
6161
type = "text/plain"
6262
putExtra(Intent.EXTRA_TEXT, text)
@@ -90,14 +90,13 @@ internal class Share(
9090
mimeTypes: List<String>?,
9191
text: String?,
9292
subject: String?,
93-
withResult: Boolean
93+
withResult: Boolean,shareIntent: Intent
9494
) {
9595
clearShareCacheFolder()
9696
val fileUris = getUrisForPaths(paths)
97-
val shareIntent = Intent()
9897
when {
9998
(fileUris.isEmpty() && !text.isNullOrBlank()) -> {
100-
share(text, subject, withResult)
99+
share(text, subject, withResult, shareIntent)
101100
return
102101
}
103102

packages/share_plus/share_plus/example/lib/main.dart

+51-15
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ class DemoAppState extends State<DemoApp> {
3838
String subject = '';
3939
String uri = '';
4040
String fileName = '';
41+
String packageName = '';
42+
String componentName = '';
4143
List<String> imageNames = [];
4244
List<String> imagePaths = [];
4345

@@ -107,6 +109,7 @@ class DemoAppState extends State<DemoApp> {
107109
setState(() => fileName = value);
108110
},
109111
),
112+
if(Platform.isAndroid) ...buildAndroidOptions(),
110113
const SizedBox(height: 16),
111114
ImagePreviews(imagePaths, onDelete: _onDeleteImage),
112115
ElevatedButton.icon(
@@ -197,6 +200,37 @@ class DemoAppState extends State<DemoApp> {
197200
);
198201
}
199202

203+
List<Widget> buildAndroidOptions() {
204+
return [
205+
const SizedBox(height: 16),
206+
Text("Android Platform(Optional)"),
207+
const SizedBox(height: 16),
208+
TextField(
209+
decoration: const InputDecoration(
210+
border: OutlineInputBorder(),
211+
labelText: 'Target package name',
212+
hintText: 'The target package name is available on Android.',
213+
),
214+
maxLines: null,
215+
onChanged: (String value) {
216+
setState(() => packageName = value);
217+
},
218+
),
219+
const SizedBox(height: 16),
220+
TextField(
221+
decoration: const InputDecoration(
222+
border: OutlineInputBorder(),
223+
labelText: 'Target component name',
224+
hintText:
225+
'The target component name is available on Android.',
226+
),
227+
maxLines: null,
228+
onChanged: (String value) {
229+
setState(() => componentName = value);
230+
},
231+
)];
232+
}
233+
200234
void _onDeleteImage(int position) {
201235
setState(() {
202236
imagePaths.removeAt(position);
@@ -216,28 +250,30 @@ class DemoAppState extends State<DemoApp> {
216250

217251
final scaffoldMessenger = ScaffoldMessenger.of(context);
218252
ShareResult shareResult;
253+
final platformOptions = PlatformOptions(
254+
androidIntentOptions: AndroidIntentOptions(
255+
packageName: packageName,
256+
componentName: componentName,
257+
));
219258
if (imagePaths.isNotEmpty) {
220259
final files = <XFile>[];
221260
for (var i = 0; i < imagePaths.length; i++) {
222261
files.add(XFile(imagePaths[i], name: imageNames[i]));
223262
}
224-
shareResult = await Share.shareXFiles(
225-
files,
226-
text: text,
227-
subject: subject,
228-
sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
229-
);
263+
shareResult = await Share.shareXFiles(files,
264+
text: text,
265+
subject: subject,
266+
sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
267+
platformOptions: platformOptions);
230268
} else if (uri.isNotEmpty) {
231-
shareResult = await Share.shareUri(
232-
Uri.parse(uri),
233-
sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
234-
);
269+
shareResult = await Share.shareUri(Uri.parse(uri),
270+
sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
271+
platformOptions: platformOptions);
235272
} else {
236-
shareResult = await Share.share(
237-
text,
238-
subject: subject,
239-
sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
240-
);
273+
shareResult = await Share.share(text,
274+
subject: subject,
275+
sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
276+
platformOptions: platformOptions);
241277
}
242278
scaffoldMessenger.showSnackBar(getResultSnackBar(shareResult));
243279
}

packages/share_plus/share_plus/lib/share_plus.dart

+32-33
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ import 'dart:ui';
88
import 'package:share_plus_platform_interface/share_plus_platform_interface.dart';
99

1010
export 'package:share_plus_platform_interface/share_plus_platform_interface.dart'
11-
show ShareResult, ShareResultStatus, XFile;
11+
show
12+
ShareResult,
13+
ShareResultStatus,
14+
XFile,
15+
PlatformOptions,
16+
AndroidIntentOptions,
17+
AndroidIntentFlag;
1218

1319
export 'src/share_plus_linux.dart';
1420
export 'src/share_plus_windows.dart'
@@ -37,14 +43,11 @@ class Share {
3743
/// from [MethodChannel].
3844
///
3945
/// See documentation about [ShareResult] on [share] method.
40-
static Future<ShareResult> shareUri(
41-
Uri uri, {
42-
Rect? sharePositionOrigin,
43-
}) async {
44-
return _platform.shareUri(
45-
uri,
46-
sharePositionOrigin: sharePositionOrigin,
47-
);
46+
static Future<ShareResult> shareUri(Uri uri,
47+
{Rect? sharePositionOrigin, PlatformOptions? platformOptions}) async {
48+
return _platform.shareUri(uri,
49+
sharePositionOrigin: sharePositionOrigin,
50+
platformOptions: platformOptions);
4851
}
4952

5053
/// Summons the platform's share sheet to share text.
@@ -82,17 +85,15 @@ class Share {
8285
///
8386
/// Will gracefully fall back to the non result variant if not implemented
8487
/// for the current environment and return [ShareResult.unavailable].
85-
static Future<ShareResult> share(
86-
String text, {
87-
String? subject,
88-
Rect? sharePositionOrigin,
89-
}) async {
88+
static Future<ShareResult> share(String text,
89+
{String? subject,
90+
Rect? sharePositionOrigin,
91+
PlatformOptions? platformOptions}) async {
9092
assert(text.isNotEmpty);
91-
return _platform.share(
92-
text,
93-
subject: subject,
94-
sharePositionOrigin: sharePositionOrigin,
95-
);
93+
return _platform.share(text,
94+
subject: subject,
95+
sharePositionOrigin: sharePositionOrigin,
96+
platformOptions: platformOptions);
9697
}
9798

9899
/// Summons the platform's share sheet to share multiple files.
@@ -123,20 +124,18 @@ class Share {
123124
/// from [MethodChannel].
124125
///
125126
/// See documentation about [ShareResult] on [share] method.
126-
static Future<ShareResult> shareXFiles(
127-
List<XFile> files, {
128-
String? subject,
129-
String? text,
130-
Rect? sharePositionOrigin,
131-
List<String>? fileNameOverrides,
132-
}) async {
127+
static Future<ShareResult> shareXFiles(List<XFile> files,
128+
{String? subject,
129+
String? text,
130+
Rect? sharePositionOrigin,
131+
List<String>? fileNameOverrides,
132+
PlatformOptions? platformOptions}) async {
133133
assert(files.isNotEmpty);
134-
return _platform.shareXFiles(
135-
files,
136-
subject: subject,
137-
text: text,
138-
sharePositionOrigin: sharePositionOrigin,
139-
fileNameOverrides: fileNameOverrides,
140-
);
134+
return _platform.shareXFiles(files,
135+
subject: subject,
136+
text: text,
137+
sharePositionOrigin: sharePositionOrigin,
138+
fileNameOverrides: fileNameOverrides,
139+
platformOptions: platformOptions);
141140
}
142141
}

packages/share_plus/share_plus/lib/src/share_plus_linux.dart

+16-19
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/// The Linux implementation of `share_plus`.
2-
library share_plus_linux;
2+
library;
33

44
import 'dart:ui';
55

@@ -19,23 +19,21 @@ class SharePlusLinuxPlugin extends SharePlatform {
1919
}
2020

2121
@override
22-
Future<ShareResult> shareUri(
23-
Uri uri, {
24-
String? subject,
25-
String? text,
26-
Rect? sharePositionOrigin,
27-
}) async {
22+
Future<ShareResult> shareUri(Uri uri,
23+
{String? subject,
24+
String? text,
25+
Rect? sharePositionOrigin,
26+
PlatformOptions? platformOptions}) async {
2827
throw UnimplementedError(
2928
'shareUri() has not been implemented on Linux. Use share().');
3029
}
3130

3231
/// Share text.
3332
@override
34-
Future<ShareResult> share(
35-
String text, {
36-
String? subject,
37-
Rect? sharePositionOrigin,
38-
}) async {
33+
Future<ShareResult> share(String text,
34+
{String? subject,
35+
Rect? sharePositionOrigin,
36+
PlatformOptions? platformOptions}) async {
3937
final queryParameters = {
4038
if (subject != null) 'subject': subject,
4139
'body': text,
@@ -63,13 +61,12 @@ class SharePlusLinuxPlugin extends SharePlatform {
6361

6462
/// Share [XFile] objects with Result.
6563
@override
66-
Future<ShareResult> shareXFiles(
67-
List<XFile> files, {
68-
String? subject,
69-
String? text,
70-
Rect? sharePositionOrigin,
71-
List<String>? fileNameOverrides,
72-
}) {
64+
Future<ShareResult> shareXFiles(List<XFile> files,
65+
{String? subject,
66+
String? text,
67+
Rect? sharePositionOrigin,
68+
List<String>? fileNameOverrides,
69+
PlatformOptions? platformOptions}) {
7370
throw UnimplementedError(
7471
'shareXFiles() has not been implemented on Linux.',
7572
);

0 commit comments

Comments
 (0)