124 lines
3.7 KiB
Dart
124 lines
3.7 KiB
Dart
import 'dart:async';
|
|
import 'dart:io';
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
|
|
import 'package:island/widgets/share/share_sheet.dart';
|
|
import 'package:share_plus/share_plus.dart';
|
|
|
|
class SharingIntentService {
|
|
static final SharingIntentService _instance =
|
|
SharingIntentService._internal();
|
|
factory SharingIntentService() => _instance;
|
|
SharingIntentService._internal();
|
|
|
|
StreamSubscription<List<SharedMediaFile>>? _intentSub;
|
|
BuildContext? _context;
|
|
|
|
/// Initialize the sharing intent service
|
|
void initialize(BuildContext context) {
|
|
if (kIsWeb || !(Platform.isIOS || Platform.isAndroid)) return;
|
|
debugPrint("SharingIntentService: Initializing with context");
|
|
_context = context;
|
|
_setupSharingListeners();
|
|
}
|
|
|
|
/// Setup listeners for sharing intents
|
|
void _setupSharingListeners() {
|
|
debugPrint("SharingIntentService: Setting up sharing listeners");
|
|
|
|
// Listen to media sharing coming from outside the app while the app is in memory
|
|
_intentSub = ReceiveSharingIntent.instance.getMediaStream().listen(
|
|
(List<SharedMediaFile> value) {
|
|
debugPrint(
|
|
"SharingIntentService: Media stream received ${value.length} files",
|
|
);
|
|
if (value.isNotEmpty) {
|
|
_handleSharedContent(value);
|
|
}
|
|
},
|
|
onError: (err) {
|
|
debugPrint("SharingIntentService: Stream error: $err");
|
|
},
|
|
);
|
|
|
|
// Get the media sharing coming from outside the app while the app is closed
|
|
ReceiveSharingIntent.instance.getInitialMedia().then((
|
|
List<SharedMediaFile> value,
|
|
) {
|
|
debugPrint(
|
|
"SharingIntentService: Initial media received ${value.length} files",
|
|
);
|
|
if (value.isNotEmpty) {
|
|
_handleSharedContent(value);
|
|
// Tell the library that we are done processing the intent
|
|
ReceiveSharingIntent.instance.reset();
|
|
}
|
|
});
|
|
}
|
|
|
|
/// Handle shared media files
|
|
void _handleSharedContent(List<SharedMediaFile> sharedFiles) {
|
|
if (_context == null) {
|
|
debugPrint(
|
|
"SharingIntentService: Context is null, cannot handle shared content",
|
|
);
|
|
return;
|
|
}
|
|
|
|
debugPrint(
|
|
"SharingIntentService: Received ${sharedFiles.length} shared files",
|
|
);
|
|
for (final file in sharedFiles) {
|
|
debugPrint(
|
|
"SharingIntentService: File path: ${file.path}, type: ${file.type}",
|
|
);
|
|
}
|
|
|
|
// Convert SharedMediaFile to XFile for files
|
|
final List<XFile> files =
|
|
sharedFiles
|
|
.where(
|
|
(file) =>
|
|
file.type == SharedMediaType.file ||
|
|
file.type == SharedMediaType.video ||
|
|
file.type == SharedMediaType.image,
|
|
)
|
|
.map((file) => XFile(file.path, name: file.path.split('/').last))
|
|
.toList();
|
|
|
|
// Extract links from shared content
|
|
final List<String> links =
|
|
sharedFiles
|
|
.where((file) => file.type == SharedMediaType.url)
|
|
.map((file) => file.path)
|
|
.toList();
|
|
|
|
// Show ShareSheet with the shared files
|
|
if (files.isNotEmpty) {
|
|
showShareSheet(context: _context!, content: ShareContent.files(files));
|
|
} else if (links.isNotEmpty) {
|
|
showShareSheet(
|
|
context: _context!,
|
|
content: ShareContent.link(links.first),
|
|
);
|
|
} else {
|
|
showShareSheet(
|
|
context: _context!,
|
|
content: ShareContent.text(
|
|
sharedFiles
|
|
.where((file) => file.type == SharedMediaType.text)
|
|
.map((text) => text.message)
|
|
.join('\n'),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
/// Dispose of resources
|
|
void dispose() {
|
|
_intentSub?.cancel();
|
|
_context = null;
|
|
}
|
|
}
|