diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index f6483fe..2789298 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -47,6 +47,11 @@ + + + + + diff --git a/android/app/src/main/kotlin/com/github/wgh136/venera/MainActivity.kt b/android/app/src/main/kotlin/com/github/wgh136/venera/MainActivity.kt index 65bae8b..9e0b9ec 100644 --- a/android/app/src/main/kotlin/com/github/wgh136/venera/MainActivity.kt +++ b/android/app/src/main/kotlin/com/github/wgh136/venera/MainActivity.kt @@ -7,6 +7,7 @@ import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.Environment import android.provider.Settings import android.util.Log @@ -40,6 +41,41 @@ class MainActivity : FlutterFragmentActivity() { private val nextLocalRequestCode = AtomicInteger() + private val sharedTexts = ArrayList() + + private var textShareHandler: ((String) -> Unit)? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + if (intent?.action == Intent.ACTION_SEND) { + if (intent.type == "text/plain") { + val text = intent.getStringExtra(Intent.EXTRA_TEXT) + if (text != null) + handleSharedText(text) + } + } + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + if (intent.action == Intent.ACTION_SEND) { + if (intent.type == "text/plain") { + val text = intent.getStringExtra(Intent.EXTRA_TEXT) + if (text != null) + handleSharedText(text) + } + } + } + + private fun handleSharedText(text: String) { + if (textShareHandler != null) { + textShareHandler?.invoke(text) + } else { + sharedTexts.add(text) + } + } + private fun startContractForResult( contract: ActivityResultContract, input: I, @@ -134,6 +170,26 @@ class MainActivity : FlutterFragmentActivity() { val mimeType = req.arguments() openFile(res, mimeType!!) } + + val shareTextChannel = EventChannel(flutterEngine.dartExecutor.binaryMessenger, "venera/text_share") + shareTextChannel.setStreamHandler( + object : EventChannel.StreamHandler { + override fun onListen(arguments: Any?, events: EventChannel.EventSink) { + textShareHandler = {text -> + events.success(text) + } + if (sharedTexts.isNotEmpty()) { + for (text in sharedTexts) { + events.success(text) + } + sharedTexts.clear() + } + } + + override fun onCancel(arguments: Any?) { + textShareHandler = null + } + }) } private fun getProxy(): String { diff --git a/android/app/src/main/res/values-zh-rCN/strings.xml b/android/app/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000..daadbbd --- /dev/null +++ b/android/app/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,4 @@ + + + 搜索 + \ No newline at end of file diff --git a/android/app/src/main/res/values-zh/strings.xml b/android/app/src/main/res/values-zh/strings.xml new file mode 100644 index 0000000..b24f947 --- /dev/null +++ b/android/app/src/main/res/values-zh/strings.xml @@ -0,0 +1,4 @@ + + + 搜尋 + \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..edd1aca --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + Search + \ No newline at end of file diff --git a/lib/init.dart b/lib/init.dart index 939ea70..2841a03 100644 --- a/lib/init.dart +++ b/lib/init.dart @@ -11,6 +11,7 @@ import 'package:venera/pages/comic_source_page.dart'; import 'package:venera/pages/follow_updates_page.dart'; import 'package:venera/pages/settings/settings_page.dart'; import 'package:venera/utils/app_links.dart'; +import 'package:venera/utils/handle_text_share.dart'; import 'package:venera/utils/tags_translation.dart'; import 'package:venera/utils/translations.dart'; import 'foundation/appdata.dart'; @@ -45,6 +46,7 @@ Future init() async { _checkOldConfigs(); if (App.isAndroid) { handleLinks(); + handleTextShare(); } FlutterError.onError = (details) { Log.error("Unhandled Exception", "${details.exception}\n${details.stack}"); diff --git a/lib/utils/handle_text_share.dart b/lib/utils/handle_text_share.dart new file mode 100644 index 0000000..b40d669 --- /dev/null +++ b/lib/utils/handle_text_share.dart @@ -0,0 +1,22 @@ +import 'package:flutter/services.dart'; +import 'package:venera/foundation/app.dart'; +import 'package:venera/pages/aggregated_search_page.dart'; + +bool _isHandling = false; + +/// Handle text share event. +/// App will navigate to [AggregatedSearchPage] with the shared text as keyword. +void handleTextShare() async { + if (_isHandling) return; + _isHandling = true; + + var channel = EventChannel('venera/text_share'); + await for (var event in channel.receiveBroadcastStream()) { + if (App.mainNavigatorKey == null) { + await Future.delayed(const Duration(milliseconds: 200)); + } + if (event is String) { + App.rootContext.to(() => AggregatedSearchPage(keyword: event)); + } + } +}