From f98f41e19538d93cbccd9b3b83ba31cd176d4a74 Mon Sep 17 00:00:00 2001 From: Strone Date: Wed, 14 Aug 2024 14:09:11 +0900 Subject: [PATCH 01/13] version up --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 3dc7d11b2..644004cea 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,8 +7,8 @@ buildscript { } extra.apply { - set("versionName", "3.4.4") - set("versionCode", 30404) + set("versionName", "3.5.0") + set("versionCode", 30500) } dependencies { From f38d2f5f40d880e3e2a5f76b0bc97c8bae88c65b Mon Sep 17 00:00:00 2001 From: Strone Date: Wed, 14 Aug 2024 14:39:00 +0900 Subject: [PATCH 02/13] version up --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 644004cea..702e339c6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,8 +7,8 @@ buildscript { } extra.apply { - set("versionName", "3.5.0") - set("versionCode", 30500) + set("versionName", "3.5.1") + set("versionCode", 30501) } dependencies { From 86ffe81db5a03ad3405f583323cce3a155ba15f9 Mon Sep 17 00:00:00 2001 From: Thirfir Date: Sat, 31 Aug 2024 14:40:58 +0900 Subject: [PATCH 03/13] =?UTF-8?q?=EC=8B=9D=EB=8B=A8=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A7=A4=EB=A6=BC=EC=9D=B4=EC=8A=88=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koreatech/koin/ui/dining/viewmodel/DiningViewModel.kt | 6 +----- koin/src/main/res/layout/activity_dining.xml | 7 +++---- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/koin/src/main/java/in/koreatech/koin/ui/dining/viewmodel/DiningViewModel.kt b/koin/src/main/java/in/koreatech/koin/ui/dining/viewmodel/DiningViewModel.kt index e36ffb7e4..a6fc2d8ab 100644 --- a/koin/src/main/java/in/koreatech/koin/ui/dining/viewmodel/DiningViewModel.kt +++ b/koin/src/main/java/in/koreatech/koin/ui/dining/viewmodel/DiningViewModel.kt @@ -1,6 +1,5 @@ package `in`.koreatech.koin.ui.dining.viewmodel -import android.util.Log import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import `in`.koreatech.koin.core.viewmodel.BaseViewModel @@ -75,14 +74,11 @@ class DiningViewModel @Inject constructor( fun getDining( date: String = selectedDate.value ) { - Log.d("dddddddddddddddd555555555", date) if (isLoading.value == false) { viewModelScope.launchWithLoading { getDiningUseCase(date) .onSuccess { - _dining.value = it.also { - Log.d("dddddddddddddddd6666666", it.toString()) - } + _dining.value = it } .onFailure { diff --git a/koin/src/main/res/layout/activity_dining.xml b/koin/src/main/res/layout/activity_dining.xml index 9539c106e..2f461975d 100644 --- a/koin/src/main/res/layout/activity_dining.xml +++ b/koin/src/main/res/layout/activity_dining.xml @@ -61,15 +61,14 @@ android:id="@+id/swipe_refresh_layout_dining" android:layout_width="match_parent" android:layout_height="0dp" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toBottomOf="@id/tabs_dining_time"> + android:layout_height="wrap_content" + android:background="@color/background_dark" /> From 582744793d5abe0e6371f30041c129df793f5d2e Mon Sep 17 00:00:00 2001 From: Thirfir Date: Sat, 31 Aug 2024 14:49:50 +0900 Subject: [PATCH 04/13] update v3.5.2 --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 702e339c6..b35f0fb69 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,8 +7,8 @@ buildscript { } extra.apply { - set("versionName", "3.5.1") - set("versionCode", 30501) + set("versionName", "3.5.2") + set("versionCode", 30502) } dependencies { From aea531335948c18f4775f7caf97d6b2d43edff65 Mon Sep 17 00:00:00 2001 From: Thirfir Date: Wed, 4 Sep 2024 20:32:26 +0900 Subject: [PATCH 05/13] =?UTF-8?q?=EC=8B=9D=EB=8B=A8=20UI/UX=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../in/koreatech/koin/domain/util/TimeUtil.kt | 8 +++ .../koin/ui/dining/adapter/DiningAdapter.kt | 7 ++ koin/src/main/res/layout/item_dining.xml | 69 ++++++++++--------- koin/src/main/res/values/strings.xml | 1 + 4 files changed, 51 insertions(+), 34 deletions(-) diff --git a/domain/src/main/java/in/koreatech/koin/domain/util/TimeUtil.kt b/domain/src/main/java/in/koreatech/koin/domain/util/TimeUtil.kt index d9bfa6dcb..694de05d9 100644 --- a/domain/src/main/java/in/koreatech/koin/domain/util/TimeUtil.kt +++ b/domain/src/main/java/in/koreatech/koin/domain/util/TimeUtil.kt @@ -2,6 +2,8 @@ package `in`.koreatech.koin.domain.util import java.text.ParseException import java.text.SimpleDateFormat +import java.time.LocalDate +import java.time.format.DateTimeFormatter import java.util.* object TimeUtil { @@ -10,6 +12,12 @@ object TimeUtil { return Calendar.getInstance().time } + fun isWeekend(dateString: String): Boolean { + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + val date = LocalDate.parse(dateString, formatter) + return date.dayOfWeek.value == 6 || date.dayOfWeek.value == 7 + } + fun getNextDayDate(date: Date): Date { val calendar = Calendar.getInstance() calendar.time = date diff --git a/koin/src/main/java/in/koreatech/koin/ui/dining/adapter/DiningAdapter.kt b/koin/src/main/java/in/koreatech/koin/ui/dining/adapter/DiningAdapter.kt index 21667c924..f7a55e3cc 100644 --- a/koin/src/main/java/in/koreatech/koin/ui/dining/adapter/DiningAdapter.kt +++ b/koin/src/main/java/in/koreatech/koin/ui/dining/adapter/DiningAdapter.kt @@ -28,6 +28,7 @@ import `in`.koreatech.koin.domain.model.dining.Dining import `in`.koreatech.koin.domain.model.dining.LikeActionType import `in`.koreatech.koin.domain.model.dining.DiningPlace import `in`.koreatech.koin.domain.util.DiningUtil +import `in`.koreatech.koin.domain.util.TimeUtil import `in`.koreatech.koin.ui.dining.DiningActivity import `in`.koreatech.koin.ui.login.LoginActivity import `in`.koreatech.koin.util.ext.toStringWithComma @@ -68,6 +69,7 @@ class DiningAdapter( textViewNoPhoto.visibility = View.INVISIBLE imageViewNoPhoto.visibility = View.INVISIBLE imageViewDining.visibility = View.VISIBLE + Glide.with(context) .load(dining.imageUrl) .listener(object : RequestListener { @@ -87,6 +89,7 @@ class DiningAdapter( dataSource: DataSource?, isFirstResource: Boolean ): Boolean { + binding.lottieImageLoading.pauseAnimation() binding.lottieImageLoading.visibility = View.GONE return false } @@ -106,6 +109,10 @@ class DiningAdapter( } else { cardViewDining.strokeWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1f, context.resources.displayMetrics).toInt() + textViewNoPhoto.text = if(TimeUtil.isWeekend(dining.date)) context.getString( + R.string.photo_not_provided_on_weekend + ) else context.getString(R.string.no_photo) + textViewNoPhoto.visibility = View.VISIBLE imageViewNoPhoto.visibility = View.VISIBLE imageViewDining.visibility = View.INVISIBLE diff --git a/koin/src/main/res/layout/item_dining.xml b/koin/src/main/res/layout/item_dining.xml index b6349151f..e4ad7b866 100644 --- a/koin/src/main/res/layout/item_dining.xml +++ b/koin/src/main/res/layout/item_dining.xml @@ -65,11 +65,11 @@ android:id="@+id/text_view_dining_sold_out" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginEnd="24dp" android:background="@drawable/background_dining_sold_out_text" android:gravity="center" android:minWidth="50dp" android:minHeight="26dp" - android:layout_marginEnd="24dp" android:text="@string/sold_out" android:textColor="#FFAD0D" android:textStyle="bold" @@ -82,11 +82,11 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" + android:layout_marginEnd="24dp" android:background="@drawable/background_dining_changed_text" android:gravity="center" android:minWidth="58dp" android:minHeight="26dp" - android:layout_marginEnd="24dp" android:text="@string/changed" android:textColor="#4B4B4B" android:textStyle="bold" @@ -100,13 +100,13 @@ android:layout_height="220dp" android:layout_marginHorizontal="24dp" android:layout_marginTop="16dp" - app:layout_constraintTop_toBottomOf="@id/linear_layout_dining_information" - app:layout_constraintStart_toStartOf="@id/linear_layout_dining_information" app:cardCornerRadius="10dp" app:cardElevation="0dp" + app:layout_constraintStart_toStartOf="@id/linear_layout_dining_information" + app:layout_constraintTop_toBottomOf="@id/linear_layout_dining_information" app:rippleColor="@android:color/transparent" app:strokeColor="@color/gray15" - app:strokeWidth="1dp" > + app:strokeWidth="1dp"> - - + + @@ -202,9 +203,9 @@ android:id="@+id/linear_layout_dining_menu_content" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="horizontal" - android:layout_marginTop="12dp" android:layout_marginHorizontal="24dp" + android:layout_marginTop="12dp" + android:orientation="horizontal" app:layout_constraintTop_toBottomOf="@id/card_view_dining"> + app:layout_constraintEnd_toStartOf="@id/text_view_like" + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + tools:text="3" /> @@ -284,16 +285,16 @@ android:layout_height="10dp" android:layout_marginEnd="6dp" android:background="@color/background_dark" + app:layout_constraintBottom_toBottomOf="@id/linear_layout_share" app:layout_constraintEnd_toStartOf="@id/linear_layout_share" - app:layout_constraintTop_toTopOf="@id/linear_layout_share" - app:layout_constraintBottom_toBottomOf="@id/linear_layout_share" /> + app:layout_constraintTop_toTopOf="@id/linear_layout_share" /> + android:text="@string/action_share" + android:textAlignment="gravity" /> 업데이트 날짜 : 품절된 메뉴입니다. 사진 없음 + 주말은 식단 이미지를 제공하지 않습니다. 품절 변경됨 %1$s원 From 8038ca4ac5983b3ca6bc1da0ca4605d1a0da6529 Mon Sep 17 00:00:00 2001 From: Thirfir Date: Mon, 30 Sep 2024 03:22:29 +0900 Subject: [PATCH 06/13] =?UTF-8?q?=EB=B9=88=20=EA=B2=80=EC=83=89=EC=96=B4?= =?UTF-8?q?=20=EB=A1=9C=EB=94=A9=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koin/ui/article/viewmodel/ArticleSearchViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/koin/src/main/java/in/koreatech/koin/ui/article/viewmodel/ArticleSearchViewModel.kt b/koin/src/main/java/in/koreatech/koin/ui/article/viewmodel/ArticleSearchViewModel.kt index a958f3615..1dabf1cc8 100644 --- a/koin/src/main/java/in/koreatech/koin/ui/article/viewmodel/ArticleSearchViewModel.kt +++ b/koin/src/main/java/in/koreatech/koin/ui/article/viewmodel/ArticleSearchViewModel.kt @@ -59,7 +59,6 @@ class ArticleSearchViewModel @Inject constructor( } fun search() { - _isLoading.value = true val trimmedQuery = query.value.trim() if (trimmedQuery.isEmpty()) { _searchResultUiState.tryEmit(SearchUiState.RequireInput) @@ -68,6 +67,7 @@ class ArticleSearchViewModel @Inject constructor( articleRepository.fetchSearchedArticles(trimmedQuery, 4, 1, 20) .onStart { + _isLoading.value = true _searchResultUiState.tryEmit(SearchUiState.Loading) }.onEach { if (it.articleHeaders.isEmpty()) { From 532e57a58b6bc19dabff2c38194d306662002284 Mon Sep 17 00:00:00 2001 From: Thirfir Date: Mon, 30 Sep 2024 03:24:34 +0900 Subject: [PATCH 07/13] Update v3.6.0 --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 03385784a..4c5c7b44b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,8 +7,8 @@ buildscript { } extra.apply { - set("versionName", "3.5.4") - set("versionCode", 30504) + set("versionName", "3.6.0") + set("versionCode", 30600) } dependencies { From 2bb1ebdf5b9011ef3cf6aa92321048c760646a11 Mon Sep 17 00:00:00 2001 From: Thirfir Date: Mon, 30 Sep 2024 03:48:11 +0900 Subject: [PATCH 08/13] Fix viewPager + swipeRefresh --- .../in/koreatech/koin/ui/dining/DiningActivity.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/koin/src/main/java/in/koreatech/koin/ui/dining/DiningActivity.kt b/koin/src/main/java/in/koreatech/koin/ui/dining/DiningActivity.kt index 3d70f5f7d..b8c65323c 100644 --- a/koin/src/main/java/in/koreatech/koin/ui/dining/DiningActivity.kt +++ b/koin/src/main/java/in/koreatech/koin/ui/dining/DiningActivity.kt @@ -8,6 +8,9 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.LinearLayoutManager +import androidx.viewpager.widget.ViewPager +import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback +import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator import dagger.hilt.android.AndroidEntryPoint import `in`.koreatech.koin.R @@ -46,6 +49,12 @@ class DiningActivity : KoinNavigationDrawerActivity() { private val diningOnBoardingBottomSheet by lazy { DiningNotificationOnBoardingFragment() } + private val diningPageChangeListener = object: OnPageChangeCallback() { + override fun onPageScrollStateChanged(state: Int) { + super.onPageScrollStateChanged(state) + binding.swipeRefreshLayoutDining.setEnabled(state == ViewPager.SCROLL_STATE_IDLE); + } + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -148,6 +157,7 @@ class DiningActivity : KoinNavigationDrawerActivity() { tabsDiningTime.getTabAt(it)?.text.toString() ) } + registerOnPageChangeCallback(diningPageChangeListener) } TabLayoutMediator(tabsDiningTime, diningViewPager) { tab, position -> tab.text = when (position) { @@ -229,4 +239,9 @@ class DiningActivity : KoinNavigationDrawerActivity() { onActionView() selectInitialPositions() } + + override fun onPause() { + super.onPause() + binding.diningViewPager.unregisterOnPageChangeCallback(diningPageChangeListener) + } } \ No newline at end of file From 5bc1cdb0140d306833f055fe14c6685ce50da0b3 Mon Sep 17 00:00:00 2001 From: Thirfir Date: Mon, 30 Sep 2024 15:18:10 +0900 Subject: [PATCH 09/13] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koin/data/repository/UserRepositoryImpl.kt | 2 ++ .../domain/usecase/user/UserLogoutUseCase.kt | 6 +++--- .../navigation/KoinNavigationDrawerActivity.kt | 17 +++++++++-------- .../viewmodel/KoinNavigationDrawerViewModel.kt | 2 -- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/data/src/main/java/in/koreatech/koin/data/repository/UserRepositoryImpl.kt b/data/src/main/java/in/koreatech/koin/data/repository/UserRepositoryImpl.kt index 8a52643c9..14073313c 100644 --- a/data/src/main/java/in/koreatech/koin/data/repository/UserRepositoryImpl.kt +++ b/data/src/main/java/in/koreatech/koin/data/repository/UserRepositoryImpl.kt @@ -55,6 +55,8 @@ class UserRepositoryImpl @Inject constructor( override suspend fun deleteUser() { try { userRemoteDataSource.deleteUser() + userLocalDataSource.updateUserInfo(User.Anonymous) + userLocalDataSource.updateIsLogin(false) tokenLocalDataSource.removeAccessToken() tokenLocalDataSource.removeRefreshToken() } catch (e: HttpException) { diff --git a/domain/src/main/java/in/koreatech/koin/domain/usecase/user/UserLogoutUseCase.kt b/domain/src/main/java/in/koreatech/koin/domain/usecase/user/UserLogoutUseCase.kt index 30e69a78c..fd56644a0 100644 --- a/domain/src/main/java/in/koreatech/koin/domain/usecase/user/UserLogoutUseCase.kt +++ b/domain/src/main/java/in/koreatech/koin/domain/usecase/user/UserLogoutUseCase.kt @@ -7,14 +7,14 @@ import `in`.koreatech.koin.domain.repository.UserRepository import javax.inject.Inject class UserLogoutUseCase @Inject constructor( - private val tokenRepository: TokenRepository, private val userRepository: UserRepository, - private val tokenErrorHandler: TokenErrorHandler + private val tokenErrorHandler: TokenErrorHandler, + private val deleteUserRefreshTokenUseCase: DeleteUserRefreshTokenUseCase ){ suspend operator fun invoke() : Pair { return try { userRepository.deleteDeviceToken() - tokenRepository.removeToken() + deleteUserRefreshTokenUseCase() Unit to null } catch (t: Throwable) { Unit to tokenErrorHandler.handleLogoutError(t) diff --git a/koin/src/main/java/in/koreatech/koin/ui/navigation/KoinNavigationDrawerActivity.kt b/koin/src/main/java/in/koreatech/koin/ui/navigation/KoinNavigationDrawerActivity.kt index 96b94a897..870612215 100644 --- a/koin/src/main/java/in/koreatech/koin/ui/navigation/KoinNavigationDrawerActivity.kt +++ b/koin/src/main/java/in/koreatech/koin/ui/navigation/KoinNavigationDrawerActivity.kt @@ -326,14 +326,6 @@ abstract class KoinNavigationDrawerActivity : ActivityBase(), lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { userInfoFlow.collect { user -> - when (menuState) { - MenuState.Main, MenuState.Notification -> { - if (!checkMainPermission()) requestMainPermissionLauncher.launch(MAIN_REQUIRED_PERMISSION) - koinNavigationDrawerViewModel.updateDeviceToken() - } - - else -> Unit - } when (user) { User.Anonymous -> { nameTextView.visibility = View.GONE @@ -346,6 +338,15 @@ abstract class KoinNavigationDrawerActivity : ActivityBase(), nameTextView.visibility = View.VISIBLE helloMessageTextView.text = getString(R.string.navigation_hello_message) loginOrLogoutTextView.text = getString(R.string.navigation_item_logout) + + when (menuState) { + MenuState.Main, MenuState.Notification -> { + if (!checkMainPermission()) requestMainPermissionLauncher.launch(MAIN_REQUIRED_PERMISSION) + koinNavigationDrawerViewModel.updateDeviceToken() + } + + else -> Unit + } } } } diff --git a/koin/src/main/java/in/koreatech/koin/ui/navigation/viewmodel/KoinNavigationDrawerViewModel.kt b/koin/src/main/java/in/koreatech/koin/ui/navigation/viewmodel/KoinNavigationDrawerViewModel.kt index 944bf0e3c..fafc81205 100644 --- a/koin/src/main/java/in/koreatech/koin/ui/navigation/viewmodel/KoinNavigationDrawerViewModel.kt +++ b/koin/src/main/java/in/koreatech/koin/ui/navigation/viewmodel/KoinNavigationDrawerViewModel.kt @@ -4,8 +4,6 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.viewModelScope import com.google.firebase.messaging.FirebaseMessaging import dagger.hilt.android.lifecycle.HiltViewModel -import `in`.koreatech.koin.core.analytics.EventLogger -import `in`.koreatech.koin.core.constant.AnalyticsConstant import `in`.koreatech.koin.core.viewmodel.BaseViewModel import `in`.koreatech.koin.core.viewmodel.SingleLiveEvent import `in`.koreatech.koin.domain.model.user.User From a115a6ed16b20220a25267003678394de1f6b6bc Mon Sep 17 00:00:00 2001 From: Thirfir Date: Mon, 30 Sep 2024 15:55:30 +0900 Subject: [PATCH 10/13] Fix PlayStore Library Incompatible Issue --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5ef10a60e..3bf1cab6f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -45,7 +45,7 @@ composeCompilerVersion = "1.5.10" glideVersion = "4.9.0" butterknifeVersion = "10.1.0" googleServiceVersion = "4.3.14" -composeNavigationVersion = "2.7.7" +composeNavigationVersion = "2.8.0-beta06" orbitVersion="7.0.1" hiltComposeVersion="1.0.0" markermanVersion="2.3.0" @@ -59,7 +59,7 @@ kakaoShare = "2.11.2" lottie = "6.4.0" balloon = "1.5.0" dataStore = "1.0.0" -navigation = "2.7.7" +navigation = "2.8.0-beta06" jsoup = "1.18.1" [libraries] From 78168ecd7ea30b8f0612d132d767fd0bda913957 Mon Sep 17 00:00:00 2001 From: Thirfir Date: Mon, 30 Sep 2024 22:34:29 +0900 Subject: [PATCH 11/13] Fix Incompatible play features library --- gradle/libs.versions.toml | 6 ++++-- koin/build.gradle.kts | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3bf1cab6f..0b276450c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,6 +2,7 @@ activityComposeVersion = "1.8.2" activityKtxVersion = "1.5.0" cardviewVersion = "1.0.0" +featureDeliveryKtxVersion = "2.1.0" firebaseBomVersion = "30.1.0" fragmentKtxVersion = "1.5.0" jetbrainsAnnotationsVersion = "23.0.0" @@ -45,7 +46,7 @@ composeCompilerVersion = "1.5.10" glideVersion = "4.9.0" butterknifeVersion = "10.1.0" googleServiceVersion = "4.3.14" -composeNavigationVersion = "2.8.0-beta06" +composeNavigationVersion = "2.7.7" orbitVersion="7.0.1" hiltComposeVersion="1.0.0" markermanVersion="2.3.0" @@ -59,7 +60,7 @@ kakaoShare = "2.11.2" lottie = "6.4.0" balloon = "1.5.0" dataStore = "1.0.0" -navigation = "2.8.0-beta06" +navigation = "2.7.7" jsoup = "1.18.1" [libraries] @@ -74,6 +75,7 @@ androidx-runner = { module = "androidx.test:runner", version.ref = "runnerVersio androidx-security-crypto = { module = "androidx.security:security-crypto", version.ref = "securityCryptoVersion" } activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activityComposeVersion" } +feature-delivery-ktx = { module = "com.google.android.play:feature-delivery-ktx", version.ref = "featureDeliveryKtxVersion" } napier = {module = "io.github.aakira:napier", version.ref="napier"} jetbrains-annotations = { module = "org.jetbrains:annotations", version.ref = "jetbrainsAnnotationsVersion" } diff --git a/koin/build.gradle.kts b/koin/build.gradle.kts index c304d1dcf..9a4b5f9c3 100644 --- a/koin/build.gradle.kts +++ b/koin/build.gradle.kts @@ -107,4 +107,6 @@ dependencies { implementation(libs.nav.fragment.ktx) implementation(libs.nav.ui.ktx) implementation(libs.nav.dynamic.features.fragment) + + implementation(libs.feature.delivery.ktx) } From 3c42f56bc6f957f7a6da6e76095c0097ca5767f2 Mon Sep 17 00:00:00 2001 From: Thirfir Date: Mon, 30 Sep 2024 22:47:16 +0900 Subject: [PATCH 12/13] Fix permission check --- .../in/koreatech/koin/ui/article/ArticleKeywordFragment.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/koin/src/main/java/in/koreatech/koin/ui/article/ArticleKeywordFragment.kt b/koin/src/main/java/in/koreatech/koin/ui/article/ArticleKeywordFragment.kt index ef5f88cd1..8e361c639 100644 --- a/koin/src/main/java/in/koreatech/koin/ui/article/ArticleKeywordFragment.kt +++ b/koin/src/main/java/in/koreatech/koin/ui/article/ArticleKeywordFragment.kt @@ -306,13 +306,11 @@ class ArticleKeywordFragment : Fragment() { private fun initKeywordNotification() { notificationViewModel.getPermissionInfo() - if (requireContext().checkNotificationPermission().not()) { - binding.notificationKeyword.disableAll() - } binding.notificationKeyword.setOnSwitchClickListener { isChecked -> if (requireContext().checkNotificationPermission().not()) { ToastUtil.getInstance().makeShort(R.string.request_notification_permission) + binding.notificationKeyword.isChecked = false return@setOnSwitchClickListener } From 6cf038a0625cece4d5d42c190d2ce790e385c17c Mon Sep 17 00:00:00 2001 From: Thirfir Date: Tue, 1 Oct 2024 01:31:30 +0900 Subject: [PATCH 13/13] =?UTF-8?q?Fix=20=EC=A3=BC=EB=B3=80=EC=83=81?= =?UTF-8?q?=EC=A0=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 4 +- .../koin/ui/article/ArticleKeywordFragment.kt | 6 ++ .../ui/store/activity/StoreDetailActivity.kt | 72 ++++++++----------- 3 files changed, 38 insertions(+), 44 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4c5c7b44b..78f6bbaa1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,8 +7,8 @@ buildscript { } extra.apply { - set("versionName", "3.6.0") - set("versionCode", 30600) + set("versionName", "3.6.1") + set("versionCode", 30601) } dependencies { diff --git a/koin/src/main/java/in/koreatech/koin/ui/article/ArticleKeywordFragment.kt b/koin/src/main/java/in/koreatech/koin/ui/article/ArticleKeywordFragment.kt index 8e361c639..ca74badca 100644 --- a/koin/src/main/java/in/koreatech/koin/ui/article/ArticleKeywordFragment.kt +++ b/koin/src/main/java/in/koreatech/koin/ui/article/ArticleKeywordFragment.kt @@ -129,6 +129,11 @@ class ArticleKeywordFragment : Fragment() { viewModel::deleteKeyword ) ) + binding.chipGroupSuggestionKeywords.children.forEach { chip -> + if ((chip as Chip).text == keyword) { + chipGroupSuggestionKeywords.removeView(chip) + } + } } } } @@ -152,6 +157,7 @@ class ArticleKeywordFragment : Fragment() { viewLifecycleOwner.lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.suggestedKeywords.collect { suggests -> + binding.chipGroupSuggestionKeywords.removeAllViews() suggests.forEach { keyword -> binding.run { if (chipGroupSuggestionKeywords.childCount >= ArticleKeywordViewModel.MAX_SUGGEST_KEYWORD_COUNT) diff --git a/koin/src/main/java/in/koreatech/koin/ui/store/activity/StoreDetailActivity.kt b/koin/src/main/java/in/koreatech/koin/ui/store/activity/StoreDetailActivity.kt index 5d99328fe..0e256b820 100644 --- a/koin/src/main/java/in/koreatech/koin/ui/store/activity/StoreDetailActivity.kt +++ b/koin/src/main/java/in/koreatech/koin/ui/store/activity/StoreDetailActivity.kt @@ -7,7 +7,7 @@ import android.content.ClipboardManager import android.os.Bundle import android.view.MotionEvent import android.widget.TextView -import androidx.activity.addCallback +import androidx.activity.OnBackPressedCallback import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.appcompat.app.AlertDialog @@ -19,16 +19,15 @@ import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator import `in`.koreatech.koin.R import `in`.koreatech.koin.core.analytics.EventAction -import `in`.koreatech.koin.core.analytics.EventExtra import `in`.koreatech.koin.core.analytics.EventLogger import `in`.koreatech.koin.core.appbar.AppBarBase import `in`.koreatech.koin.core.constant.AnalyticsConstant -import `in`.koreatech.koin.core.dialog.ImageZoomableDialog import `in`.koreatech.koin.core.toast.ToastUtil import `in`.koreatech.koin.core.util.dataBinding import `in`.koreatech.koin.databinding.StoreActivityDetailBinding -import `in`.koreatech.koin.ui.navigation.KoinNavigationDrawerTimeActivity +import `in`.koreatech.koin.ui.navigation.KoinNavigationDrawerActivity import `in`.koreatech.koin.ui.navigation.state.MenuState +import `in`.koreatech.koin.ui.store.adapter.StoreDetailFlyerRecyclerAdapter import `in`.koreatech.koin.ui.store.adapter.StoreDetailImageViewpagerAdapter import `in`.koreatech.koin.ui.store.adapter.StoreDetailMenuRecyclerAdapter import `in`.koreatech.koin.ui.store.adapter.StoreDetailViewpagerAdapter @@ -42,7 +41,7 @@ import `in`.koreatech.koin.util.ext.withLoading import kotlinx.coroutines.launch import kotlin.properties.Delegates -class StoreDetailActivity : KoinNavigationDrawerTimeActivity() { +class StoreDetailActivity : KoinNavigationDrawerActivity() { override val menuState = MenuState.Store private var storeCurrentTime by Delegates.notNull() private var storeElapsedTime by Delegates.notNull() @@ -74,40 +73,33 @@ class StoreDetailActivity : KoinNavigationDrawerTimeActivity() { private val callContract = registerForActivityResult(StoreCallContract()) {} private val storeMenuAdapter = StoreDetailMenuRecyclerAdapter() - - // private val storeDetailFlyerRecyclerAdapter = StoreDetailFlyerRecyclerAdapter().apply { -// setOnItemClickListener { position, _ -> -// flyerDialogFragment = StoreFlyerDialogFragment() -// flyerDialogFragment?.initialPosition = position -// flyerDialogFragment?.show(supportFragmentManager, DIALOG_TAG) -// EventLogger.logClickEvent( -// EventAction.BUSINESS, -// AnalyticsConstant.Label.SHOP_PICTURE, -// viewModel.store.value?.name ?: "Unknown" -// ) -// } -// } + private val storeDetailFlyerRecyclerAdapter = StoreDetailFlyerRecyclerAdapter().apply { + setOnItemClickListener { position, _ -> + flyerDialogFragment = StoreFlyerDialogFragment() + flyerDialogFragment?.initialPosition = position + flyerDialogFragment?.show(supportFragmentManager, DIALOG_TAG) + EventLogger.logClickEvent( + EventAction.BUSINESS, + AnalyticsConstant.Label.SHOP_PICTURE, + viewModel.store.value?.name ?: "Unknown" + ) + } + } private val storeDetailViewpagerAdapter = StoreDetailViewpagerAdapter(this) @SuppressLint("ClickableViewAccessibility") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) - onBackPressedDispatcher.addCallback(this) { - intent.putExtra(BACK_ACTION, "swipe") - intent.putExtra(ELAPSED_TIME, getElapsedTimeAndReset()) - intent.putExtra(STORE_NAME, viewModel.store.value?.name) - setResult(RESULT_OK, intent) - finish() - } - binding.koinBaseAppbar.setOnClickListener { + initViewModel() + + + binding.koinBaseAppbar.storeDetailClickListener { when (it.id) { AppBarBase.getLeftButtonId() -> { - intent.putExtra(BACK_ACTION, "click") - intent.putExtra(ELAPSED_TIME, getElapsedTimeAndReset()) - intent.putExtra(STORE_NAME, viewModel.store.value?.name) - setResult(RESULT_OK, intent) - finish() + storeElapsedTime = System.currentTimeMillis() - storeCurrentTime + isSwipeGesture = false + onBackPressed() } AppBarBase.getRightButtonId() -> { @@ -253,7 +245,6 @@ class StoreDetailActivity : KoinNavigationDrawerTimeActivity() { } - override fun onTouchEvent(event: MotionEvent?): Boolean { if (event?.action == MotionEvent.ACTION_CANCEL) { isSwipeGesture = true @@ -348,8 +339,6 @@ class StoreDetailActivity : KoinNavigationDrawerTimeActivity() { binding.storeDetailImageview.apply { adapter = StoreDetailImageViewpagerAdapter(it.imageUrls) { - ImageZoomableDialog(context, it) - .also { it.show() } EventLogger.logClickEvent( EventAction.BUSINESS, AnalyticsConstant.Label.SHOP_PICTURE, @@ -374,30 +363,29 @@ class StoreDetailActivity : KoinNavigationDrawerTimeActivity() { val category = intent.extras?.getString(StoreDetailActivityContract.CATEGORY) storeElapsedTime = System.currentTimeMillis() - storeCurrentTime currentPage = "카테고리($category)" - if (isSwipeGesture) { + if ( isSwipeGesture) { EventLogger.logSwipeEvent( EventAction.BUSINESS, AnalyticsConstant.Label.SHOP_DETAIL_VIEW_BACK, - (viewModel.store.value?.name - ?: "Unknown") + ", current_page: " + category + ", duration_time: ${storeElapsedTime / 1000}" + (viewModel.store.value?.name ?: "Unknown") + ", current_page: " + category + ", duration_time: ${storeElapsedTime / 1000}" ) - } else { + } + else{ EventLogger.logClickEvent( EventAction.BUSINESS, AnalyticsConstant.Label.SHOP_DETAIL_VIEW_BACK, - (viewModel.store.value?.name - ?: "Unknown") + ", current_page: " + category + ", duration_time: ${storeElapsedTime / 1000}" + (viewModel.store.value?.name ?: "Unknown") + ", current_page: " + category + ", duration_time: ${storeElapsedTime / 1000}" ) } - if (currentTab == 2) { + if(currentTab == 2){ reviewElapsedTime = System.currentTimeMillis() - reviewCurrentTime EventLogger.logClickEvent( EventAction.BUSINESS, AnalyticsConstant.Label.SHOP_DETAIL_VIEW_REVIEW_BACK, (viewModel.store.value?.name - ?: "Unknown") + ", previous_page: 리뷰" + ", current_page:" + currentPage + ", duration_time: ${reviewElapsedTime / 1000}" + ?: "Unknown") +", previous_page: 리뷰" +", current_page:" +currentPage+ ", duration_time: ${reviewElapsedTime / 1000}" ) } flyerDialogFragment?.dismiss()