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));
+ }
+ }
+}