From 152b9e94c1730cd9f02d7fcbc3f1212e6d3c7d5c Mon Sep 17 00:00:00 2001 From: Dan2dani Date: Thu, 15 Feb 2024 22:46:55 +0900 Subject: [PATCH 01/17] =?UTF-8?q?[mod]=20#224=20=EC=97=AC=EB=9F=AC=20?= =?UTF-8?q?=EB=94=94=EC=9E=90=EC=9D=B8=EC=97=90=20=EB=8C=80=ED=95=9C=20Chi?= =?UTF-8?q?p=20Factory=EB=A5=BC=20=EB=A7=8C=EB=93=A4=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/sopt/geonppang/util/ChipFactory.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/sopt/geonppang/util/ChipFactory.kt b/app/src/main/java/com/sopt/geonppang/util/ChipFactory.kt index 1438d175..fea9acad 100644 --- a/app/src/main/java/com/sopt/geonppang/util/ChipFactory.kt +++ b/app/src/main/java/com/sopt/geonppang/util/ChipFactory.kt @@ -1,10 +1,10 @@ package com.sopt.geonppang.util import android.view.LayoutInflater +import androidx.annotation.LayoutRes import com.google.android.material.chip.Chip -import com.sopt.geonppang.R object ChipFactory { - fun create(layoutInflater: LayoutInflater): Chip = - layoutInflater.inflate(R.layout.view_chip_review, null, false) as Chip + fun create(layoutInflater: LayoutInflater, @LayoutRes layoutResId: Int): Chip = + layoutInflater.inflate(layoutResId, null, false) as Chip } From aac156f6bb3e2af5153ea09e9e628381fc64b0b3 Mon Sep 17 00:00:00 2001 From: Dan2dani Date: Sat, 17 Feb 2024 00:02:11 +0900 Subject: [PATCH 02/17] =?UTF-8?q?[mod]=20#224=20sdk=20=EC=98=AC=EB=A6=AC?= =?UTF-8?q?=EA=B8=B0=20=EB=B0=8F=20=EA=B0=81=EC=A2=85=20=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=EB=9F=AC=EB=A6=AC=20=EB=B2=84=EC=A0=84=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f85e9f47..a3f3ede7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,12 +15,12 @@ properties.load(project.rootProject.file('local.properties').newDataInputStream( android { namespace 'com.sopt.geonppang' - compileSdk 33 + compileSdk 34 defaultConfig { applicationId "com.sopt.geonppang" minSdk 28 - targetSdk 33 + targetSdk 34 versionCode 1 versionName "1.0.0" @@ -58,20 +58,21 @@ android { } dependencies { - implementation 'androidx.core:core-ktx:1.10.1' + implementation 'androidx.core:core-ktx:1.12.0' implementation 'androidx.appcompat:appcompat:1.6.1' - implementation 'com.google.android.material:material:1.9.0' + implementation 'com.google.android.material:material:1.11.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation "androidx.recyclerview:recyclerview:1.3.1" + implementation "androidx.recyclerview:recyclerview:1.3.2" // Ktx - implementation 'androidx.activity:activity-ktx:1.7.2' - implementation 'androidx.fragment:fragment-ktx:1.6.1' + implementation 'androidx.activity:activity-ktx:1.8.2' + implementation 'androidx.fragment:fragment-ktx:1.6.2' + //noinspection GradleDependency implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version" // Hilt implementation "com.google.dagger:hilt-android:$hilt_version" - implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0' + implementation 'androidx.hilt:hilt-navigation-fragment:1.1.0' implementation 'androidx.security:security-crypto-ktx:1.1.0-alpha06' kapt "com.google.dagger:hilt-compiler:$hilt_version" @@ -91,7 +92,7 @@ dependencies { implementation 'com.squareup.okhttp3:logging-interceptor' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0' - implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1' + implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' From f976b4ebc54c55eed6e4f33e94e7e9fdc8dac7a7 Mon Sep 17 00:00:00 2001 From: Dan2dani Date: Sat, 17 Feb 2024 14:17:34 +0900 Subject: [PATCH 03/17] =?UTF-8?q?[feat]=20#224=20BreadTypeIdDto,=20Nutrien?= =?UTF-8?q?tTypeIdDto=20=EA=B0=99=EC=9D=B4=20=EA=B3=B5=ED=86=B5=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=93=B0=EC=9D=B4=EB=8A=94=20Dto=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/geonppang/data/model/response/BreadTypeIdDto.kt | 8 ++++++++ .../geonppang/data/model/response/NutrientTypeIdDto.kt | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 app/src/main/java/com/sopt/geonppang/data/model/response/BreadTypeIdDto.kt create mode 100644 app/src/main/java/com/sopt/geonppang/data/model/response/NutrientTypeIdDto.kt diff --git a/app/src/main/java/com/sopt/geonppang/data/model/response/BreadTypeIdDto.kt b/app/src/main/java/com/sopt/geonppang/data/model/response/BreadTypeIdDto.kt new file mode 100644 index 00000000..8000cd81 --- /dev/null +++ b/app/src/main/java/com/sopt/geonppang/data/model/response/BreadTypeIdDto.kt @@ -0,0 +1,8 @@ +package com.sopt.geonppang.data.model.response + +import kotlinx.serialization.Serializable + +@Serializable +data class BreadTypeIdDto( + val breadTypeId: Int +) diff --git a/app/src/main/java/com/sopt/geonppang/data/model/response/NutrientTypeIdDto.kt b/app/src/main/java/com/sopt/geonppang/data/model/response/NutrientTypeIdDto.kt new file mode 100644 index 00000000..a18fca9e --- /dev/null +++ b/app/src/main/java/com/sopt/geonppang/data/model/response/NutrientTypeIdDto.kt @@ -0,0 +1,8 @@ +package com.sopt.geonppang.data.model.response + +import kotlinx.serialization.Serializable + +@Serializable +data class NutrientTypeIdDto( + val nutrientTypeId: Int +) From ecffe6e5cf09783b2451c6525948df6b618d1301 Mon Sep 17 00:00:00 2001 From: Dan2dani Date: Sat, 17 Feb 2024 14:18:34 +0900 Subject: [PATCH 04/17] =?UTF-8?q?[feat]=20#224=20breadType=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=B4=20List=20=ED=98=95=ED=83=9C=EB=A1=9C=20?= =?UTF-8?q?=EA=B0=80=EC=A7=80=EA=B3=A0=20=EC=9E=88=EB=8A=94=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EC=83=9D=EC=84=B1=20List=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=84=EB=B6=80=20=EC=A0=84=ED=99=98=20=ED=9B=84=20=EA=B8=B0?= =?UTF-8?q?=EC=A1=B4=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EC=98=88=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sopt/geonppang/domain/model/Bakery.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/src/main/java/com/sopt/geonppang/domain/model/Bakery.kt b/app/src/main/java/com/sopt/geonppang/domain/model/Bakery.kt index a77343d3..0e5baf25 100644 --- a/app/src/main/java/com/sopt/geonppang/domain/model/Bakery.kt +++ b/app/src/main/java/com/sopt/geonppang/domain/model/Bakery.kt @@ -1,5 +1,8 @@ package com.sopt.geonppang.domain.model +import com.sopt.geonppang.presentation.type.BreadFilterType + +// TODO: breadType 형태 완전 변환 후 차후 삭제 data class Bakery( val bakeryId: Int, val bakeryName: String, @@ -12,3 +15,17 @@ data class Bakery( val bakeryPicture: String, val breadType: BreadType, ) + +// TODO: 차후 네이밍 수정 +data class BakeryInformation( + val bakeryId: Int, + val bakeryName: String, + val isHACCP: Boolean, + val isVegan: Boolean, + val isNonGMO: Boolean, + val firstNearStation: String, + val secondNearStation: String, + val bookmarkCount: Int?, + val bakeryPicture: String, + val breadTypeList: List, +) \ No newline at end of file From 86095dff762ee5a379b69fe070485af74eeec062 Mon Sep 17 00:00:00 2001 From: Dan2dani Date: Sat, 17 Feb 2024 14:20:07 +0900 Subject: [PATCH 05/17] =?UTF-8?q?[feat]=20#224=20breadType=20model=20?= =?UTF-8?q?=ED=98=95=ED=83=9C=20=EC=88=98=EC=A0=95=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=A5=B8=20=EA=B4=80=EB=A0=A8=20model,=20entity=20=ED=98=95?= =?UTF-8?q?=ED=83=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/response/ResponseDetailBakery.kt | 27 ++++----------- .../model/response/ResponseMyPageBookmark.kt | 33 ++++++------------- .../data/model/response/ResponseMyPageInfo.kt | 29 +++++----------- .../model/response/ResponseMyPageReview.kt | 33 ++++++------------- .../data/model/response/ResponseSearch.kt | 33 ++++++------------- .../model/response/ResponseSettingFilter.kt | 30 ++++++++--------- .../sopt/geonppang/domain/model/BakeryInfo.kt | 4 ++- .../sopt/geonppang/domain/model/MyReview.kt | 2 +- .../sopt/geonppang/domain/model/Profile.kt | 4 ++- .../com/sopt/geonppang/domain/model/Search.kt | 2 +- .../geonppang/domain/model/SelectedFilter.kt | 17 ++++------ 11 files changed, 72 insertions(+), 142 deletions(-) diff --git a/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseDetailBakery.kt b/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseDetailBakery.kt index 6baecbad..99b0f905 100644 --- a/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseDetailBakery.kt +++ b/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseDetailBakery.kt @@ -1,8 +1,8 @@ package com.sopt.geonppang.data.model.response import com.sopt.geonppang.domain.model.BakeryInfo -import com.sopt.geonppang.domain.model.BreadType import com.sopt.geonppang.domain.model.Menu +import com.sopt.geonppang.presentation.type.BreadFilterType import kotlinx.serialization.Serializable @Serializable @@ -18,7 +18,7 @@ data class ResponseDetailBakery( val bakeryName: String, val bakeryPicture: String, val bookMarkCount: Int, - val breadType: BreadType, + val breadTypeList: List, val closedDay: String, val firstNearStation: String, val mapUrl: String, @@ -34,16 +34,6 @@ data class ResponseDetailBakery( val reviewCount: Int, val secondNearStation: String, ) { - @Serializable - data class BreadType( - val breadTypeId: Int, - val breadTypeName: String, - val isGlutenFree: Boolean, - val isNutFree: Boolean, - val isSugarFree: Boolean, - val isVegan: Boolean - ) - @Serializable data class Menu( val menuId: Int, @@ -78,13 +68,10 @@ data class ResponseDetailBakery( menuPrice = menu.menuPrice ) }, - breadType = BreadType( - breadTypeId = data.breadType.breadTypeId, - breadTypeName = data.breadType.breadTypeName, - isGlutenFree = data.breadType.isGlutenFree, - isVegan = data.breadType.isVegan, - isNutFree = data.breadType.isNutFree, - isSugarFree = data.breadType.isSugarFree - ) + breadTypeIdList = data.breadTypeList.mapNotNull { breadTypeIdDto -> + BreadFilterType.values().find { + it.id == breadTypeIdDto.breadTypeId + } + } ) } diff --git a/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMyPageBookmark.kt b/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMyPageBookmark.kt index f9c3739e..f818e00c 100644 --- a/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMyPageBookmark.kt +++ b/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMyPageBookmark.kt @@ -1,7 +1,7 @@ package com.sopt.geonppang.data.model.response -import com.sopt.geonppang.domain.model.Bakery -import com.sopt.geonppang.domain.model.BreadType +import com.sopt.geonppang.domain.model.BakeryInformation +import com.sopt.geonppang.presentation.type.BreadFilterType import kotlinx.serialization.Serializable @Serializable @@ -22,21 +22,11 @@ data class ResponseMyPageBookmark( val secondNearStation: String, val bookMarkCount: Int, val reviewCount: Int, - val breadType: BreadType - ) { - @Serializable - data class BreadType( - val breadTypeId: Int, - val breadTypeName: String, - val isGlutenFree: Boolean, - val isVegan: Boolean, - val isNutFree: Boolean, - val isSugarFree: Boolean, - ) - } + val breadTypeList: List + ) fun toMypageBookmark() = data.map { myBookmark -> - Bakery( + BakeryInformation( bakeryId = myBookmark.bakeryId, bakeryName = myBookmark.bakeryName, bakeryPicture = myBookmark.bakeryPicture, @@ -46,14 +36,11 @@ data class ResponseMyPageBookmark( isNonGMO = myBookmark.isNonGMO, isVegan = myBookmark.isVegan, isHACCP = myBookmark.isHACCP, - breadType = BreadType( - myBookmark.breadType.breadTypeId, - myBookmark.breadType.breadTypeName, - myBookmark.breadType.isGlutenFree, - myBookmark.breadType.isVegan, - myBookmark.breadType.isNutFree, - myBookmark.breadType.isSugarFree, - ) + breadTypeList = myBookmark.breadTypeList.mapNotNull { breadTypeIdDto -> + BreadFilterType.values().find { + it.id == breadTypeIdDto.breadTypeId + } + } ) } } diff --git a/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMyPageInfo.kt b/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMyPageInfo.kt index 500b9774..09768670 100644 --- a/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMyPageInfo.kt +++ b/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMyPageInfo.kt @@ -1,7 +1,7 @@ package com.sopt.geonppang.data.model.response -import com.sopt.geonppang.domain.model.BreadType import com.sopt.geonppang.domain.model.Profile +import com.sopt.geonppang.presentation.type.BreadFilterType import kotlinx.serialization.Serializable @Serializable @@ -14,29 +14,16 @@ data class ResponseMyPageInfo( data class Data( val memberNickname: String, val mainPurpose: String, - val breadType: BreadType - ) { - @Serializable - data class BreadType( - val breadTypeId: Int, - val breadTypeName: String, - val isGlutenFree: Boolean, - val isNutFree: Boolean, - val isSugarFree: Boolean, - val isVegan: Boolean - ) - } + val breadTypeList: List + ) fun toMypageInfo() = Profile( memberNickname = data.memberNickname, mainPurpose = data.mainPurpose, - breadType = BreadType( - breadTypeId = data.breadType.breadTypeId, - breadTypeName = data.breadType.breadTypeName, - isGlutenFree = data.breadType.isGlutenFree, - isVegan = data.breadType.isVegan, - isNutFree = data.breadType.isNutFree, - isSugarFree = data.breadType.isSugarFree - ) + breadTypeList = data.breadTypeList.mapNotNull { breadTypeIdDto -> + BreadFilterType.values().find { + it.id == breadTypeIdDto.breadTypeId + } + } ) } diff --git a/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMyPageReview.kt b/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMyPageReview.kt index d1c086ec..35259aa2 100644 --- a/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMyPageReview.kt +++ b/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseMyPageReview.kt @@ -1,8 +1,8 @@ package com.sopt.geonppang.data.model.response -import com.sopt.geonppang.domain.model.Bakery -import com.sopt.geonppang.domain.model.BreadType +import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.domain.model.MyReview +import com.sopt.geonppang.presentation.type.BreadFilterType import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -25,24 +25,14 @@ data class ResponseMyPageReview( val isNonGmo: Boolean, val firstNearStation: String, val secondNearStation: String, - val breadType: BreadType, + val breadTypeList: List, val reviewId: Int, val createdAt: String, - ) { - @Serializable - data class BreadType( - val breadTypeId: Int, - val breadTypeName: String, - val isGlutenFree: Boolean, - val isVegan: Boolean, - val isNutFree: Boolean, - val isSugarFree: Boolean, - ) - } + ) fun toMyReview() = data.map { myReview -> MyReview( - bakery = Bakery( + bakery = BakeryInformation( myReview.bakeryId, myReview.bakeryName, myReview.isHACCP, @@ -52,14 +42,11 @@ data class ResponseMyPageReview( myReview.secondNearStation, null, myReview.bakeryPicture, - breadType = BreadType( - myReview.breadType.breadTypeId, - myReview.breadType.breadTypeName, - myReview.breadType.isGlutenFree, - myReview.breadType.isVegan, - myReview.breadType.isNutFree, - myReview.breadType.isSugarFree - ) + breadTypeList = myReview.breadTypeList.mapNotNull { breadTypeIdDto -> + BreadFilterType.values().find { + it.id == breadTypeIdDto.breadTypeId + } + } ), reviewId = myReview.reviewId, date = myReview.createdAt diff --git a/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseSearch.kt b/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseSearch.kt index 9da412ec..5f1bea51 100644 --- a/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseSearch.kt +++ b/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseSearch.kt @@ -1,8 +1,8 @@ package com.sopt.geonppang.data.model.response -import com.sopt.geonppang.domain.model.Bakery -import com.sopt.geonppang.domain.model.BreadType +import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.domain.model.Search +import com.sopt.geonppang.presentation.type.BreadFilterType import kotlinx.serialization.Serializable @Serializable @@ -22,29 +22,19 @@ data class ResponseSearch( val bakeryName: String, val bakeryPicture: String, val bookMarkCount: Int, - val breadType: BreadType, + val breadTypeList: List, val firstNearStation: String, val isHACCP: Boolean, val isNonGMO: Boolean, val isVegan: Boolean, val reviewCount: Int, val secondNearStation: String, - ) { - @Serializable - data class BreadType( - val breadTypeId: Int, - val breadTypeName: String, - val isGlutenFree: Boolean, - val isNutFree: Boolean, - val isSugarFree: Boolean, - val isVegan: Boolean, - ) - } + ) fun toSearch() = Search( resultCount = resultCount, bakeryList = bakeryList.map { searchBakery -> - Bakery( + BakeryInformation( bakeryId = searchBakery.bakeryId, bakeryName = searchBakery.bakeryName, bakeryPicture = searchBakery.bakeryPicture, @@ -54,14 +44,11 @@ data class ResponseSearch( isNonGMO = searchBakery.isNonGMO, isVegan = searchBakery.isVegan, isHACCP = searchBakery.isHACCP, - breadType = BreadType( - searchBakery.breadType.breadTypeId, - searchBakery.breadType.breadTypeName, - searchBakery.breadType.isGlutenFree, - searchBakery.breadType.isVegan, - searchBakery.breadType.isNutFree, - searchBakery.breadType.isSugarFree, - ) + breadTypeList = searchBakery.breadTypeList.mapNotNull { breadTypeIdDto -> + BreadFilterType.values().find { + it.id == breadTypeIdDto.breadTypeId + } + } ) } ) diff --git a/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseSettingFilter.kt b/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseSettingFilter.kt index d9800662..e46e76c0 100644 --- a/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseSettingFilter.kt +++ b/app/src/main/java/com/sopt/geonppang/data/model/response/ResponseSettingFilter.kt @@ -1,6 +1,8 @@ package com.sopt.geonppang.data.model.response import com.sopt.geonppang.domain.model.SelectedFilter +import com.sopt.geonppang.presentation.type.BreadFilterType +import com.sopt.geonppang.presentation.type.NutrientFilterType import kotlinx.serialization.Serializable @Serializable @@ -11,30 +13,24 @@ data class ResponseSettingFilter( ) { @Serializable data class Data( - val breadTypeList: List, + val breadTypeList: List, val mainPurpose: String, val memberId: Int, val nickname: String, - val nutrientTypeList: List - ) - - @Serializable - data class BreadTypeId( - val breadTypeId: Int - ) - - @Serializable - data class NutrientTypeId( - val nutrientTypeId: Int + val nutrientTypeList: List ) fun toSelectedFilter() = SelectedFilter( mainPurpose = data.mainPurpose, - breadTypeList = data.breadTypeList.map { breadType -> SelectedFilter.BreadTypeId(breadTypeId = breadType.breadTypeId) }, - nutrientTypeList = data.nutrientTypeList.map { nutrientType -> - SelectedFilter.NutrientTypeId( - nutrientTypeId = nutrientType.nutrientTypeId - ) + breadTypeList = data.breadTypeList.mapNotNull { breadType -> + BreadFilterType.values().find { + it.id == breadType.breadTypeId + } + }, + nutrientTypeList = data.nutrientTypeList.mapNotNull { nutrientTypeIdDto -> + NutrientFilterType.values().find { + it.id == nutrientTypeIdDto.nutrientTypeId + } } ) } diff --git a/app/src/main/java/com/sopt/geonppang/domain/model/BakeryInfo.kt b/app/src/main/java/com/sopt/geonppang/domain/model/BakeryInfo.kt index 5f58dbdd..bb93a177 100644 --- a/app/src/main/java/com/sopt/geonppang/domain/model/BakeryInfo.kt +++ b/app/src/main/java/com/sopt/geonppang/domain/model/BakeryInfo.kt @@ -1,5 +1,7 @@ package com.sopt.geonppang.domain.model +import com.sopt.geonppang.presentation.type.BreadFilterType + data class BakeryInfo( val bakeryId: Int, val bakeryName: String, @@ -7,7 +9,7 @@ data class BakeryInfo( val isHACCP: Boolean, val isVegan: Boolean, val isNonGMO: Boolean, - val breadType: BreadType, + val breadTypeIdList: List, val firstNearStation: String, val secondNearStation: String, val isBooked: Boolean, diff --git a/app/src/main/java/com/sopt/geonppang/domain/model/MyReview.kt b/app/src/main/java/com/sopt/geonppang/domain/model/MyReview.kt index 4d803931..82718cb7 100644 --- a/app/src/main/java/com/sopt/geonppang/domain/model/MyReview.kt +++ b/app/src/main/java/com/sopt/geonppang/domain/model/MyReview.kt @@ -1,7 +1,7 @@ package com.sopt.geonppang.domain.model data class MyReview( - val bakery: Bakery, + val bakery: BakeryInformation, val reviewId: Int, val date: String, ) diff --git a/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt b/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt index c76f7dc2..e3a107c3 100644 --- a/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt +++ b/app/src/main/java/com/sopt/geonppang/domain/model/Profile.kt @@ -1,7 +1,9 @@ package com.sopt.geonppang.domain.model +import com.sopt.geonppang.presentation.type.BreadFilterType + data class Profile( val memberNickname: String, val mainPurpose: String, - val breadType: BreadType + val breadTypeList: List ) diff --git a/app/src/main/java/com/sopt/geonppang/domain/model/Search.kt b/app/src/main/java/com/sopt/geonppang/domain/model/Search.kt index eb74dbff..4ee9d91d 100644 --- a/app/src/main/java/com/sopt/geonppang/domain/model/Search.kt +++ b/app/src/main/java/com/sopt/geonppang/domain/model/Search.kt @@ -2,5 +2,5 @@ package com.sopt.geonppang.domain.model data class Search( val resultCount: Int, - val bakeryList: List + val bakeryList: List ) diff --git a/app/src/main/java/com/sopt/geonppang/domain/model/SelectedFilter.kt b/app/src/main/java/com/sopt/geonppang/domain/model/SelectedFilter.kt index 394ef77d..780d1c02 100644 --- a/app/src/main/java/com/sopt/geonppang/domain/model/SelectedFilter.kt +++ b/app/src/main/java/com/sopt/geonppang/domain/model/SelectedFilter.kt @@ -1,15 +1,10 @@ package com.sopt.geonppang.domain.model +import com.sopt.geonppang.presentation.type.BreadFilterType +import com.sopt.geonppang.presentation.type.NutrientFilterType + data class SelectedFilter( val mainPurpose: String, - val breadTypeList: List, - val nutrientTypeList: List -) { - data class BreadTypeId( - val breadTypeId: Int - ) - - data class NutrientTypeId( - val nutrientTypeId: Int - ) -} + val breadTypeList: List, + val nutrientTypeList: List +) From 2bdfcc99c7d8f1889342b7c34f95991f3ddf4a85 Mon Sep 17 00:00:00 2001 From: Dan2dani Date: Sat, 17 Feb 2024 14:20:42 +0900 Subject: [PATCH 06/17] =?UTF-8?q?[feat]=20#224=20breadType=20chip=20?= =?UTF-8?q?=EB=94=94=EC=9E=90=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/view_bread_type_chip_gray.xml | 11 +++++++++++ .../main/res/layout/view_bread_type_chip_point_m1.xml | 11 +++++++++++ .../main/res/layout/view_bread_type_chip_point_m2.xml | 11 +++++++++++ ...w.xml => view_chip_review_recommended_keyword.xml} | 0 4 files changed, 33 insertions(+) create mode 100644 app/src/main/res/layout/view_bread_type_chip_gray.xml create mode 100644 app/src/main/res/layout/view_bread_type_chip_point_m1.xml create mode 100644 app/src/main/res/layout/view_bread_type_chip_point_m2.xml rename app/src/main/res/layout/{view_chip_review.xml => view_chip_review_recommended_keyword.xml} (100%) diff --git a/app/src/main/res/layout/view_bread_type_chip_gray.xml b/app/src/main/res/layout/view_bread_type_chip_gray.xml new file mode 100644 index 00000000..4c23eaf6 --- /dev/null +++ b/app/src/main/res/layout/view_bread_type_chip_gray.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_bread_type_chip_point_m1.xml b/app/src/main/res/layout/view_bread_type_chip_point_m1.xml new file mode 100644 index 00000000..cd78ad47 --- /dev/null +++ b/app/src/main/res/layout/view_bread_type_chip_point_m1.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_bread_type_chip_point_m2.xml b/app/src/main/res/layout/view_bread_type_chip_point_m2.xml new file mode 100644 index 00000000..d973aeff --- /dev/null +++ b/app/src/main/res/layout/view_bread_type_chip_point_m2.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_chip_review.xml b/app/src/main/res/layout/view_chip_review_recommended_keyword.xml similarity index 100% rename from app/src/main/res/layout/view_chip_review.xml rename to app/src/main/res/layout/view_chip_review_recommended_keyword.xml From 3f280a701329b96f38595907ea1019f8be689586 Mon Sep 17 00:00:00 2001 From: Dan2dani Date: Sat, 17 Feb 2024 14:21:15 +0900 Subject: [PATCH 07/17] =?UTF-8?q?[feat]=20#224=20chip=20inflate=EC=97=90?= =?UTF-8?q?=20=ED=95=84=EC=9A=94=ED=95=9C=20=EA=B0=81=EC=A2=85=20=ED=99=95?= =?UTF-8?q?=EC=9E=A5=ED=95=A8=EC=88=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/geonppang/util/extension/ChipExt.kt | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 app/src/main/java/com/sopt/geonppang/util/extension/ChipExt.kt diff --git a/app/src/main/java/com/sopt/geonppang/util/extension/ChipExt.kt b/app/src/main/java/com/sopt/geonppang/util/extension/ChipExt.kt new file mode 100644 index 00000000..e8f15b0c --- /dev/null +++ b/app/src/main/java/com/sopt/geonppang/util/extension/ChipExt.kt @@ -0,0 +1,49 @@ +package com.sopt.geonppang.util.extension + +/* + author: dana + description: chip을 inflate 하는 것과 관련이 있는 확장함수들 모음 + */ + +import android.view.LayoutInflater +import androidx.core.content.ContextCompat.getString +import com.google.android.material.chip.Chip +import com.google.android.material.chip.ChipGroup +import com.sopt.geonppang.R +import com.sopt.geonppang.presentation.type.BreadFilterType +import com.sopt.geonppang.util.ChipFactory + + +fun String.toBreadTypeGrayChip(layoutInflater: LayoutInflater): Chip { + return ChipFactory.create(layoutInflater, R.layout.view_bread_type_chip_gray) +} + +fun String.toBreadTypePointM1Chip(layoutInflater: LayoutInflater): Chip { + return ChipFactory.create(layoutInflater, R.layout.view_bread_type_chip_point_m1) +} + +fun String.toBreadTypePointM2Chip(layoutInflater: LayoutInflater): Chip { + return ChipFactory.create(layoutInflater, R.layout.view_bread_type_chip_point_m2) +} + +fun String.toReviewRecommendedKeyWordChip(layoutInflater: LayoutInflater): Chip { + return ChipFactory.create(layoutInflater, R.layout.view_chip_review_recommended_keyword).also { + it.text = this + } +} + +fun ChipGroup.breadTypeListToChips( + breadTypeList: List, + toChip: String.() -> Chip +) { + + for (breadType in breadTypeList) { + val breadTypeTitle = getString(context, breadType.titleRes) + + val chip = breadTypeTitle.toChip().apply { + text = breadTypeTitle + } + + this.addView(chip) + } +} From a504b7c094429343ecb14cb02120fd546dee9ee1 Mon Sep 17 00:00:00 2001 From: Dan2dani Date: Sat, 17 Feb 2024 14:22:50 +0900 Subject: [PATCH 08/17] =?UTF-8?q?[mod]=20#224=20breadType=EC=9D=B4=20?= =?UTF-8?q?=ED=8F=AC=ED=95=A8=EB=90=9C=20=EB=B7=B0=20=EB=94=94=EC=9E=90?= =?UTF-8?q?=EC=9D=B8=20=EC=88=98=EC=A0=95(chip=20=EC=82=AD=EC=A0=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/layout/activity_my_review_detail.xml | 46 ++--------------- .../res/layout/activity_review_writing.xml | 44 ++-------------- app/src/main/res/layout/fragment_my_page.xml | 41 +-------------- app/src/main/res/layout/item_bakery.xml | 51 +++---------------- .../res/layout/item_detail_bakery_info.xml | 40 +-------------- app/src/main/res/layout/item_my_review.xml | 44 ++-------------- 6 files changed, 19 insertions(+), 247 deletions(-) diff --git a/app/src/main/res/layout/activity_my_review_detail.xml b/app/src/main/res/layout/activity_my_review_detail.xml index 5029494d..c87ddc5e 100644 --- a/app/src/main/res/layout/activity_my_review_detail.xml +++ b/app/src/main/res/layout/activity_my_review_detail.xml @@ -4,9 +4,6 @@ xmlns:tools="http://schemas.android.com/tools"> - - - @@ -34,7 +31,7 @@ + android:layout_height="wrap_content"> - - - - - - - - - + app:layout_constraintTop_toBottomOf="@id/tv_bakery_title" /> - - - - - - - - - - + app:layout_constraintWidth="0dp" /> + app:layout_constraintTop_toBottomOf="@id/cg_bakery_bread_types" /> - - - - - - - - - - + app:layout_constraintTop_toBottomOf="@+id/tv_my_page_profile_nickname"/> diff --git a/app/src/main/res/layout/item_bakery.xml b/app/src/main/res/layout/item_bakery.xml index c8086a7b..721a0e17 100644 --- a/app/src/main/res/layout/item_bakery.xml +++ b/app/src/main/res/layout/item_bakery.xml @@ -9,7 +9,7 @@ + type="com.sopt.geonppang.domain.model.BakeryInformation" /> - - - - - - - - - + app:layout_constraintWidth="0dp" /> + app:layout_constraintTop_toBottomOf="@id/cg_bakery_bread_types" /> - - - - - - - - - - + app:layout_constraintTop_toBottomOf="@id/tv_item_detail_bakery_info_bakery_name"/> - - - - - - - - - - + app:layout_constraintWidth="0dp" /> + app:layout_constraintTop_toBottomOf="@id/cg_bakery_bread_types" /> Date: Sat, 17 Feb 2024 14:24:06 +0900 Subject: [PATCH 09/17] =?UTF-8?q?[feat]=20#224=20list=20item=EB=A7=88?= =?UTF-8?q?=EB=8B=A4=20chipgroup=EC=9D=B4=20inflate=20=EB=90=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9D=B7=EB=8F=84=EB=A1=9D,=20onBind=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=EC=97=90=EC=84=9C=20initChips=20=ED=98=B8=EC=B6=9C?= =?UTF-8?q?=ED=95=98=EA=B3=A0,=20=EB=9E=8C=EB=8B=A4=EC=8B=9D=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bakeryList/BakeryListAdapter.kt | 7 +++--- .../presentation/common/BakeryAdapter.kt | 20 ++++++++++++----- .../presentation/myPage/MyReviewAdapter.kt | 22 ++++++++++++------- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListAdapter.kt b/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListAdapter.kt index 73b36931..56420319 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListAdapter.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListAdapter.kt @@ -6,19 +6,20 @@ import androidx.recyclerview.widget.RecyclerView import com.sopt.geonppang.R import com.sopt.geonppang.databinding.ItemBakeryBinding import com.sopt.geonppang.domain.model.Bakery +import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.util.extension.loadingImage import com.sopt.geonppang.util.extension.setOnSingleClickListener class BakeryListAdapter( private val moveToDetail: (Int) -> Unit ) : RecyclerView.Adapter() { - private val bakeryList: MutableList = mutableListOf() + private val bakeryList: MutableList = mutableListOf() class BakeryViewHolder( private val binding: ItemBakeryBinding, ) : RecyclerView.ViewHolder(binding.root) { fun onBind( - bakery: Bakery, + bakery: BakeryInformation, moveToDetail: (Int) -> Unit ) { binding.bakery = bakery @@ -48,7 +49,7 @@ class BakeryListAdapter( holder.onBind(bakeryList[position], moveToDetail) } - fun setBakeryList(bakeries: MutableList) { + fun setBakeryList(bakeries: MutableList) { bakeryList.clear() bakeryList.addAll(bakeries) notifyDataSetChanged() diff --git a/app/src/main/java/com/sopt/geonppang/presentation/common/BakeryAdapter.kt b/app/src/main/java/com/sopt/geonppang/presentation/common/BakeryAdapter.kt index 399610cb..c0708483 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/common/BakeryAdapter.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/common/BakeryAdapter.kt @@ -4,17 +4,19 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.chip.ChipGroup import com.sopt.geonppang.R import com.sopt.geonppang.databinding.ItemBakeryBinding -import com.sopt.geonppang.domain.model.Bakery +import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.util.ItemDiffCallback import com.sopt.geonppang.util.extension.loadingImage import com.sopt.geonppang.util.extension.setOnSingleClickListener class BakeryAdapter( private val moveToDetail: (Int) -> Unit, -) : ListAdapter( - ItemDiffCallback( + private val initBreadTypeChips: (ChipGroup, Int) -> Unit, +) : ListAdapter( + ItemDiffCallback( onItemsTheSame = { old, new -> old.bakeryId == new.bakeryId }, onContentsTheSame = { old, new -> old == new } ) @@ -24,12 +26,20 @@ class BakeryAdapter( private val binding: ItemBakeryBinding, ) : RecyclerView.ViewHolder(binding.root) { fun onBind( - bakery: Bakery, + bakery: BakeryInformation, moveToDetail: (Int) -> Unit, + initBreadTypeChips: (ChipGroup, Int) -> Unit, + position: Int ) { binding.bakery = bakery binding.executePendingBindings() + // TODO: dana 다른 방식이 있는지 고민, 매 바인딩마다 removeAllViews 해야하는가 ? + with(binding.cgBakeryBreadTypes) { + this.removeAllViews() + initBreadTypeChips(this, position) + } + binding.root.setOnSingleClickListener { moveToDetail(bakery.bakeryId) } @@ -49,6 +59,6 @@ class BakeryAdapter( } override fun onBindViewHolder(holder: BakeryViewHolder, position: Int) { - holder.onBind(getItem(position), moveToDetail) + holder.onBind(getItem(position), moveToDetail, initBreadTypeChips, position) } } diff --git a/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyReviewAdapter.kt b/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyReviewAdapter.kt index 26a9600f..6996007b 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyReviewAdapter.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyReviewAdapter.kt @@ -4,10 +4,10 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.chip.ChipGroup import com.sopt.geonppang.R import com.sopt.geonppang.databinding.ItemMyReviewBinding import com.sopt.geonppang.domain.model.MyReview -import com.sopt.geonppang.presentation.model.BakeryReviewWritingInfo import com.sopt.geonppang.presentation.model.MyReviewBakeryInfo import com.sopt.geonppang.util.ItemDiffCallback import com.sopt.geonppang.util.extension.loadingImage @@ -15,6 +15,7 @@ import com.sopt.geonppang.util.extension.setOnSingleClickListener class MyReviewAdapter( private val moveToReviewDetail: (Int, MyReviewBakeryInfo) -> Unit, + private val initBreadTypeChips: (ChipGroup, Int) -> Unit, ) : ListAdapter( ItemDiffCallback( @@ -29,8 +30,18 @@ class MyReviewAdapter( fun onBind( review: MyReview, moveToReviewDetail: (Int, MyReviewBakeryInfo) -> Unit, + initBreadTypeChips: (ChipGroup, Int) -> Unit, + position: Int ) { + binding.review = review + + // TODO: dana 다른 방식이 있는지 고민, 매 바인딩마다 removeAllViews 해야하는가 ? + with(binding.cgBakeryBreadTypes) { + this.removeAllViews() + initBreadTypeChips(this, position) + } + binding.root.setOnSingleClickListener { moveToReviewDetail( review.reviewId, @@ -40,12 +51,7 @@ class MyReviewAdapter( review.bakery.bakeryPicture, review.bakery.firstNearStation, review.bakery.secondNearStation, - BakeryReviewWritingInfo.BreadType( - review.bakery.breadType.isGlutenFree, - review.bakery.breadType.isVegan, - review.bakery.breadType.isNutFree, - review.bakery.breadType.isSugarFree - ) + review.bakery.breadTypeList ) ) } @@ -66,6 +72,6 @@ class MyReviewAdapter( } override fun onBindViewHolder(holder: MyReviewViewHolder, position: Int) { - holder.onBind(getItem(position), moveToReviewDetail) + holder.onBind(getItem(position), moveToReviewDetail, initBreadTypeChips, position) } } From 560661d9437e5bdb124646c40efc0a954a3c5a5d Mon Sep 17 00:00:00 2001 From: Dan2dani Date: Sat, 17 Feb 2024 14:25:25 +0900 Subject: [PATCH 10/17] =?UTF-8?q?[feat]=20#224=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=20=EB=82=98=EC=9D=98=20Bre?= =?UTF-8?q?adType=20chip=20=EB=8F=99=EC=A0=81=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/myPage/MyPageFragment.kt | 39 +++++++++++++++---- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyPageFragment.kt b/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyPageFragment.kt index ae0342c4..747aa5e5 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyPageFragment.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyPageFragment.kt @@ -5,17 +5,22 @@ import android.net.Uri import android.os.Bundle import android.view.View import androidx.fragment.app.viewModels +import androidx.lifecycle.Lifecycle import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import com.sopt.geonppang.BuildConfig import com.sopt.geonppang.R import com.sopt.geonppang.databinding.FragmentMyPageBinding +import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.presentation.common.WebViewActivity import com.sopt.geonppang.presentation.filterSetting.FilterSettingActivity +import com.sopt.geonppang.presentation.type.BreadFilterType import com.sopt.geonppang.presentation.type.FilterInfoType import com.sopt.geonppang.util.AmplitudeUtils import com.sopt.geonppang.util.binding.BindingFragment +import com.sopt.geonppang.util.extension.breadTypeListToChips import com.sopt.geonppang.util.extension.setOnSingleClickListener +import com.sopt.geonppang.util.extension.toBreadTypeGrayChip import com.sopt.geonppang.util.setInvisibility import com.sopt.geonppang.util.setVisibility import dagger.hilt.android.AndroidEntryPoint @@ -26,6 +31,8 @@ import kotlinx.coroutines.flow.onEach class MyPageFragment : BindingFragment(R.layout.fragment_my_page) { private val viewModel by viewModels() + lateinit var myBreadTypeList: List + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -81,16 +88,34 @@ class MyPageFragment : BindingFragment(R.layout.fragment_ } private fun collectData() { - viewModel.profileInfo.flowWithLifecycle(lifecycle).onEach { + // 생명 주기 상태가 최소 CREATED 일 때만 수집하도록 제한 + viewModel.profileInfo.flowWithLifecycle( + viewLifecycleOwner.lifecycle, + Lifecycle.State.CREATED + ).onEach { profile -> binding.chipMyPageProfilePurpose.text = viewModel.setMainPurposeTitle()?.let { it1 -> this.context?.getString(it1) } ?: "" - }.launchIn(lifecycleScope) - viewModel.isFilterSelected.flowWithLifecycle(lifecycle).onEach { isFilterSelected -> - binding.includeMyPageSpeechBubble.root.setVisibility(!isFilterSelected) - binding.chipMyPageProfilePurpose.setInvisibility(isFilterSelected) - binding.chipGroupMyPageProfileBread.setInvisibility(isFilterSelected) - }.launchIn(lifecycleScope) + profile?.let { profile -> + myBreadTypeList = profile.breadTypeList + initBreadTypeChips(myBreadTypeList) + } + }.launchIn(viewLifecycleOwner.lifecycleScope) + + viewModel.isFilterSelected.flowWithLifecycle(viewLifecycleOwner.lifecycle) + .onEach { isFilterSelected -> + binding.includeMyPageSpeechBubble.root.setVisibility(!isFilterSelected) + binding.chipMyPageProfilePurpose.setInvisibility(isFilterSelected) + }.launchIn(viewLifecycleOwner.lifecycleScope) + } + + private fun initBreadTypeChips(breadTypeList: List) { + binding.chipGroupMyPageProfileBread.breadTypeListToChips( + breadTypeList = breadTypeList, + toChip = { + this.toBreadTypeGrayChip(layoutInflater) + } + ) } private fun moveToStoreBakeryList() { From 1c3468c305872570277fdbd7b34d55d244ca39a2 Mon Sep 17 00:00:00 2001 From: Dan2dani Date: Sat, 17 Feb 2024 14:26:10 +0900 Subject: [PATCH 11/17] =?UTF-8?q?[feat]=20#224=20=EB=82=98=EC=9D=98=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=EB=AA=A9=EB=A1=9D=20BreadTypeChips=20?= =?UTF-8?q?=EB=8F=99=EC=A0=81=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/repository/MyPageRepositoryImpl.kt | 3 ++- .../domain/repository/MyPageRepository.kt | 4 ++-- .../myPage/MyBookMarksActivity.kt | 22 ++++++++++++++++++- .../presentation/myPage/MyPageViewModel.kt | 4 ++-- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/sopt/geonppang/data/repository/MyPageRepositoryImpl.kt b/app/src/main/java/com/sopt/geonppang/data/repository/MyPageRepositoryImpl.kt index 1383e630..a0d8b111 100644 --- a/app/src/main/java/com/sopt/geonppang/data/repository/MyPageRepositoryImpl.kt +++ b/app/src/main/java/com/sopt/geonppang/data/repository/MyPageRepositoryImpl.kt @@ -2,6 +2,7 @@ package com.sopt.geonppang.data.repository import com.sopt.geonppang.data.datasource.remote.MyPageDataSource import com.sopt.geonppang.domain.model.Bakery +import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.domain.model.MyReview import com.sopt.geonppang.domain.model.Profile import com.sopt.geonppang.domain.repository.MyPageRepository @@ -14,7 +15,7 @@ class MyPageRepositoryImpl @Inject constructor( mypageDataSource.fetchMyPageInfo().toMypageInfo() } - override suspend fun fetchMyBookmark(): Result> = runCatching { + override suspend fun fetchMyBookmark(): Result> = runCatching { mypageDataSource.fetchMyBookmarkList().toMypageBookmark() } diff --git a/app/src/main/java/com/sopt/geonppang/domain/repository/MyPageRepository.kt b/app/src/main/java/com/sopt/geonppang/domain/repository/MyPageRepository.kt index e351d072..c48a407d 100644 --- a/app/src/main/java/com/sopt/geonppang/domain/repository/MyPageRepository.kt +++ b/app/src/main/java/com/sopt/geonppang/domain/repository/MyPageRepository.kt @@ -1,11 +1,11 @@ package com.sopt.geonppang.domain.repository -import com.sopt.geonppang.domain.model.Bakery +import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.domain.model.MyReview import com.sopt.geonppang.domain.model.Profile interface MyPageRepository { suspend fun fetchProfileInfo(): Result - suspend fun fetchMyBookmark(): Result> + suspend fun fetchMyBookmark(): Result> suspend fun fetchMyReview(): Result> } diff --git a/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyBookMarksActivity.kt b/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyBookMarksActivity.kt index 515704a4..fabc5d13 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyBookMarksActivity.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyBookMarksActivity.kt @@ -5,8 +5,10 @@ import android.os.Bundle import androidx.activity.viewModels import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope +import com.google.android.material.chip.ChipGroup import com.sopt.geonppang.R import com.sopt.geonppang.databinding.ActivityMyBookmarksBinding +import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.presentation.common.BakeryAdapter import com.sopt.geonppang.presentation.detail.DetailActivity import com.sopt.geonppang.presentation.detail.DetailActivity.Companion.SOURCE @@ -15,6 +17,8 @@ import com.sopt.geonppang.util.AmplitudeUtils import com.sopt.geonppang.util.CustomItemDecoration import com.sopt.geonppang.util.UiState import com.sopt.geonppang.util.binding.BindingActivity +import com.sopt.geonppang.util.extension.breadTypeListToChips +import com.sopt.geonppang.util.extension.toBreadTypePointM2Chip import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -26,6 +30,8 @@ class MyBookMarksActivity : private val myPageViewModel: MyPageViewModel by viewModels() private lateinit var bakeryAdapter: BakeryAdapter + private var myBookMarkBakeryList = listOf() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.viewModel = myPageViewModel @@ -42,7 +48,7 @@ class MyBookMarksActivity : } private fun initLayout() { - bakeryAdapter = BakeryAdapter(::moveToDetail) + bakeryAdapter = BakeryAdapter(::moveToDetail, ::initBreadTypeChips) binding.rvStoreList.apply { adapter = bakeryAdapter addItemDecoration(CustomItemDecoration(this@MyBookMarksActivity)) @@ -59,6 +65,7 @@ class MyBookMarksActivity : myPageViewModel.myPageBookmarkListState.flowWithLifecycle(lifecycle).onEach { when (it) { is UiState.Success -> { + myBookMarkBakeryList = it.data bakeryAdapter.submitList(it.data) } @@ -78,6 +85,19 @@ class MyBookMarksActivity : startActivity(intent) } + private fun initBreadTypeChips(chipGroup: ChipGroup, position: Int) { + if (myBookMarkBakeryList.isNotEmpty()) { + myBookMarkBakeryList.get(position).breadTypeList.let { breadTypeList -> + chipGroup.breadTypeListToChips( + breadTypeList = breadTypeList, + toChip = { + this.toBreadTypePointM2Chip(layoutInflater) + } + ) + } + } + } + companion object { const val BAKERY_ID = "bakeryId" const val MY_PAGE_MY_STORE = "MYPAGE_MYSTORE" diff --git a/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyPageViewModel.kt b/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyPageViewModel.kt index 57700a1c..1eba8ce2 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyPageViewModel.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyPageViewModel.kt @@ -2,7 +2,7 @@ package com.sopt.geonppang.presentation.myPage import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.geonppang.domain.model.Bakery +import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.domain.model.MyReview import com.sopt.geonppang.domain.model.Profile import com.sopt.geonppang.domain.repository.MyPageRepository @@ -28,7 +28,7 @@ class MyPageViewModel @Inject constructor( private var _myReviewCount = MutableStateFlow(null) val myReviewCount get() = _myReviewCount.asStateFlow() private var _myPageBookmarkListState = - MutableStateFlow>>(UiState.Loading) + MutableStateFlow>>(UiState.Loading) val myPageBookmarkListState get() = _myPageBookmarkListState.asStateFlow() private var _myBookmarkCount = MutableStateFlow(null) val myBookmarkCount get() = _myBookmarkCount.asStateFlow() From eb15885c36917be44c0433b236b43195f3307bec Mon Sep 17 00:00:00 2001 From: Dan2dani Date: Sat, 17 Feb 2024 14:26:31 +0900 Subject: [PATCH 12/17] =?UTF-8?q?[feat]=20#224=20=EB=82=98=EC=9D=98=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=AA=A8=EC=95=84=EB=B3=B4=EA=B8=B0=20Bra?= =?UTF-8?q?dTypeChips=20=EB=8F=99=EC=A0=81=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/model/MyReviewBakeryInfo.kt | 3 ++- .../presentation/myPage/MyReviewActivity.kt | 22 ++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/sopt/geonppang/presentation/model/MyReviewBakeryInfo.kt b/app/src/main/java/com/sopt/geonppang/presentation/model/MyReviewBakeryInfo.kt index bf4f3b73..956e2abd 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/model/MyReviewBakeryInfo.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/model/MyReviewBakeryInfo.kt @@ -1,6 +1,7 @@ package com.sopt.geonppang.presentation.model import android.os.Parcelable +import com.sopt.geonppang.presentation.type.BreadFilterType import kotlinx.android.parcel.Parcelize @Parcelize @@ -10,5 +11,5 @@ data class MyReviewBakeryInfo( val bakeryPicture: String, val firstNearStation: String, val secondNearStation: String, - val breadType: BakeryReviewWritingInfo.BreadType + val breadTypeList: List ) : Parcelable diff --git a/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyReviewActivity.kt b/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyReviewActivity.kt index e0f1e1e1..088fa38a 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyReviewActivity.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyReviewActivity.kt @@ -5,8 +5,10 @@ import android.os.Bundle import androidx.activity.viewModels import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope +import com.google.android.material.chip.ChipGroup import com.sopt.geonppang.R import com.sopt.geonppang.databinding.ActivityMyReviewBinding +import com.sopt.geonppang.domain.model.MyReview import com.sopt.geonppang.presentation.detail.DetailActivity.Companion.SOURCE import com.sopt.geonppang.presentation.detail.DetailActivity.Companion.VIEW_DETAIL_PAGE_AT import com.sopt.geonppang.presentation.model.MyReviewBakeryInfo @@ -15,6 +17,8 @@ import com.sopt.geonppang.util.AmplitudeUtils import com.sopt.geonppang.util.CustomItemDecoration import com.sopt.geonppang.util.UiState import com.sopt.geonppang.util.binding.BindingActivity +import com.sopt.geonppang.util.extension.breadTypeListToChips +import com.sopt.geonppang.util.extension.toBreadTypePointM2Chip import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -25,6 +29,8 @@ class MyReviewActivity : BindingActivity(R.layout.activ private val viewModel: MyPageViewModel by viewModels() private lateinit var myReviewAdapter: MyReviewAdapter + private var myReviewList = listOf() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.viewModel = viewModel @@ -37,7 +43,7 @@ class MyReviewActivity : BindingActivity(R.layout.activ private fun initLayout() { viewModel.fetchMyPageReviewList() - myReviewAdapter = MyReviewAdapter(::moveToReviewDetail) + myReviewAdapter = MyReviewAdapter(::moveToReviewDetail, ::initBreadTypeChips) binding.rvMyReviewList.apply { adapter = myReviewAdapter addItemDecoration(CustomItemDecoration(this@MyReviewActivity)) @@ -54,6 +60,7 @@ class MyReviewActivity : BindingActivity(R.layout.activ viewModel.myPageReviewListState.flowWithLifecycle(lifecycle).onEach { when (it) { is UiState.Success -> { + myReviewList = it.data myReviewAdapter.submitList(it.data) } @@ -74,6 +81,19 @@ class MyReviewActivity : BindingActivity(R.layout.activ startActivity(intent) } + private fun initBreadTypeChips(chipGroup: ChipGroup, position: Int) { + if (myReviewList.isNotEmpty()) { + myReviewList.get(position).bakery.breadTypeList.let { breadTypeIdList -> + chipGroup.breadTypeListToChips( + breadTypeList = breadTypeIdList, + toChip = { + this.toBreadTypePointM2Chip(layoutInflater) + } + ) + } + } + } + companion object { const val REVIEW_ID = "reviewId" const val BAKERY_INFO = "bakeryInfo" From 0310713ff3a8d93d6d8f08c5f6d5766014941a50 Mon Sep 17 00:00:00 2001 From: Dan2dani Date: Sat, 17 Feb 2024 14:27:00 +0900 Subject: [PATCH 13/17] =?UTF-8?q?[feat]=20#224=20=EB=82=98=EC=9D=98=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EC=83=81=EC=84=B8=EB=B3=B4=EA=B8=B0,=20?= =?UTF-8?q?=EB=B9=B5=EC=A7=91=20BreadTypeChips=20=EB=8F=99=EC=A0=81=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../myReviewDetail/MyReviewDetailActivity.kt | 13 ++++++++++++- .../myReviewDetail/MyReviewDetailViewModel.kt | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/sopt/geonppang/presentation/myReviewDetail/MyReviewDetailActivity.kt b/app/src/main/java/com/sopt/geonppang/presentation/myReviewDetail/MyReviewDetailActivity.kt index e5e3e258..1bd6cf6d 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/myReviewDetail/MyReviewDetailActivity.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/myReviewDetail/MyReviewDetailActivity.kt @@ -6,12 +6,15 @@ import com.sopt.geonppang.R import com.sopt.geonppang.databinding.ActivityMyReviewDetailBinding import com.sopt.geonppang.presentation.model.MyReviewBakeryInfo import com.sopt.geonppang.util.binding.BindingActivity +import com.sopt.geonppang.util.extension.breadTypeListToChips +import com.sopt.geonppang.util.extension.toBreadTypePointM2Chip import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class MyReviewDetailActivity : BindingActivity(R.layout.activity_my_review_detail) { private val myReviewDetailViewModel: MyReviewDetailViewModel by viewModels() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.viewModel = myReviewDetailViewModel @@ -24,9 +27,17 @@ class MyReviewDetailActivity : private fun initLayout() { val reviewId = intent.getIntExtra(REVIEW_ID, -1) myReviewDetailViewModel.fetchMyReviewDetail(reviewId) + val bakeryInfo = intent.getParcelableExtra(BAKERY_INFO) bakeryInfo?.let { bakeryInfo -> - myReviewDetailViewModel.setUserInfo(bakeryInfo) + myReviewDetailViewModel.setBakeryInfo(bakeryInfo) + binding.cgBakeryBreadTypes + .breadTypeListToChips( + breadTypeList = bakeryInfo.breadTypeList, + toChip = { + this.toBreadTypePointM2Chip(layoutInflater) + } + ) } } diff --git a/app/src/main/java/com/sopt/geonppang/presentation/myReviewDetail/MyReviewDetailViewModel.kt b/app/src/main/java/com/sopt/geonppang/presentation/myReviewDetail/MyReviewDetailViewModel.kt index beb664e2..f38d6382 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/myReviewDetail/MyReviewDetailViewModel.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/myReviewDetail/MyReviewDetailViewModel.kt @@ -39,7 +39,7 @@ class MyReviewDetailViewModel @Inject constructor( isRecommendKeywordSelected.value = selectedKeyWord } - fun setUserInfo(bakeryInfo: MyReviewBakeryInfo) { + fun setBakeryInfo(bakeryInfo: MyReviewBakeryInfo) { _bakeryInfo.value = bakeryInfo } From 47b65cd5075bce30fb034666014d00e89cbe904e Mon Sep 17 00:00:00 2001 From: Dan2dani Date: Sat, 17 Feb 2024 14:27:57 +0900 Subject: [PATCH 14/17] =?UTF-8?q?[feat]=20#224=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20breadTypeChi?= =?UTF-8?q?ps=20=EB=8F=99=EC=A0=81=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/search/SearchActivity.kt | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/sopt/geonppang/presentation/search/SearchActivity.kt b/app/src/main/java/com/sopt/geonppang/presentation/search/SearchActivity.kt index acb2343c..3d60bc58 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/search/SearchActivity.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/search/SearchActivity.kt @@ -8,8 +8,10 @@ import androidx.activity.viewModels import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.ConcatAdapter +import com.google.android.material.chip.ChipGroup import com.sopt.geonppang.R import com.sopt.geonppang.databinding.ActivitySearchBinding +import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.presentation.common.BakeryAdapter import com.sopt.geonppang.presentation.detail.DetailActivity import com.sopt.geonppang.presentation.detail.DetailActivity.Companion.SOURCE @@ -18,7 +20,9 @@ import com.sopt.geonppang.util.AmplitudeUtils import com.sopt.geonppang.util.CustomItemDecoration import com.sopt.geonppang.util.UiState import com.sopt.geonppang.util.binding.BindingActivity +import com.sopt.geonppang.util.extension.breadTypeListToChips import com.sopt.geonppang.util.extension.hideKeyboard +import com.sopt.geonppang.util.extension.toBreadTypePointM2Chip import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -30,6 +34,8 @@ class SearchActivity : BindingActivity(R.layout.activity_ private lateinit var bakeryAdapter: BakeryAdapter private lateinit var searchCountAdapter: SearchCountAdapter + private var bakeryInformationList = listOf() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.viewModel = viewModel @@ -42,7 +48,7 @@ class SearchActivity : BindingActivity(R.layout.activity_ private fun initLayout() { searchCountAdapter = SearchCountAdapter() - bakeryAdapter = BakeryAdapter(::moveToDetail) + bakeryAdapter = BakeryAdapter(::moveToDetail, ::initBreadTypeChips) binding.rvSearchBakeryList.apply { adapter = ConcatAdapter(searchCountAdapter, bakeryAdapter) addItemDecoration( @@ -80,6 +86,8 @@ class SearchActivity : BindingActivity(R.layout.activity_ completeFilteringInParticularView() viewModel.searchBakeryList() searchCountAdapter.setSearchData(it.data) + + bakeryInformationList = it.data.bakeryList bakeryAdapter.submitList(it.data.bakeryList) } @@ -121,6 +129,19 @@ class SearchActivity : BindingActivity(R.layout.activity_ return super.dispatchTouchEvent(ev) } + private fun initBreadTypeChips(chipGroup: ChipGroup, position: Int) { + if (bakeryInformationList.isNotEmpty()) { + bakeryInformationList.get(position).breadTypeList.let { breadTypeIdList -> + chipGroup.breadTypeListToChips( + breadTypeList = breadTypeIdList, + toChip = { + this.toBreadTypePointM2Chip(layoutInflater) + } + ) + } + } + } + companion object { const val BAKERY_ID = "bakeryId" const val VIEW_TO_VIEW = "viewToView" From 78c60a0408b829b482aa641fe919831da4448924 Mon Sep 17 00:00:00 2001 From: Dan2dani Date: Sat, 17 Feb 2024 14:28:21 +0900 Subject: [PATCH 15/17] =?UTF-8?q?[feat]=20#224=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1,=20=EB=B9=B5=EC=A7=91=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=EB=B7=B0=20BreadTypsChips=20=EB=8F=99=EC=A0=81=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bakeryList/BakeryListFragment.kt | 2 +- .../presentation/detail/DetailActivity.kt | 38 ++++++++++++++----- .../detail/DetailBakeryInfoAdapter.kt | 11 ++++-- .../presentation/detail/DetailViewModel.kt | 9 +---- .../model/BakeryReviewWritingInfo.kt | 13 ++----- .../reviewWriting/ReviewWritingActivity.kt | 14 ++++++- .../geonppang/util/VerticalProgressBar.kt | 4 +- 7 files changed, 57 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListFragment.kt b/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListFragment.kt index ce84127d..d9004527 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListFragment.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListFragment.kt @@ -75,7 +75,7 @@ class BakeryListFragment : viewModel.bakeryListState.flowWithLifecycle(lifecycle).onEach { when (it) { is UiState.Success -> { - bakeryAdapter.setBakeryList(it.data.toMutableList()) +// bakeryAdapter.setBakeryList(it.data.toMutableList()) } else -> {} diff --git a/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailActivity.kt b/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailActivity.kt index aa343803..15d4dc5e 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailActivity.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailActivity.kt @@ -13,16 +13,22 @@ import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipGroup import com.sopt.geonppang.R import com.sopt.geonppang.databinding.ActivityDetailBinding +import com.sopt.geonppang.domain.model.BakeryInfo +import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.presentation.common.WebViewActivity import com.sopt.geonppang.presentation.model.BakeryReviewWritingInfo import com.sopt.geonppang.presentation.report.ReportActivity import com.sopt.geonppang.presentation.reviewWriting.ReviewWritingActivity +import com.sopt.geonppang.presentation.type.BreadFilterType import com.sopt.geonppang.util.AmplitudeUtils import com.sopt.geonppang.util.ChipFactory import com.sopt.geonppang.util.CustomSnackbar import com.sopt.geonppang.util.UiState import com.sopt.geonppang.util.binding.BindingActivity +import com.sopt.geonppang.util.extension.breadTypeListToChips import com.sopt.geonppang.util.extension.setOnSingleClickListener +import com.sopt.geonppang.util.extension.toBreadTypePointM1Chip +import com.sopt.geonppang.util.extension.toReviewRecommendedKeyWordChip import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -38,11 +44,7 @@ class DetailActivity : BindingActivity(R.layout.activity_ private lateinit var detailNoReviewAdapter: DetailNoReviewAdapter private lateinit var concatAdapter: ConcatAdapter private var bakeryId = -1 - - private val String.toChip: Chip - get() = ChipFactory.create(layoutInflater).also { - it.text = this - } + lateinit var breadTypeList: List override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -59,10 +61,10 @@ class DetailActivity : BindingActivity(R.layout.activity_ private fun initLayout() { viewModel.fetchDetailReview(bakeryId) - detailBakeryInfoAdapter = DetailBakeryInfoAdapter(::moveToWebPage) + detailBakeryInfoAdapter = DetailBakeryInfoAdapter(::moveToWebPage, ::initBreadTypeChips) detailMenuAdapter = DetailMenuAdapter() detailReviewGraphAdapter = DetailReviewGraphAdapter() - detailReviewAdapter = DetailReviewAdapter(::initChip, ::moveToReport) + detailReviewAdapter = DetailReviewAdapter(::initRecommendKeyWordChip, ::moveToReport) detailNoReviewAdapter = DetailNoReviewAdapter() concatAdapter = ConcatAdapter( @@ -103,10 +105,13 @@ class DetailActivity : BindingActivity(R.layout.activity_ } private fun collectData() { - viewModel.bakeryInfo.flowWithLifecycle(lifecycle).onEach { + viewModel.bakeryInfo.flowWithLifecycle(lifecycle).onEach { it -> it?.let { bakeryInfo -> detailBakeryInfoAdapter.setBakeryInfo(bakeryInfo) detailMenuAdapter.submitList(bakeryInfo.menuList) + breadTypeList = bakeryInfo.breadTypeIdList + + } }.launchIn(lifecycleScope) @@ -152,16 +157,29 @@ class DetailActivity : BindingActivity(R.layout.activity_ }.launchIn(lifecycleScope) } - private fun initChip(chipGroup: ChipGroup, position: Int) { + private fun initRecommendKeyWordChip(chipGroup: ChipGroup, position: Int) { viewModel.reviewData.value?.detailReviewList?.get(position)?.recommendKeywordList?.let { recommendKeywordList -> for (recommendKeyword in recommendKeywordList) { chipGroup.addView( - recommendKeyword.recommendKeywordName.toChip + recommendKeyword.recommendKeywordName.toReviewRecommendedKeyWordChip( + layoutInflater + ) ) } } } + private fun initBreadTypeChips(chipGroup: ChipGroup) { + if (breadTypeList.isNotEmpty()) { + chipGroup.breadTypeListToChips( + breadTypeList = breadTypeList, + toChip = { + this.toBreadTypePointM1Chip(layoutInflater) + } + ) + } + } + private fun moveToTop(recyclerView: RecyclerView) { recyclerView.smoothScrollToPosition(FIRST_POSITION) } diff --git a/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailBakeryInfoAdapter.kt b/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailBakeryInfoAdapter.kt index afcb254f..13dd2786 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailBakeryInfoAdapter.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailBakeryInfoAdapter.kt @@ -3,12 +3,14 @@ package com.sopt.geonppang.presentation.detail import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.chip.ChipGroup import com.sopt.geonppang.databinding.ItemDetailBakeryInfoBinding import com.sopt.geonppang.domain.model.BakeryInfo import com.sopt.geonppang.util.AmplitudeUtils class DetailBakeryInfoAdapter( - private val moveToWebPage: (String) -> Unit + private val moveToWebPage: (String) -> Unit, + private val initBreadTypeChips: (ChipGroup) -> Unit, ) : RecyclerView.Adapter() { private val bakeryInfoList: MutableList = mutableListOf() @@ -16,11 +18,14 @@ class DetailBakeryInfoAdapter( RecyclerView.ViewHolder(binding.root) { fun onBind( bakeryInfo: BakeryInfo, - moveToWebPage: (String) -> Unit + moveToWebPage: (String) -> Unit, + initBreadTypeChips: (ChipGroup) -> Unit, ) { with(binding) { binding.bakeryInfo = bakeryInfo + initBreadTypeChips(binding.chipGroupItemDetailBakeryInfoBreadType) + tvItemDetailBakeryInfoHomepage.setOnClickListener { AmplitudeUtils.trackEvent(CLICK_WEBSITE) moveToWebPage(bakeryInfo.homepageUrl) @@ -43,7 +48,7 @@ class DetailBakeryInfoAdapter( override fun getItemCount(): Int = bakeryInfoList.size override fun onBindViewHolder(holder: DetailBakeryInfoViewHolder, position: Int) { - holder.onBind(bakeryInfoList[position], moveToWebPage) + holder.onBind(bakeryInfoList[position], moveToWebPage, initBreadTypeChips) } fun setBakeryInfo(bakeryInfo: BakeryInfo) { diff --git a/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailViewModel.kt b/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailViewModel.kt index a09986c0..1143f89b 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailViewModel.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailViewModel.kt @@ -71,15 +71,10 @@ class DetailViewModel @Inject constructor( BakeryReviewWritingInfo( _bakeryInfo.bakeryName, _bakeryInfo.bakeryPicture, - BakeryReviewWritingInfo.BreadType( - _bakeryInfo.breadType.isGlutenFree, - _bakeryInfo.breadType.isVegan, - _bakeryInfo.breadType.isNutFree, - _bakeryInfo.breadType.isSugarFree, - ), + _bakeryInfo.breadTypeIdList, _bakeryInfo.firstNearStation, _bakeryInfo.secondNearStation ) - } ?: BakeryReviewWritingInfo("", "", null, "", "") + } ?: BakeryReviewWritingInfo("", "", listOf(), "", "") } } diff --git a/app/src/main/java/com/sopt/geonppang/presentation/model/BakeryReviewWritingInfo.kt b/app/src/main/java/com/sopt/geonppang/presentation/model/BakeryReviewWritingInfo.kt index a3d17348..0491788e 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/model/BakeryReviewWritingInfo.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/model/BakeryReviewWritingInfo.kt @@ -1,21 +1,14 @@ package com.sopt.geonppang.presentation.model import android.os.Parcelable +import com.sopt.geonppang.presentation.type.BreadFilterType import kotlinx.android.parcel.Parcelize @Parcelize data class BakeryReviewWritingInfo( val bakeryName: String, val bakeryPicture: String, - val breadType: BreadType?, + val breadTypeList: List, val firstNearestStation: String, val secondNearestStation: String?, -) : Parcelable { - @Parcelize - data class BreadType( - val isGlutenFree: Boolean, - val isVegan: Boolean, - val isNutFree: Boolean, - val isSugarFree: Boolean, - ) : Parcelable -} +) : Parcelable diff --git a/app/src/main/java/com/sopt/geonppang/presentation/reviewWriting/ReviewWritingActivity.kt b/app/src/main/java/com/sopt/geonppang/presentation/reviewWriting/ReviewWritingActivity.kt index 12a9ac23..7beb8510 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/reviewWriting/ReviewWritingActivity.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/reviewWriting/ReviewWritingActivity.kt @@ -14,8 +14,10 @@ import com.sopt.geonppang.presentation.type.LikeType import com.sopt.geonppang.util.AmplitudeUtils import com.sopt.geonppang.util.UiState import com.sopt.geonppang.util.binding.BindingActivity +import com.sopt.geonppang.util.extension.breadTypeListToChips import com.sopt.geonppang.util.extension.hideKeyboard import com.sopt.geonppang.util.extension.setOnSingleClickListener +import com.sopt.geonppang.util.extension.toBreadTypePointM2Chip import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -41,7 +43,17 @@ class ReviewWritingActivity : private fun initLayout() { val bakeryReviewWritingInfo = intent.getParcelableExtra(BAKERY_INFO) - bakeryReviewWritingInfo?.let { viewModel.setBakeryInfo(it) } + bakeryReviewWritingInfo?.let { bakeryInfo -> + viewModel.setBakeryInfo(bakeryInfo) + + binding.cgBakeryBreadTypes + .breadTypeListToChips( + breadTypeList = bakeryInfo.breadTypeList, + toChip = { + this.toBreadTypePointM2Chip(layoutInflater) + } + ) + } } private fun addListeners() { diff --git a/app/src/main/java/com/sopt/geonppang/util/VerticalProgressBar.kt b/app/src/main/java/com/sopt/geonppang/util/VerticalProgressBar.kt index 3564df70..ceadc404 100644 --- a/app/src/main/java/com/sopt/geonppang/util/VerticalProgressBar.kt +++ b/app/src/main/java/com/sopt/geonppang/util/VerticalProgressBar.kt @@ -28,7 +28,7 @@ class VerticalProgressBar @JvmOverloads constructor( typedArray.recycle() } - override fun onDraw(canvas: Canvas?) { + override fun onDraw(canvas: Canvas) { super.onDraw(canvas) val width = width.toFloat() @@ -43,7 +43,7 @@ class VerticalProgressBar @JvmOverloads constructor( height.toInt() ) - canvas?.let { canvas -> + canvas.let { canvas -> backgroundDrawable?.draw(canvas) progressDrawable?.draw(canvas) } From 7a2b76c54241dd8e525413cdee685a0ddfce6354 Mon Sep 17 00:00:00 2001 From: Dan2dani Date: Sat, 17 Feb 2024 14:54:59 +0900 Subject: [PATCH 16/17] =?UTF-8?q?[chroe]=20#224=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/geonppang/data/repository/MyPageRepositoryImpl.kt | 1 - app/src/main/java/com/sopt/geonppang/domain/model/Bakery.kt | 2 +- .../geonppang/presentation/bakeryList/BakeryListAdapter.kt | 1 - .../com/sopt/geonppang/presentation/detail/DetailActivity.kt | 4 ---- .../com/sopt/geonppang/presentation/myPage/MyPageFragment.kt | 1 - .../main/java/com/sopt/geonppang/util/extension/ChipExt.kt | 1 - 6 files changed, 1 insertion(+), 9 deletions(-) diff --git a/app/src/main/java/com/sopt/geonppang/data/repository/MyPageRepositoryImpl.kt b/app/src/main/java/com/sopt/geonppang/data/repository/MyPageRepositoryImpl.kt index a0d8b111..8874f311 100644 --- a/app/src/main/java/com/sopt/geonppang/data/repository/MyPageRepositoryImpl.kt +++ b/app/src/main/java/com/sopt/geonppang/data/repository/MyPageRepositoryImpl.kt @@ -1,7 +1,6 @@ package com.sopt.geonppang.data.repository import com.sopt.geonppang.data.datasource.remote.MyPageDataSource -import com.sopt.geonppang.domain.model.Bakery import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.domain.model.MyReview import com.sopt.geonppang.domain.model.Profile diff --git a/app/src/main/java/com/sopt/geonppang/domain/model/Bakery.kt b/app/src/main/java/com/sopt/geonppang/domain/model/Bakery.kt index 0e5baf25..fbae20d4 100644 --- a/app/src/main/java/com/sopt/geonppang/domain/model/Bakery.kt +++ b/app/src/main/java/com/sopt/geonppang/domain/model/Bakery.kt @@ -28,4 +28,4 @@ data class BakeryInformation( val bookmarkCount: Int?, val bakeryPicture: String, val breadTypeList: List, -) \ No newline at end of file +) diff --git a/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListAdapter.kt b/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListAdapter.kt index 56420319..5a4c108a 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListAdapter.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListAdapter.kt @@ -5,7 +5,6 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.sopt.geonppang.R import com.sopt.geonppang.databinding.ItemBakeryBinding -import com.sopt.geonppang.domain.model.Bakery import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.util.extension.loadingImage import com.sopt.geonppang.util.extension.setOnSingleClickListener diff --git a/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailActivity.kt b/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailActivity.kt index 15d4dc5e..8ba2c884 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailActivity.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailActivity.kt @@ -9,19 +9,15 @@ import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.ConcatAdapter import androidx.recyclerview.widget.RecyclerView -import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipGroup import com.sopt.geonppang.R import com.sopt.geonppang.databinding.ActivityDetailBinding -import com.sopt.geonppang.domain.model.BakeryInfo -import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.presentation.common.WebViewActivity import com.sopt.geonppang.presentation.model.BakeryReviewWritingInfo import com.sopt.geonppang.presentation.report.ReportActivity import com.sopt.geonppang.presentation.reviewWriting.ReviewWritingActivity import com.sopt.geonppang.presentation.type.BreadFilterType import com.sopt.geonppang.util.AmplitudeUtils -import com.sopt.geonppang.util.ChipFactory import com.sopt.geonppang.util.CustomSnackbar import com.sopt.geonppang.util.UiState import com.sopt.geonppang.util.binding.BindingActivity diff --git a/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyPageFragment.kt b/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyPageFragment.kt index 747aa5e5..5926dddd 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyPageFragment.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyPageFragment.kt @@ -11,7 +11,6 @@ import androidx.lifecycle.lifecycleScope import com.sopt.geonppang.BuildConfig import com.sopt.geonppang.R import com.sopt.geonppang.databinding.FragmentMyPageBinding -import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.presentation.common.WebViewActivity import com.sopt.geonppang.presentation.filterSetting.FilterSettingActivity import com.sopt.geonppang.presentation.type.BreadFilterType diff --git a/app/src/main/java/com/sopt/geonppang/util/extension/ChipExt.kt b/app/src/main/java/com/sopt/geonppang/util/extension/ChipExt.kt index e8f15b0c..fa6c93b4 100644 --- a/app/src/main/java/com/sopt/geonppang/util/extension/ChipExt.kt +++ b/app/src/main/java/com/sopt/geonppang/util/extension/ChipExt.kt @@ -13,7 +13,6 @@ import com.sopt.geonppang.R import com.sopt.geonppang.presentation.type.BreadFilterType import com.sopt.geonppang.util.ChipFactory - fun String.toBreadTypeGrayChip(layoutInflater: LayoutInflater): Chip { return ChipFactory.create(layoutInflater, R.layout.view_bread_type_chip_gray) } From 60ad98896e4fc43f57670abc35881dc3a5fdfd81 Mon Sep 17 00:00:00 2001 From: Dan2dani Date: Sat, 17 Feb 2024 14:54:59 +0900 Subject: [PATCH 17/17] =?UTF-8?q?[chroe]=20#224=20ktlint=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/geonppang/data/repository/MyPageRepositoryImpl.kt | 1 - app/src/main/java/com/sopt/geonppang/domain/model/Bakery.kt | 2 +- .../geonppang/presentation/bakeryList/BakeryListAdapter.kt | 1 - .../sopt/geonppang/presentation/detail/DetailActivity.kt | 6 ------ .../sopt/geonppang/presentation/myPage/MyPageFragment.kt | 1 - .../main/java/com/sopt/geonppang/util/extension/ChipExt.kt | 1 - 6 files changed, 1 insertion(+), 11 deletions(-) diff --git a/app/src/main/java/com/sopt/geonppang/data/repository/MyPageRepositoryImpl.kt b/app/src/main/java/com/sopt/geonppang/data/repository/MyPageRepositoryImpl.kt index a0d8b111..8874f311 100644 --- a/app/src/main/java/com/sopt/geonppang/data/repository/MyPageRepositoryImpl.kt +++ b/app/src/main/java/com/sopt/geonppang/data/repository/MyPageRepositoryImpl.kt @@ -1,7 +1,6 @@ package com.sopt.geonppang.data.repository import com.sopt.geonppang.data.datasource.remote.MyPageDataSource -import com.sopt.geonppang.domain.model.Bakery import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.domain.model.MyReview import com.sopt.geonppang.domain.model.Profile diff --git a/app/src/main/java/com/sopt/geonppang/domain/model/Bakery.kt b/app/src/main/java/com/sopt/geonppang/domain/model/Bakery.kt index 0e5baf25..fbae20d4 100644 --- a/app/src/main/java/com/sopt/geonppang/domain/model/Bakery.kt +++ b/app/src/main/java/com/sopt/geonppang/domain/model/Bakery.kt @@ -28,4 +28,4 @@ data class BakeryInformation( val bookmarkCount: Int?, val bakeryPicture: String, val breadTypeList: List, -) \ No newline at end of file +) diff --git a/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListAdapter.kt b/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListAdapter.kt index 56420319..5a4c108a 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListAdapter.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/bakeryList/BakeryListAdapter.kt @@ -5,7 +5,6 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.sopt.geonppang.R import com.sopt.geonppang.databinding.ItemBakeryBinding -import com.sopt.geonppang.domain.model.Bakery import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.util.extension.loadingImage import com.sopt.geonppang.util.extension.setOnSingleClickListener diff --git a/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailActivity.kt b/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailActivity.kt index 15d4dc5e..4a05e232 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailActivity.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/detail/DetailActivity.kt @@ -9,19 +9,15 @@ import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.ConcatAdapter import androidx.recyclerview.widget.RecyclerView -import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipGroup import com.sopt.geonppang.R import com.sopt.geonppang.databinding.ActivityDetailBinding -import com.sopt.geonppang.domain.model.BakeryInfo -import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.presentation.common.WebViewActivity import com.sopt.geonppang.presentation.model.BakeryReviewWritingInfo import com.sopt.geonppang.presentation.report.ReportActivity import com.sopt.geonppang.presentation.reviewWriting.ReviewWritingActivity import com.sopt.geonppang.presentation.type.BreadFilterType import com.sopt.geonppang.util.AmplitudeUtils -import com.sopt.geonppang.util.ChipFactory import com.sopt.geonppang.util.CustomSnackbar import com.sopt.geonppang.util.UiState import com.sopt.geonppang.util.binding.BindingActivity @@ -110,8 +106,6 @@ class DetailActivity : BindingActivity(R.layout.activity_ detailBakeryInfoAdapter.setBakeryInfo(bakeryInfo) detailMenuAdapter.submitList(bakeryInfo.menuList) breadTypeList = bakeryInfo.breadTypeIdList - - } }.launchIn(lifecycleScope) diff --git a/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyPageFragment.kt b/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyPageFragment.kt index 747aa5e5..5926dddd 100644 --- a/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyPageFragment.kt +++ b/app/src/main/java/com/sopt/geonppang/presentation/myPage/MyPageFragment.kt @@ -11,7 +11,6 @@ import androidx.lifecycle.lifecycleScope import com.sopt.geonppang.BuildConfig import com.sopt.geonppang.R import com.sopt.geonppang.databinding.FragmentMyPageBinding -import com.sopt.geonppang.domain.model.BakeryInformation import com.sopt.geonppang.presentation.common.WebViewActivity import com.sopt.geonppang.presentation.filterSetting.FilterSettingActivity import com.sopt.geonppang.presentation.type.BreadFilterType diff --git a/app/src/main/java/com/sopt/geonppang/util/extension/ChipExt.kt b/app/src/main/java/com/sopt/geonppang/util/extension/ChipExt.kt index e8f15b0c..fa6c93b4 100644 --- a/app/src/main/java/com/sopt/geonppang/util/extension/ChipExt.kt +++ b/app/src/main/java/com/sopt/geonppang/util/extension/ChipExt.kt @@ -13,7 +13,6 @@ import com.sopt.geonppang.R import com.sopt.geonppang.presentation.type.BreadFilterType import com.sopt.geonppang.util.ChipFactory - fun String.toBreadTypeGrayChip(layoutInflater: LayoutInflater): Chip { return ChipFactory.create(layoutInflater, R.layout.view_bread_type_chip_gray) }