Skip to content

Commit e9c9292

Browse files
authored
Merge pull request #703 from Daily-DAYO/release/2.1.0
Release v2.1.0
2 parents 43e7d3e + e9509bd commit e9c9292

File tree

22 files changed

+478
-292
lines changed

22 files changed

+478
-292
lines changed

app/build.gradle

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ android {
3333
applicationId "com.daily.dayo"
3434
minSdkVersion rootProject.ext.minSdkVersion
3535
targetSdkVersion rootProject.ext.targetSdkVersion
36-
versionCode 20000
37-
versionName "2.0.0"
36+
versionCode 21000
37+
versionName "2.1.0"
3838

3939
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
4040

@@ -102,7 +102,7 @@ dependencies {
102102
implementation project(':domain')
103103
implementation project(':data')
104104

105-
def sentry_version = "7.16.0"
105+
def sentry_version = "8.24.0"
106106
def glide_version = "4.15.1"
107107

108108
// Hilt
@@ -114,8 +114,10 @@ dependencies {
114114
implementation "com.github.bumptech.glide:glide:$glide_version"
115115
kapt "com.github.bumptech.glide:compiler:$glide_version"
116116
// Sentry
117-
implementation "io.sentry:sentry-android:$sentry_version"
118-
implementation 'org.slf4j:slf4j-nop:1.7.25'
117+
implementation platform("io.sentry:sentry-bom:$sentry_version")
118+
implementation('io.sentry:sentry-android')
119+
implementation('io.sentry:sentry-android-fragment')
120+
implementation 'org.slf4j:slf4j-nop:2.0.17'
119121
// Firebase
120122
implementation 'com.google.firebase:firebase-crashlytics-ktx'
121123
implementation 'com.google.firebase:firebase-analytics-ktx'

data/src/main/java/daily/dayo/data/datasource/remote/search/SearchApiService.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ import retrofit2.http.Query
66

77
interface SearchApiService {
88

9-
@GET("/api/v1/search")
9+
@GET("/api/v2/search")
1010
suspend fun requestSearchTag(
1111
@Query("tag") tag: String,
12-
@Query("end") end: Int
12+
@Query("end") end: Int,
13+
@Query("order") order: String
1314
): NetworkResponse<SearchResultResponse>
1415

1516
@GET("/api/v1/search/member")

data/src/main/java/daily/dayo/data/datasource/remote/search/SearchPagingSource.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,20 @@ import androidx.paging.PagingState
55
import daily.dayo.data.mapper.toSearch
66
import daily.dayo.domain.model.NetworkResponse
77
import daily.dayo.domain.model.Search
8+
import daily.dayo.domain.model.SearchOrder
89

910
class SearchPagingSource(
1011
private val apiService: SearchApiService,
1112
private val size: Int,
12-
private val tag: String
13+
private val tag: String,
14+
private val searchOrder: SearchOrder
1315
) : PagingSource<Int, Search>() {
1416

1517
override suspend fun load(
1618
params: LoadParams<Int>
1719
): LoadResult<Int, Search> {
1820
val nextPageNumber = params.key ?: 0
19-
apiService.requestSearchTag(tag = tag, end = nextPageNumber).let { ApiResponse ->
21+
apiService.requestSearchTag(tag = tag, end = nextPageNumber, order = searchOrder.toString()).let { ApiResponse ->
2022
return try {
2123
when (ApiResponse) {
2224
is NetworkResponse.Success -> {

data/src/main/java/daily/dayo/data/repository/SearchRepositoryImpl.kt

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ import androidx.paging.PagingData
77
import daily.dayo.data.datasource.local.SharedManager
88
import daily.dayo.data.datasource.remote.search.SearchApiService
99
import daily.dayo.data.datasource.remote.search.SearchFollowUserPagingSource
10-
import daily.dayo.data.datasource.remote.search.SearchUserPagingSource
1110
import daily.dayo.data.datasource.remote.search.SearchPagingSource
11+
import daily.dayo.data.datasource.remote.search.SearchUserPagingSource
1212
import daily.dayo.domain.model.NetworkResponse
1313
import daily.dayo.domain.model.Search
1414
import daily.dayo.domain.model.SearchHistory
1515
import daily.dayo.domain.model.SearchHistoryDetail
1616
import daily.dayo.domain.model.SearchHistoryType
17+
import daily.dayo.domain.model.SearchOrder
1718
import daily.dayo.domain.model.SearchUser
1819
import daily.dayo.domain.repository.SearchRepository
1920
import kotlinx.coroutines.flow.Flow
@@ -47,10 +48,11 @@ class SearchRepositoryImpl @Inject constructor(
4748
override fun updateSearchKeywordRecentList(keyword: String, requestSearchType: SearchHistoryType) {
4849
SharedManager(context = context).updateSearchHistory(
4950
SearchHistoryDetail(
50-
history = keyword,
51-
searchHistoryType = requestSearchType,
52-
searchId = 0
53-
))
51+
history = keyword,
52+
searchHistoryType = requestSearchType,
53+
searchId = 0
54+
)
55+
)
5456
}
5557

5658
override fun requestSearchUser(nickname: String): Flow<PagingData<SearchUser>> = Pager(PagingConfig(pageSize = SEARCH_PAGE_SIZE)) {
@@ -61,35 +63,43 @@ class SearchRepositoryImpl @Inject constructor(
6163
SearchFollowUserPagingSource(searchApiService, SEARCH_PAGE_SIZE, nickname)
6264
}.flow
6365

64-
override fun requestSearchTag(tag: String): Flow<PagingData<Search>> = Pager(PagingConfig(pageSize = SEARCH_PAGE_SIZE)) {
65-
SearchPagingSource(searchApiService, SEARCH_PAGE_SIZE, tag)
66+
override fun requestSearchTag(tag: String, searchOrder: SearchOrder): Flow<PagingData<Search>> = Pager(PagingConfig(pageSize = SEARCH_PAGE_SIZE)) {
67+
SearchPagingSource(searchApiService, SEARCH_PAGE_SIZE, tag, searchOrder)
6668
}.flow
6769

68-
override suspend fun requestSearchTotalCount(tag: String, end: Int, searchHistoryType: SearchHistoryType) : Int =
69-
when (searchHistoryType) {
70-
SearchHistoryType.TAG -> {
71-
searchApiService.requestSearchTag(tag, end).let { ApiResponse ->
72-
when(ApiResponse) {
73-
is NetworkResponse.Success -> {
74-
return ApiResponse.body!!.totalCount
75-
}
76-
else -> return 0
70+
override suspend fun requestSearchTotalCount(
71+
tag: String,
72+
end: Int,
73+
searchHistoryType: SearchHistoryType,
74+
searchOrder: SearchOrder
75+
): Int = when (searchHistoryType) {
76+
SearchHistoryType.TAG -> {
77+
searchApiService.requestSearchTag(tag, end, searchOrder.toString()).let { ApiResponse ->
78+
when (ApiResponse) {
79+
is NetworkResponse.Success -> {
80+
return ApiResponse.body!!.totalCount
7781
}
82+
83+
else -> return 0
7884
}
7985
}
80-
SearchHistoryType.USER -> {
81-
searchApiService.requestSearchUser(tag, end).let { ApiResponse ->
82-
when(ApiResponse) {
83-
is NetworkResponse.Success -> {
84-
return ApiResponse.body!!.totalCount
85-
}
86-
else -> return 0
86+
}
87+
88+
SearchHistoryType.USER -> {
89+
searchApiService.requestSearchUser(tag, end).let { ApiResponse ->
90+
when (ApiResponse) {
91+
is NetworkResponse.Success -> {
92+
return ApiResponse.body!!.totalCount
8793
}
94+
95+
else -> return 0
8896
}
8997
}
90-
else -> 0
9198
}
9299

100+
else -> 0
101+
}
102+
93103
companion object {
94104
private const val SEARCH_PAGE_SIZE = 10
95105
}

domain/src/main/java/daily/dayo/domain/model/Search.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,12 @@ data class SearchHistoryDetail(
2727
enum class SearchHistoryType {
2828
USER,
2929
TAG
30-
}
30+
}
31+
32+
enum class SearchOrder {
33+
NEW, OLD;
34+
35+
override fun toString(): String {
36+
return name.lowercase()
37+
}
38+
}

domain/src/main/java/daily/dayo/domain/repository/SearchRepository.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import androidx.paging.PagingData
44
import daily.dayo.domain.model.Search
55
import daily.dayo.domain.model.SearchHistory
66
import daily.dayo.domain.model.SearchHistoryType
7+
import daily.dayo.domain.model.SearchOrder
78
import daily.dayo.domain.model.SearchUser
89
import kotlinx.coroutines.flow.Flow
910

1011
interface SearchRepository {
11-
fun requestSearchTag(tag: String): Flow<PagingData<Search>>
12+
fun requestSearchTag(tag: String, searchOrder: SearchOrder): Flow<PagingData<Search>>
1213
fun requestSearchUser(nickname: String): Flow<PagingData<SearchUser>>
1314
fun requestSearchFollowUser(nickname: String): Flow<PagingData<SearchUser>>
1415
fun requestSearchKeywordRecentList(): SearchHistory
@@ -22,6 +23,7 @@ interface SearchRepository {
2223
suspend fun requestSearchTotalCount(
2324
tag: String,
2425
end: Int,
25-
searchHistoryType: SearchHistoryType
26+
searchHistoryType: SearchHistoryType,
27+
searchOrder: SearchOrder
2628
): Int
2729
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package daily.dayo.domain.usecase.search
22

3+
import daily.dayo.domain.model.SearchOrder
34
import daily.dayo.domain.repository.SearchRepository
45
import javax.inject.Inject
56

67
class RequestSearchTagUseCase @Inject constructor(
78
private val searchRepository: SearchRepository
89
) {
9-
operator fun invoke(tag: String) = searchRepository.requestSearchTag(tag)
10+
operator fun invoke(tag: String, searchOrder: SearchOrder) = searchRepository.requestSearchTag(tag, searchOrder)
1011
}
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package daily.dayo.domain.usecase.search
22

33
import daily.dayo.domain.model.SearchHistoryType
4+
import daily.dayo.domain.model.SearchOrder
45
import daily.dayo.domain.repository.SearchRepository
56
import javax.inject.Inject
67

78
class RequestSearchTotalCountUseCase @Inject constructor(
89
private val searchRepository: SearchRepository
910
) {
10-
suspend operator fun invoke(tag: String, searchHistoryType: SearchHistoryType) =
11-
searchRepository.requestSearchTotalCount(tag, 0, searchHistoryType)
11+
suspend operator fun invoke(
12+
tag: String,
13+
searchHistoryType: SearchHistoryType,
14+
searchOrder: SearchOrder = SearchOrder.NEW
15+
) = searchRepository.requestSearchTotalCount(tag, 0, searchHistoryType, searchOrder)
1216
}

presentation/src/main/java/daily/dayo/presentation/activity/MainActivity.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ class MainActivity : AppCompatActivity() {
4545
MainScreen(
4646
onAdRequest = { onRewardSuccess ->
4747
showAdIfAvailable(onRewardSuccess)
48-
}
48+
},
49+
onExit = { finish() }
4950
)
5051
}
5152
}

presentation/src/main/java/daily/dayo/presentation/screen/account/AccountScreen.kt

Lines changed: 69 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,100 @@
11
package daily.dayo.presentation.screen.account
22

3-
import android.annotation.SuppressLint
3+
import androidx.compose.animation.core.animateFloatAsState
4+
import androidx.compose.foundation.background
5+
import androidx.compose.foundation.clickable
6+
import androidx.compose.foundation.interaction.MutableInteractionSource
47
import androidx.compose.foundation.layout.Box
8+
import androidx.compose.foundation.layout.fillMaxSize
9+
import androidx.compose.foundation.layout.navigationBarsPadding
510
import androidx.compose.foundation.layout.padding
6-
import androidx.compose.material.Scaffold
11+
import androidx.compose.foundation.layout.systemBarsPadding
12+
import androidx.compose.material3.BottomSheetScaffold
713
import androidx.compose.material3.ExperimentalMaterial3Api
14+
import androidx.compose.material3.SheetValue
815
import androidx.compose.material3.SnackbarHost
916
import androidx.compose.material3.SnackbarHostState
1017
import androidx.compose.runtime.Composable
18+
import androidx.compose.runtime.derivedStateOf
1119
import androidx.compose.runtime.getValue
1220
import androidx.compose.runtime.mutableStateOf
1321
import androidx.compose.runtime.remember
1422
import androidx.compose.runtime.rememberCoroutineScope
1523
import androidx.compose.runtime.setValue
1624
import androidx.compose.ui.Modifier
25+
import androidx.compose.ui.unit.dp
1726
import androidx.navigation.compose.NavHost
27+
import daily.dayo.presentation.theme.Dark
1828
import daily.dayo.presentation.view.dialog.getBottomSheetDialogState
29+
import kotlinx.coroutines.launch
1930

20-
@SuppressLint("UnusedMaterialScaffoldPaddingParameter")
2131
@OptIn(ExperimentalMaterial3Api::class)
2232
@Composable
2333
internal fun AccountScreen(
2434
navigator: AccountNavigator = rememberAccountNavigator()
2535
) {
2636
val coroutineScope = rememberCoroutineScope()
2737
val snackBarHostState = remember { SnackbarHostState() }
38+
var bottomSheetContent by remember { mutableStateOf<(@Composable () -> Unit)?>(null) }
2839
val bottomSheetState = getBottomSheetDialogState()
29-
var bottomSheet: (@Composable () -> Unit)? by remember { mutableStateOf(null) }
30-
val bottomSheetContent: (@Composable () -> Unit) -> Unit = {
31-
bottomSheet = it
40+
val bottomSheetDimAlpha by remember {
41+
derivedStateOf { if (bottomSheetState.bottomSheetState.currentValue == SheetValue.Expanded) 0.6f else 0f }
3242
}
33-
Scaffold(
34-
snackbarHost = { SnackbarHost(hostState = snackBarHostState) }
35-
) {
36-
Scaffold(
37-
bottomBar = { bottomSheet?.let { it() } }
38-
) {
39-
Scaffold(
40-
content = { innerPadding ->
41-
Box(Modifier.padding(innerPadding)) {
42-
NavHost(
43-
navController = navigator.navController,
44-
startDestination = AccountScreen.SignIn.route
45-
) {
46-
signInNavGraph(
47-
coroutineScope = coroutineScope,
48-
snackBarHostState = snackBarHostState,
49-
navController = navigator.navController,
50-
onBackClick = { navigator.popBackStack() },
51-
navigateToSignIn = { navigator.navigateSignIn() },
52-
navigateToSignInEmail = { navigator.navigateSignInEmail() },
53-
navigateToResetPassword = { navigator.navigateResetPassword() },
54-
navigateToSignUpEmail = { navigator.navigateSignUpEmail() },
55-
navigateToProfileSetting = { navigator.navigateProfileSetting() },
56-
navigateToRules = { route -> navigator.navigateRules(route) },
57-
bottomSheetState = bottomSheetState,
58-
bottomSheetContent = bottomSheetContent
59-
)
43+
val animatedDimAlpha by animateFloatAsState(targetValue = bottomSheetDimAlpha)
44+
45+
BottomSheetScaffold(
46+
modifier = Modifier.systemBarsPadding(),
47+
scaffoldState = bottomSheetState,
48+
sheetDragHandle = null,
49+
sheetContent = {
50+
Box(modifier = Modifier.navigationBarsPadding()) {
51+
bottomSheetContent?.invoke()
52+
}
53+
},
54+
sheetPeekHeight = 0.dp,
55+
snackbarHost = {
56+
SnackbarHost(
57+
hostState = snackBarHostState,
58+
modifier = Modifier.navigationBarsPadding()
59+
)
60+
},
61+
content = { innerPadding ->
62+
Box(Modifier.padding(innerPadding)) {
63+
NavHost(
64+
navController = navigator.navController,
65+
startDestination = AccountScreen.SignIn.route
66+
) {
67+
signInNavGraph(
68+
coroutineScope = coroutineScope,
69+
snackBarHostState = snackBarHostState,
70+
navController = navigator.navController,
71+
onBackClick = { navigator.popBackStack() },
72+
navigateToSignIn = { navigator.navigateSignIn() },
73+
navigateToSignInEmail = { navigator.navigateSignInEmail() },
74+
navigateToResetPassword = { navigator.navigateResetPassword() },
75+
navigateToSignUpEmail = { navigator.navigateSignUpEmail() },
76+
navigateToProfileSetting = { navigator.navigateProfileSetting() },
77+
navigateToRules = { route -> navigator.navigateRules(route) },
78+
bottomSheetState = bottomSheetState,
79+
bottomSheetContent = { content ->
80+
bottomSheetContent = content
6081
}
61-
}
62-
})
82+
)
83+
}
84+
85+
if (animatedDimAlpha > 0f) {
86+
Box(
87+
modifier = Modifier
88+
.fillMaxSize()
89+
.background(Dark.copy(alpha = animatedDimAlpha))
90+
.clickable(indication = null, interactionSource = remember { MutableInteractionSource() }) {
91+
coroutineScope.launch { bottomSheetState.bottomSheetState.hide() }
92+
}
93+
)
94+
}
95+
}
6396
}
64-
}
97+
)
6598
}
6699

67100
sealed class AccountScreen(val route: String) {

0 commit comments

Comments
 (0)