diff --git a/presentation/src/main/java/com/going/presentation/dashboard/DashBoardActivity.kt b/presentation/src/main/java/com/going/presentation/dashboard/DashBoardActivity.kt index 9395441b..a6ca2e91 100644 --- a/presentation/src/main/java/com/going/presentation/dashboard/DashBoardActivity.kt +++ b/presentation/src/main/java/com/going/presentation/dashboard/DashBoardActivity.kt @@ -31,12 +31,17 @@ class DashBoardActivity : checkIsFirstEntered() setTabLayout() setViewPager() - setTravelerName() initSettingBtnClickListener() initCreateTripBtnClickListener() initOnBackPressedListener(binding.root) } + override fun onResume() { + super.onResume() + + setTravelerName() + } + private fun checkIsFirstEntered() { if (intent.getBooleanExtra(IS_FIRST_ENTERED, false)) { val tripId = intent.getLongExtra(TRIP_ID, 0) diff --git a/presentation/src/main/java/com/going/presentation/profile/participant/profiletag/changetag/ChangeTagActivity.kt b/presentation/src/main/java/com/going/presentation/profile/participant/profiletag/changetag/ChangeTagActivity.kt index e2589c74..a1e31ede 100644 --- a/presentation/src/main/java/com/going/presentation/profile/participant/profiletag/changetag/ChangeTagActivity.kt +++ b/presentation/src/main/java/com/going/presentation/profile/participant/profiletag/changetag/ChangeTagActivity.kt @@ -28,13 +28,13 @@ class ChangeTagActivity : private var _adapter: ChangeTagAdapter? = null private val adapter get() = requireNotNull(_adapter) { getString(R.string.adapter_not_initialized_error_msg) } - private val preferenceAnswers = MutableList(5) { 0 } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) initAdapter() + setTripId() initPreferenceList() + observeIsButtonValid() initItemDecoration() initChangeClickListener() initBackClickListener() @@ -46,6 +46,10 @@ class ChangeTagActivity : binding.rvChangeTag.adapter = adapter } + private fun setTripId() { + tagViewModel.tripId = intent.getLongExtra(TRIP_ID, 0) + } + private fun initPreferenceList() { if (intent != null) { val styleA = intent.getIntExtra(STYLE_A, 0) @@ -64,34 +68,28 @@ class ChangeTagActivity : ) ) - preferenceAnswers[0] = styleA - preferenceAnswers[1] = styleB - preferenceAnswers[2] = styleC - preferenceAnswers[3] = styleD - preferenceAnswers[4] = styleE + tagViewModel.setDefaultPreference(styleA, styleB, styleC, styleD, styleE) } } private fun preferenceTagClickListener(item: ProfilePreferenceData, checkedIndex: Int) { - preferenceAnswers[item.number.toInt() - 1] = checkedIndex - setButtonValid() - sendPreferenceInfo() - } - - private fun setButtonValid() { - binding.btnChangeStart.isEnabled = true - binding.btnChangeStart.setTextColor( - colorOf(R.color.white_000) - ) + tagViewModel.checkIsPreferenceChange(item.number.toInt(), checkedIndex) } - private fun sendPreferenceInfo() { - tagViewModel.tripId = intent.getLongExtra(TRIP_ID, 0) - tagViewModel.styleA.value = preferenceAnswers[0] - tagViewModel.styleB.value = preferenceAnswers[1] - tagViewModel.styleC.value = preferenceAnswers[2] - tagViewModel.styleD.value = preferenceAnswers[3] - tagViewModel.styleE.value = preferenceAnswers[4] + private fun observeIsButtonValid() { + tagViewModel.isButtonValid.flowWithLifecycle(lifecycle).onEach { state -> + if (state) { + binding.btnChangeStart.isEnabled = true + binding.btnChangeStart.setTextColor( + colorOf(R.color.white_000) + ) + } else { + binding.btnChangeStart.isEnabled = false + binding.btnChangeStart.setTextColor( + colorOf(R.color.gray_200) + ) + } + }.launchIn(lifecycleScope) } private fun initItemDecoration() { diff --git a/presentation/src/main/java/com/going/presentation/profile/participant/profiletag/changetag/ChangeTagViewModel.kt b/presentation/src/main/java/com/going/presentation/profile/participant/profiletag/changetag/ChangeTagViewModel.kt index c3ba95c6..053bcd43 100644 --- a/presentation/src/main/java/com/going/presentation/profile/participant/profiletag/changetag/ChangeTagViewModel.kt +++ b/presentation/src/main/java/com/going/presentation/profile/participant/profiletag/changetag/ChangeTagViewModel.kt @@ -1,6 +1,5 @@ package com.going.presentation.profile.participant.profiletag.changetag -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.going.domain.entity.ProfilePreferenceData @@ -8,7 +7,9 @@ import com.going.domain.entity.request.PreferenceChangeRequestModel import com.going.domain.repository.ProfileRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch import javax.inject.Inject @@ -20,24 +21,91 @@ class ChangeTagViewModel @Inject constructor( private val _preferencePatchState = MutableSharedFlow() val preferencePatchState: SharedFlow = _preferencePatchState + private val _isButtonValid = MutableStateFlow(false) + val isButtonValid: StateFlow = _isButtonValid + var tripId: Long = 0 - val styleA = MutableLiveData(0) - val styleB = MutableLiveData(0) - val styleC = MutableLiveData(0) - val styleD = MutableLiveData(0) - val styleE = MutableLiveData(0) + private var defaultStyleA: Int? = 0 + private var defaultStyleB: Int? = 0 + private var defaultStyleC: Int? = 0 + private var defaultStyleD: Int? = 0 + private var defaultStyleE: Int? = 0 + + private var styleA: Int? = 0 + private var styleB: Int? = 0 + private var styleC: Int? = 0 + private var styleD: Int? = 0 + private var styleE: Int? = 0 + + private var isStyleAChanged: Boolean = false + private var isStyleBChanged: Boolean = false + private var isStyleCChanged: Boolean = false + private var isStyleDChanged: Boolean = false + private var isStyleEChanged: Boolean = false + + fun setDefaultPreference(styleA: Int, styleB: Int, styleC: Int, styleD: Int, styleE: Int) { + defaultStyleA = styleA + this.styleA = styleA + + defaultStyleB = styleB + this.styleB = styleB + + defaultStyleC = styleC + this.styleC = styleC + + defaultStyleD = styleD + this.styleD = styleD + + defaultStyleE = styleE + this.styleE = styleE + } + + fun checkIsPreferenceChange(number: Int, index: Int) { + when (number) { + 1 -> { + styleA = index + isStyleAChanged = index != defaultStyleA + } + + 2 -> { + styleB = index + isStyleBChanged = index != defaultStyleB + } + + 3 -> { + styleC = index + isStyleCChanged = index != defaultStyleC + } + + 4 -> { + styleD = index + isStyleDChanged = index != defaultStyleD + } + + 5 -> { + styleE = index + isStyleEChanged = index != defaultStyleE + } + } + checkIsButtonValid() + } + + private fun checkIsButtonValid() { + _isButtonValid.value = + isStyleAChanged || isStyleBChanged || isStyleCChanged || isStyleDChanged || isStyleEChanged + } fun patchPreferenceTagToServer() { viewModelScope.launch { profileRepository.patchPreferenceTag( tripId, PreferenceChangeRequestModel( - styleA.value ?: 0, - styleB.value ?: 0, - styleC.value ?: 0, - styleD.value ?: 0, - styleE.value ?: 0 + styleA ?: 0, + styleB ?: 0, + styleC ?: 0, + styleD ?: 0, + styleE ?: 0 ) ) .onSuccess { diff --git a/presentation/src/main/java/com/going/presentation/todo/ourtodo/OurTodoFragment.kt b/presentation/src/main/java/com/going/presentation/todo/ourtodo/OurTodoFragment.kt index b6528e88..3fd6b29c 100644 --- a/presentation/src/main/java/com/going/presentation/todo/ourtodo/OurTodoFragment.kt +++ b/presentation/src/main/java/com/going/presentation/todo/ourtodo/OurTodoFragment.kt @@ -135,7 +135,8 @@ class OurTodoFragment() : BaseFragment(R.layout.fragment binding.btnOurTripFriend.setOnSingleClickListener { CheckFriendsActivity.createIntent( requireContext(), - viewModel.tripId + viewModel.tripId, + viewModel.inviteCode ).apply { startActivity(this) } } } diff --git a/presentation/src/main/java/com/going/presentation/todo/ourtodo/checkfriends/CheckFriendsActivity.kt b/presentation/src/main/java/com/going/presentation/todo/ourtodo/checkfriends/CheckFriendsActivity.kt index eef8a08e..9cdad3a8 100644 --- a/presentation/src/main/java/com/going/presentation/todo/ourtodo/checkfriends/CheckFriendsActivity.kt +++ b/presentation/src/main/java/com/going/presentation/todo/ourtodo/checkfriends/CheckFriendsActivity.kt @@ -7,6 +7,7 @@ import android.text.SpannableStringBuilder import android.text.Spanned import android.text.style.ForegroundColorSpan import androidx.activity.viewModels +import androidx.core.view.isVisible import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import com.going.domain.entity.response.CheckFriendsModel @@ -14,6 +15,7 @@ import com.going.presentation.R import com.going.presentation.databinding.ActivityCheckFriendsBinding import com.going.presentation.profile.participant.ParticipantProfileActivity import com.going.presentation.todo.TodoActivity.Companion.EXTRA_TRIP_ID +import com.going.presentation.todo.ourtodo.invite.FriendInviteEmptyDialog import com.going.ui.base.BaseActivity import com.going.ui.extension.colorOf import com.going.ui.extension.setOnSingleClickListener @@ -33,6 +35,8 @@ class CheckFriendsActivity : private val viewModel by viewModels() + private var friendInviteDialog: FriendInviteEmptyDialog? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -84,11 +88,28 @@ class CheckFriendsActivity : } private fun setFriendsData(data: CheckFriendsModel) { - adapter.submitList(data.participants) + if (data.participants.size == 1) { + binding.layoutCheckFriendsEmpty.isVisible = true + setInviteCode() + initInviteBtnListener() + } else { + binding.svCheckFriends.isVisible = true + adapter.submitList(data.participants) + setProgressBarStatus(data.styles.map { it.rates }) + setCountStatus(data.styles.map { it.counts }) + setResultTextColor(data.bestPrefer) + } + } - setProgressBarStatus(data.styles.map { it.rates }) - setCountStatus(data.styles.map { it.counts }) - setResultTextColor(data.bestPrefer) + private fun setInviteCode() { + viewModel.inviteCode = intent.getStringExtra(INVITE_CODE) + } + + private fun initInviteBtnListener() { + binding.btnCheckFriendsInvite.setOnSingleClickListener { + friendInviteDialog = FriendInviteEmptyDialog() + friendInviteDialog?.show(supportFragmentManager, INVITE_DIALOG) + } } private fun setProgressBarStatus(rates: List>) { @@ -203,17 +224,22 @@ class CheckFriendsActivity : override fun onDestroy() { super.onDestroy() _adapter = null + if (friendInviteDialog?.isAdded == true) friendInviteDialog?.dismiss() } companion object { private const val TRIP_ID = "TRIP_ID" + private const val INVITE_CODE = "INVITE_CODE" + private const val INVITE_DIALOG = "INVITE_DIALOG" @JvmStatic fun createIntent( context: Context, - tripId: Long + tripId: Long, + inviteCode: String ): Intent = Intent(context, CheckFriendsActivity::class.java).apply { putExtra(TRIP_ID, tripId) + putExtra(INVITE_CODE, inviteCode) } } diff --git a/presentation/src/main/java/com/going/presentation/todo/ourtodo/checkfriends/CheckFriendsViewModel.kt b/presentation/src/main/java/com/going/presentation/todo/ourtodo/checkfriends/CheckFriendsViewModel.kt index f2f01568..5f311316 100644 --- a/presentation/src/main/java/com/going/presentation/todo/ourtodo/checkfriends/CheckFriendsViewModel.kt +++ b/presentation/src/main/java/com/going/presentation/todo/ourtodo/checkfriends/CheckFriendsViewModel.kt @@ -19,6 +19,8 @@ class CheckFriendsViewModel @Inject constructor( private val _checkFriendsListState = MutableStateFlow>(UiState.Empty) val checkFriendsListState: StateFlow> get() = _checkFriendsListState + var inviteCode: String? = "" + fun getFriendsListFromServer( tripId: Long ) { diff --git a/presentation/src/main/java/com/going/presentation/todo/ourtodo/invite/FriendInviteEmptyDialog.kt b/presentation/src/main/java/com/going/presentation/todo/ourtodo/invite/FriendInviteEmptyDialog.kt new file mode 100644 index 00000000..3ff29c00 --- /dev/null +++ b/presentation/src/main/java/com/going/presentation/todo/ourtodo/invite/FriendInviteEmptyDialog.kt @@ -0,0 +1,65 @@ +package com.going.presentation.todo.ourtodo.invite + +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import android.os.Build +import android.os.Bundle +import android.view.View +import android.view.WindowManager +import androidx.fragment.app.activityViewModels +import com.going.presentation.R +import com.going.presentation.databinding.FragmentFriendInviteDialogBinding +import com.going.presentation.todo.ourtodo.checkfriends.CheckFriendsViewModel +import com.going.ui.base.BaseDialog +import com.going.ui.extension.setOnSingleClickListener +import com.going.ui.extension.toast + +class FriendInviteEmptyDialog : + BaseDialog(R.layout.fragment_friend_invite_dialog) { + + private val viewModel by activityViewModels() + + override fun onStart() { + super.onStart() + dialog?.window?.apply { + setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.WRAP_CONTENT, + ) + setBackgroundDrawableResource(R.color.transparent) + } + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + setInviteCode() + initExitBtnListener() + initLinkInviteBtnListener() + } + + private fun setInviteCode() { + binding.tvTodoInviteCode.text = viewModel.inviteCode + } + + private fun initExitBtnListener() { + binding.btnTodoInviteFinish.setOnSingleClickListener { + dismiss() + } + } + + private fun initLinkInviteBtnListener() { + binding.tvTodoInviteTermsText.setOnSingleClickListener { + val clipboardManager = + requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clipData = ClipData.newPlainText(CLIP_LABEL, viewModel.inviteCode) + clipboardManager.setPrimaryClip(clipData) + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) toast(getString(R.string.finish_trip_tv_copy_code_complete)) + } + } + + companion object { + const val CLIP_LABEL = "RECOMMEND_LINK" + } +} diff --git a/presentation/src/main/res/drawable/ic_empty_check_friends.xml b/presentation/src/main/res/drawable/ic_empty_check_friends.xml new file mode 100644 index 00000000..f915c76c --- /dev/null +++ b/presentation/src/main/res/drawable/ic_empty_check_friends.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/presentation/src/main/res/layout/activity_change_tag.xml b/presentation/src/main/res/layout/activity_change_tag.xml index eba0d1d2..e193b149 100644 --- a/presentation/src/main/res/layout/activity_change_tag.xml +++ b/presentation/src/main/res/layout/activity_change_tag.xml @@ -19,7 +19,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:background="@drawable/layer_list_preference_tag_gray100_line" - android:backgroundTint="@color/white_000" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> @@ -77,7 +76,6 @@ android:layout_marginHorizontal="24dp" android:layout_marginBottom="22dp" android:background="@drawable/sel_rounded_corner_button" - android:enabled="false" android:outlineProvider="none" android:text="@string/change_tag_btn_change" android:textColor="@color/gray_200" diff --git a/presentation/src/main/res/layout/activity_check_friends.xml b/presentation/src/main/res/layout/activity_check_friends.xml index 8cc88faf..c7e87594 100644 --- a/presentation/src/main/res/layout/activity_check_friends.xml +++ b/presentation/src/main/res/layout/activity_check_friends.xml @@ -46,8 +46,10 @@ + + + + + + + + + + diff --git a/presentation/src/main/res/layout/activity_enter_preference.xml b/presentation/src/main/res/layout/activity_enter_preference.xml index 5b02ad06..341a7cac 100644 --- a/presentation/src/main/res/layout/activity_enter_preference.xml +++ b/presentation/src/main/res/layout/activity_enter_preference.xml @@ -18,7 +18,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:background="@drawable/layer_list_preference_tag_gray100_line" - android:backgroundTint="@color/white_000" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> diff --git a/presentation/src/main/res/layout/activity_finish_preference.xml b/presentation/src/main/res/layout/activity_finish_preference.xml index 9db8388d..9abb9d59 100644 --- a/presentation/src/main/res/layout/activity_finish_preference.xml +++ b/presentation/src/main/res/layout/activity_finish_preference.xml @@ -10,7 +10,7 @@ 우리의 여행 취향 프로필 사진을 눌러서 친구의 취향을 구경해보세요  %d명 + 상관없어 여행 계획 철저하게 - 아무렇게 즉흥으로 여행 장소 관광지 - 어디든 로컬장소 식당 유명 맛집 - 아무데나 가까운 곳 사진 - 사진필수 - 상관없어 + 사진 필수 눈에 담기 여행 일정 알차게 @@ -238,6 +235,8 @@ %s에 대한 여행 취향이 잘 맞네요! 달라서 즐거운 여행! 친구와 서로의 취향을 이야기해 봐요 최고의 여행 친구! 모든 여행 취향이 일치해요 + 아직 함께하는 친구들이 없어요!\n친구를 초대하고 함께 여행 취향을 알아보세요 + 여행 친구 초대하기 카카오톡 초대코드 오류