feat: implement mobile UI, Android build configuration, and share intent handling using share_handler

This commit is contained in:
Ümit Tunç
2026-04-29 22:33:02 +03:00
parent 3755a07c25
commit a3d3de0c0d
7 changed files with 100 additions and 20 deletions
+3 -3
View File
@@ -11,12 +11,12 @@ android {
ndkVersion = flutter.ndkVersion ndkVersion = flutter.ndkVersion
compileOptions { compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_17
} }
kotlinOptions { kotlinOptions {
jvmTarget = "1.8" jvmTarget = "17"
} }
+10
View File
@@ -24,6 +24,16 @@
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter> </intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="video/*" />
</intent-filter>
</activity> </activity>
<!-- Don't delete the meta-data below. <!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
+14 -8
View File
@@ -18,15 +18,21 @@ subprojects {
project.layout.buildDirectory.value(newSubprojectBuildDir) project.layout.buildDirectory.value(newSubprojectBuildDir)
} }
// Java ve Kotlin'i 1.8'e zorla // Java ve Kotlin'i 17'ye zorla
tasks.withType<JavaCompile>().configureEach { afterEvaluate {
sourceCompatibility = "1.8" if (project.hasProperty("android")) {
targetCompatibility = "1.8" configure<com.android.build.gradle.BaseExtension> {
} compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
}
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile>().configureEach { tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile>().configureEach {
compilerOptions { compilerOptions {
jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8) jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17)
}
} }
} }
} }
@@ -0,0 +1,31 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:share_handler/share_handler.dart';
import 'sender_providers.dart';
final shareHandlerProvider = Provider<void>((ref) {
final handler = ShareHandler.instance;
// Listen for background shares
handler.sharedMediaStream.listen((SharedMedia media) {
_handleMedia(media, ref);
});
// Check for initial share (app opened via share)
handler.getInitialSharedMedia().then((media) {
if (media != null) {
_handleMedia(media, ref);
}
});
return;
});
void _handleMedia(SharedMedia media, Ref ref) {
final content = media.content;
if (content != null && content.isNotEmpty) {
// If it's a URL or contains a URL, send it
if (content.startsWith('http')) {
ref.read(senderProvider.notifier).sendLink(content);
}
}
}
@@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../../../core/theme/app_colors.dart'; import '../../../../core/theme/app_colors.dart';
import '../../../discovery/presentation/providers/discovery_providers.dart'; import '../../../discovery/presentation/providers/discovery_providers.dart';
import '../providers/sender_providers.dart'; import '../providers/sender_providers.dart';
import '../providers/share_handler_provider.dart';
class MobileSenderScreen extends ConsumerStatefulWidget { class MobileSenderScreen extends ConsumerStatefulWidget {
const MobileSenderScreen({super.key}); const MobileSenderScreen({super.key});
@@ -14,6 +15,11 @@ class MobileSenderScreen extends ConsumerStatefulWidget {
class _MobileSenderScreenState extends ConsumerState<MobileSenderScreen> { class _MobileSenderScreenState extends ConsumerState<MobileSenderScreen> {
final _urlController = TextEditingController(); final _urlController = TextEditingController();
@override
void initState() {
super.initState();
}
@override @override
void dispose() { void dispose() {
_urlController.dispose(); _urlController.dispose();
@@ -22,6 +28,9 @@ class _MobileSenderScreenState extends ConsumerState<MobileSenderScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// Initialize share handler
ref.watch(shareHandlerProvider);
final devicesAsync = ref.watch(discoveredDevicesProvider); final devicesAsync = ref.watch(discoveredDevicesProvider);
final senderState = ref.watch(senderProvider); final senderState = ref.watch(senderProvider);
+32 -8
View File
@@ -744,14 +744,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.0" version: "2.2.0"
receive_sharing_intent:
dependency: "direct main"
description:
name: receive_sharing_intent
sha256: ec76056e4d258ad708e76d85591d933678625318e411564dcb9059048ca3a593
url: "https://pub.dev"
source: hosted
version: "1.8.1"
record_use: record_use:
dependency: transitive dependency: transitive
description: description:
@@ -776,6 +768,38 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.3" version: "2.0.3"
share_handler:
dependency: "direct main"
description:
name: share_handler
sha256: "0a6d007f0e44fbee27164adcd159ecbc88238864313f4e5c58161cae2180328d"
url: "https://pub.dev"
source: hosted
version: "0.0.25"
share_handler_android:
dependency: transitive
description:
name: share_handler_android
sha256: caf555b933dc72783aa37fef75688c7b86bd6f7bc17d80fbf585bc42f123cc8d
url: "https://pub.dev"
source: hosted
version: "0.0.11"
share_handler_ios:
dependency: transitive
description:
name: share_handler_ios
sha256: cdc21f88f336a944157a8e9ceb191525cee3b082d6eb6c2082488e4f09dc3ece
url: "https://pub.dev"
source: hosted
version: "0.0.15"
share_handler_platform_interface:
dependency: transitive
description:
name: share_handler_platform_interface
sha256: "7a4df95a87b326b2f07458d937f2281874567c364b7b7ebe4e7d50efaae5f106"
url: "https://pub.dev"
source: hosted
version: "0.0.6"
shared_preferences: shared_preferences:
dependency: "direct main" dependency: "direct main"
description: description:
+1 -1
View File
@@ -39,13 +39,13 @@ dependencies:
media_kit: ^1.2.6 media_kit: ^1.2.6
media_kit_video: ^2.0.1 media_kit_video: ^2.0.1
media_kit_libs_video: ^1.0.7 media_kit_libs_video: ^1.0.7
receive_sharing_intent: ^1.8.1
flutter_inappwebview: ^6.1.5 flutter_inappwebview: ^6.1.5
shared_preferences: ^2.5.5 shared_preferences: ^2.5.5
google_fonts: ^8.1.0 google_fonts: ^8.1.0
flutter_svg: ^2.2.4 flutter_svg: ^2.2.4
path_provider: ^2.1.5 path_provider: ^2.1.5
dio: ^5.9.2 dio: ^5.9.2
share_handler: ^0.0.25
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: