Skip to content

Commit e78fac0

Browse files
committed
Merge branch 'release/v1.3.3'
2 parents 694abf8 + ac617d4 commit e78fac0

File tree

20 files changed

+91
-20
lines changed

20 files changed

+91
-20
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ android {
1919

2020
defaultConfig {
2121
applicationId = "com.mrl.pixiv"
22-
versionCode = 10302
23-
versionName = "1.3.2"
22+
versionCode = 10303
23+
versionName = "1.3.3"
2424

2525
vectorDrawables {
2626
useSupportLibrary = true

common/data/src/main/kotlin/com/mrl/pixiv/common/data/search/SearchResp.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ data class SearchIllustResp(
1616
val searchSpanLimit: Long,
1717

1818
@SerialName("show_ai")
19-
val showAi: Boolean
19+
val showAi: Boolean = true
2020
)
2121

2222
@Serializable

common/datasource-remote/src/main/kotlin/com/mrl/pixiv/common/datasource/remote/PixivApi.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,4 +233,13 @@ interface PixivApi {
233233
suspend fun addIllustBrowsingHistory(
234234
@Field("illust_ids[]") illustId: List<Long>,
235235
): EmptyResp
236+
237+
@GET("v1/search/popular-preview/illust")
238+
suspend fun searchPopularPreviewIllust(
239+
@Query("filter") filter: String = Filter.ANDROID.value,
240+
@Query("include_translated_tag_results") includeTranslatedTagResults: Boolean = true,
241+
@Query("merge_plain_keyword_results") mergePlainKeywordResults: Boolean = true,
242+
@Query("word") word: String,
243+
@Query("search_target") searchTarget: String = SearchTarget.PARTIAL_MATCH_FOR_TAGS.value,
244+
): SearchIllustResp
236245
}

common/repository/src/main/kotlin/com/mrl/pixiv/common/repository/PixivRepository.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,4 +212,13 @@ object PixivRepository : KoinComponent {
212212

213213
suspend fun addIllustBrowsingHistory(illustIds: List<Long>) =
214214
apiApi.addIllustBrowsingHistory(illustIds)
215+
216+
suspend fun searchPopularPreviewIllust(query: SearchIllustQuery) =
217+
apiApi.searchPopularPreviewIllust(
218+
query.filter.value,
219+
query.includeTranslatedTagResults,
220+
query.mergePlainKeywordResults,
221+
query.word,
222+
query.searchTarget.value,
223+
)
215224
}

common/repository/src/main/kotlin/com/mrl/pixiv/common/repository/paging/SearchIllustPagingSource.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import com.mrl.pixiv.common.repository.util.queryParams
1414

1515
class SearchIllustPagingSource(
1616
private val query: SearchIllustQuery,
17+
private val isPremium: Boolean,
1718
) : PagingSource<SearchIllustQuery, Illust>() {
1819
override fun getRefreshKey(state: PagingState<SearchIllustQuery, Illust>): SearchIllustQuery? {
1920
return null
@@ -22,7 +23,11 @@ class SearchIllustPagingSource(
2223
override suspend fun load(params: LoadParams<SearchIllustQuery>): LoadResult<SearchIllustQuery, Illust> {
2324
return try {
2425
val resp = if (params.key == null) {
25-
PixivRepository.searchIllust(query)
26+
if (query.sort == SearchSort.POPULAR_DESC && !isPremium) {
27+
PixivRepository.searchPopularPreviewIllust(query)
28+
} else {
29+
PixivRepository.searchIllust(query)
30+
}
2631
} else {
2732
PixivRepository.searchIllustNext(params.key!!.toMap())
2833
}
@@ -61,4 +66,4 @@ class SearchIllustPagingSource(
6166
LoadResult.Error(e)
6267
}
6368
}
64-
}
69+
}

feature/main/src/main/kotlin/com/mrl/pixiv/search/result/SearchResultViewModel.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,14 @@ import androidx.paging.PagingConfig
77
import androidx.paging.cachedIn
88
import com.mrl.pixiv.common.data.search.SearchIllustQuery
99
import com.mrl.pixiv.common.repository.paging.SearchIllustPagingSource
10+
import com.mrl.pixiv.common.repository.requireUserInfoFlow
1011
import com.mrl.pixiv.common.viewmodel.BaseMviViewModel
1112
import com.mrl.pixiv.common.viewmodel.ViewIntent
1213
import com.mrl.pixiv.search.SearchState.SearchFilter
14+
import kotlinx.coroutines.flow.combine
15+
import kotlinx.coroutines.flow.distinctUntilChanged
1316
import kotlinx.coroutines.flow.flatMapLatest
17+
import kotlinx.coroutines.flow.map
1418
import kotlinx.datetime.LocalDate
1519
import kotlinx.datetime.LocalDateRange
1620
import kotlinx.datetime.format
@@ -46,7 +50,12 @@ class SearchResultViewModel(
4650
) : BaseMviViewModel<SearchResultState, SearchResultAction>(
4751
initialState = SearchResultState(searchWords = searchWords),
4852
), KoinComponent {
49-
val searchResults = uiState.flatMapLatest { state ->
53+
val searchResults = combine(
54+
uiState,
55+
requireUserInfoFlow.map { it.profile.isPremium }.distinctUntilChanged()
56+
) { state, isPremium ->
57+
state to isPremium
58+
}.flatMapLatest { (state, isPremium) ->
5059
val words = state.searchWords
5160
val filter = state.searchFilter
5261
val startDate = state.searchDateRange?.start
@@ -62,7 +71,8 @@ class SearchResultViewModel(
6271
startDate = startDate?.format(LocalDate.Formats.ISO),
6372
endDate = endDate?.format(LocalDate.Formats.ISO),
6473
searchAiType = filter.searchAiType,
65-
)
74+
),
75+
isPremium = isPremium
6676
)
6777
}.flow
6878
}.cachedIn(viewModelScope)

feature/main/src/main/kotlin/com/mrl/pixiv/search/result/components/FilterBottomSheet.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,18 @@ import androidx.compose.ui.draw.clip
2828
import androidx.compose.ui.graphics.Color
2929
import androidx.compose.ui.res.stringResource
3030
import androidx.compose.ui.unit.dp
31+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
32+
import com.mrl.pixiv.common.compose.LocalToaster
3133
import com.mrl.pixiv.common.data.search.SearchAiType
3234
import com.mrl.pixiv.common.data.search.SearchSort
3335
import com.mrl.pixiv.common.data.search.SearchTarget
36+
import com.mrl.pixiv.common.repository.requireUserInfoFlow
3437
import com.mrl.pixiv.common.util.RString
3538
import com.mrl.pixiv.common.util.throttleClick
3639
import com.mrl.pixiv.search.SearchState.SearchFilter
40+
import kotlinx.coroutines.flow.map
3741
import kotlinx.coroutines.launch
42+
import kotlin.time.Duration.Companion.seconds
3843

3944
@Composable
4045
internal fun FilterBottomSheet(
@@ -46,6 +51,8 @@ internal fun FilterBottomSheet(
4651
) {
4752
var innerSearchFilter by remember { mutableStateOf(searchFilter) }
4853
val scope = rememberCoroutineScope()
54+
val toaster = LocalToaster.current
55+
val isPremium by requireUserInfoFlow.map { it.profile.isPremium }.collectAsStateWithLifecycle(false)
4956
ModalBottomSheet(
5057
onDismissRequest = onDismissRequest,
5158
modifier = modifier,
@@ -111,6 +118,9 @@ internal fun FilterBottomSheet(
111118
selected = innerSearchFilter.sort == key,
112119
onClick = {
113120
innerSearchFilter = innerSearchFilter.copy(sort = key)
121+
if (!isPremium && key == SearchSort.POPULAR_DESC) {
122+
toaster.show(RString.premium_required, duration = 2.seconds)
123+
}
114124
}
115125
)
116126
}

feature/main/src/main/kotlin/com/mrl/pixiv/search/result/components/SearchResultAppBar.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,19 @@ import androidx.compose.ui.Modifier
3535
import androidx.compose.ui.res.stringResource
3636
import androidx.compose.ui.text.style.TextOverflow
3737
import androidx.compose.ui.unit.dp
38+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
39+
import com.mrl.pixiv.common.compose.LocalToaster
40+
import com.mrl.pixiv.common.repository.requireUserInfoFlow
3841
import com.mrl.pixiv.common.util.RString
3942
import com.mrl.pixiv.common.util.throttleClick
43+
import kotlinx.coroutines.flow.map
4044
import kotlinx.datetime.LocalDateRange
4145
import kotlinx.datetime.TimeZone
4246
import kotlinx.datetime.atStartOfDayIn
4347
import kotlinx.datetime.toLocalDateTime
4448
import kotlin.time.Clock
4549
import kotlin.time.Duration.Companion.days
50+
import kotlin.time.Duration.Companion.seconds
4651
import kotlin.time.Instant
4752

4853
@OptIn(ExperimentalMaterial3Api::class)
@@ -59,6 +64,9 @@ internal fun SearchResultAppBar(
5964
) {
6065
var showBookmarkMenu by remember { mutableStateOf(false) }
6166
var showDateRangePicker by remember { mutableStateOf(false) }
67+
val toaster = LocalToaster.current
68+
val isPremium by requireUserInfoFlow.map { it.profile.isPremium }
69+
.collectAsStateWithLifecycle(false)
6270

6371
TopAppBar(
6472
modifier = modifier,
@@ -97,7 +105,12 @@ internal fun SearchResultAppBar(
97105
}
98106
// Bookmark Range
99107
IconButton(
100-
onClick = { showBookmarkMenu = true },
108+
onClick = {
109+
showBookmarkMenu = true
110+
if (!isPremium) {
111+
toaster.show(RString.premium_required, duration = 2.seconds)
112+
}
113+
},
101114
shapes = IconButtonDefaults.shapes(),
102115
) {
103116
Icon(

feature/setting/src/main/kotlin/com/mrl/pixiv/setting/appdata/AppDataScreen.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import androidx.compose.material3.TopAppBar
3838
import androidx.compose.runtime.Composable
3939
import androidx.compose.runtime.LaunchedEffect
4040
import androidx.compose.runtime.getValue
41+
import androidx.compose.runtime.mutableIntStateOf
4142
import androidx.compose.runtime.mutableStateOf
4243
import androidx.compose.runtime.remember
4344
import androidx.compose.runtime.rememberCoroutineScope
@@ -72,6 +73,8 @@ fun AppDataScreen(
7273
val state = viewModel.asState()
7374

7475
var showMigrationConfirmDialog by remember { mutableStateOf(false) }
76+
var trigger by remember { mutableIntStateOf(0) }
77+
val cacheDirSize = remember(trigger) { context.cacheDir.calculateSize().adaptiveFileSize() }
7578

7679
val permissionLauncher = rememberLauncherForActivityResult(
7780
contract = ActivityResultContracts.RequestPermission()
@@ -181,7 +184,7 @@ fun AppDataScreen(
181184

182185
ListItem(
183186
headlineContent = {
184-
Text(text = stringResource(RString.clear_cache))
187+
Text(text = stringResource(RString.clear_cache, cacheDirSize))
185188
},
186189
modifier = Modifier.clickable {
187190
scope.launch(Dispatchers.IO) {
@@ -190,6 +193,7 @@ fun AppDataScreen(
190193
it.deleteRecursively()
191194
}
192195
ToastUtil.safeShortToast(RString.cache_cleared, dirSize)
196+
trigger++
193197
}
194198
},
195199
leadingContent = {

lib_strings/src/main/res/values-ar/strings.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@
9090
<string name="user_blocked">تم حظر المستخدم</string>
9191
<string name="cancel_user_blocked">إلغاء حظر المستخدم</string>
9292
<string name="app_data">بيانات التطبيق</string>
93-
<string name="clear_cache">مسح ذاكرة التخزين المؤقت</string>
93+
<string name="clear_cache">مسح ذاكرة التخزين المؤقت (%1$s)</string>
9494
<string name="cache_cleared">تم إخلاء %1$s من المساحة</string>
9595
<string name="migrate_data_title">تم اكتشاف بيانات قديمة</string>
9696
<string name="migrate_data_desc">تم اكتشاف %1$d صورة في الدليل القديم، يوصى بنقلها إلى الدليل الجديد</string>
@@ -149,4 +149,5 @@
149149
<string name="new_version_available">نسخة جديدة متاحة</string>
150150
<string name="current_version">الإصدار الحالي: %s</string>
151151
<string name="download">تحميل</string>
152+
<string name="premium_required">Pixiv Premium مطلوب</string>
152153
</resources>

0 commit comments

Comments
 (0)