Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(share_plus): Add the intent options for the Android platform #3435

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions packages/share_plus/share_plus/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,26 @@ All three methods return a `ShareResult` object which contains the following inf

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

## Platform-Specific Features

Use `PlatformOptions` to configure platform features.

### Android

Supports fine-grained configuration of intent in Android. You can use `AndroidIntentOptions` to specify the app to share.

```dart
Share.share('check out my website https://example.com', platformOptions:PlatformOptions(
androidIntentOptions: AndroidIntentOptions(
packageName: 'com.example.app',
componentName: "com.example.app.ShareActivity",
flags: [
AndroidIntentFlag.FLAG_ACTIVITY_CLEAR_TOP,
AndroidIntentFlag.FLAG_ACTIVITY_NEW_TASK,
]
));
```

## Known Issues

### Sharing data created with XFile.fromData
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package dev.fluttercommunity.plus.share

import android.content.ComponentName
import android.content.Intent
import android.os.Build
import io.flutter.BuildConfig
import io.flutter.plugin.common.MethodCall
Expand Down Expand Up @@ -29,6 +31,7 @@ internal class MethodCallHandler(
call.argument<Any>("uri") as String,
subject = null,
withResult = isWithResult,
shareIntent = obtainIntent(call)
)
success(isWithResult, result)
}
Expand All @@ -38,6 +41,7 @@ internal class MethodCallHandler(
call.argument<Any>("text") as String,
call.argument<Any>("subject") as String?,
isWithResult,
shareIntent = obtainIntent(call)
)
success(isWithResult, result)
}
Expand All @@ -49,6 +53,7 @@ internal class MethodCallHandler(
call.argument<String?>("text"),
call.argument<String?>("subject"),
isWithResult,
shareIntent = obtainIntent(call)
)
success(isWithResult, result)
}
Expand All @@ -61,6 +66,27 @@ internal class MethodCallHandler(
}
}

private fun obtainIntent(call: MethodCall): Intent {
val flags = call.argument<Int?>("flags")
val packageName = call.argument<String?>("packageName")
val componentName = call.argument<String?>("componentName")

return Intent().apply {
if (flags != null) {
addFlags(flags);
}
when {
!componentName.isNullOrBlank() && !packageName.isNullOrBlank() -> {
setComponent(ComponentName(packageName, componentName))
}

!packageName.isNullOrBlank() -> {
setPackage(packageName)
}
}
}
}

private fun success(
isWithResult: Boolean,
result: MethodChannel.Result
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ internal class Share(
this.activity = activity
}

fun share(text: String, subject: String?, withResult: Boolean) {
val shareIntent = Intent().apply {
fun share(text: String, subject: String?, withResult: Boolean,shareIntent: Intent) {
shareIntent.apply {
action = Intent.ACTION_SEND
type = "text/plain"
putExtra(Intent.EXTRA_TEXT, text)
Expand Down Expand Up @@ -90,14 +90,13 @@ internal class Share(
mimeTypes: List<String>?,
text: String?,
subject: String?,
withResult: Boolean
withResult: Boolean,shareIntent: Intent
) {
clearShareCacheFolder()
val fileUris = getUrisForPaths(paths)
val shareIntent = Intent()
when {
(fileUris.isEmpty() && !text.isNullOrBlank()) -> {
share(text, subject, withResult)
share(text, subject, withResult, shareIntent)
return
}

Expand Down
66 changes: 51 additions & 15 deletions packages/share_plus/share_plus/example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@
String subject = '';
String uri = '';
String fileName = '';
String packageName = '';
String componentName = '';
List<String> imageNames = [];
List<String> imagePaths = [];

Expand Down Expand Up @@ -107,6 +109,7 @@
setState(() => fileName = value);
},
),
if (Platform.isAndroid) ...buildAndroidOptions(),
const SizedBox(height: 16),
ImagePreviews(imagePaths, onDelete: _onDeleteImage),
ElevatedButton.icon(
Expand Down Expand Up @@ -197,6 +200,37 @@
);
}

List<Widget> buildAndroidOptions() {
return [
const SizedBox(height: 16),
Text("Android Platform(Optional)"),

Check notice on line 206 in packages/share_plus/share_plus/example/lib/main.dart

View workflow job for this annotation

GitHub Actions / Dart Analyzer

Use 'const' with the constructor to improve performance.

Try adding the 'const' keyword to the constructor invocation. See https://dart.dev/diagnostics/prefer_const_constructors to learn more about this problem.
const SizedBox(height: 16),
TextField(
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: 'Target package name',
hintText: 'The target package name is available on Android.',
),
maxLines: null,
onChanged: (String value) {
setState(() => packageName = value);
},
),
const SizedBox(height: 16),
TextField(
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: 'Target component name',
hintText: 'The target component name is available on Android.',
),
maxLines: null,
onChanged: (String value) {
setState(() => componentName = value);
},
)
];
}

void _onDeleteImage(int position) {
setState(() {
imagePaths.removeAt(position);
Expand All @@ -216,28 +250,30 @@

final scaffoldMessenger = ScaffoldMessenger.of(context);
ShareResult shareResult;
final platformOptions = PlatformOptions(
androidIntentOptions: AndroidIntentOptions(
packageName: packageName,
componentName: componentName,
));
if (imagePaths.isNotEmpty) {
final files = <XFile>[];
for (var i = 0; i < imagePaths.length; i++) {
files.add(XFile(imagePaths[i], name: imageNames[i]));
}
shareResult = await Share.shareXFiles(
files,
text: text,
subject: subject,
sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
);
shareResult = await Share.shareXFiles(files,
text: text,
subject: subject,
sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
platformOptions: platformOptions);
} else if (uri.isNotEmpty) {
shareResult = await Share.shareUri(
Uri.parse(uri),
sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
);
shareResult = await Share.shareUri(Uri.parse(uri),
sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
platformOptions: platformOptions);
} else {
shareResult = await Share.share(
text,
subject: subject,
sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
);
shareResult = await Share.share(text,
subject: subject,
sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size,
platformOptions: platformOptions);
}
scaffoldMessenger.showSnackBar(getResultSnackBar(shareResult));
}
Expand Down
65 changes: 32 additions & 33 deletions packages/share_plus/share_plus/lib/share_plus.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,13 @@ import 'dart:ui';
import 'package:share_plus_platform_interface/share_plus_platform_interface.dart';

export 'package:share_plus_platform_interface/share_plus_platform_interface.dart'
show ShareResult, ShareResultStatus, XFile;
show
ShareResult,
ShareResultStatus,
XFile,
PlatformOptions,
AndroidIntentOptions,
AndroidIntentFlag;

export 'src/share_plus_linux.dart';
export 'src/share_plus_windows.dart'
Expand Down Expand Up @@ -37,14 +43,11 @@ class Share {
/// from [MethodChannel].
///
/// See documentation about [ShareResult] on [share] method.
static Future<ShareResult> shareUri(
Uri uri, {
Rect? sharePositionOrigin,
}) async {
return _platform.shareUri(
uri,
sharePositionOrigin: sharePositionOrigin,
);
static Future<ShareResult> shareUri(Uri uri,
{Rect? sharePositionOrigin, PlatformOptions? platformOptions}) async {
return _platform.shareUri(uri,
sharePositionOrigin: sharePositionOrigin,
platformOptions: platformOptions);
}

/// Summons the platform's share sheet to share text.
Expand Down Expand Up @@ -82,17 +85,15 @@ class Share {
///
/// Will gracefully fall back to the non result variant if not implemented
/// for the current environment and return [ShareResult.unavailable].
static Future<ShareResult> share(
String text, {
String? subject,
Rect? sharePositionOrigin,
}) async {
static Future<ShareResult> share(String text,
{String? subject,
Rect? sharePositionOrigin,
PlatformOptions? platformOptions}) async {
assert(text.isNotEmpty);
return _platform.share(
text,
subject: subject,
sharePositionOrigin: sharePositionOrigin,
);
return _platform.share(text,
subject: subject,
sharePositionOrigin: sharePositionOrigin,
platformOptions: platformOptions);
}

/// Summons the platform's share sheet to share multiple files.
Expand Down Expand Up @@ -123,20 +124,18 @@ class Share {
/// from [MethodChannel].
///
/// See documentation about [ShareResult] on [share] method.
static Future<ShareResult> shareXFiles(
List<XFile> files, {
String? subject,
String? text,
Rect? sharePositionOrigin,
List<String>? fileNameOverrides,
}) async {
static Future<ShareResult> shareXFiles(List<XFile> files,
{String? subject,
String? text,
Rect? sharePositionOrigin,
List<String>? fileNameOverrides,
PlatformOptions? platformOptions}) async {
assert(files.isNotEmpty);
return _platform.shareXFiles(
files,
subject: subject,
text: text,
sharePositionOrigin: sharePositionOrigin,
fileNameOverrides: fileNameOverrides,
);
return _platform.shareXFiles(files,
subject: subject,
text: text,
sharePositionOrigin: sharePositionOrigin,
fileNameOverrides: fileNameOverrides,
platformOptions: platformOptions);
}
}
35 changes: 16 additions & 19 deletions packages/share_plus/share_plus/lib/src/share_plus_linux.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/// The Linux implementation of `share_plus`.
library share_plus_linux;
library;

import 'dart:ui';

Expand All @@ -19,23 +19,21 @@ class SharePlusLinuxPlugin extends SharePlatform {
}

@override
Future<ShareResult> shareUri(
Uri uri, {
String? subject,
String? text,
Rect? sharePositionOrigin,
}) async {
Future<ShareResult> shareUri(Uri uri,
{String? subject,
String? text,
Rect? sharePositionOrigin,
PlatformOptions? platformOptions}) async {
throw UnimplementedError(
'shareUri() has not been implemented on Linux. Use share().');
}

/// Share text.
@override
Future<ShareResult> share(
String text, {
String? subject,
Rect? sharePositionOrigin,
}) async {
Future<ShareResult> share(String text,
{String? subject,
Rect? sharePositionOrigin,
PlatformOptions? platformOptions}) async {
final queryParameters = {
if (subject != null) 'subject': subject,
'body': text,
Expand Down Expand Up @@ -63,13 +61,12 @@ class SharePlusLinuxPlugin extends SharePlatform {

/// Share [XFile] objects with Result.
@override
Future<ShareResult> shareXFiles(
List<XFile> files, {
String? subject,
String? text,
Rect? sharePositionOrigin,
List<String>? fileNameOverrides,
}) {
Future<ShareResult> shareXFiles(List<XFile> files,
{String? subject,
String? text,
Rect? sharePositionOrigin,
List<String>? fileNameOverrides,
PlatformOptions? platformOptions}) {
throw UnimplementedError(
'shareXFiles() has not been implemented on Linux.',
);
Expand Down
Loading
Loading