custom pwa and shortcut support

This commit is contained in:
Fabian Freund
2026-03-26 10:38:36 +01:00
parent b0c9d6c283
commit fe07b182ec
30 changed files with 896 additions and 69 deletions
@@ -21,37 +21,42 @@ import 'package:fast_equatable/fast_equatable.dart';
import 'package:weblibre/utils/input_classification.dart';
sealed class SharedContent with FastEquatable {
SharedContent();
final String? contextId;
factory SharedContent.parse(String content) {
SharedContent({this.contextId});
factory SharedContent.parse(String content, {String? contextId}) {
if (parseSharedIntentUrl(content) case final Uri uri) {
return SharedUrl(uri);
return SharedUrl(uri, contextId: contextId);
} else {
return SharedText(content);
return SharedText(content, contextId: contextId);
}
}
@override
List<Object?> get hashParameters => [contextId];
}
final class SharedUrl extends SharedContent {
final Uri url;
SharedUrl(this.url);
SharedUrl(this.url, {super.contextId});
@override
String toString() => url.toString();
@override
List<Object?> get hashParameters => [url];
List<Object?> get hashParameters => [url, ...super.hashParameters];
}
final class SharedText extends SharedContent {
final String text;
SharedText(this.text);
SharedText(this.text, {super.contextId});
@override
String toString() => text;
@override
List<Object?> get hashParameters => [text];
List<Object?> get hashParameters => [text, ...super.hashParameters];
}
@@ -45,6 +45,12 @@ final _sharingIntentTransformer =
_ => null,
};
// Extract container context from shortcut intents
final contextId =
intent.action == 'android.intent.action.VIEW'
? intent.extra['pwa_context_id'] as String?
: null;
if (data != null) {
if (uri_to_file.isUriSupported(data)) {
var path = data;
@@ -70,17 +76,23 @@ final _sharingIntentTransformer =
final mimeType = mime.lookupMimeType(file.path);
switch (mimeType) {
case 'application/pdf':
sink.add(ReceivedIntentParameter(path, null));
sink.add(
ReceivedIntentParameter(path, null, contextId: contextId),
);
default:
logger.w('Unhandled mime type: $mimeType');
}
} catch (e) {
logger.e('Failed to convert URI to file: $e');
// Fallback: pass the original URI
sink.add(ReceivedIntentParameter(data, null));
sink.add(
ReceivedIntentParameter(data, null, contextId: contextId),
);
}
} else {
sink.add(ReceivedIntentParameter(data, null));
sink.add(
ReceivedIntentParameter(data, null, contextId: contextId),
);
}
}
},