Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
c030dd3
1.1.2버전 develop -> release 머지합니다 (#168)
LeeYongIn0517 Oct 13, 2024
44e2126
Merge branch 'release' of https://github.com/HMOAA/HMOA_ANDROID into …
LeeYongIn0517 Oct 13, 2024
9feb75f
Delete
LeeYongIn0517 Oct 13, 2024
a48f754
Delete
LeeYongIn0517 Oct 13, 2024
066804e
Delete
LeeYongIn0517 Oct 13, 2024
7dc9e0e
Release 1.1.2 버전 업로드 - 커밋 누락된 부분 추가 푸시 (#169)
LeeYongIn0517 Oct 14, 2024
eecba5c
HotFix: 카카오 sdk 버전 업그레이드 (#170) (#171)
LeeYongIn0517 Oct 15, 2024
3fc6571
v1.1.3 업데이트 수정 (#175)
LeeYongIn0517 Oct 15, 2024
689234e
v1.1.3 업데이트 (#172)
LeeYongIn0517 Oct 15, 2024
96ace7a
동기화 (#178)
uselessnaming Oct 30, 2024
dafd989
Chore: 데이터백업설정 변경
LeeYongIn0517 Nov 4, 2024
520fbe0
Chore: 테스트 버전 업그레이드 25->27
LeeYongIn0517 Nov 4, 2024
33d04e6
Fix: 주소지 추가 오류 수정 (#180)
uselessnaming Nov 5, 2024
3768957
chore: gitignore 파일 추가
LeeYongIn0517 Nov 6, 2024
6a5f790
chore: 주석해제
LeeYongIn0517 Nov 6, 2024
3c76629
Feat: 상품 구매 여부 확인 다이얼로그 추가
LeeYongIn0517 Nov 6, 2024
9e65cfe
Feat: Hbti 설문 양옆 스크롤 기능 추가
LeeYongIn0517 Nov 6, 2024
fc4893e
Delete: 주석 삭제
LeeYongIn0517 Nov 6, 2024
62698c2
Fix: LazyColumn으로 변경 후 스크롤위치 초기화 적용
LeeYongIn0517 Nov 6, 2024
ad96af9
Feature/hbti shj (#182)
uselessnaming Nov 12, 2024
8ed4112
Refactor: isNoteSelectedData상태 업데이트 함수 수정
LeeYongIn0517 Nov 13, 2024
1dc9e41
fix: Hbti ProgressBar 리컴포지션 최적화 및 UI 버그 개선
LeeYongIn0517 Nov 13, 2024
1cace44
Design: Hbti 향료 선택화면 디테일 변경
LeeYongIn0517 Nov 13, 2024
124959d
Fix: nullable 처리 누락 수정
LeeYongIn0517 Nov 13, 2024
caacc79
Merge commit 'ad96af9dba4682f44e701d7cdaabb5b31a8d71b6'
LeeYongIn0517 Nov 14, 2024
9d04ab6
Feature/hbti 버그 및 HBTI UI 수정 (#183)
LeeYongIn0517 Nov 15, 2024
bb08512
Feat: 향료주문 과정 설명 화면 api 적용
LeeYongIn0517 Nov 19, 2024
2b4ffc0
Feat: 향료주문 과정 설명 화면 네비게이션 추가
LeeYongIn0517 Nov 19, 2024
02db089
Feat: 가격대 향수추천 결과 화면 추가
LeeYongIn0517 Nov 19, 2024
284607a
Test: 향수 추천결과 화면 UI/단위 테스트 작성
LeeYongIn0517 Nov 19, 2024
4296f93
Test: 뷰모델 변경사항 반영한 테스트 수정
LeeYongIn0517 Nov 19, 2024
81d2d72
Fix: 브랜드 이미지 삭제 반영
LeeYongIn0517 Nov 19, 2024
706377a
Design: 상단 바 패딩 불일치 수정
LeeYongIn0517 Nov 19, 2024
7a7fe0b
Merge commit '9d04ab64d8d9b6c162dca26db501a7aa072cfb1a'
LeeYongIn0517 Nov 19, 2024
d308d8e
Fix: 향수 화면의 브랜드 사진 삭제 반영
LeeYongIn0517 Nov 19, 2024
fe16e40
Feature/hbti HBTI 디자인 최종 수정 반영 (#184)
LeeYongIn0517 Nov 19, 2024
b724f3b
Design: 디자인 추가 수정
LeeYongIn0517 Nov 19, 2024
2927c68
Chore: 버전 코드 수정 27->28
LeeYongIn0517 Nov 19, 2024
54d3185
Design: 버튼 크기 작아지는 현상 수정
LeeYongIn0517 Nov 19, 2024
7178580
Feature/hbti 디자인 수정 (#185)
LeeYongIn0517 Nov 19, 2024
473a19b
Feature/hbti shj 마지막 merge (#186)
uselessnaming Nov 21, 2024
23072c9
Merge commit '473a19b92871c8b6414e4c0578430fde17027ed2'
LeeYongIn0517 Nov 21, 2024
7e58fce
Chore: 버전코드 변경 28->30
LeeYongIn0517 Nov 22, 2024
d23f0cb
Merge commit '85f22d20ee326c5194b7c8ac4864899f2e830064'
LeeYongIn0517 Nov 23, 2024
b81b182
Merge commit '3fc657177ea7fcf0d8e0f4682bb259e3471c698d'
LeeYongIn0517 Nov 26, 2024
a6f43d1
Merge commit '689234e6e6f587bcfbab8c65d25c2fcd79656418'
LeeYongIn0517 Nov 26, 2024
71e93a9
Feat: SearchTopBar Debounce 적용
LeeYongIn0517 Dec 1, 2024
c1b7248
Fix: Debounce 필터링 조건 변경
LeeYongIn0517 Dec 1, 2024
b9ec5e4
Design: 홈 글씨 align 수정
LeeYongIn0517 Dec 1, 2024
9977649
Design: 향수 이미지 패딩 추가
LeeYongIn0517 Dec 1, 2024
455fd1e
Chore: 버전코드 변경 30->31
LeeYongIn0517 Dec 1, 2024
b074256
HotFix: nullable 처리 속성 추가
LeeYongIn0517 Dec 3, 2024
14962f1
Chore: 1.2.0 버전으로 업데이트 표기 변경
LeeYongIn0517 Dec 6, 2024
3eca334
Hotfix/1.2.0 (#190)
LeeYongIn0517 Dec 6, 2024
f6e2d19
Merge commit '3eca334fd3ee3fe344dadff2169582af41f012fe' into hotfix/d…
LeeYongIn0517 Dec 10, 2024
e2de217
Chore: compiler-metrics 옵션 추가
LeeYongIn0517 Dec 14, 2024
0898f15
Chore: kotlinx-collections-immutable 추가
LeeYongIn0517 Dec 14, 2024
5131f57
Docs: 임시 주석처리
LeeYongIn0517 Dec 14, 2024
12da75e
Chore: JUnit 의존성 누락된 부분 추가
LeeYongIn0517 Dec 14, 2024
08b8330
Docs: 임시 주석처리
LeeYongIn0517 Dec 14, 2024
46dd3c4
Refactor: 데이터 클래스 및 파라미터 안정성 보완
LeeYongIn0517 Dec 14, 2024
f487dac
Chore: .kotlin 빌드파일 gitignore 추가
LeeYongIn0517 Dec 14, 2024
f9d5fc3
Chore: kotlin 버전 업그레이드 1.9.0->1.9.21
LeeYongIn0517 Dec 14, 2024
154fab6
Chore: Immutable컬렉션 및 stable marker 라이브러리 추가
LeeYongIn0517 Dec 14, 2024
246eaf4
Refactor: 데이터 클래스 안정성 개선 및 리컴포지션 최적화
LeeYongIn0517 Dec 14, 2024
12ba5cd
Merge commit '0a1600e176d082cf483ddfd2eee772fcc813e20c' into migrate/ksp
LeeYongIn0517 Dec 15, 2024
f49e04a
Fix: 리컴포지션 최적화 오류 수정
LeeYongIn0517 Dec 18, 2024
5e6018a
Chore: compose-stable-marker 라이브러리 제거
LeeYongIn0517 Dec 18, 2024
a27e69e
Chore: immutable collection 제거
LeeYongIn0517 Dec 18, 2024
4b7715f
Merge: hotifx/design(1.2.0)
LeeYongIn0517 Dec 18, 2024
74c1540
Merge commit 'aaa1c8e27d03b246e11090eef9e62d1ee1a87016' into migrate/ksp
LeeYongIn0517 Dec 18, 2024
d7c2605
Merge commit '92f65bb1133ac045b938625cfff4b83a5dcbe53b' into migrate/ksp
LeeYongIn0517 Dec 21, 2024
cd06086
Refactor: 폴더 생성 및 이동
LeeYongIn0517 Dec 21, 2024
4070db6
Chore: google inapp update 라이브러리 추가
LeeYongIn0517 Dec 21, 2024
d95d32a
Chore: 버전코드 변경
LeeYongIn0517 Dec 22, 2024
2e84ca8
Feat: 인앱 업데이트 기능 추가
LeeYongIn0517 Dec 22, 2024
f9700b2
Refactor: 기존 PagingSource -> 제네릭 PerfumePagingSource로 리팩터링
LeeYongIn0517 Dec 24, 2024
0a1d9b4
Refactor: 향수 별 댓글 페이징소스 파일 통합
LeeYongIn0517 Dec 26, 2024
91025ae
Merge commit '5457f459567259a3ba72afab0ee61c158168ee64' into optimize
LeeYongIn0517 Dec 26, 2024
c1d0363
Chore: 버전 업데이트
LeeYongIn0517 Dec 26, 2024
7664306
Refactor: LazyColumn 추가
LeeYongIn0517 Jan 6, 2025
a276cb7
Chore: 컴포지션 리포트 컴파일 옵션 추가
LeeYongIn0517 Jan 7, 2025
b0c2c82
Fix: SearchTopBar 검색어삭제 기능 수정
LeeYongIn0517 Jan 7, 2025
fe0576b
Refactor: 리컴포지션 최소화 및 상태관리 수정
LeeYongIn0517 Jan 7, 2025
b6a19a5
Fix: delete fcm API 반복 호출 현상 수정
LeeYongIn0517 Jan 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .idea/deploymentTargetSelector.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 28 additions & 1 deletion .idea/inspectionProfiles/Project_Default.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ android {
applicationId = "com.hmoa.app"
minSdk = 26
targetSdk = 34
versionCode = 35
versionName = "1.2.0"
versionCode = 36
versionName = "1.3.0"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
manifestPlaceholders["REDIRECTION_PATH"] = localProperties["REDIRECTION_PATH"] as String
Expand Down
23 changes: 15 additions & 8 deletions app/src/main/java/com/hmoa/app/view/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ import com.hmoa.feature_magazine.Navigation.navigateToMagazineHome
import com.hmoa.feature_userinfo.navigation.navigateToUserInfoGraph
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch
import kr.co.bootpay.android.BootpayAnalytics

Expand Down Expand Up @@ -185,17 +186,23 @@ class MainActivity : AppCompatActivity() {

lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.CREATED) {
viewModel.fcmTokenFlow().collectLatest { fcmToken ->
viewModel.getNotificationEnabled().collectLatest { isEnabled ->
Log.d("POST PERMISSION", "is granted : ${isEnabled}")
viewModel.fcmTokenFlow()
.combine(viewModel.getNotificationEnabled()) { fcmToken, isNotificationsEnabled ->
Pair(
fcmToken,
isNotificationsEnabled
)
}.collectLatest {
val fcmToken = it.first
val isNotificationsEnabled = it.second
Log.d("POST PERMISSION", "is granted : ${isNotificationsEnabled}")
Log.d("FCM TEST", "fcm token : ${fcmToken}")
initializeFirebaseSetting(
fcmToken = fcmToken,
onSaveFcmToken = { token -> viewModel.saveFcmToken(token) })
initializeRoute(
onRouteToLogin = { checkFcmToken(fcmToken, isEnabled) })
onRouteToLogin = { checkFcmToken(fcmToken, isNotificationsEnabled) })
}
}
}
}

Expand Down Expand Up @@ -292,10 +299,10 @@ class MainActivity : AppCompatActivity() {
Log.d("FCM TEST", "checkFcmToken의 fcmToken 값: ${fcmToken}")
}

private suspend fun handleFcmToken(
fcmToken: String, isEnabled: Boolean
private fun handleFcmToken(
fcmToken: String, isNotificationEnabled: Boolean
) {
if (isEnabled) {
if (isNotificationEnabled) {
Log.d("FCM TEST", "post fcm token")
viewModel.postFcmToken(fcmToken)
} else {
Expand Down
27 changes: 22 additions & 5 deletions app/src/main/java/com/hmoa/app/viewmodel/AppViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import com.hmoa.core_domain.repository.FcmRepository
import com.hmoa.core_domain.repository.LoginRepository
import com.hmoa.core_model.request.FCMTokenSaveRequestDto
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import javax.inject.Inject

Expand All @@ -15,15 +16,30 @@ class AppViewModel @Inject constructor(
private val loginRepository: LoginRepository,
private val fcmRepository: FcmRepository,
) : ViewModel() {
val authTokenState = MutableStateFlow<String?>(null)
suspend fun authTokenFlow(): Flow<String?> = loginRepository.getAuthToken()
suspend fun rememberedTokenFlow(): Flow<String?> = loginRepository.getRememberedToken()
suspend fun fcmTokenFlow(): Flow<String?> =
fcmRepository.getLocalFcmToken().shareIn(viewModelScope, SharingStarted.WhileSubscribed())

suspend fun fcmTokenFlow(): Flow<String?> = fcmRepository.getLocalFcmToken()
init {
getAuthToken()
}

fun delFcmToken() {
viewModelScope.launch {
fcmRepository.deleteLocalFcmToken()
fcmRepository.deleteRemoteFcmToken()
if (authTokenState.value != null) {
fcmRepository.deleteLocalFcmToken()
fcmRepository.deleteRemoteFcmToken()
}
}
}

fun getAuthToken() {
viewModelScope.launch(Dispatchers.IO) {
loginRepository.getAuthToken().onEmpty { }.collectLatest {
authTokenState.update { it }
}
}
}

Expand All @@ -36,7 +52,8 @@ class AppViewModel @Inject constructor(

fun saveFcmToken(token: String) = viewModelScope.launch { fcmRepository.saveLocalFcmToken(token) }
fun checkAlarm(id: Int) = viewModelScope.launch { fcmRepository.checkAlarm(id) }
suspend fun getNotificationEnabled(): Flow<Boolean> = fcmRepository.getNotificationEnabled()
suspend fun getNotificationEnabled(): Flow<Boolean> =
fcmRepository.getNotificationEnabled().shareIn(viewModelScope, SharingStarted.WhileSubscribed())

suspend fun saveNotificationEnabled(isEnabled: Boolean) =
viewModelScope.launch { fcmRepository.saveNotificationEnabled(isEnabled) }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.hmoa.core_designsystem.component

import android.util.Log
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
Expand Down Expand Up @@ -36,7 +37,7 @@ fun SearchTopBar(
onClickSearch: () -> Unit,
navBack: () -> Unit,
) {
var searchWord by remember { mutableStateOf("") }
var searchWord by remember { mutableStateOf(searchWord) }
val textFlow = remember { snapshotFlow { searchWord } }

LaunchedEffect(textFlow) {
Expand All @@ -51,7 +52,7 @@ fun SearchTopBar(
.padding(start = 13.dp),
value = searchWord,
onValueChange = {
if (it == "") {
if (it.length == 0) {
onClearWord()
}
searchWord = it
Expand Down Expand Up @@ -104,7 +105,10 @@ fun SearchTopBar(
modifier = Modifier.size(20.dp)
.background(color = CustomColor.gray2, shape = CircleShape)
.clip(CircleShape),
onClick = onClearWord
onClick = {
onClearWord()
searchWord = ""
}
) {
Icon(
imageVector = Icons.Filled.Close,
Expand Down
12 changes: 12 additions & 0 deletions feature-brand/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,18 @@ android {
buildFeatures {
compose = true
}
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>() {
compilerOptions.freeCompilerArgs.addAll(
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=${project.buildDir.absolutePath}/compose_metrics",
)
}
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>() {
compilerOptions.freeCompilerArgs.addAll(
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=${project.buildDir.absolutePath}/compose_reports",
)
}
}

dependencies {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package com.hmoa.feature_brand.screen
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
Expand Down Expand Up @@ -68,15 +68,14 @@ fun BrandSearchScreen(
@Composable
fun BrandSearchContent(
searchWord: String,
consonantBrands: MutableMap<Consonant?, List<BrandDefaultResponseDto>?>?,
searchResult: MutableMap<Consonant?, List<BrandDefaultResponseDto>?>?,
consonantBrands: Map<Consonant?, List<BrandDefaultResponseDto>?>?,
searchResult: Map<Consonant?, List<BrandDefaultResponseDto>?>?,
onBrandClick: (brandId: Int) -> Unit,
onBackClick: () -> Unit,
onChangedWord: (word: String) -> Unit,
onClearWord: () -> Unit,
onClickSearch: (word: String) -> Unit
) {
var scrollState = rememberScrollState()
Column {
Row(modifier = Modifier.padding(start = 16.dp)) {
SearchTopBar(
Expand All @@ -93,23 +92,27 @@ fun BrandSearchContent(
)
Column(
modifier = Modifier.fillMaxWidth().padding(horizontal = 12.dp)
.padding(top = 16.dp).verticalScroll(scrollState)
.padding(top = 16.dp)
) {
if (searchWord == "") {
Consonant.entries.forEach { consonant ->
BrandGridView(
brands = consonantBrands?.get(consonant),
onBrandClick = { onBrandClick(it) },
consonant = consonant
)
LazyColumn {
items(Consonant.entries.toList()) { consonant ->
BrandGridView(
brands = consonantBrands?.get(consonant),
onBrandClick = { onBrandClick(it) },
consonant = consonant
)
}
}
} else {
Consonant.entries.forEach { consonant ->
BrandGridView(
brands = searchResult?.get(consonant),
onBrandClick = { onBrandClick(it) },
consonant = consonant
)
LazyColumn {
items(Consonant.entries.toList()) { consonant ->
BrandGridView(
brands = searchResult?.get(consonant),
onBrandClick = { onBrandClick(it) },
consonant = consonant
)
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.hmoa.core_common.Result
import com.hmoa.core_common.asResult
import com.hmoa.core_domain.repository.SearchRepository
import com.hmoa.core_domain.entity.data.Consonant
import com.hmoa.core_domain.repository.SearchRepository
import com.hmoa.core_model.response.BrandDefaultResponseDto
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.*
Expand All @@ -14,7 +14,6 @@ import javax.inject.Inject

@HiltViewModel
class BrandSearchViewmodel @Inject constructor(private val searchRepository: SearchRepository) : ViewModel() {
val PAGE_SIZE = 10
private var consonantBrandMapState =
MutableStateFlow<MutableMap<Consonant?, List<BrandDefaultResponseDto>?>?>(null)
private var searchWordState = MutableStateFlow<String>("")
Expand All @@ -38,19 +37,19 @@ class BrandSearchViewmodel @Inject constructor(private val searchRepository: Sea

fun initializeBrands() {
viewModelScope.launch {
val newMap = consonantBrandMapState.value?.toMutableMap() ?: mutableMapOf()
for (i in 1..19) {
flow { emit(searchRepository.getBrandAll(i)) }.asResult().collectLatest {
when (it) {
is Result.Success -> {
val newMap = consonantBrandMapState.value?.toMutableMap() ?: mutableMapOf()
newMap[mapNumberIntoConsonant(i)] = it.data.data
consonantBrandMapState.value = newMap
}

else -> {}
}
}
}
consonantBrandMapState.value = newMap
}
}

Expand All @@ -65,12 +64,11 @@ class BrandSearchViewmodel @Inject constructor(private val searchRepository: Sea
flow { emit(searchRepository.getBrand(word)) }.asResult().collectLatest {
when (it) {
is Result.Success -> {
val newMap = searchResultState.value?.toMutableMap() ?: mutableMapOf()
it.data.data?.forEach {
val newMap = searchResultState.value?.toMutableMap()
?: mutableMapOf()
newMap[mapNumberIntoConsonant(it.consonant)] = it.brandList
searchResultState.value = newMap
}
searchResultState.value = newMap
}

is Result.Error -> {
Expand Down Expand Up @@ -121,4 +119,4 @@ class BrandSearchViewmodel @Inject constructor(private val searchRepository: Sea
data object Error : BrandSearchUiState
}

}
}
Loading
Loading