From acbe4eafa9cb4b979b079441f854cb9ad11f1c50 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Mon, 31 Jul 2023 23:21:59 +0800 Subject: [PATCH] Support clearing search history --- .../java/com/hippo/ehviewer/EhApplication.kt | 4 +++ .../java/com/hippo/ehviewer/dao/SearchDao.kt | 3 ++ .../hippo/ehviewer/ui/ConfigureActivity.kt | 8 ++--- .../hippo/ehviewer/ui/scene/SearchBarScene.kt | 5 +-- .../hippo/ehviewer/ui/settings/BaseScreen.kt | 4 +-- .../{SecurityScreen.kt => PrivacyScreen.kt} | 33 ++++++++++++++++++- app/src/main/res/values-zh-rCN/strings.xml | 4 +++ app/src/main/res/values/strings.xml | 4 +++ 8 files changed, 54 insertions(+), 11 deletions(-) rename app/src/main/java/com/hippo/ehviewer/ui/settings/{SecurityScreen.kt => PrivacyScreen.kt} (64%) diff --git a/app/src/main/java/com/hippo/ehviewer/EhApplication.kt b/app/src/main/java/com/hippo/ehviewer/EhApplication.kt index f99147bf9..d5c34db38 100644 --- a/app/src/main/java/com/hippo/ehviewer/EhApplication.kt +++ b/app/src/main/java/com/hippo/ehviewer/EhApplication.kt @@ -31,6 +31,7 @@ import com.hippo.ehviewer.client.data.GalleryDetail import com.hippo.ehviewer.coil.MergeInterceptor import com.hippo.ehviewer.coil.installCronetHttpUriFetcher import com.hippo.ehviewer.dailycheck.checkDawn +import com.hippo.ehviewer.dao.SearchDatabase import com.hippo.ehviewer.download.DownloadManager import com.hippo.ehviewer.ktbuilder.cache import com.hippo.ehviewer.ktbuilder.chunker @@ -56,6 +57,7 @@ import moe.tarsin.kt.unreachable import okhttp3.AsyncDns import okhttp3.android.AndroidAsyncDns import okio.Path.Companion.toOkioPath +import splitties.arch.room.roomDb import splitties.init.appCtx private val lifecycle = ProcessLifecycleOwner.get().lifecycle @@ -202,5 +204,7 @@ class EhApplication : Application(), ImageLoaderFactory { maxSizeBytes(Settings.readCacheSize.coerceIn(320, 5120).toLong() * 1024 * 1024) } } + + val searchDatabase by lazy { roomDb("search_database.db") } } } diff --git a/app/src/main/java/com/hippo/ehviewer/dao/SearchDao.kt b/app/src/main/java/com/hippo/ehviewer/dao/SearchDao.kt index 3304e1721..bb33b6b76 100644 --- a/app/src/main/java/com/hippo/ehviewer/dao/SearchDao.kt +++ b/app/src/main/java/com/hippo/ehviewer/dao/SearchDao.kt @@ -6,6 +6,9 @@ import androidx.room.Query @Dao interface SearchDao { + @Query("DELETE FROM suggestions") + suspend fun clear() + @Query("DELETE FROM suggestions WHERE `query` = :query") suspend fun deleteQuery(query: String) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/ConfigureActivity.kt b/app/src/main/java/com/hippo/ehviewer/ui/ConfigureActivity.kt index 8848a5a93..17110014f 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/ConfigureActivity.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/ConfigureActivity.kt @@ -28,7 +28,7 @@ import com.hippo.ehviewer.ui.settings.EhScreen import com.hippo.ehviewer.ui.settings.FilterScreen import com.hippo.ehviewer.ui.settings.LicenseScreen import com.hippo.ehviewer.ui.settings.MyTagsScreen -import com.hippo.ehviewer.ui.settings.SecurityScreen +import com.hippo.ehviewer.ui.settings.PrivacyScreen import com.hippo.ehviewer.ui.settings.UConfigScreen class ConfigureActivity : EhActivity() { @@ -72,8 +72,8 @@ class ConfigureActivity : EhActivity() { composable(LICENSE_SCREEN) { LicenseScreen() } - composable(SECURITY_SETTINGS_SCREEN) { - SecurityScreen() + composable(PRIVACY_SETTINGS_SCREEN) { + PrivacyScreen() } composable(ADVANCED_SETTINGS_SCREEN) { AdvancedScreen() @@ -109,7 +109,7 @@ val LocalNavController = compositionLocalOf { error("CompositionL const val BASE_SETTINGS_SCREEN = "Base" const val EH_SETTINGS_SCREEN = "Eh" const val DOWNLOAD_SETTINGS_SCREEN = "Download" -const val SECURITY_SETTINGS_SCREEN = "Security" +const val PRIVACY_SETTINGS_SCREEN = "Privacy" const val ADVANCED_SETTINGS_SCREEN = "Advanced" const val ABOUT_SETTINGS_SCREEN = "About" const val LICENSE_SCREEN = "License" diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/SearchBarScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/SearchBarScene.kt index 6d9f9149e..ec09ed8a0 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/SearchBarScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/SearchBarScene.kt @@ -19,12 +19,12 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.search.SearchView import com.google.android.material.shape.MaterialShapeDrawable +import com.hippo.ehviewer.EhApplication.Companion.searchDatabase import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhTagDatabase import com.hippo.ehviewer.dao.Search import com.hippo.ehviewer.dao.SearchDao -import com.hippo.ehviewer.dao.SearchDatabase import com.hippo.ehviewer.databinding.ItemSimpleList2Binding import com.hippo.ehviewer.databinding.SceneSearchbarBinding import com.hippo.ehviewer.ui.legacy.BaseDialogBuilder @@ -32,9 +32,6 @@ import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.withUIContext import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow -import splitties.arch.room.roomDb - -private val searchDatabase by lazy { roomDb("search_database.db") } abstract class SearchBarScene : BaseScene(), ToolBarScene { private var _binding: SceneSearchbarBinding? = null diff --git a/app/src/main/java/com/hippo/ehviewer/ui/settings/BaseScreen.kt b/app/src/main/java/com/hippo/ehviewer/ui/settings/BaseScreen.kt index 8c418d510..d1fe0528e 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/settings/BaseScreen.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/settings/BaseScreen.kt @@ -26,7 +26,7 @@ import com.hippo.ehviewer.ui.DOWNLOAD_SETTINGS_SCREEN import com.hippo.ehviewer.ui.EH_SETTINGS_SCREEN import com.hippo.ehviewer.ui.FINISH_ROUTE_NAME import com.hippo.ehviewer.ui.LocalNavController -import com.hippo.ehviewer.ui.SECURITY_SETTINGS_SCREEN +import com.hippo.ehviewer.ui.PRIVACY_SETTINGS_SCREEN @Composable fun BaseScreen() { @@ -59,7 +59,7 @@ fun BaseScreen() { PreferenceHeader( icon = Icons.Default.Security, title = R.string.settings_privacy, - childRouteName = SECURITY_SETTINGS_SCREEN, + childRouteName = PRIVACY_SETTINGS_SCREEN, ) PreferenceHeader( icon = Icons.Default.Adb, diff --git a/app/src/main/java/com/hippo/ehviewer/ui/settings/SecurityScreen.kt b/app/src/main/java/com/hippo/ehviewer/ui/settings/PrivacyScreen.kt similarity index 64% rename from app/src/main/java/com/hippo/ehviewer/ui/settings/SecurityScreen.kt rename to app/src/main/java/com/hippo/ehviewer/ui/settings/PrivacyScreen.kt index 25c263ed1..bab2b9117 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/settings/SecurityScreen.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/settings/PrivacyScreen.kt @@ -7,25 +7,38 @@ import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource +import com.hippo.ehviewer.EhApplication.Companion.searchDatabase import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings import com.hippo.ehviewer.ui.LocalNavController import com.hippo.ehviewer.ui.isAuthenticationSupported import com.hippo.ehviewer.ui.tools.observed +import com.hippo.ehviewer.ui.tools.rememberDialogState import com.hippo.ehviewer.ui.tools.rememberedAccessor +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch @Composable -fun SecurityScreen() { +fun PrivacyScreen() { val navController = LocalNavController.current val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() + val snackbarHostState = remember { SnackbarHostState() } + val coroutineScope = rememberCoroutineScope { Dispatchers.IO } + fun launchSnackBar(content: String) = coroutineScope.launch { snackbarHostState.showSnackbar(content) } + val dialogState = rememberDialogState() + dialogState.Handler() Scaffold( topBar = { TopAppBar( @@ -38,6 +51,7 @@ fun SecurityScreen() { scrollBehavior = scrollBehavior, ) }, + snackbarHost = { SnackbarHost(snackbarHostState) }, ) { Column(modifier = Modifier.padding(it).nestedScroll(scrollBehavior.nestedScrollConnection)) { SwitchPreference( @@ -59,6 +73,23 @@ fun SecurityScreen() { summary = stringResource(id = R.string.settings_privacy_secure_summary), value = Settings::enabledSecurity, ) + val searchHistoryCleared = stringResource(id = R.string.search_history_cleared) + Preference( + title = stringResource(id = R.string.clear_search_history), + summary = stringResource(id = R.string.clear_search_history_summary), + ) { + coroutineScope.launch { + val confirmed = dialogState.show( + confirmText = R.string.clear_all, + dismissText = android.R.string.cancel, + title = R.string.clear_search_history_confirm, + ) + if (confirmed) { + searchDatabase.searchDao().clear() + launchSnackBar(searchHistoryCleared) + } + } + } } } } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9a7bf3a1f..13e7cbbb4 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -461,6 +461,10 @@ 隐私 不允许屏幕抓取 启用后,将不能截取该应用的屏幕截图,同时,将不会在系统任务切换器中显示该应用的内容预览,重新加载应用以生效此更改 + 清除设备上的搜索记录 + 移除您在此设备上执行过的搜索查询的记录 + 要清除搜索记录吗? + 已清除搜索记录 下载服务 收藏画廊 纯黑深色主题 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 03d592bc1..1904be5a7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -526,6 +526,10 @@ Privacy Prevent screenshots Prevent the content of the app from being taken screenshots of or shown in the \"Recent Apps\" list. + Clear device search history + Remove searches you have performed from this device + Clear search history? + Search history cleared Download Service Favorite Black dark theme