From c72fba76626b99c3ae182ad7377b508015e53d6c Mon Sep 17 00:00:00 2001 From: HaeTi Date: Wed, 19 Jul 2023 23:07:59 +0900 Subject: [PATCH 01/10] =?UTF-8?q?#33=20/=20=EC=B4=88=EB=8C=80=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=B0=9C=EA=B8=89=20=EB=B0=9B=EA=B8=B0=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onboarding/OnBoardingRepository.kt | 2 +- .../onboarding/OnBoardingRepositoryImpl.kt | 4 ++-- .../uni/presentation/common/content/Const.kt | 1 + .../uni/presentation/invite/DdayActivity.kt | 18 ++++++++++++++---- .../uni/presentation/invite/DdayViewModel.kt | 4 ++++ .../invite/ShareInviteCodeActivity.kt | 8 ++++++++ .../res/layout/activity_share_invite_code.xml | 4 ++-- app/src/main/res/values/strings.xml | 2 +- 8 files changed, 33 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepository.kt b/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepository.kt index 53e685cb..afaa88a3 100644 --- a/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepository.kt +++ b/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepository.kt @@ -4,5 +4,5 @@ interface OnBoardingRepository { suspend fun patchNickName(nickname: String) - suspend fun postStartDate(startDate: String) + suspend fun postStartDate(startDate: String): String } diff --git a/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepositoryImpl.kt b/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepositoryImpl.kt index c89b2d2a..954d4f45 100644 --- a/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepositoryImpl.kt +++ b/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepositoryImpl.kt @@ -13,7 +13,7 @@ class OnBoardingRepositoryImpl @Inject constructor( onBoardingService.patchNickName(RequestNickNameDto(nickname)) } - override suspend fun postStartDate(startDate: String) { - onBoardingService.postStartDate(RequestStartDateDto(startDate)) + override suspend fun postStartDate(startDate: String): String { + return onBoardingService.postStartDate(RequestStartDateDto(startDate)).inviteCode } } diff --git a/app/src/main/java/sopt/uni/presentation/common/content/Const.kt b/app/src/main/java/sopt/uni/presentation/common/content/Const.kt index a26da749..16bbe2fd 100644 --- a/app/src/main/java/sopt/uni/presentation/common/content/Const.kt +++ b/app/src/main/java/sopt/uni/presentation/common/content/Const.kt @@ -1,3 +1,4 @@ package sopt.uni.presentation.common.content const val MAX_LENGTH = 10 +const val INVITECODE = "inviteCode" diff --git a/app/src/main/java/sopt/uni/presentation/invite/DdayActivity.kt b/app/src/main/java/sopt/uni/presentation/invite/DdayActivity.kt index bee52661..1a8bfbe1 100644 --- a/app/src/main/java/sopt/uni/presentation/invite/DdayActivity.kt +++ b/app/src/main/java/sopt/uni/presentation/invite/DdayActivity.kt @@ -1,15 +1,17 @@ package sopt.uni.presentation.invite +import android.content.Intent import android.os.Bundle import androidx.activity.viewModels +import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch import sopt.uni.R import sopt.uni.databinding.ActivityDDayBinding +import sopt.uni.presentation.common.content.INVITECODE import sopt.uni.util.DateUtil import sopt.uni.util.binding.BindingActivity import sopt.uni.util.extension.setOnSingleClickListener -import sopt.uni.util.extension.startActivity -import timber.log.Timber import java.util.Calendar @AndroidEntryPoint @@ -30,9 +32,17 @@ class DdayActivity : BindingActivity(R.layout.activity_d_da binding.dpDDay.dayOfMonth, ) binding.btnNext.setOnSingleClickListener { - Timber.e(formatedDate) dDayViewModel.postStartDate(formatedDate) - startActivity() + lifecycleScope.launch { + dDayViewModel.inviteCode.collect { inviteCode -> + if (inviteCode.isNotEmpty()) { + Intent(this@DdayActivity, ShareInviteCodeActivity::class.java).apply { + putExtra(INVITECODE, inviteCode) + startActivity(this) + } + } + } + } } } diff --git a/app/src/main/java/sopt/uni/presentation/invite/DdayViewModel.kt b/app/src/main/java/sopt/uni/presentation/invite/DdayViewModel.kt index 3593be19..67db4800 100644 --- a/app/src/main/java/sopt/uni/presentation/invite/DdayViewModel.kt +++ b/app/src/main/java/sopt/uni/presentation/invite/DdayViewModel.kt @@ -3,6 +3,7 @@ package sopt.uni.presentation.invite import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch import sopt.uni.data.repository.onboarding.OnBoardingRepository import timber.log.Timber @@ -13,11 +14,14 @@ class DdayViewModel @Inject constructor( private val onBoardingRepository: OnBoardingRepository, ) : ViewModel() { + var inviteCode = MutableStateFlow("") + fun postStartDate(startDate: String) { viewModelScope.launch { kotlin.runCatching { onBoardingRepository.postStartDate(startDate = startDate) }.fold({ + inviteCode = MutableStateFlow(it) Timber.d("기념일 갱신이 완료되었습니다.") }, { Timber.d("기념일 갱신이 실패했습니다.") diff --git a/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeActivity.kt b/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeActivity.kt index 85147884..5ee31206 100644 --- a/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeActivity.kt +++ b/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeActivity.kt @@ -4,8 +4,10 @@ import android.os.Bundle import dagger.hilt.android.AndroidEntryPoint import sopt.uni.R import sopt.uni.databinding.ActivityShareInviteCodeBinding +import sopt.uni.presentation.common.content.INVITECODE import sopt.uni.util.binding.BindingActivity import sopt.uni.util.extension.setOnSingleClickListener +import timber.log.Timber @AndroidEntryPoint class ShareInviteCodeActivity : @@ -15,6 +17,12 @@ class ShareInviteCodeActivity : setContentView(binding.root) moveToPrevPage() + getInviteCode() + } + + private fun getInviteCode() { + Timber.e(intent.getStringExtra(INVITECODE)) + binding.tvInviteCode.text = intent.getStringExtra(INVITECODE) } private fun moveToPrevPage() { diff --git a/app/src/main/res/layout/activity_share_invite_code.xml b/app/src/main/res/layout/activity_share_invite_code.xml index a269a6e1..a7f3b434 100644 --- a/app/src/main/res/layout/activity_share_invite_code.xml +++ b/app/src/main/res/layout/activity_share_invite_code.xml @@ -49,7 +49,7 @@ app:layout_constraintTop_toBottomOf="@id/iv_share_card" /> 나의 코드 123 456 789 새로고침 - 링크 공유하기 + 초대코드 복사하기 두 분의 기념일을 입력하세요 두 분의 시작일은 언제인가요? 초대코드를 입력하세요 From 4d7c7435d476382bd037790d905618686bea2ce8 Mon Sep 17 00:00:00 2001 From: HaeTi Date: Wed, 19 Jul 2023 23:22:25 +0900 Subject: [PATCH 02/10] =?UTF-8?q?#33=20/=20=EC=83=81=EB=8C=80=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=ED=99=95=EC=9D=B8=ED=95=98=EA=B8=B0=20UI=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_share_invite_code.xml | 10 +++++----- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/layout/activity_share_invite_code.xml b/app/src/main/res/layout/activity_share_invite_code.xml index a7f3b434..1d3925b6 100644 --- a/app/src/main/res/layout/activity_share_invite_code.xml +++ b/app/src/main/res/layout/activity_share_invite_code.xml @@ -82,15 +82,15 @@ android:layout_marginHorizontal="16dp" android:layout_marginBottom="100dp" android:background="@drawable/bg_enter_invite_code_btn" - android:drawableLeft="@drawable/ic_arrow_reset" + android:drawableStart="@drawable/ic_arrow_reset" android:drawableTint="@color/Lightblue_600" - android:paddingLeft="120dp" - android:paddingEnd="120dp" + android:gravity="center" + android:maxLines="1" + android:paddingHorizontal="100dp" android:stateListAnimator="@null" - android:text="@string/refresh" + android:text="@string/check_couple_state" android:textColor="@color/Lightblue_600" app:layout_constraintBottom_toBottomOf="parent" /> - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 45f7deb6..969be2d6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -34,7 +34,7 @@ 초대코드 공유하기 나의 코드 123 456 789 - 새로고침 + 상대 연결 확인하기 초대코드 복사하기 두 분의 기념일을 입력하세요 두 분의 시작일은 언제인가요? From d55830d74c61db862d36987275573daafcc3aefc Mon Sep 17 00:00:00 2001 From: HaeTi Date: Wed, 19 Jul 2023 23:49:52 +0900 Subject: [PATCH 03/10] =?UTF-8?q?#33=20/=20flow=20=EB=B0=A9=EC=B6=9C=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/sopt/uni/presentation/invite/DdayActivity.kt | 2 +- app/src/main/java/sopt/uni/presentation/invite/DdayViewModel.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/sopt/uni/presentation/invite/DdayActivity.kt b/app/src/main/java/sopt/uni/presentation/invite/DdayActivity.kt index 1a8bfbe1..88df6255 100644 --- a/app/src/main/java/sopt/uni/presentation/invite/DdayActivity.kt +++ b/app/src/main/java/sopt/uni/presentation/invite/DdayActivity.kt @@ -31,7 +31,7 @@ class DdayActivity : BindingActivity(R.layout.activity_d_da binding.dpDDay.year.toString() + "-" + DateUtil.formatedMonth(binding.dpDDay.month) + "-" + DateUtil.formatedDay( binding.dpDDay.dayOfMonth, ) - binding.btnNext.setOnSingleClickListener { + binding.btnNext.setOnClickListener { dDayViewModel.postStartDate(formatedDate) lifecycleScope.launch { dDayViewModel.inviteCode.collect { inviteCode -> diff --git a/app/src/main/java/sopt/uni/presentation/invite/DdayViewModel.kt b/app/src/main/java/sopt/uni/presentation/invite/DdayViewModel.kt index 67db4800..d9923414 100644 --- a/app/src/main/java/sopt/uni/presentation/invite/DdayViewModel.kt +++ b/app/src/main/java/sopt/uni/presentation/invite/DdayViewModel.kt @@ -21,7 +21,7 @@ class DdayViewModel @Inject constructor( kotlin.runCatching { onBoardingRepository.postStartDate(startDate = startDate) }.fold({ - inviteCode = MutableStateFlow(it) + inviteCode.emit(it) Timber.d("기념일 갱신이 완료되었습니다.") }, { Timber.d("기념일 갱신이 실패했습니다.") From 671c9804e0c9942c6c5c07bde9afd775bb47bcbd Mon Sep 17 00:00:00 2001 From: HaeTi Date: Thu, 20 Jul 2023 00:21:50 +0900 Subject: [PATCH 04/10] =?UTF-8?q?#33=20/=20=EC=83=81=EB=8C=80=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=ED=99=95=EC=9D=B8=ED=95=98=EA=B8=B0=20=EC=84=9C?= =?UTF-8?q?=EB=B2=84=ED=86=B5=EC=8B=A0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onboarding/OnBoardingRepository.kt | 2 ++ .../onboarding/OnBoardingRepositoryImpl.kt | 4 +++ .../uni/data/service/OnBoardingService.kt | 5 ++++ .../response/ResponseCheckConnectionDto.kt | 10 +++++++ .../uni/presentation/invite/DdayActivity.kt | 2 +- .../invite/ShareInviteCodeActivity.kt | 23 +++++++++++++++ .../invite/ShareInviteCodeViewModel.kt | 29 +++++++++++++++++++ .../res/layout/activity_share_invite_code.xml | 6 ++-- app/src/main/res/values/strings.xml | 1 + 9 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/sopt/uni/data/source/remote/response/ResponseCheckConnectionDto.kt create mode 100644 app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeViewModel.kt diff --git a/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepository.kt b/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepository.kt index afaa88a3..fd21952f 100644 --- a/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepository.kt +++ b/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepository.kt @@ -5,4 +5,6 @@ interface OnBoardingRepository { suspend fun patchNickName(nickname: String) suspend fun postStartDate(startDate: String): String + + suspend fun checkCoupleConnection(): Boolean } diff --git a/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepositoryImpl.kt b/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepositoryImpl.kt index 954d4f45..86edbfff 100644 --- a/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepositoryImpl.kt +++ b/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepositoryImpl.kt @@ -16,4 +16,8 @@ class OnBoardingRepositoryImpl @Inject constructor( override suspend fun postStartDate(startDate: String): String { return onBoardingService.postStartDate(RequestStartDateDto(startDate)).inviteCode } + + override suspend fun checkCoupleConnection(): Boolean { + return onBoardingService.checkConnection().connection + } } diff --git a/app/src/main/java/sopt/uni/data/service/OnBoardingService.kt b/app/src/main/java/sopt/uni/data/service/OnBoardingService.kt index f2ec9080..f803276a 100644 --- a/app/src/main/java/sopt/uni/data/service/OnBoardingService.kt +++ b/app/src/main/java/sopt/uni/data/service/OnBoardingService.kt @@ -1,10 +1,12 @@ package sopt.uni.data.service import retrofit2.http.Body +import retrofit2.http.GET import retrofit2.http.PATCH import retrofit2.http.POST import sopt.uni.data.source.remote.request.RequestNickNameDto import sopt.uni.data.source.remote.request.RequestStartDateDto +import sopt.uni.data.source.remote.response.ResponseCheckConnectionDto import sopt.uni.data.source.remote.response.ResponseNickNameDto import sopt.uni.data.source.remote.response.ResponseStartDateDto @@ -19,4 +21,7 @@ interface OnBoardingService { suspend fun postStartDate( @Body request: RequestStartDateDto, ): ResponseStartDateDto + + @GET("api/couple/join") + suspend fun checkConnection(): ResponseCheckConnectionDto } diff --git a/app/src/main/java/sopt/uni/data/source/remote/response/ResponseCheckConnectionDto.kt b/app/src/main/java/sopt/uni/data/source/remote/response/ResponseCheckConnectionDto.kt new file mode 100644 index 00000000..f7ae704f --- /dev/null +++ b/app/src/main/java/sopt/uni/data/source/remote/response/ResponseCheckConnectionDto.kt @@ -0,0 +1,10 @@ +package sopt.uni.data.source.remote.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseCheckConnectionDto( + @SerialName("connection") + val connection: Boolean, +) diff --git a/app/src/main/java/sopt/uni/presentation/invite/DdayActivity.kt b/app/src/main/java/sopt/uni/presentation/invite/DdayActivity.kt index 88df6255..1a8bfbe1 100644 --- a/app/src/main/java/sopt/uni/presentation/invite/DdayActivity.kt +++ b/app/src/main/java/sopt/uni/presentation/invite/DdayActivity.kt @@ -31,7 +31,7 @@ class DdayActivity : BindingActivity(R.layout.activity_d_da binding.dpDDay.year.toString() + "-" + DateUtil.formatedMonth(binding.dpDDay.month) + "-" + DateUtil.formatedDay( binding.dpDDay.dayOfMonth, ) - binding.btnNext.setOnClickListener { + binding.btnNext.setOnSingleClickListener { dDayViewModel.postStartDate(formatedDate) lifecycleScope.launch { dDayViewModel.inviteCode.collect { inviteCode -> diff --git a/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeActivity.kt b/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeActivity.kt index 5ee31206..d05ebe70 100644 --- a/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeActivity.kt +++ b/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeActivity.kt @@ -1,23 +1,31 @@ package sopt.uni.presentation.invite import android.os.Bundle +import androidx.activity.viewModels +import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch import sopt.uni.R import sopt.uni.databinding.ActivityShareInviteCodeBinding import sopt.uni.presentation.common.content.INVITECODE +import sopt.uni.presentation.home.HomeActivity import sopt.uni.util.binding.BindingActivity import sopt.uni.util.extension.setOnSingleClickListener +import sopt.uni.util.extension.showSnackbar +import sopt.uni.util.extension.startActivity import timber.log.Timber @AndroidEntryPoint class ShareInviteCodeActivity : BindingActivity(R.layout.activity_share_invite_code) { + private val shareInviteCodeViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) moveToPrevPage() getInviteCode() + checkCoupleConnection() } private fun getInviteCode() { @@ -30,4 +38,19 @@ class ShareInviteCodeActivity : finish() } } + + private fun checkCoupleConnection() { + binding.btnCheckConnection.setOnSingleClickListener { + shareInviteCodeViewModel.checkCoupleConnection() + lifecycleScope.launch { + shareInviteCodeViewModel.isConnected.collect { isConnected -> + if (isConnected) { + startActivity() + } else { + showSnackbar(binding.root, getString(R.string.cannot_connect)) + } + } + } + } + } } diff --git a/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeViewModel.kt b/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeViewModel.kt new file mode 100644 index 00000000..fb0017e4 --- /dev/null +++ b/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeViewModel.kt @@ -0,0 +1,29 @@ +package sopt.uni.presentation.invite + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.launch +import sopt.uni.data.repository.onboarding.OnBoardingRepository +import timber.log.Timber +import javax.inject.Inject + +@HiltViewModel +class ShareInviteCodeViewModel @Inject constructor( + private val onBoardingRepository: OnBoardingRepository, +) : ViewModel() { + val isConnected = MutableStateFlow(false) + + fun checkCoupleConnection() { + viewModelScope.launch { + kotlin.runCatching { + onBoardingRepository.checkCoupleConnection() + }.fold({ + isConnected.emit(it) + }, { + Timber.d(it) + }) + } + } +} diff --git a/app/src/main/res/layout/activity_share_invite_code.xml b/app/src/main/res/layout/activity_share_invite_code.xml index 1d3925b6..dfc77541 100644 --- a/app/src/main/res/layout/activity_share_invite_code.xml +++ b/app/src/main/res/layout/activity_share_invite_code.xml @@ -61,7 +61,7 @@ app:layout_constraintTop_toBottomOf="@id/tv_my_code" /> 승부를 이대로 중단하시나요? 소모된 하트는 다시 돌아오지 않아요 글자수를 초과했어요 + 상대가 아직 연결되지 않았어요 From f8d845f0457160ee98b9a3d28c731281c328bec0 Mon Sep 17 00:00:00 2001 From: HaeTi Date: Thu, 20 Jul 2023 00:36:31 +0900 Subject: [PATCH 05/10] =?UTF-8?q?#33=20/=20=EC=B4=88=EB=8C=80=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EA=B3=B5=EC=9C=A0=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../invite/ShareInviteCodeActivity.kt | 15 +++++++++++++++ .../res/layout/activity_share_invite_code.xml | 2 +- app/src/main/res/values/strings.xml | 1 - 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeActivity.kt b/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeActivity.kt index d05ebe70..ca7715ce 100644 --- a/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeActivity.kt +++ b/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeActivity.kt @@ -1,5 +1,6 @@ package sopt.uni.presentation.invite +import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.lifecycle.lifecycleScope @@ -26,6 +27,7 @@ class ShareInviteCodeActivity : moveToPrevPage() getInviteCode() checkCoupleConnection() + copyInviteCode() } private fun getInviteCode() { @@ -53,4 +55,17 @@ class ShareInviteCodeActivity : } } } + + private fun copyInviteCode() { + binding.btnCopyInviteCode.setOnSingleClickListener { + val sendIntent: Intent = Intent().apply { + action = Intent.ACTION_SEND + putExtra(Intent.EXTRA_TEXT, binding.tvInviteCode.text.toString()) + type = "text/plain" + } + + val shareIntent = Intent.createChooser(sendIntent, null) + startActivity(shareIntent) + } + } } diff --git a/app/src/main/res/layout/activity_share_invite_code.xml b/app/src/main/res/layout/activity_share_invite_code.xml index dfc77541..a051552d 100644 --- a/app/src/main/res/layout/activity_share_invite_code.xml +++ b/app/src/main/res/layout/activity_share_invite_code.xml @@ -68,7 +68,7 @@ android:layout_margin="16dp" android:background="@drawable/bg_nickname_btn" android:stateListAnimator="@null" - android:text="@string/copy_invite_code" + android:text="@string/share_invite_code" android:textColor="@color/white" app:layout_constraintBottom_toTopOf="@id/btn_check_connection" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 67260e2a..dc1e5606 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -35,7 +35,6 @@ 나의 코드 123 456 789 상대 연결 확인하기 - 초대코드 복사하기 두 분의 기념일을 입력하세요 두 분의 시작일은 언제인가요? 초대코드를 입력하세요 From f28e15c22b0ce0691aa0d7d4edd0cf10b448366f Mon Sep 17 00:00:00 2001 From: HaeTi Date: Thu, 20 Jul 2023 00:47:43 +0900 Subject: [PATCH 06/10] =?UTF-8?q?#33=20/=20=EC=B4=88=EB=8C=80=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=ED=9E=8C=ED=8A=B8=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/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dc1e5606..7cbdfc8e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -89,7 +89,7 @@ 카카오 로그인 Google계정으로 로그인 - 000-000-000 + ag14f0hkl user profile 커플 스코어 승부 히스토리 From c5482db360946e506af93397d5f2160ee2756969 Mon Sep 17 00:00:00 2001 From: HaeTi Date: Thu, 20 Jul 2023 02:01:42 +0900 Subject: [PATCH 07/10] =?UTF-8?q?#33=20/=20=EC=97=B0=EA=B2=B0=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EC=95=88=EA=B0=80=EB=A6=AC?= =?UTF-8?q?=EA=B2=8C=20=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 949e73ce..3ac7412c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -59,8 +59,8 @@ android:name=".presentation.wish.WishActivity" android:exported="true" android:screenOrientation="portrait" - android:windowSoftInputMode="adjustPan" - android:theme="@style/Theme.UNIAOS.GrayStatusBar"/> + android:theme="@style/Theme.UNIAOS.GrayStatusBar" + android:windowSoftInputMode="adjustPan" /> + android:screenOrientation="portrait" + android:windowSoftInputMode="adjustResize" /> - + android:screenOrientation="portrait" /> Date: Thu, 20 Jul 2023 03:13:08 +0900 Subject: [PATCH 08/10] =?UTF-8?q?#33=20/=20=EC=83=81=EB=8C=80=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=ED=99=95=EC=9D=B8=ED=95=98=EA=B8=B0=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EB=94=94=EC=9E=90=EC=9D=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/layout/activity_share_invite_code.xml | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/app/src/main/res/layout/activity_share_invite_code.xml b/app/src/main/res/layout/activity_share_invite_code.xml index a051552d..8ecb6f17 100644 --- a/app/src/main/res/layout/activity_share_invite_code.xml +++ b/app/src/main/res/layout/activity_share_invite_code.xml @@ -70,27 +70,41 @@ android:stateListAnimator="@null" android:text="@string/share_invite_code" android:textColor="@color/white" - app:layout_constraintBottom_toTopOf="@id/btn_check_connection" + app:layout_constraintBottom_toTopOf="@id/ll_check_connection" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> - + android:orientation="horizontal" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent"> + + + + + + \ No newline at end of file From b4f27a6dc1a9f8e4fe410602b550e695a3997e0e Mon Sep 17 00:00:00 2001 From: HaeTi Date: Thu, 20 Jul 2023 03:13:45 +0900 Subject: [PATCH 09/10] =?UTF-8?q?#33=20/=20=EC=83=81=EB=8C=80=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=ED=99=95=EC=9D=B8=ED=95=98=EA=B8=B0=20=EC=84=9C?= =?UTF-8?q?=EB=B2=84=ED=86=B5=EC=8B=A0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onboarding/OnBoardingRepository.kt | 4 ++ .../onboarding/OnBoardingRepositoryImpl.kt | 6 +++ .../uni/data/service/OnBoardingService.kt | 7 ++++ .../request/RequestPostCheckConnectionDto.kt | 11 +++++ .../invite/EnterInviteCodeActivity.kt | 41 ++++++++++++++++++- .../invite/EnterInviteCodeViewModel.kt | 33 +++++++++++++++ .../invite/ShareInviteCodeActivity.kt | 3 +- .../res/layout/activity_enter_invite_code.xml | 17 ++++++++ 8 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/sopt/uni/data/source/remote/request/RequestPostCheckConnectionDto.kt create mode 100644 app/src/main/java/sopt/uni/presentation/invite/EnterInviteCodeViewModel.kt diff --git a/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepository.kt b/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepository.kt index fd21952f..450e8224 100644 --- a/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepository.kt +++ b/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepository.kt @@ -1,5 +1,7 @@ package sopt.uni.data.repository.onboarding +import retrofit2.Response + interface OnBoardingRepository { suspend fun patchNickName(nickname: String) @@ -7,4 +9,6 @@ interface OnBoardingRepository { suspend fun postStartDate(startDate: String): String suspend fun checkCoupleConnection(): Boolean + + suspend fun postCheckConnection(inviteCode: String): Response } diff --git a/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepositoryImpl.kt b/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepositoryImpl.kt index 86edbfff..e57d6474 100644 --- a/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepositoryImpl.kt +++ b/app/src/main/java/sopt/uni/data/repository/onboarding/OnBoardingRepositoryImpl.kt @@ -1,7 +1,9 @@ package sopt.uni.data.repository.onboarding +import retrofit2.Response import sopt.uni.data.service.OnBoardingService import sopt.uni.data.source.remote.request.RequestNickNameDto +import sopt.uni.data.source.remote.request.RequestPostCheckConnectionDto import sopt.uni.data.source.remote.request.RequestStartDateDto import javax.inject.Inject @@ -20,4 +22,8 @@ class OnBoardingRepositoryImpl @Inject constructor( override suspend fun checkCoupleConnection(): Boolean { return onBoardingService.checkConnection().connection } + + override suspend fun postCheckConnection(inviteCode: String): Response { + return onBoardingService.postCheckConnection(RequestPostCheckConnectionDto(inviteCode)) + } } diff --git a/app/src/main/java/sopt/uni/data/service/OnBoardingService.kt b/app/src/main/java/sopt/uni/data/service/OnBoardingService.kt index f803276a..67985488 100644 --- a/app/src/main/java/sopt/uni/data/service/OnBoardingService.kt +++ b/app/src/main/java/sopt/uni/data/service/OnBoardingService.kt @@ -1,10 +1,12 @@ package sopt.uni.data.service +import retrofit2.Response import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.PATCH import retrofit2.http.POST import sopt.uni.data.source.remote.request.RequestNickNameDto +import sopt.uni.data.source.remote.request.RequestPostCheckConnectionDto import sopt.uni.data.source.remote.request.RequestStartDateDto import sopt.uni.data.source.remote.response.ResponseCheckConnectionDto import sopt.uni.data.source.remote.response.ResponseNickNameDto @@ -24,4 +26,9 @@ interface OnBoardingService { @GET("api/couple/join") suspend fun checkConnection(): ResponseCheckConnectionDto + + @POST("api/couple/join") + suspend fun postCheckConnection( + @Body request: RequestPostCheckConnectionDto, + ): Response } diff --git a/app/src/main/java/sopt/uni/data/source/remote/request/RequestPostCheckConnectionDto.kt b/app/src/main/java/sopt/uni/data/source/remote/request/RequestPostCheckConnectionDto.kt new file mode 100644 index 00000000..16e9cefa --- /dev/null +++ b/app/src/main/java/sopt/uni/data/source/remote/request/RequestPostCheckConnectionDto.kt @@ -0,0 +1,11 @@ +package sopt.uni.data.source.remote.request + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class RequestPostCheckConnectionDto( + @SerialName + ("inviteCode") + val inviteCode: String, +) diff --git a/app/src/main/java/sopt/uni/presentation/invite/EnterInviteCodeActivity.kt b/app/src/main/java/sopt/uni/presentation/invite/EnterInviteCodeActivity.kt index c47e021d..42e5ae6b 100644 --- a/app/src/main/java/sopt/uni/presentation/invite/EnterInviteCodeActivity.kt +++ b/app/src/main/java/sopt/uni/presentation/invite/EnterInviteCodeActivity.kt @@ -1,20 +1,29 @@ package sopt.uni.presentation.invite import android.os.Bundle +import android.view.View +import androidx.activity.viewModels +import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch import sopt.uni.R import sopt.uni.databinding.ActivityEnterInviteCodeBinding +import sopt.uni.presentation.home.HomeActivity import sopt.uni.util.binding.BindingActivity import sopt.uni.util.extension.setOnSingleClickListener +import sopt.uni.util.extension.showToast +import sopt.uni.util.extension.startActivity @AndroidEntryPoint class EnterInviteCodeActivity : BindingActivity(R.layout.activity_enter_invite_code) { + private val enterInviteCodeViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(binding.root) - + binding.viewModel = enterInviteCodeViewModel moveToPrevPage() + checkInviteCode() + changeBoxStrokeColor() } private fun moveToPrevPage() { @@ -22,4 +31,32 @@ class EnterInviteCodeActivity : finish() } } + + private fun changeBoxStrokeColor() { + if (binding.etInviteCode.text.isNotBlank()) { + binding.etInviteCode.background = getDrawable(R.drawable.bg_mypage_edit_text) + } + } + + private fun checkInviteCode() { + binding.btnConnect.setOnSingleClickListener { + enterInviteCodeViewModel.checkCoupleConnection() + lifecycleScope.launch { + enterInviteCodeViewModel.connectState.collect { responseCode -> + if (responseCode == "204") { + this@EnterInviteCodeActivity.showToast("커플 연결에 성공했습니다") + binding.etInviteCode.background = + getDrawable(R.drawable.bg_mypage_edit_text) + binding.tvInviteCodeErrorMessage.visibility = View.INVISIBLE + startActivity() + finishAffinity() + } else { + binding.etInviteCode.background = + getDrawable(R.drawable.bg_mypage_edit_text_error) + binding.tvInviteCodeErrorMessage.visibility = View.VISIBLE + } + } + } + } + } } diff --git a/app/src/main/java/sopt/uni/presentation/invite/EnterInviteCodeViewModel.kt b/app/src/main/java/sopt/uni/presentation/invite/EnterInviteCodeViewModel.kt new file mode 100644 index 00000000..730140db --- /dev/null +++ b/app/src/main/java/sopt/uni/presentation/invite/EnterInviteCodeViewModel.kt @@ -0,0 +1,33 @@ +package sopt.uni.presentation.invite + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.launch +import sopt.uni.data.repository.onboarding.OnBoardingRepository +import timber.log.Timber +import javax.inject.Inject + +@HiltViewModel +class EnterInviteCodeViewModel @Inject constructor( + private val onBoardingRepository: OnBoardingRepository, +) : ViewModel() { + + val inviteCode = MutableStateFlow("") + val connectState = MutableStateFlow("") + + fun checkCoupleConnection() { + viewModelScope.launch { + kotlin.runCatching { + Timber.d("invite = ${inviteCode.value}") + onBoardingRepository.postCheckConnection(inviteCode = inviteCode.value) + }.fold({ + connectState.emit(it.code().toString()) + Timber.d("커플 연결 통신에 성공했습니다. code = ${it.code()}") + }, { + Timber.d(it) + }) + } + } +} diff --git a/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeActivity.kt b/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeActivity.kt index ca7715ce..2b5a5038 100644 --- a/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeActivity.kt +++ b/app/src/main/java/sopt/uni/presentation/invite/ShareInviteCodeActivity.kt @@ -42,12 +42,13 @@ class ShareInviteCodeActivity : } private fun checkCoupleConnection() { - binding.btnCheckConnection.setOnSingleClickListener { + binding.llCheckConnection.setOnSingleClickListener { shareInviteCodeViewModel.checkCoupleConnection() lifecycleScope.launch { shareInviteCodeViewModel.isConnected.collect { isConnected -> if (isConnected) { startActivity() + finishAffinity() } else { showSnackbar(binding.root, getString(R.string.cannot_connect)) } diff --git a/app/src/main/res/layout/activity_enter_invite_code.xml b/app/src/main/res/layout/activity_enter_invite_code.xml index d70ca7c8..e2f5b005 100644 --- a/app/src/main/res/layout/activity_enter_invite_code.xml +++ b/app/src/main/res/layout/activity_enter_invite_code.xml @@ -4,6 +4,10 @@ + + + + Date: Thu, 20 Jul 2023 05:04:15 +0900 Subject: [PATCH 10/10] =?UTF-8?q?#33=20/=20=EC=BD=94=EB=93=9C=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../source/remote/request/RequestPostCheckConnectionDto.kt | 3 +-- .../sopt/uni/presentation/invite/EnterInviteCodeActivity.kt | 5 ++--- .../sopt/uni/presentation/invite/EnterInviteCodeViewModel.kt | 1 - app/src/main/res/layout/activity_enter_invite_code.xml | 2 +- app/src/main/res/values/strings.xml | 2 ++ 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/sopt/uni/data/source/remote/request/RequestPostCheckConnectionDto.kt b/app/src/main/java/sopt/uni/data/source/remote/request/RequestPostCheckConnectionDto.kt index 16e9cefa..40348923 100644 --- a/app/src/main/java/sopt/uni/data/source/remote/request/RequestPostCheckConnectionDto.kt +++ b/app/src/main/java/sopt/uni/data/source/remote/request/RequestPostCheckConnectionDto.kt @@ -5,7 +5,6 @@ import kotlinx.serialization.Serializable @Serializable data class RequestPostCheckConnectionDto( - @SerialName - ("inviteCode") + @SerialName("inviteCode") val inviteCode: String, ) diff --git a/app/src/main/java/sopt/uni/presentation/invite/EnterInviteCodeActivity.kt b/app/src/main/java/sopt/uni/presentation/invite/EnterInviteCodeActivity.kt index 42e5ae6b..e8f60d2f 100644 --- a/app/src/main/java/sopt/uni/presentation/invite/EnterInviteCodeActivity.kt +++ b/app/src/main/java/sopt/uni/presentation/invite/EnterInviteCodeActivity.kt @@ -44,9 +44,8 @@ class EnterInviteCodeActivity : lifecycleScope.launch { enterInviteCodeViewModel.connectState.collect { responseCode -> if (responseCode == "204") { - this@EnterInviteCodeActivity.showToast("커플 연결에 성공했습니다") - binding.etInviteCode.background = - getDrawable(R.drawable.bg_mypage_edit_text) + this@EnterInviteCodeActivity.showToast(getString(R.string.couple_connect_success)) + binding.etInviteCode.background = getDrawable(R.drawable.bg_mypage_edit_text) binding.tvInviteCodeErrorMessage.visibility = View.INVISIBLE startActivity() finishAffinity() diff --git a/app/src/main/java/sopt/uni/presentation/invite/EnterInviteCodeViewModel.kt b/app/src/main/java/sopt/uni/presentation/invite/EnterInviteCodeViewModel.kt index 730140db..318dcf99 100644 --- a/app/src/main/java/sopt/uni/presentation/invite/EnterInviteCodeViewModel.kt +++ b/app/src/main/java/sopt/uni/presentation/invite/EnterInviteCodeViewModel.kt @@ -24,7 +24,6 @@ class EnterInviteCodeViewModel @Inject constructor( onBoardingRepository.postCheckConnection(inviteCode = inviteCode.value) }.fold({ connectState.emit(it.code().toString()) - Timber.d("커플 연결 통신에 성공했습니다. code = ${it.code()}") }, { Timber.d(it) }) diff --git a/app/src/main/res/layout/activity_enter_invite_code.xml b/app/src/main/res/layout/activity_enter_invite_code.xml index e2f5b005..fb49376d 100644 --- a/app/src/main/res/layout/activity_enter_invite_code.xml +++ b/app/src/main/res/layout/activity_enter_invite_code.xml @@ -59,7 +59,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="4dp" - android:text="입력하신 코드 정보를 찾을 수 없어요" + android:text="@string/cannot_find_code_information" android:textColor="@color/Red_500" android:visibility="invisible" app:layout_constraintStart_toStartOf="@id/et_invite_code" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7cbdfc8e..1294d174 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -197,5 +197,7 @@ 소모된 하트는 다시 돌아오지 않아요 글자수를 초과했어요 상대가 아직 연결되지 않았어요 + 커플 연결에 성공했습니다 + 입력하신 코드 정보를 찾을 수 없어요