diff --git a/app/src/main/kotlin/com/hippo/ehviewer/client/EhTagDatabase.kt b/app/src/main/kotlin/com/hippo/ehviewer/client/EhTagDatabase.kt index cdef888b7..f360b0986 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/EhTagDatabase.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/EhTagDatabase.kt @@ -25,6 +25,8 @@ import com.hippo.ehviewer.util.AppConfig import com.hippo.ehviewer.util.FileUtils import com.hippo.ehviewer.util.StatusCodeException import com.hippo.ehviewer.util.copyTo +import com.hippo.unifile.asUniFile +import com.hippo.unifile.sha1 import eu.kanade.tachiyomi.util.system.logcat import io.ktor.client.HttpClient import io.ktor.client.request.prepareGet @@ -42,8 +44,6 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import moe.tarsin.coroutines.runSuspendCatching import okio.BufferedSource -import okio.HashingSink.Companion.sha1 -import okio.blackholeSink import okio.buffer import okio.source import splitties.init.appCtx @@ -163,19 +163,8 @@ object EhTagDatabase : CoroutineScope { }.getOrNull() } - private fun getFileSha1(file: File): String? { - return runCatching { - file.source().buffer().use { source -> - sha1(blackholeSink()).use { - source.readAll(it) - it.hash.hex() - } - } - }.getOrNull() - } - private fun checkData(sha1: String?, data: File): Boolean { - return sha1 != null && sha1 == getFileSha1(data) + return sha1 != null && sha1 == data.asUniFile().sha1() } private suspend fun save(client: HttpClient, url: String, file: File) { diff --git a/app/src/main/kotlin/com/hippo/ehviewer/client/EhUrl.kt b/app/src/main/kotlin/com/hippo/ehviewer/client/EhUrl.kt index cad8a8ac1..836270725 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/EhUrl.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/EhUrl.kt @@ -139,7 +139,7 @@ object EhUrl { fun getTagDefinitionUrl(tag: String) = "https://ehwiki.org/wiki/" + tag.replace(' ', '_') } -inline fun ehUrl(path: String?, host: String = EhUrl.domain, builder: ParametersBuilder.() -> Unit) = ehUrl( +inline fun ehUrl(path: String? = null, host: String = EhUrl.domain, builder: ParametersBuilder.() -> Unit) = ehUrl( path = if (path.isNullOrBlank()) emptyList() else listOf(path), host = host, parameters = Parameters.build(builder), diff --git a/app/src/main/kotlin/com/hippo/ehviewer/client/data/ListUrlBuilder.kt b/app/src/main/kotlin/com/hippo/ehviewer/client/data/ListUrlBuilder.kt index 2b62d7477..d58ac8110 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/data/ListUrlBuilder.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/data/ListUrlBuilder.kt @@ -47,8 +47,6 @@ data class ListUrlBuilder( var pageFrom: Int = -1, var pageTo: Int = -1, var imagePath: String? = null, - var isUseSimilarityScan: Boolean = false, - var isOnlySearchCovers: Boolean = false, ) : Parcelable { fun setIndex(index: String, isNext: Boolean = true) { @@ -274,7 +272,6 @@ data class ListUrlBuilder( } ?: it } addQueryParameterIfNotBlank("f_search", query) - addQueryParameterIfNotBlank("f_shash", hash) addQueryParameterIfNotBlank("prev", mPrev) addQueryParameterIfNotBlank("next", mNext) addQueryParameterIfNotBlank("seek", mJumpTo) @@ -328,7 +325,9 @@ data class ListUrlBuilder( } MODE_WHATS_HOT -> EhUrl.popularUrl - MODE_IMAGE_SEARCH -> EhUrl.imageSearchUrl + MODE_IMAGE_SEARCH -> ehUrl { + addQueryParameter("f_shash", requireNotNull(hash)) + }.buildString() MODE_TOPLIST -> { ehUrl("toplist.php", EhUrl.DOMAIN_E) { addQueryParameter("tl", requireNotNull(mKeyword)) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/image/Image.kt b/app/src/main/kotlin/com/hippo/ehviewer/image/Image.kt index 1b3acbe00..3b0013f02 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/image/Image.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/image/Image.kt @@ -17,12 +17,10 @@ */ package com.hippo.ehviewer.image -import android.content.Context import android.graphics.Bitmap import android.graphics.ColorSpace import android.graphics.Rect import android.graphics.drawable.Animatable -import android.net.Uri import android.os.Build import androidx.annotation.RequiresApi import arrow.core.Either @@ -40,7 +38,6 @@ import coil3.request.allowHardware import coil3.request.colorSpace import coil3.size.Precision import coil3.size.Scale -import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings import com.hippo.ehviewer.jni.isGif import com.hippo.ehviewer.jni.mmap @@ -96,7 +93,6 @@ class Image private constructor(image: CoilImage, private val src: AutoCloseable } companion object { - private val imageSearchMaxSize = appCtx.resources.getDimensionPixelOffset(R.dimen.image_search_max_size) private val targetWidth = appCtx.resources.displayMetrics.widthPixels * 2 private val targetHeight = appCtx.resources.displayMetrics.heightPixels * 2 @@ -166,20 +162,6 @@ class Image private constructor(image: CoilImage, private val src: AutoCloseable logcat(it) }.getOrNull() } - - suspend fun Context.decodeBitmap(uri: Uri): Bitmap { - val req = imageRequest { - memoryCachePolicy(CachePolicy.DISABLED) - data(uri) - size(imageSearchMaxSize) - scale(Scale.FILL) - } - val image = when (val result = appCtx.imageLoader.execute(req)) { - is SuccessResult -> result.image - is ErrorResult -> throw result.throwable - } - return (image as BitmapImage).bitmap - } } } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt index 0e552bc44..e146cd3c9 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt @@ -20,7 +20,6 @@ import android.app.assist.AssistContent import android.content.Intent import android.content.pm.verify.domain.DomainVerificationManager import android.content.pm.verify.domain.DomainVerificationUserState.DOMAIN_STATE_NONE -import android.graphics.Bitmap import android.net.Uri import android.os.Bundle import android.widget.Toast @@ -104,7 +103,6 @@ import com.hippo.ehviewer.download.DownloadService import com.hippo.ehviewer.download.downloadLocation import com.hippo.ehviewer.icons.EhIcons import com.hippo.ehviewer.icons.filled.Subscriptions -import com.hippo.ehviewer.image.Image.Companion.decodeBitmap import com.hippo.ehviewer.ui.destinations.DownloadScreenDestination import com.hippo.ehviewer.ui.destinations.DownloadsScreenDestination import com.hippo.ehviewer.ui.destinations.FavouritesScreenDestination @@ -127,20 +125,18 @@ import com.hippo.ehviewer.ui.tools.LocalDialogState import com.hippo.ehviewer.ui.tools.LocalTouchSlopProvider import com.hippo.ehviewer.ui.tools.LocalWindowSizeClass import com.hippo.ehviewer.updater.AppUpdater -import com.hippo.ehviewer.util.AppConfig import com.hippo.ehviewer.util.ExceptionUtils import com.hippo.ehviewer.util.addTextToClipboard import com.hippo.ehviewer.util.getParcelableExtraCompat import com.hippo.ehviewer.util.getUrlFromClipboard import com.hippo.ehviewer.util.isAtLeastQ import com.hippo.ehviewer.util.isAtLeastS +import com.hippo.unifile.asUniFile +import com.hippo.unifile.sha1 import com.ramcosta.composedestinations.DestinationsNavHost import com.ramcosta.composedestinations.rememberNavHostEngine import com.ramcosta.composedestinations.utils.currentDestinationAsState import eu.kanade.tachiyomi.util.lang.withIOContext -import eu.kanade.tachiyomi.util.system.logcat -import java.io.File -import java.io.FileOutputStream import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.delay @@ -190,18 +186,6 @@ class MainActivity : EhActivity() { } } - private suspend fun saveImageToTempFile(uri: Uri): File? { - return runSuspendCatching { - val bitmap = decodeBitmap(uri) - val temp = AppConfig.createTempFile() - FileOutputStream(temp).use { bitmap.compress(Bitmap.CompressFormat.JPEG, 90, it) } - temp - }.getOrElse { - logcat(it) - null - } - } - override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) intentChannel.trySend(intent) @@ -280,13 +264,11 @@ class MainActivity : EhActivity() { } else if (type != null && type.startsWith("image/")) { val uri = intent.getParcelableExtraCompat(Intent.EXTRA_STREAM) if (null != uri) { - val temp = withIOContext { saveImageToTempFile(uri) } - if (null != temp) { + withIOContext { uri.asUniFile().sha1() }?.let { navController.navigate( ListUrlBuilder( mode = ListUrlBuilder.MODE_IMAGE_SEARCH, - imagePath = temp.path, - isUseSimilarityScan = true, + hash = it, ).asDst(), ) } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/ImageSearch.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/ImageSearch.kt index a98559a41..12b374b01 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/ImageSearch.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/ImageSearch.kt @@ -1,15 +1,13 @@ package com.hippo.ehviewer.ui.main +import android.net.Uri import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.sizeIn import androidx.compose.material3.Card import androidx.compose.material3.FilledTonalButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ProvideTextStyle import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -19,25 +17,20 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import coil3.compose.AsyncImage import com.hippo.ehviewer.R -import com.hippo.ehviewer.ui.tools.LabeledCheckbox @Composable fun ImageSearch( - imagePath: String, + image: Uri?, onSelectImage: () -> Unit, - uss: Boolean, - onUssChecked: (Boolean) -> Unit, - osc: Boolean, - onOscChecked: (Boolean) -> Unit, ) = Column( modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, ) { - AnimatedVisibility(visible = imagePath.isNotBlank(), modifier = Modifier.align(Alignment.CenterHorizontally)) { + AnimatedVisibility(visible = image != null, modifier = Modifier.align(Alignment.CenterHorizontally)) { Card { val maxSize = dimensionResource(id = R.dimen.image_search_max_size) AsyncImage( - model = imagePath, + model = image, contentDescription = null, modifier = Modifier.sizeIn(maxWidth = maxSize, maxHeight = maxSize), ) @@ -49,18 +42,4 @@ fun ImageSearch( ) { Text(text = stringResource(id = R.string.select_image)) } - ProvideTextStyle(MaterialTheme.typography.bodyMedium) { - Row { - LabeledCheckbox( - checked = uss, - onCheckedChange = onUssChecked, - label = stringResource(id = R.string.search_uss), - ) - LabeledCheckbox( - checked = osc, - onCheckedChange = onOscChecked, - label = stringResource(id = R.string.search_osc), - ) - } - } } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryDetailScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryDetailScreen.kt index fc12ad784..e9a5e3880 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryDetailScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryDetailScreen.kt @@ -593,10 +593,10 @@ fun GalleryDetailScreen(args: GalleryDetailScreenArgs, navigator: DestinationsNa icon = Icons.Default.ImageSearch, text = stringResource(id = R.string.search_cover), onClick = { - val key = galleryDetail.thumbKey.orEmpty() + val key = galleryDetail.thumbKey!! navigator.navigate( ListUrlBuilder( - mode = ListUrlBuilder.MODE_NORMAL, + mode = ListUrlBuilder.MODE_IMAGE_SEARCH, hash = key.substringAfterLast('/').substringBefore('-'), ).asDst(), ) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt index de720148e..1e0bd749d 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryListScreen.kt @@ -1,6 +1,5 @@ package com.hippo.ehviewer.ui.screen -import android.graphics.Bitmap import android.net.Uri import android.view.ViewConfiguration import androidx.activity.result.contract.ActivityResultContracts @@ -110,7 +109,6 @@ import com.hippo.ehviewer.collectAsState import com.hippo.ehviewer.dao.QuickSearch import com.hippo.ehviewer.icons.EhIcons import com.hippo.ehviewer.icons.filled.GoTo -import com.hippo.ehviewer.image.Image.Companion.decodeBitmap import com.hippo.ehviewer.ui.LocalSideSheetState import com.hippo.ehviewer.ui.LocalSnackBarHostState import com.hippo.ehviewer.ui.MainActivity @@ -135,17 +133,17 @@ import com.hippo.ehviewer.ui.tools.draggingHapticFeedback import com.hippo.ehviewer.ui.tools.foldToLoadResult import com.hippo.ehviewer.ui.tools.observed import com.hippo.ehviewer.ui.tools.rememberInVM -import com.hippo.ehviewer.util.AppConfig import com.hippo.ehviewer.util.FavouriteStatusRouter import com.hippo.ehviewer.util.findActivity import com.hippo.ehviewer.util.pickVisualMedia +import com.hippo.unifile.asUniFile +import com.hippo.unifile.sha1 import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.spec.Direction import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.withIOContext import eu.kanade.tachiyomi.util.lang.withUIContext -import java.io.File import kotlin.math.roundToInt import kotlin.random.Random import kotlinx.coroutines.delay @@ -186,9 +184,7 @@ fun GalleryListScreen(lub: ListUrlBuilder, navigator: DestinationsNavigator) { var category by rememberSaveable { mutableIntStateOf(Settings.searchCategory) } var searchMethod by rememberSaveable { mutableIntStateOf(1) } var advancedSearchOption by rememberSaveable { mutableStateOf(AdvancedSearchOption()) } - var useSimilarityScan by rememberSaveable { mutableStateOf(false) } - var searchCoverOnly by rememberSaveable { mutableStateOf(false) } - var imagePath by rememberSaveable { mutableStateOf("") } + var imageUri by rememberSaveable { mutableStateOf(null) } LaunchedEffect(urlBuilder) { if (urlBuilder.mode == MODE_SUBSCRIPTION) searchMethod = 2 @@ -261,16 +257,8 @@ fun GalleryListScreen(lub: ListUrlBuilder, navigator: DestinationsNavigator) { } } runSuspendCatching { - if (MODE_IMAGE_SEARCH == urlBuilder.mode) { - EhEngine.imageSearch( - File(urlBuilder.imagePath!!), - urlBuilder.isUseSimilarityScan, - urlBuilder.isOnlySearchCovers, - ) - } else { - val url = urlBuilder.build() - EhEngine.getGalleryList(url) - } + val url = urlBuilder.build() + EhEngine.getGalleryList(url) }.foldToLoadResult { result -> urlBuilder.mJumpTo = null LoadResult.Page(result.galleryInfoList, result.prev, result.next) @@ -551,18 +539,12 @@ fun GalleryListScreen(lub: ListUrlBuilder, navigator: DestinationsNavigator) { builder.pageFrom = advancedSearchOption.fromPage builder.pageTo = advancedSearchOption.toPage } else { - builder.mode = MODE_IMAGE_SEARCH - if (imagePath.isBlank()) { + if (imageUri == null) { snackbarState.showSnackbar(selectImageFirst) return@ret } - val uri = Uri.parse(imagePath) - val temp = AppConfig.createTempFile() ?: return@ret - val bitmap = context.decodeBitmap(uri) - temp.outputStream().use { bitmap.compress(Bitmap.CompressFormat.JPEG, 90, it) } - builder.imagePath = temp.path - builder.isUseSimilarityScan = useSimilarityScan - builder.isOnlySearchCovers = searchCoverOnly + builder.mode = MODE_IMAGE_SEARCH + builder.hash = imageUri!!.asUniFile().sha1() ?: return@ret } when (oldMode) { MODE_TOPLIST, MODE_WHATS_HOT -> { @@ -648,17 +630,12 @@ fun GalleryListScreen(lub: ListUrlBuilder, navigator: DestinationsNavigator) { style = MaterialTheme.typography.titleMedium, ) ImageSearch( - imagePath = imagePath, + image = imageUri, onSelectImage = { coroutineScope.launch { - val image = context.pickVisualMedia(ActivityResultContracts.PickVisualMedia.ImageOnly) - if (image != null) imagePath = image.toString() + imageUri = context.pickVisualMedia(ActivityResultContracts.PickVisualMedia.ImageOnly) } }, - uss = useSimilarityScan, - onUssChecked = { useSimilarityScan = it }, - osc = searchCoverOnly, - onOscChecked = { searchCoverOnly = it }, ) } } diff --git a/app/src/main/kotlin/com/hippo/unifile/UniFileExtensions.kt b/app/src/main/kotlin/com/hippo/unifile/UniFileExtensions.kt index 952a2c208..d0fe372d0 100644 --- a/app/src/main/kotlin/com/hippo/unifile/UniFileExtensions.kt +++ b/app/src/main/kotlin/com/hippo/unifile/UniFileExtensions.kt @@ -5,10 +5,15 @@ import android.os.Environment import android.os.ParcelFileDescriptor.AutoCloseInputStream import android.os.ParcelFileDescriptor.AutoCloseOutputStream import android.provider.DocumentsContract +import eu.kanade.tachiyomi.util.system.logcat import java.io.File import java.io.FileInputStream import java.io.FileOutputStream +import okio.HashingSink import okio.Path +import okio.blackholeSink +import okio.buffer +import okio.source /** * Use Native IO/NIO directly if possible, unless you need process file content on JVM! @@ -24,6 +29,18 @@ fun UniFile.openOutputStream(): FileOutputStream { return AutoCloseOutputStream(openFileDescriptor("w")) } +fun UniFile.sha1() = runCatching { + openInputStream().source().buffer().use { source -> + HashingSink.sha1(blackholeSink()).use { + source.readAll(it) + it.hash.hex() + } + } +}.getOrElse { + logcat(it) + null +} + fun File.asUniFile() = UniFile.fromFile(this) fun Path.asUniFile() = toFile().asUniFile() diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 484ede118..3b0aa63f2 100755 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -65,8 +65,6 @@ Uploader Etikett Bild wählen - Ähnlichkeitscan aktivieren - Nur nach Umschläge suchen Wähle ein Bild Zu den Favoriten hinzufügen Aus den Favoriten entfernen diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 6069968a6..cc240062f 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -76,8 +76,6 @@ Mostrar solo galerías con torrents Valoración mínima: Seleccionar imagen - Usar búsqueda similar - Buscar solo portadas Seleccione la imagen primero hasta Deshabilitar filtros para: diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index a5aa12924..2dbc9cc1c 100755 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -86,8 +86,6 @@ Tag Sélectionner une image - Activer le scannage de similarité - Chercher seulement les couverture Sélectionnez une image Ajouter à favori diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index bd3e23984..58f1b675e 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -85,8 +85,6 @@ タグ 画像を選択 - 類似検索を有効化 - カバーのみを検索 画像を選択してください お気に入りに追加 diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 3cfbeab89..4a3301eeb 100755 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -82,8 +82,6 @@ 최소 평점: 이미지 선택 - 유사한 이미지 검색 - 커버만 검색 먼저 이미지를 선택해 주세요. 즐겨찾기에 추가 diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 6b5dd1065..0a1ba375c 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -28,7 +28,6 @@ 4 stjerner Ingen torrenter Språk - Kun søk i omslag Fortsett uten å logge inn ♥ %d Torrent (%d) diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 3c711f779..37ace0f92 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -82,8 +82,6 @@ เรตติ้งขั้นต่ำ: เลือกรูปภาพ - ใช้สแกนหาความเหมือน - ค้นหาเฉพาะหน้าปก โปรดเลือกรูปภาพก่อน เพิ่มเข้าในรายการโปรด diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 23645048d..49baeb70e 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -52,8 +52,6 @@ Yükleyen Etiketler Görsel Seç - Benzerlik taramasını kullan - Yalnızca kapak ara Lütfen önce görsel seç Favorilere ekle Favorilerden kaldır diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 64fd9ab70..5f23098f9 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -78,8 +78,6 @@ 上传者 标签 选择图片 - 使用相似搜索 - 只搜索封面 请先选择图片 收藏 移除收藏 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 4d0518872..4be4ed575 100755 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -90,8 +90,6 @@ 標籤 選擇圖片 - 使用相似搜索 - 只搜索封面 請先選擇圖片 收藏 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a338dd389..96d1aa942 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -78,8 +78,6 @@ 上傳者 標籤 選擇圖片 - 使用相似性搜尋 - 只搜尋封面 請先選擇圖片 收藏 移除收藏 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 78da1c822..458296a87 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -118,8 +118,6 @@ Uploader Tags Select image - Use similarity scan - Only search covers Please select image first Add to favourites Remove from favourites