diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/ListUrlBuilder.kt b/app/src/main/java/com/hippo/ehviewer/client/data/ListUrlBuilder.kt index caec5f41f..1b736c50e 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/data/ListUrlBuilder.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/data/ListUrlBuilder.kt @@ -22,7 +22,7 @@ import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.addQueryParameterIfNotBlank import com.hippo.ehviewer.client.ehUrl import com.hippo.ehviewer.dao.QuickSearch -import com.hippo.ehviewer.ui.legacy.AdvanceSearchTable +import com.hippo.ehviewer.ui.main.AdvanceTable import com.hippo.ehviewer.util.encodeUTF8 import com.hippo.ehviewer.yorozuya.toIntOrDefault import kotlinx.parcelize.Parcelize @@ -215,23 +215,23 @@ data class ListUrlBuilder( } "f_sh" -> if ("on" == value) { - advanceSearch = advanceSearch or AdvanceSearchTable.SH + advanceSearch = advanceSearch or AdvanceTable.SH } "f_sto" -> if ("on" == value) { - advanceSearch = advanceSearch or AdvanceSearchTable.STO + advanceSearch = advanceSearch or AdvanceTable.STO } "f_sfl" -> if ("on" == value) { - advanceSearch = advanceSearch or AdvanceSearchTable.SFL + advanceSearch = advanceSearch or AdvanceTable.SFL } "f_sfu" -> if ("on" == value) { - advanceSearch = advanceSearch or AdvanceSearchTable.SFU + advanceSearch = advanceSearch or AdvanceTable.SFU } "f_sft" -> if ("on" == value) { - advanceSearch = advanceSearch or AdvanceSearchTable.SFT + advanceSearch = advanceSearch or AdvanceTable.SFT } "f_sr" -> if ("on" == value) { @@ -297,19 +297,19 @@ data class ListUrlBuilder( // Advance search if (advanceSearch != -1) { addQueryParameter("advsearch", "1") - if (advanceSearch and AdvanceSearchTable.SH != 0) { + if (advanceSearch and AdvanceTable.SH != 0) { addQueryParameter("f_sh", "on") } - if (advanceSearch and AdvanceSearchTable.STO != 0) { + if (advanceSearch and AdvanceTable.STO != 0) { addQueryParameter("f_sto", "on") } - if (advanceSearch and AdvanceSearchTable.SFL != 0) { + if (advanceSearch and AdvanceTable.SFL != 0) { addQueryParameter("f_sfl", "on") } - if (advanceSearch and AdvanceSearchTable.SFU != 0) { + if (advanceSearch and AdvanceTable.SFU != 0) { addQueryParameter("f_sfu", "on") } - if (advanceSearch and AdvanceSearchTable.SFT != 0) { + if (advanceSearch and AdvanceTable.SFT != 0) { addQueryParameter("f_sft", "on") } // Set min star diff --git a/app/src/main/java/com/hippo/ehviewer/ui/legacy/AdvanceSearchTable.kt b/app/src/main/java/com/hippo/ehviewer/ui/legacy/AdvanceSearchTable.kt deleted file mode 100644 index da8a76c31..000000000 --- a/app/src/main/java/com/hippo/ehviewer/ui/legacy/AdvanceSearchTable.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2015 Hippo Seven - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.hippo.ehviewer.ui.legacy - -class AdvanceSearchTable { - companion object { - const val SH = 0x1 - const val STO = 0x2 - const val SFL = 0x100 - const val SFU = 0x200 - const val SFT = 0x400 - } -} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/legacy/SearchLayout.kt b/app/src/main/java/com/hippo/ehviewer/ui/legacy/SearchLayout.kt index 82876df4d..c5d73ee50 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/legacy/SearchLayout.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/legacy/SearchLayout.kt @@ -35,8 +35,10 @@ import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.data.ListUrlBuilder import com.hippo.ehviewer.client.exception.EhException import com.hippo.ehviewer.image.Image +import com.hippo.ehviewer.ui.main.AdvancedSearchOption import com.hippo.ehviewer.ui.main.ImageSearch import com.hippo.ehviewer.ui.main.NormalSearch +import com.hippo.ehviewer.ui.main.SearchAdvanced import com.hippo.ehviewer.util.pickVisualMedia import com.hippo.unifile.UniFile import kotlinx.coroutines.launch @@ -48,10 +50,9 @@ class SearchLayout @JvmOverloads constructor( ) : AbstractComposeView(context, attrs, defStyle) { private var isNormalMode by mutableStateOf(true) // else ImageSearch mode private var isAdvancedMode by mutableStateOf(false) - private var mCategory by mutableIntStateOf(Settings.searchCategory) private var mSearchMode by mutableIntStateOf(1) - + private var advancedState by mutableStateOf(AdvancedSearchOption()) private var uss by mutableStateOf(false) private var osc by mutableStateOf(false) private var path by mutableStateOf("") @@ -89,7 +90,14 @@ class SearchLayout @JvmOverloads constructor( } } AnimatedVisibility(visible = isNormalMode && isAdvancedMode) { - ElevatedCard { + ElevatedCard(modifier = Modifier.fillMaxWidth()) { + Column(modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.search_category_padding_h), vertical = dimensionResource(id = R.dimen.search_category_padding_v))) { + Text(text = stringResource(id = R.string.search_advance), modifier = Modifier.height(dimensionResource(id = R.dimen.search_category_title_height)), fontWeight = FontWeight.Bold, style = MaterialTheme.typography.titleMedium) + SearchAdvanced( + state = advancedState, + onStateChanged = { advancedState = it }, + ) + } } } AnimatedVisibility(visible = !isNormalMode) { @@ -146,6 +154,19 @@ class SearchLayout @JvmOverloads constructor( } urlBuilder.keyword = query urlBuilder.category = mCategory + if (isAdvancedMode) { + urlBuilder.advanceSearch = advancedState.advanceSearch + urlBuilder.minRating = advancedState.minRating + val pageFrom = advancedState.page.first + val pageTo = advancedState.page.last + if (pageTo != -1 && pageTo < 10) { + throw EhException(context.getString(R.string.search_sp_err1)) + } else if (pageFrom != -1 && pageTo != -1 && pageTo - pageFrom < 20) { + throw EhException(context.getString(R.string.search_sp_err2)) + } + urlBuilder.pageFrom = pageFrom + urlBuilder.pageTo = pageTo + } } false -> { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/main/AdvanceTable.kt b/app/src/main/java/com/hippo/ehviewer/ui/main/AdvanceTable.kt new file mode 100644 index 000000000..20905ca8f --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/ui/main/AdvanceTable.kt @@ -0,0 +1,15 @@ +package com.hippo.ehviewer.ui.main + +object AdvanceTable { + const val SH = 0x1 + const val STO = 0x2 + const val SFL = 0x100 + const val SFU = 0x200 + const val SFT = 0x400 +} + +data class AdvancedSearchOption( + val advanceSearch: Int = 0, + val minRating: Int = 0, + val page: IntRange = 0..1, +) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/main/AdvancedSearch.kt b/app/src/main/java/com/hippo/ehviewer/ui/main/AdvancedSearch.kt new file mode 100644 index 000000000..aa25ded89 --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/ui/main/AdvancedSearch.kt @@ -0,0 +1,37 @@ +package com.hippo.ehviewer.ui.main + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.material3.Checkbox +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 +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import com.hippo.ehviewer.R + +@Composable +fun SearchAdvanced( + state: AdvancedSearchOption, + onStateChanged: (AdvancedSearchOption) -> Unit, +) { + Column { + ProvideTextStyle(MaterialTheme.typography.bodyMedium) { + val adv = state.advanceSearch + fun checked(bit: Int) = adv and bit != 0 + fun AdvancedSearchOption.inv(checked: Boolean, bit: Int) = onStateChanged(copy(advanceSearch = if (checked) advanceSearch xor bit else advanceSearch or bit)) + Row { + Row(modifier = Modifier.weight(1f)) { + Checkbox(checked = checked(AdvanceTable.SH), onCheckedChange = { state.inv(it, AdvanceTable.SH) }) + Text(text = stringResource(id = R.string.search_sh), modifier = Modifier.align(Alignment.CenterVertically)) + } + Row(modifier = Modifier.weight(1f)) { + Checkbox(checked = checked(AdvanceTable.STO), onCheckedChange = { state.inv(it, AdvanceTable.STO) }) + Text(text = stringResource(id = R.string.search_sto), modifier = Modifier.align(Alignment.CenterVertically)) + } + } + } + } +}