From c90305aaf5c290db26bb3b11ef521b28d14aef8b Mon Sep 17 00:00:00 2001 From: flazepe <51487578+flazepe@users.noreply.github.com> Date: Mon, 24 Aug 2026 20:54:42 +0800 Subject: [PATCH 01/15] Support sharing images to reverse search --- app/src/main/AndroidManifest.xml | 6 +++ .../java/moe/apex/breadboard/MainActivity.kt | 49 ++++++++++++++++--- .../breadboard/navigation/Destinations.kt | 2 +- .../apex/breadboard/navigation/Navigation.kt | 9 ++-- .../saucenao/ReverseSearchScreen.kt | 10 ++-- 5 files changed, 62 insertions(+), 14 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7aa0cfc8..baf8e494 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -27,6 +27,12 @@ + + + + + + maybePrepareArtistDestination(intent) - "search" -> maybePrepareResultsDestination(intent) + val newIntent = createReverseSearchIntent(intent) ?: intent + + return when (newIntent.getStringExtra("destination")) { + "artist" -> maybePrepareArtistDestination(newIntent) + "search" -> maybePrepareResultsDestination(newIntent) + "reverse_search" -> maybePrepareReverseSearchDestination(newIntent) else -> null } } @@ -170,4 +182,27 @@ class MainActivity : SingletonImageLoader.Factory, ComponentActivity(), VolumeBu } } } + + + private fun createReverseSearchIntent(intent: Intent): Intent? { + if (intent.action != Intent.ACTION_SEND) return null + + val initialImageUrl = intent.extras?.getString(Intent.EXTRA_TEXT) + val initialFileUri = intent.clipData?.getItemAt(0)?.uri + + val intent = Intent(Intent.ACTION_VIEW) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + intent.component = ComponentName(this, MainActivity::class.java) + intent.putExtra("destination", "reverse_search") + + /* Sometimes a shared link may contain an image clipData of the favicon, so we must + prioritize the text over the clipData. Providing them both would be bad. */ + if (initialImageUrl != null) { + intent.putExtra("initial_image_url", initialImageUrl) + } else if (initialFileUri != null) { + intent.putExtra("initial_file_uri", initialFileUri.toString()) + } + + return intent + } } diff --git a/app/src/main/java/moe/apex/breadboard/navigation/Destinations.kt b/app/src/main/java/moe/apex/breadboard/navigation/Destinations.kt index f28e0500..c44a1d53 100644 --- a/app/src/main/java/moe/apex/breadboard/navigation/Destinations.kt +++ b/app/src/main/java/moe/apex/breadboard/navigation/Destinations.kt @@ -88,7 +88,7 @@ object FollowedArtists object Search @Serializable -object ReverseSearch +data class ReverseSearch(val initialImageUrl: String? = null, val initialFileUri: String? = null) @Serializable data class Results( diff --git a/app/src/main/java/moe/apex/breadboard/navigation/Navigation.kt b/app/src/main/java/moe/apex/breadboard/navigation/Navigation.kt index ab90787a..00214a6f 100644 --- a/app/src/main/java/moe/apex/breadboard/navigation/Navigation.kt +++ b/app/src/main/java/moe/apex/breadboard/navigation/Navigation.kt @@ -202,8 +202,8 @@ fun Navigation(navController: NavHostController, startDestination: Any = Search) }, onClick = { if (!currentRoute.routeIs(ReverseSearch::class)) { - navController.navigate(ReverseSearch) { - popUpTo(ReverseSearch) { inclusive = true } + navController.navigate(ReverseSearch()) { + popUpTo(ReverseSearch()) { inclusive = true } } } } @@ -288,7 +288,10 @@ fun Navigation(navController: NavHostController, startDestination: Any = Search) } composable { HomeScreen(navController) { isNavigationBarVisible = it } } composable { SearchScreen(navController, focusRequester) } - composable { ReverseSearchScreen(navController) } + composable { + val args = it.toRoute() + ReverseSearchScreen(navController, args.initialImageUrl, args.initialFileUri) + } composable { val args = it.toRoute() SearchResults(navController, args.source, args.tags) diff --git a/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt b/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt index 4e4f51d7..571a1ad6 100644 --- a/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt +++ b/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt @@ -80,14 +80,18 @@ import moe.apex.breadboard.util.showToast @OptIn(ExperimentalMaterial3ExpressiveApi::class, ExperimentalMaterial3Api::class) @Composable -fun ReverseSearchScreen(navController: NavController) { +fun ReverseSearchScreen( + navController: NavController, + initialImageUrl: String? = null, + initialFileUri: String? = null +) { val context = LocalContext.current val clipboard = LocalClipboard.current val prefs = LocalPreferences.current val scope = rememberCoroutineScope() - var imageUrl by rememberSaveable { mutableStateOf("") } - var selectedFileUri by rememberSaveable { mutableStateOf(null) } + var imageUrl by rememberSaveable { mutableStateOf(initialImageUrl ?: "") } + var selectedFileUri by rememberSaveable { mutableStateOf(initialFileUri?.toUri()) } val imagePickerLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.GetContent() From fa7b18c1fc1050c5ce3f7f5fe3bd3b36a399b58d Mon Sep 17 00:00:00 2001 From: flazepe <51487578+flazepe@users.noreply.github.com> Date: Mon, 24 Aug 2026 20:55:14 +0800 Subject: [PATCH 02/15] Support image clipboard paste for reverse search --- .../saucenao/ReverseSearchScreen.kt | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt b/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt index 571a1ad6..08d2d7a9 100644 --- a/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt +++ b/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt @@ -201,13 +201,21 @@ fun ReverseSearchScreen( IconButton( onClick = { scope.launch { - val clipboardText = - clipboard.nativeClipboard.primaryClip?.getItemAt( - 0 - )?.text?.toString() - if (clipboardText != null) { - imageUrl = clipboardText - selectedFileUri = null + val clipboardItem = clipboard.nativeClipboard.primaryClip?.getItemAt( + 0 + ) + + if (clipboardItem != null) { + val uri = clipboardItem.uri + val mimeType = uri?.let { + context.contentResolver.getType(it) + } + + if (mimeType?.startsWith("image/") == true) { + selectedFileUri = uri + } else { + imageUrl = clipboardItem.text.toString() + } } else { showToast(context, "Nothing on the clipboard") } From 74794fa52786db3ac731f598d0cc171cef58bb6a Mon Sep 17 00:00:00 2001 From: flazepe <51487578+flazepe@users.noreply.github.com> Date: Mon, 24 Aug 2026 21:05:18 +0800 Subject: [PATCH 03/15] Rename `newIntent` back to `intent` * Figured it's not that big of a deal for it to be ambiguous here --- app/src/main/java/moe/apex/breadboard/MainActivity.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/moe/apex/breadboard/MainActivity.kt b/app/src/main/java/moe/apex/breadboard/MainActivity.kt index 487f6dba..7937d3fa 100644 --- a/app/src/main/java/moe/apex/breadboard/MainActivity.kt +++ b/app/src/main/java/moe/apex/breadboard/MainActivity.kt @@ -99,12 +99,12 @@ class MainActivity : SingletonImageLoader.Factory, ComponentActivity(), VolumeBu private fun determineDestination(intent: Intent): Any? { - val newIntent = createReverseSearchIntent(intent) ?: intent + val intent = createReverseSearchIntent(intent) ?: intent - return when (newIntent.getStringExtra("destination")) { - "artist" -> maybePrepareArtistDestination(newIntent) - "search" -> maybePrepareResultsDestination(newIntent) - "reverse_search" -> maybePrepareReverseSearchDestination(newIntent) + return when (intent.getStringExtra("destination")) { + "artist" -> maybePrepareArtistDestination(intent) + "search" -> maybePrepareResultsDestination(intent) + "reverse_search" -> maybePrepareReverseSearchDestination(intent) else -> null } } From df39d4ecb270e477c720410c3d2ba29316a09aec Mon Sep 17 00:00:00 2001 From: flazepe <51487578+flazepe@users.noreply.github.com> Date: Mon, 24 Aug 2026 21:10:12 +0800 Subject: [PATCH 04/15] Reduce redundant reverse search intent code --- app/src/main/java/moe/apex/breadboard/MainActivity.kt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/moe/apex/breadboard/MainActivity.kt b/app/src/main/java/moe/apex/breadboard/MainActivity.kt index 7937d3fa..abad4a0e 100644 --- a/app/src/main/java/moe/apex/breadboard/MainActivity.kt +++ b/app/src/main/java/moe/apex/breadboard/MainActivity.kt @@ -187,14 +187,11 @@ class MainActivity : SingletonImageLoader.Factory, ComponentActivity(), VolumeBu private fun createReverseSearchIntent(intent: Intent): Intent? { if (intent.action != Intent.ACTION_SEND) return null + intent.putExtra("destination", "reverse_search") + val initialImageUrl = intent.extras?.getString(Intent.EXTRA_TEXT) val initialFileUri = intent.clipData?.getItemAt(0)?.uri - val intent = Intent(Intent.ACTION_VIEW) - intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK - intent.component = ComponentName(this, MainActivity::class.java) - intent.putExtra("destination", "reverse_search") - /* Sometimes a shared link may contain an image clipData of the favicon, so we must prioritize the text over the clipData. Providing them both would be bad. */ if (initialImageUrl != null) { From 3cd68b39b843bae1862cccfac3c030151a746847 Mon Sep 17 00:00:00 2001 From: flazepe <51487578+flazepe@users.noreply.github.com> Date: Mon, 24 Aug 2026 21:11:16 +0800 Subject: [PATCH 05/15] Remove unused import --- app/src/main/java/moe/apex/breadboard/MainActivity.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/moe/apex/breadboard/MainActivity.kt b/app/src/main/java/moe/apex/breadboard/MainActivity.kt index abad4a0e..12c17d0e 100644 --- a/app/src/main/java/moe/apex/breadboard/MainActivity.kt +++ b/app/src/main/java/moe/apex/breadboard/MainActivity.kt @@ -1,7 +1,6 @@ package moe.apex.breadboard import android.app.UiModeManager -import android.content.ComponentName import android.content.Context import android.content.Intent import android.os.Build From d75d0b1efb77f462c5b7a229d25c0fb6160b1f31 Mon Sep 17 00:00:00 2001 From: flazepe <51487578+flazepe@users.noreply.github.com> Date: Mon, 24 Aug 2026 21:27:22 +0800 Subject: [PATCH 06/15] Better and descriptive approach --- app/src/main/java/moe/apex/breadboard/MainActivity.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/moe/apex/breadboard/MainActivity.kt b/app/src/main/java/moe/apex/breadboard/MainActivity.kt index 12c17d0e..fa4157b1 100644 --- a/app/src/main/java/moe/apex/breadboard/MainActivity.kt +++ b/app/src/main/java/moe/apex/breadboard/MainActivity.kt @@ -98,7 +98,8 @@ class MainActivity : SingletonImageLoader.Factory, ComponentActivity(), VolumeBu private fun determineDestination(intent: Intent): Any? { - val intent = createReverseSearchIntent(intent) ?: intent + // Transform any Intent.ACTION_SEND intent to a valid reverse search destination intent + if (intent.action == Intent.ACTION_SEND) transformReverseSearchIntent(intent) return when (intent.getStringExtra("destination")) { "artist" -> maybePrepareArtistDestination(intent) @@ -183,9 +184,7 @@ class MainActivity : SingletonImageLoader.Factory, ComponentActivity(), VolumeBu } - private fun createReverseSearchIntent(intent: Intent): Intent? { - if (intent.action != Intent.ACTION_SEND) return null - + private fun transformReverseSearchIntent(intent: Intent) { intent.putExtra("destination", "reverse_search") val initialImageUrl = intent.extras?.getString(Intent.EXTRA_TEXT) @@ -198,7 +197,5 @@ class MainActivity : SingletonImageLoader.Factory, ComponentActivity(), VolumeBu } else if (initialFileUri != null) { intent.putExtra("initial_file_uri", initialFileUri.toString()) } - - return intent } } From d9a4b86bc156d1648afbf0adfa9dace17ec0369b Mon Sep 17 00:00:00 2001 From: flazepe <51487578+flazepe@users.noreply.github.com> Date: Mon, 24 Aug 2026 21:32:18 +0800 Subject: [PATCH 07/15] Reset selected file URI on paste button click --- .../java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt b/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt index 08d2d7a9..8b4658f1 100644 --- a/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt +++ b/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt @@ -214,6 +214,10 @@ fun ReverseSearchScreen( if (mimeType?.startsWith("image/") == true) { selectedFileUri = uri } else { + /* onValueChange does not trigger when you press + the paste button, so we still have to reset the + selected file URI. */ + selectedFileUri = null imageUrl = clipboardItem.text.toString() } } else { From ff2f3c02c2d1cac44c0d845279acc324e87429ee Mon Sep 17 00:00:00 2001 From: flazepe <51487578+flazepe@users.noreply.github.com> Date: Mon, 24 Aug 2026 21:55:06 +0800 Subject: [PATCH 08/15] Minor changes --- app/src/main/java/moe/apex/breadboard/MainActivity.kt | 6 +++--- .../moe/apex/breadboard/saucenao/ReverseSearchScreen.kt | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/moe/apex/breadboard/MainActivity.kt b/app/src/main/java/moe/apex/breadboard/MainActivity.kt index fa4157b1..bb1ea7fc 100644 --- a/app/src/main/java/moe/apex/breadboard/MainActivity.kt +++ b/app/src/main/java/moe/apex/breadboard/MainActivity.kt @@ -99,7 +99,7 @@ class MainActivity : SingletonImageLoader.Factory, ComponentActivity(), VolumeBu private fun determineDestination(intent: Intent): Any? { // Transform any Intent.ACTION_SEND intent to a valid reverse search destination intent - if (intent.action == Intent.ACTION_SEND) transformReverseSearchIntent(intent) + if (intent.action == Intent.ACTION_SEND) transformReverseSearchDestinationIntent(intent) return when (intent.getStringExtra("destination")) { "artist" -> maybePrepareArtistDestination(intent) @@ -184,14 +184,14 @@ class MainActivity : SingletonImageLoader.Factory, ComponentActivity(), VolumeBu } - private fun transformReverseSearchIntent(intent: Intent) { + private fun transformReverseSearchDestinationIntent(intent: Intent) { intent.putExtra("destination", "reverse_search") val initialImageUrl = intent.extras?.getString(Intent.EXTRA_TEXT) val initialFileUri = intent.clipData?.getItemAt(0)?.uri /* Sometimes a shared link may contain an image clipData of the favicon, so we must - prioritize the text over the clipData. Providing them both would be bad. */ + prioritise the text over the clipData. Providing them both would be bad. */ if (initialImageUrl != null) { intent.putExtra("initial_image_url", initialImageUrl) } else if (initialFileUri != null) { diff --git a/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt b/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt index 8b4658f1..95551319 100644 --- a/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt +++ b/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt @@ -201,9 +201,10 @@ fun ReverseSearchScreen( IconButton( onClick = { scope.launch { - val clipboardItem = clipboard.nativeClipboard.primaryClip?.getItemAt( - 0 - ) + val clipboardItem = + clipboard.nativeClipboard.primaryClip?.getItemAt( + 0 + ) if (clipboardItem != null) { val uri = clipboardItem.uri From 415356fae8ba9cedeface8628bc995663b2000c8 Mon Sep 17 00:00:00 2001 From: flazepe <51487578+flazepe@users.noreply.github.com> Date: Mon, 24 Aug 2026 22:08:42 +0800 Subject: [PATCH 09/15] Fix app stacking on older Android versions * Move comments to the top (can't make comments between attributes, blame XML) --- app/src/main/AndroidManifest.xml | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index baf8e494..884dc942 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,12 @@ + + android:enableOnBackInvokedCallback="true" + android:configChanges="uiMode" + android:documentLaunchMode="intoExisting"> + android:theme="@style/Theme.Breadboard"> @@ -39,8 +43,7 @@ android:taskAffinity="moe.apex.breadboard.DeepLinkActivity" android:launchMode="singleTop" android:exported="true" - android:theme="@style/Theme.Breadboard" - android:configChanges="uiMode"> + android:theme="@style/Theme.Breadboard"> From 154b53d1605b48ecd0c9a9e44e46cdb50c1aac80 Mon Sep 17 00:00:00 2001 From: flazepe <51487578+flazepe@users.noreply.github.com> Date: Tue, 25 Aug 2026 12:32:03 +0800 Subject: [PATCH 10/15] Create a copy of the intent instead * Probably not a good idea to just mutate any intent we provide to the method --- .../main/java/moe/apex/breadboard/MainActivity.kt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/moe/apex/breadboard/MainActivity.kt b/app/src/main/java/moe/apex/breadboard/MainActivity.kt index bb1ea7fc..056639cf 100644 --- a/app/src/main/java/moe/apex/breadboard/MainActivity.kt +++ b/app/src/main/java/moe/apex/breadboard/MainActivity.kt @@ -98,8 +98,12 @@ class MainActivity : SingletonImageLoader.Factory, ComponentActivity(), VolumeBu private fun determineDestination(intent: Intent): Any? { - // Transform any Intent.ACTION_SEND intent to a valid reverse search destination intent - if (intent.action == Intent.ACTION_SEND) transformReverseSearchDestinationIntent(intent) + val intent = if (intent.action == Intent.ACTION_SEND) { + // Transform any Intent.ACTION_SEND intent to a valid reverse search destination intent + createReverseSearchDestinationIntent(intent) + } else { + intent + } return when (intent.getStringExtra("destination")) { "artist" -> maybePrepareArtistDestination(intent) @@ -184,7 +188,9 @@ class MainActivity : SingletonImageLoader.Factory, ComponentActivity(), VolumeBu } - private fun transformReverseSearchDestinationIntent(intent: Intent) { + private fun createReverseSearchDestinationIntent(intent: Intent): Intent { + val intent = Intent(intent) + intent.putExtra("destination", "reverse_search") val initialImageUrl = intent.extras?.getString(Intent.EXTRA_TEXT) @@ -197,5 +203,7 @@ class MainActivity : SingletonImageLoader.Factory, ComponentActivity(), VolumeBu } else if (initialFileUri != null) { intent.putExtra("initial_file_uri", initialFileUri.toString()) } + + return intent } } From 4706f4257c613a0b57c1b07970d7d6a589d63101 Mon Sep 17 00:00:00 2001 From: flazepe <51487578+flazepe@users.noreply.github.com> Date: Tue, 25 Aug 2026 13:07:40 +0800 Subject: [PATCH 11/15] Less code --- .../java/moe/apex/breadboard/MainActivity.kt | 44 +++++-------------- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/moe/apex/breadboard/MainActivity.kt b/app/src/main/java/moe/apex/breadboard/MainActivity.kt index 056639cf..b7090609 100644 --- a/app/src/main/java/moe/apex/breadboard/MainActivity.kt +++ b/app/src/main/java/moe/apex/breadboard/MainActivity.kt @@ -90,25 +90,23 @@ class MainActivity : SingletonImageLoader.Factory, ComponentActivity(), VolumeBu } - private fun maybePrepareReverseSearchDestination(intent: Intent): ReverseSearch? { - val initialImageUrl = intent.getStringExtra("initial_image_url") - val initialFileUri = intent.getStringExtra("initial_file_uri") - return ReverseSearch(initialImageUrl, initialFileUri) - } - - private fun determineDestination(intent: Intent): Any? { - val intent = if (intent.action == Intent.ACTION_SEND) { - // Transform any Intent.ACTION_SEND intent to a valid reverse search destination intent - createReverseSearchDestinationIntent(intent) - } else { - intent + // Handle reverse search Intent.ACTION_SEND intent + if (intent.action == Intent.ACTION_SEND) { + /* Sometimes a shared link may contain an image clipData of the favicon, so we must + prioritise the text over the clipData. Providing them both would be bad. */ + intent.extras?.getString(Intent.EXTRA_TEXT)?.let { initialImageUrl -> + return ReverseSearch(initialImageUrl = initialImageUrl) + } + + intent.clipData?.getItemAt(0)?.uri?.let { initialFileUri -> + return ReverseSearch(initialFileUri = initialFileUri.toString()) + } } return when (intent.getStringExtra("destination")) { "artist" -> maybePrepareArtistDestination(intent) "search" -> maybePrepareResultsDestination(intent) - "reverse_search" -> maybePrepareReverseSearchDestination(intent) else -> null } } @@ -186,24 +184,4 @@ class MainActivity : SingletonImageLoader.Factory, ComponentActivity(), VolumeBu } } } - - - private fun createReverseSearchDestinationIntent(intent: Intent): Intent { - val intent = Intent(intent) - - intent.putExtra("destination", "reverse_search") - - val initialImageUrl = intent.extras?.getString(Intent.EXTRA_TEXT) - val initialFileUri = intent.clipData?.getItemAt(0)?.uri - - /* Sometimes a shared link may contain an image clipData of the favicon, so we must - prioritise the text over the clipData. Providing them both would be bad. */ - if (initialImageUrl != null) { - intent.putExtra("initial_image_url", initialImageUrl) - } else if (initialFileUri != null) { - intent.putExtra("initial_file_uri", initialFileUri.toString()) - } - - return intent - } } From 633767e771891d399ed23868aece1d4e63ec192b Mon Sep 17 00:00:00 2001 From: flazepe <51487578+flazepe@users.noreply.github.com> Date: Tue, 25 Aug 2026 13:10:34 +0800 Subject: [PATCH 12/15] Move back stuff * I just don't like seeing messy diffs :p --- .../java/moe/apex/breadboard/MainActivity.kt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/moe/apex/breadboard/MainActivity.kt b/app/src/main/java/moe/apex/breadboard/MainActivity.kt index b7090609..313d2f60 100644 --- a/app/src/main/java/moe/apex/breadboard/MainActivity.kt +++ b/app/src/main/java/moe/apex/breadboard/MainActivity.kt @@ -76,13 +76,6 @@ class MainActivity : SingletonImageLoader.Factory, ComponentActivity(), VolumeBu } - private fun maybePrepareArtistDestination(intent: Intent): ArtistProfile? { - val artist = intent.getStringExtra("artist") ?: return null - val source = ImageSource.valueOf(intent.getStringExtra("origin_source") ?: return null) - return ArtistProfile(artist, source) - } - - private fun maybePrepareResultsDestination(intent: Intent): Results? { val searchSource = ImageSource.valueOf(intent.getStringExtra("source") ?: return null) val searchQuery = intent.getStringArrayExtra("query") ?: return null @@ -90,8 +83,15 @@ class MainActivity : SingletonImageLoader.Factory, ComponentActivity(), VolumeBu } + private fun maybePrepareArtistDestination(intent: Intent): ArtistProfile? { + val artist = intent.getStringExtra("artist") ?: return null + val source = ImageSource.valueOf(intent.getStringExtra("origin_source") ?: return null) + return ArtistProfile(artist, source) + } + + private fun determineDestination(intent: Intent): Any? { - // Handle reverse search Intent.ACTION_SEND intent + // Handle Intent.ACTION_SEND intent for reverse search if (intent.action == Intent.ACTION_SEND) { /* Sometimes a shared link may contain an image clipData of the favicon, so we must prioritise the text over the clipData. Providing them both would be bad. */ From 1d8afae26f31d9c2d0dd97b24411864650b2958d Mon Sep 17 00:00:00 2001 From: flazepe <51487578+flazepe@users.noreply.github.com> Date: Tue, 25 Aug 2026 13:19:19 +0800 Subject: [PATCH 13/15] Improve comment --- .../moe/apex/breadboard/saucenao/ReverseSearchScreen.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt b/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt index 95551319..2392a64d 100644 --- a/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt +++ b/app/src/main/java/moe/apex/breadboard/saucenao/ReverseSearchScreen.kt @@ -215,9 +215,9 @@ fun ReverseSearchScreen( if (mimeType?.startsWith("image/") == true) { selectedFileUri = uri } else { - /* onValueChange does not trigger when you press - the paste button, so we still have to reset the - selected file URI. */ + /* onValueChange does not trigger when you mutate + imageUrl via code, so we still have to reset + selectedFileUri here. */ selectedFileUri = null imageUrl = clipboardItem.text.toString() } From 3712ceeddd326666969f6204f7642b073b94dc04 Mon Sep 17 00:00:00 2001 From: flazepe <51487578+flazepe@users.noreply.github.com> Date: Tue, 25 Aug 2026 18:43:48 +0800 Subject: [PATCH 14/15] Set reverse search intent label to SauceNao * I think this is better than Reverse Search since it's shorter (it doesn't get truncated) and matches the screen name in the app --- app/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 884dc942..b99ca0d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -31,7 +31,7 @@ - + From 4c0a8d5a6df5b884bdd2b65201bd016f1d0ca603 Mon Sep 17 00:00:00 2001 From: flazepe <51487578+flazepe@users.noreply.github.com> Date: Tue, 25 Aug 2026 18:45:04 +0800 Subject: [PATCH 15/15] Fix capitalization --- app/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b99ca0d4..8aeb80a7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -31,7 +31,7 @@ - +