diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02ac32491..e92723c46 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -172,6 +172,11 @@ android:exported="false" android:screenOrientation="portrait" /> + (R.layout.activity_main private val type by stringExtra() private var backPressedTime: Long = 0 + private var userSubsStateJob: Job? = null private val onBackPressedCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { @@ -82,12 +84,15 @@ class MainActivity : BindingActivity(R.layout.activity_main } private fun initBnvItemSelectedListener() { - supportFragmentManager.findFragmentById(R.id.fcv_main) ?: navigateTo() + supportFragmentManager.findFragmentById(R.id.fcv_main) + ?: navigateTo() binding.bnvMain.setOnItemSelectedListener { menu -> when (menu.itemId) { R.id.menu_recommend -> { - AmplitudeUtils.trackEventWithProperties(EVENT_CLICK_RECOMMEND_NAVIGATION) + AmplitudeUtils.trackEventWithProperties( + EVENT_CLICK_RECOMMEND_NAVIGATION, + ) navigateTo() } @@ -185,7 +190,7 @@ class MainActivity : BindingActivity(R.layout.activity_main } private fun setupGetUserSubsState() { - viewModel.getUserSubsState.flowWithLifecycle(lifecycle) + userSubsStateJob = viewModel.getUserSubsState.flowWithLifecycle(lifecycle) .onEach { state -> when (state) { is Empty -> return@onEach @@ -195,20 +200,25 @@ class MainActivity : BindingActivity(R.layout.activity_main // TODO : 도메인 모델에 변환된 날짜로 파싱되도록 보완 val expiredDateString = state.data?.expiredDate.toString() val expiredDate = - SimpleDateFormat(EXPIRED_DATE_FORMAT).parse(expiredDateString) + SimpleDateFormat(EXPIRED_DATE_FORMAT).parse( + expiredDateString, + ) ?: return@onEach val currentDate = Calendar.getInstance().time val daysDifference = TimeUnit.DAYS.convert( expiredDate.time - currentDate.time, TimeUnit.MILLISECONDS, ) - if (daysDifference >= 1) { + if (daysDifference <= 1) { PayReSubsNoticeDialog.newInstance(expiredDateString) .show(supportFragmentManager, PAY_RESUBS_DIALOG) } } - is Failure -> yelloSnackbar(binding.root, getString(R.string.msg_error)) + is Failure -> yelloSnackbar( + binding.root, + getString(R.string.msg_error), + ) } }.launchIn(lifecycleScope) } @@ -217,7 +227,11 @@ class MainActivity : BindingActivity(R.layout.activity_main viewModel.getNoticeState.flowWithLifecycle(lifecycle) .onEach { state -> when (state) { - is Empty -> yelloSnackbar(binding.root, getString(R.string.msg_error)) + is Empty -> yelloSnackbar( + binding.root, + getString(R.string.msg_error), + ) + is Loading -> return@onEach is Success -> { if (!state.data.isAvailable) return@onEach @@ -262,6 +276,10 @@ class MainActivity : BindingActivity(R.layout.activity_main badgeDrawable.isVisible = count != 0 } + fun resetUserSubsStateFlow() { + userSubsStateJob?.cancel() + } + companion object { private const val EXTRA_TYPE = "type" private const val EXTRA_PATH = "path" @@ -274,7 +292,8 @@ class MainActivity : BindingActivity(R.layout.activity_main const val BACK_PRESSED_INTERVAL = 2000 const val EXPIRED_DATE_FORMAT = "yyyy-MM-dd" const val PAY_RESUBS_DIALOG = "PayResubsNoticeDialog" - private const val EVENT_CLICK_RECOMMEND_NAVIGATION = "click_recommend_navigation" + private const val EVENT_CLICK_RECOMMEND_NAVIGATION = + "click_recommend_navigation" private const val TAG_NOTICE_DIALOG = "NOTICE_DIALOG" diff --git a/app/src/main/java/com/el/yello/presentation/main/look/LookFragment.kt b/app/src/main/java/com/el/yello/presentation/main/look/LookFragment.kt index b59eed3ce..63f424383 100644 --- a/app/src/main/java/com/el/yello/presentation/main/look/LookFragment.kt +++ b/app/src/main/java/com/el/yello/presentation/main/look/LookFragment.kt @@ -40,13 +40,16 @@ class LookFragment : BindingFragment(R.layout.fragment_look private var isScrolled: Boolean = false private var isNoFriend: Boolean = false + private var isFilterSelected: Boolean = false + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initAdapter() initInviteBtnListener() + initFilterBtnListener() setListBottomPadding() - observeTimelinePagingList() + observeTimelinePagingList(isFilterSelected) setPullToScrollListener() observePagingLoadingState() catchScrollForAmplitude() @@ -59,6 +62,7 @@ class LookFragment : BindingFragment(R.layout.fragment_look adapter.addLoadStateListener { combinedLoadStates -> if (combinedLoadStates.prepend.endOfPaginationReached) { binding.layoutLookNoFriendsList.isVisible = adapter.itemCount < 1 + binding.layoutLookListInfo.isGone = adapter.itemCount < 1 binding.rvLook.isGone = adapter.itemCount < 1 isNoFriend = adapter.itemCount < 1 } @@ -77,6 +81,16 @@ class LookFragment : BindingFragment(R.layout.fragment_look } } + private fun initFilterBtnListener() { + binding.btnLookFilter.setOnSingleClickListener { + isFilterSelected = !isFilterSelected + adapter.refresh() + viewModel.setFirstLoading(true) + observeTimelinePagingList(isFilterSelected) + binding.tvLookFilterType.text = if(isFilterSelected) TYPE_MINE else TYPE_ALL + } + } + private fun setListBottomPadding() { binding.rvLook.addItemDecoration(BaseLinearRcvItemDeco(bottomPadding = 14)) } @@ -96,11 +110,10 @@ class LookFragment : BindingFragment(R.layout.fragment_look }.launchIn(lifecycleScope) } - private fun observeTimelinePagingList() { - viewModel.getLookListWithPaging().flowWithLifecycle(lifecycle) - .onEach { pagingData -> - adapter.submitData(lifecycle, pagingData) - }.launchIn(lifecycleScope) + private fun observeTimelinePagingList(onlyMine: Boolean) { + viewModel.getLookListWithPaging(onlyMine).flowWithLifecycle(lifecycle).onEach { pagingData -> + adapter.submitData(lifecycle, pagingData) + }.launchIn(lifecycleScope) } @@ -166,5 +179,8 @@ class LookFragment : BindingFragment(R.layout.fragment_look companion object { const val INVITE_DIALOG = "inviteDialog" const val TIMELINE_NO_FRIEND = "timeline_0friend" + + const val TYPE_ALL = "모든 쪽지" + const val TYPE_MINE = "내가 보낸 쪽지" } } \ No newline at end of file diff --git a/app/src/main/java/com/el/yello/presentation/main/look/LookViewHolder.kt b/app/src/main/java/com/el/yello/presentation/main/look/LookViewHolder.kt index b9ac20783..d83f36355 100644 --- a/app/src/main/java/com/el/yello/presentation/main/look/LookViewHolder.kt +++ b/app/src/main/java/com/el/yello/presentation/main/look/LookViewHolder.kt @@ -50,6 +50,7 @@ class LookViewHolder( setTextColor(itemView.context.colorOf(R.color.semantic_gender_f_500)) FROM_FEMALE } + if (item.isUserSenderVote) text = FROM_ME } } } @@ -58,5 +59,6 @@ class LookViewHolder( const val MALE = "MALE" const val FROM_MALE = "남학생에게 받음" const val FROM_FEMALE = "여학생에게 받음" + const val FROM_ME = "나에게 받음" } } \ No newline at end of file diff --git a/app/src/main/java/com/el/yello/presentation/main/look/LookViewModel.kt b/app/src/main/java/com/el/yello/presentation/main/look/LookViewModel.kt index 5aea27b1e..0f2fa950a 100644 --- a/app/src/main/java/com/el/yello/presentation/main/look/LookViewModel.kt +++ b/app/src/main/java/com/el/yello/presentation/main/look/LookViewModel.kt @@ -29,10 +29,10 @@ class LookViewModel @Inject constructor( _isFirstLoading.value = boolean } - fun getLookListWithPaging(): Flow> = + fun getLookListWithPaging(onlyMine: Boolean): Flow> = Pager( config = PagingConfig(LookPagingSource.LOOK_PAGE_SIZE), - pagingSourceFactory = { LookPagingSource(lookService) } + pagingSourceFactory = { LookPagingSource(lookService, onlyMine) } ).flow.cachedIn(viewModelScope) fun getYelloId() = authRepository.getYelloId() diff --git a/app/src/main/java/com/el/yello/presentation/main/profile/ProfileViewModel.kt b/app/src/main/java/com/el/yello/presentation/main/profile/ProfileViewModel.kt index 44e7fe214..d83828529 100644 --- a/app/src/main/java/com/el/yello/presentation/main/profile/ProfileViewModel.kt +++ b/app/src/main/java/com/el/yello/presentation/main/profile/ProfileViewModel.kt @@ -1,10 +1,16 @@ package com.el.yello.presentation.main.profile +import android.content.Context +import android.util.Log +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.el.yello.R import com.el.yello.util.amplitude.AmplitudeUtils import com.example.domain.entity.PayInfoModel import com.example.domain.entity.ProfileFriendsListModel +import com.example.domain.entity.ProfileQuitReasonModel import com.example.domain.entity.ProfileUserModel import com.example.domain.repository.AuthRepository import com.example.domain.repository.PayRepository @@ -30,14 +36,12 @@ class ProfileViewModel @Inject constructor( init { resetPageVariable() - // resetStateVariable() } private val _getUserDataResult = MutableSharedFlow() val getUserDataResult: SharedFlow = _getUserDataResult - private val _getFriendListState = - MutableStateFlow>(UiState.Empty) + private val _getFriendListState = MutableStateFlow>(UiState.Empty) val getFriendListState: StateFlow> = _getFriendListState private val _deleteUserState = MutableStateFlow>(UiState.Empty) @@ -71,6 +75,21 @@ class ProfileViewModel @Inject constructor( var clickedUserData = ProfileUserModel() var clickedItemPosition: Int? = null + private val quitReasonText = MutableLiveData() + val etcText = MutableLiveData("") + private val _quitReasonData: MutableLiveData> = MutableLiveData() + val quitReasonData: LiveData> = _quitReasonData + fun setEtcText(etc: String) { + etcText.value = etc + } + fun setQuitReason(reason: String) { + quitReasonText.value = reason + } + fun addQuitReasonList(context: Context) { + val quitReasonArray = context.resources.getStringArray(R.array.quit_reasons) + _quitReasonData.value = quitReasonArray.toList() + } + fun setItemPosition(position: Int) { clickedItemPosition = position } @@ -92,6 +111,7 @@ class ProfileViewModel @Inject constructor( _kakaoQuitState.value = UiState.Empty _getFriendListState.value = UiState.Empty _getPurchaseInfoState.value = UiState.Empty + _getUserDataResult.resetReplayCache() } fun getUserDataFromServer() { @@ -136,7 +156,16 @@ class ProfileViewModel @Inject constructor( fun deleteUserDataToServer() { viewModelScope.launch { _deleteUserState.value = UiState.Loading - profileRepository.deleteUserData() + val quitReason = if (quitReasonText.value.toString().equals("기타")) { + etcText.value.toString() + } else { + quitReasonText.value.toString() + } + profileRepository.deleteUserData( + ProfileQuitReasonModel( + quitReason, + ), + ) .onSuccess { clearLocalInfo() delay(300) diff --git a/app/src/main/java/com/el/yello/presentation/main/profile/info/ProfileFragment.kt b/app/src/main/java/com/el/yello/presentation/main/profile/info/ProfileFragment.kt index d5ff39919..a576da7d3 100644 --- a/app/src/main/java/com/el/yello/presentation/main/profile/info/ProfileFragment.kt +++ b/app/src/main/java/com/el/yello/presentation/main/profile/info/ProfileFragment.kt @@ -64,15 +64,18 @@ class ProfileFragment : BindingFragment(R.layout.fragmen AmplitudeUtils.trackEventWithProperties("view_profile") } + override fun onResume() { + super.onResume() + + resetProfileData() + } + private fun initProfileSetting() { initProfileManageBtnListener() initUpwardBtnListener() initUpwardBtnVisibility() initAdapter() setItemDivider() - viewModel.getUserDataFromServer() - viewModel.getFriendsListFromServer() - viewModel.getPurchaseInfoFromServer() } private fun setItemDivider() { @@ -156,14 +159,7 @@ class ProfileFragment : BindingFragment(R.layout.fragmen binding.layoutProfileSwipe.apply { setOnRefreshListener { lifecycleScope.launch { - adapter.setItemList(listOf()) - viewModel.run { - resetPageVariable() - resetStateVariable() - getPurchaseInfoFromServer() - getUserDataFromServer() - getFriendsListFromServer() - } + resetProfileData() delay(200) binding.layoutProfileSwipe.isRefreshing = false } @@ -172,6 +168,17 @@ class ProfileFragment : BindingFragment(R.layout.fragmen } } + private fun resetProfileData() { + adapter.setItemList(listOf()) + viewModel.run { + resetPageVariable() + resetStateVariable() + getPurchaseInfoFromServer() + getUserDataFromServer() + getFriendsListFromServer() + } + } + private fun observeUserDataResult() { viewModel.getUserDataResult.flowWithLifecycle(lifecycle).onEach { result -> if (!result) yelloSnackbar(requireView(), getString(R.string.profile_error_user_data)) diff --git a/app/src/main/java/com/el/yello/presentation/main/profile/manage/ProfileQuitDialog.kt b/app/src/main/java/com/el/yello/presentation/main/profile/manage/ProfileQuitDialog.kt index c7a7e7f97..70009c558 100644 --- a/app/src/main/java/com/el/yello/presentation/main/profile/manage/ProfileQuitDialog.kt +++ b/app/src/main/java/com/el/yello/presentation/main/profile/manage/ProfileQuitDialog.kt @@ -70,8 +70,6 @@ class ProfileQuitDialog : viewModel.deleteUserDataToServer() } } - - // 유저 탈퇴 서버 통신 성공 시 카카오 연결 해제 진행 private fun observeUserDeleteState() { viewModel.deleteUserState.flowWithLifecycle(lifecycle).onEach { state -> when (state) { diff --git a/app/src/main/java/com/el/yello/presentation/main/profile/manage/ProfileQuitReasonActivity.kt b/app/src/main/java/com/el/yello/presentation/main/profile/manage/ProfileQuitReasonActivity.kt new file mode 100644 index 000000000..d4b8c4a16 --- /dev/null +++ b/app/src/main/java/com/el/yello/presentation/main/profile/manage/ProfileQuitReasonActivity.kt @@ -0,0 +1,94 @@ +package com.el.yello.presentation.main.profile.manage + +import android.os.Bundle +import androidx.activity.viewModels +import androidx.recyclerview.widget.RecyclerView +import com.el.yello.R +import com.el.yello.databinding.ActivityProfileQuitReasonBinding +import com.el.yello.presentation.main.profile.ProfileViewModel +import com.example.ui.base.BindingActivity +import com.example.ui.context.colorOf +import com.example.ui.view.setOnSingleClickListener +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class ProfileQuitReasonActivity : + BindingActivity(R.layout.activity_profile_quit_reason) { + private lateinit var quitReasonList: List + private val viewModel by viewModels() + private var clickedItemPosition: Int = RecyclerView.NO_POSITION + private var isItemClicked: Boolean = false + private var profileQuitDialog: ProfileQuitDialog? = null + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding.vm = viewModel + initQuitReasonAdapter() + initBackBtnListener() + initInviteDialogBtnListener() + } + + private fun initQuitReasonAdapter() { + viewModel.addQuitReasonList(this) + quitReasonList = viewModel.quitReasonData.value ?: emptyList() + val adapter = ProfileQuitReasonAdapter( + storeQuitReason = ::storeQuitReason, + setEtcText = ::setEtcText, + ) { position, clicked -> + clickedItemPosition = position + isItemClicked = clicked + if (isItemClicked) { + if (clickedItemPosition == 7) { + nonClickedButtonUI() + } else { + clickedButtonUI() + } + } + } + binding.rvQuitReason.adapter = adapter + adapter.submitList(ArrayList(quitReasonList)) + } + + private fun initInviteDialogBtnListener() { + binding.btnProfileQuitReasonDone.setOnSingleClickListener { + profileQuitDialog = ProfileQuitDialog() + profileQuitDialog?.show(supportFragmentManager, QUIT_DIALOG) + } + } + + private fun initBackBtnListener() { + binding.btnProfileQuitReasonBack.setOnSingleClickListener { finish() } + } + + private fun clickedButtonUI() { + with(binding.btnProfileQuitReasonDone) { + setBackgroundResource(R.drawable.shape_black_fill_grayscales700_line_100_rect) + setTextColor(colorOf(R.color.semantic_red_500)) + isEnabled = true + } + } + + private fun nonClickedButtonUI() { + with(binding.btnProfileQuitReasonDone) { + setBackgroundResource(R.drawable.shape_black_fill_grayscales600_line_100_rect) + setTextColor(colorOf(R.color.grayscales_600)) + isEnabled = false + } + } + + private fun storeQuitReason(reason: String) { + viewModel.setQuitReason(reason) + } + + private fun setEtcText(etc: String) { + viewModel.setEtcText(etc) + } + + override fun onDestroy() { + super.onDestroy() + profileQuitDialog?.dismiss() + } + + private companion object { + const val QUIT_DIALOG = "quitDialog" + } +} diff --git a/app/src/main/java/com/el/yello/presentation/main/profile/manage/ProfileQuitReasonAdapter.kt b/app/src/main/java/com/el/yello/presentation/main/profile/manage/ProfileQuitReasonAdapter.kt new file mode 100644 index 000000000..1ed70c3f2 --- /dev/null +++ b/app/src/main/java/com/el/yello/presentation/main/profile/manage/ProfileQuitReasonAdapter.kt @@ -0,0 +1,85 @@ +package com.el.yello.presentation.main.profile.manage + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.widget.addTextChangedListener +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.el.yello.R +import com.el.yello.databinding.ItemProfileQuitReasonBinding +import com.example.ui.view.ItemDiffCallback +import com.example.ui.view.setOnSingleClickListener + +class ProfileQuitReasonAdapter( + private val storeQuitReason: (String) -> Unit, + private val setEtcText: (String) -> Unit, + private val onItemClickListener: (Int, Boolean) -> Unit, +) : ListAdapter(diffUtil) { + private var selectedItemPosition: Int = RecyclerView.NO_POSITION + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QuitReasonViewHolder { + return QuitReasonViewHolder( + ItemProfileQuitReasonBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false, + ), + storeQuitReason, + setEtcText, + this::onItemClicked, + ) + } + + override fun onBindViewHolder(holder: QuitReasonViewHolder, position: Int) { + holder.bind(getItem(position), position == selectedItemPosition) + } + + private fun onItemClicked(position: Int) { + if (selectedItemPosition != RecyclerView.NO_POSITION) { + notifyItemChanged(selectedItemPosition) + } + selectedItemPosition = position + notifyItemChanged(position) + storeQuitReason(getItem(position)) + onItemClickListener(position, true) + } + + class QuitReasonViewHolder( + private val binding: ItemProfileQuitReasonBinding, + private val storeQuitReason: (String) -> Unit, + private val setEtcText: (String) -> Unit, + private val onItemClicked: (Int) -> Unit, + ) : RecyclerView.ViewHolder(binding.root) { + + fun bind(reason: String, isItemSelected: Boolean) { + binding.reason = reason + binding.root.setOnSingleClickListener { + onItemClicked(absoluteAdapterPosition) + } + binding.etQuitEtc.addTextChangedListener { + setEtcText(binding.etQuitEtc.text.toString()) + } + if (isItemSelected) { + with(binding) { + ivQuitReasonCheckpoint.setBackgroundResource(R.drawable.ic_profile_quit_reason_check) + cvQuitReasonList.setBackgroundResource(R.drawable.shape_black_fill_white_line_8_rect) + etQuitEtc.visibility = if (absoluteAdapterPosition == 7) View.VISIBLE else View.GONE + } + storeQuitReason(reason) + } else { + with(binding) { + ivQuitReasonCheckpoint.setBackgroundResource(R.drawable.ic_profile_quit_reason_uncheck) + cvQuitReasonList.setBackgroundResource(R.drawable.shape_grayscales900_fill_8_rect) + etQuitEtc.visibility = View.GONE + } + } + } + } + + companion object { + private val diffUtil = ItemDiffCallback( + onItemsTheSame = { old, new -> old == new }, + onContentsTheSame = { old, new -> old == new }, + ) + } +} diff --git a/app/src/main/java/com/el/yello/presentation/main/profile/manage/ProfileQuitTwoActivity.kt b/app/src/main/java/com/el/yello/presentation/main/profile/manage/ProfileQuitTwoActivity.kt index bed202e9b..dfe2aa2c2 100644 --- a/app/src/main/java/com/el/yello/presentation/main/profile/manage/ProfileQuitTwoActivity.kt +++ b/app/src/main/java/com/el/yello/presentation/main/profile/manage/ProfileQuitTwoActivity.kt @@ -1,5 +1,6 @@ package com.el.yello.presentation.main.profile.manage +import android.content.Intent import android.os.Bundle import com.el.yello.R import com.el.yello.databinding.ActivityProfileQuitTwoBinding @@ -12,37 +13,27 @@ import org.json.JSONObject @AndroidEntryPoint class ProfileQuitTwoActivity : BindingActivity(R.layout.activity_profile_quit_two) { - - private var profileQuitDialog: ProfileQuitDialog? = null - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) initBackBtnListener() - initInviteDialogBtnListener() + initQuitBtnListener() } private fun initBackBtnListener() { binding.btnProfileQuitBack.setOnSingleClickListener { finish() } } - private fun initInviteDialogBtnListener() { + private fun initQuitBtnListener() { binding.btnProfileQuitForSure.setOnSingleClickListener { AmplitudeUtils.trackEventWithProperties( "click_profile_withdrawal", JSONObject().put("withdrawal_button", "withdrawal3"), ) - profileQuitDialog = ProfileQuitDialog() - profileQuitDialog?.show(supportFragmentManager, QUIT_DIALOG) + Intent(this, ProfileQuitReasonActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + startActivity(this) + } } } - - override fun onDestroy() { - super.onDestroy() - profileQuitDialog?.dismiss() - } - - private companion object { - const val QUIT_DIALOG = "quitDialog" - } } diff --git a/app/src/main/java/com/el/yello/presentation/onboarding/activity/OnBoardingViewModel.kt b/app/src/main/java/com/el/yello/presentation/onboarding/OnBoardingViewModel.kt similarity index 99% rename from app/src/main/java/com/el/yello/presentation/onboarding/activity/OnBoardingViewModel.kt rename to app/src/main/java/com/el/yello/presentation/onboarding/OnBoardingViewModel.kt index 5492ed473..2f3ec884f 100644 --- a/app/src/main/java/com/el/yello/presentation/onboarding/activity/OnBoardingViewModel.kt +++ b/app/src/main/java/com/el/yello/presentation/onboarding/OnBoardingViewModel.kt @@ -1,4 +1,4 @@ -package com.el.yello.presentation.onboarding.activity +package com.el.yello.presentation.onboarding import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData diff --git a/app/src/main/java/com/el/yello/presentation/onboarding/activity/EditNameActivity.kt b/app/src/main/java/com/el/yello/presentation/onboarding/activity/EditNameActivity.kt index 3ac8f9521..09a760787 100644 --- a/app/src/main/java/com/el/yello/presentation/onboarding/activity/EditNameActivity.kt +++ b/app/src/main/java/com/el/yello/presentation/onboarding/activity/EditNameActivity.kt @@ -11,6 +11,7 @@ import com.el.yello.presentation.auth.SignInActivity.Companion.EXTRA_GENDER import com.el.yello.presentation.auth.SignInActivity.Companion.EXTRA_KAKAO_ID import com.el.yello.presentation.auth.SignInActivity.Companion.EXTRA_NAME import com.el.yello.presentation.auth.SignInActivity.Companion.EXTRA_PROFILE_IMAGE +import com.el.yello.presentation.onboarding.OnBoardingViewModel import com.example.ui.base.BindingActivity import com.example.ui.context.toast import com.example.ui.view.setOnSingleClickListener diff --git a/app/src/main/java/com/el/yello/presentation/onboarding/activity/OnBoardingActivity.kt b/app/src/main/java/com/el/yello/presentation/onboarding/activity/OnBoardingActivity.kt index ad6d981a3..2fa807f81 100644 --- a/app/src/main/java/com/el/yello/presentation/onboarding/activity/OnBoardingActivity.kt +++ b/app/src/main/java/com/el/yello/presentation/onboarding/activity/OnBoardingActivity.kt @@ -14,6 +14,7 @@ import com.el.yello.presentation.auth.SignInActivity.Companion.EXTRA_GENDER import com.el.yello.presentation.auth.SignInActivity.Companion.EXTRA_KAKAO_ID import com.el.yello.presentation.auth.SignInActivity.Companion.EXTRA_NAME import com.el.yello.presentation.auth.SignInActivity.Companion.EXTRA_PROFILE_IMAGE +import com.el.yello.presentation.onboarding.OnBoardingViewModel import com.example.ui.base.BindingActivity import com.example.ui.context.toast import dagger.hilt.android.AndroidEntryPoint diff --git a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/addfriend/AddFriendFragment.kt b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/addfriend/AddFriendFragment.kt index 0263d9db6..e7118188b 100644 --- a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/addfriend/AddFriendFragment.kt +++ b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/addfriend/AddFriendFragment.kt @@ -12,7 +12,7 @@ import androidx.recyclerview.widget.RecyclerView import com.el.yello.R import com.el.yello.databinding.FragmentAddFriendBinding import com.el.yello.presentation.onboarding.activity.OnBoardingActivity -import com.el.yello.presentation.onboarding.activity.OnBoardingViewModel +import com.el.yello.presentation.onboarding.OnBoardingViewModel import com.el.yello.util.amplitude.AmplitudeUtils import com.example.domain.entity.onboarding.AddFriendListModel.FriendModel import com.example.ui.base.BindingFragment diff --git a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/code/CodeFragment.kt b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/code/CodeFragment.kt index 513a7de76..361f7a9dd 100644 --- a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/code/CodeFragment.kt +++ b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/code/CodeFragment.kt @@ -9,7 +9,7 @@ import com.el.yello.R import com.el.yello.databinding.FragmentCodeBinding import com.el.yello.presentation.onboarding.activity.GetAlarmActivity import com.el.yello.presentation.onboarding.activity.OnBoardingActivity -import com.el.yello.presentation.onboarding.activity.OnBoardingViewModel +import com.el.yello.presentation.onboarding.OnBoardingViewModel import com.el.yello.util.amplitude.AmplitudeUtils import com.el.yello.util.context.yelloSnackbar import com.example.ui.base.BindingFragment diff --git a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/highschoolinfo/HighSchoolInfoFragment.kt b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/highschoolinfo/HighSchoolInfoFragment.kt index 50f778c24..bbcb84b02 100644 --- a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/highschoolinfo/HighSchoolInfoFragment.kt +++ b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/highschoolinfo/HighSchoolInfoFragment.kt @@ -7,7 +7,7 @@ import androidx.navigation.fragment.findNavController import com.el.yello.R import com.el.yello.databinding.FragmentHighschoolBinding import com.el.yello.presentation.onboarding.activity.OnBoardingActivity -import com.el.yello.presentation.onboarding.activity.OnBoardingViewModel +import com.el.yello.presentation.onboarding.OnBoardingViewModel import com.el.yello.presentation.onboarding.fragment.highschoolinfo.group.GroupDialogFragment import com.el.yello.presentation.onboarding.fragment.highschoolinfo.school.SearchDialogHighSchoolFragment import com.el.yello.util.amplitude.AmplitudeUtils diff --git a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/highschoolinfo/group/GroupDialogFragment.kt b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/highschoolinfo/group/GroupDialogFragment.kt index bf47b5a45..4005e250b 100644 --- a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/highschoolinfo/group/GroupDialogFragment.kt +++ b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/highschoolinfo/group/GroupDialogFragment.kt @@ -5,7 +5,7 @@ import android.view.View import androidx.fragment.app.activityViewModels import com.el.yello.R import com.el.yello.databinding.FragmentDialogGroupBinding -import com.el.yello.presentation.onboarding.activity.OnBoardingViewModel +import com.el.yello.presentation.onboarding.OnBoardingViewModel import com.example.ui.base.BindingBottomSheetDialog class GroupDialogFragment : diff --git a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/highschoolinfo/school/SearchDialogHighSchoolFragment.kt b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/highschoolinfo/school/SearchDialogHighSchoolFragment.kt index ea354277a..a9cf220a6 100644 --- a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/highschoolinfo/school/SearchDialogHighSchoolFragment.kt +++ b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/highschoolinfo/school/SearchDialogHighSchoolFragment.kt @@ -16,7 +16,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.el.yello.R import com.el.yello.databinding.FragmentDialogHighschoolBinding -import com.el.yello.presentation.onboarding.activity.OnBoardingViewModel +import com.el.yello.presentation.onboarding.OnBoardingViewModel import com.el.yello.util.context.yelloSnackbar import com.example.ui.base.BindingBottomSheetDialog import com.example.ui.context.hideKeyboard diff --git a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/studenttype/SelectStudentFragment.kt b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/studenttype/SelectStudentFragment.kt index 90bed8f54..e43ffd4da 100644 --- a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/studenttype/SelectStudentFragment.kt +++ b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/studenttype/SelectStudentFragment.kt @@ -7,7 +7,7 @@ import androidx.navigation.fragment.findNavController import com.el.yello.R import com.el.yello.databinding.FragmentSelectStudentTypeBinding import com.el.yello.presentation.onboarding.activity.OnBoardingActivity -import com.el.yello.presentation.onboarding.activity.OnBoardingViewModel +import com.el.yello.presentation.onboarding.OnBoardingViewModel import com.el.yello.util.amplitude.AmplitudeUtils import com.example.domain.enum.StudentType import com.example.ui.base.BindingFragment diff --git a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/universityinfo/UniversityInfoFragment.kt b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/universityinfo/UniversityInfoFragment.kt index 55fd7a464..7fd0cb59b 100644 --- a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/universityinfo/UniversityInfoFragment.kt +++ b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/universityinfo/UniversityInfoFragment.kt @@ -8,7 +8,7 @@ import androidx.navigation.fragment.findNavController import com.el.yello.R import com.el.yello.databinding.FragmentUniversityBinding import com.el.yello.presentation.onboarding.activity.OnBoardingActivity -import com.el.yello.presentation.onboarding.activity.OnBoardingViewModel +import com.el.yello.presentation.onboarding.OnBoardingViewModel import com.el.yello.presentation.onboarding.fragment.universityinfo.department.SearchDialogDepartmentFragment import com.el.yello.presentation.onboarding.fragment.universityinfo.studentid.StudentIdDialogFragment import com.el.yello.presentation.onboarding.fragment.universityinfo.university.SearchDialogUniversityFragment diff --git a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/universityinfo/department/SearchDialogDepartmentFragment.kt b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/universityinfo/department/SearchDialogDepartmentFragment.kt index 2baad7d0f..9e5cd55a4 100644 --- a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/universityinfo/department/SearchDialogDepartmentFragment.kt +++ b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/universityinfo/department/SearchDialogDepartmentFragment.kt @@ -16,7 +16,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.el.yello.R import com.el.yello.databinding.FragmentDialogDepartmentBinding -import com.el.yello.presentation.onboarding.activity.OnBoardingViewModel +import com.el.yello.presentation.onboarding.OnBoardingViewModel import com.el.yello.util.context.yelloSnackbar import com.example.ui.base.BindingBottomSheetDialog import com.example.ui.context.hideKeyboard diff --git a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/universityinfo/studentid/StudentIdDialogFragment.kt b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/universityinfo/studentid/StudentIdDialogFragment.kt index 94185d164..6aa088edd 100644 --- a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/universityinfo/studentid/StudentIdDialogFragment.kt +++ b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/universityinfo/studentid/StudentIdDialogFragment.kt @@ -5,7 +5,7 @@ import android.view.View import androidx.fragment.app.activityViewModels import com.el.yello.R import com.el.yello.databinding.FragmentDialogStudentIdBinding -import com.el.yello.presentation.onboarding.activity.OnBoardingViewModel +import com.el.yello.presentation.onboarding.OnBoardingViewModel import com.example.ui.base.BindingBottomSheetDialog class StudentIdDialogFragment : diff --git a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/universityinfo/university/SearchDialogUniversityFragment.kt b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/universityinfo/university/SearchDialogUniversityFragment.kt index 793cdf866..734e3a63c 100644 --- a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/universityinfo/university/SearchDialogUniversityFragment.kt +++ b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/universityinfo/university/SearchDialogUniversityFragment.kt @@ -16,7 +16,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.el.yello.R import com.el.yello.databinding.FragmentDialogUniversityBinding -import com.el.yello.presentation.onboarding.activity.OnBoardingViewModel +import com.el.yello.presentation.onboarding.OnBoardingViewModel import com.el.yello.util.context.yelloSnackbar import com.example.ui.base.BindingBottomSheetDialog import com.example.ui.context.hideKeyboard diff --git a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/yelloid/YelIoIdFragment.kt b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/yelloid/YelIoIdFragment.kt index ed3567264..14548d537 100644 --- a/app/src/main/java/com/el/yello/presentation/onboarding/fragment/yelloid/YelIoIdFragment.kt +++ b/app/src/main/java/com/el/yello/presentation/onboarding/fragment/yelloid/YelIoIdFragment.kt @@ -7,8 +7,8 @@ import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController import com.el.yello.R import com.el.yello.databinding.FragmentYelloIdBinding +import com.el.yello.presentation.onboarding.OnBoardingViewModel import com.el.yello.presentation.onboarding.activity.OnBoardingActivity -import com.el.yello.presentation.onboarding.activity.OnBoardingViewModel import com.el.yello.util.amplitude.AmplitudeUtils import com.el.yello.util.context.yelloSnackbar import com.example.ui.base.BindingFragment diff --git a/app/src/main/java/com/el/yello/presentation/pay/PayReSubsNoticeDialog.kt b/app/src/main/java/com/el/yello/presentation/pay/PayReSubsNoticeDialog.kt index 233ea8786..b74b45cb0 100644 --- a/app/src/main/java/com/el/yello/presentation/pay/PayReSubsNoticeDialog.kt +++ b/app/src/main/java/com/el/yello/presentation/pay/PayReSubsNoticeDialog.kt @@ -9,12 +9,16 @@ import android.view.ViewGroup import android.view.WindowManager import com.el.yello.R import com.el.yello.databinding.FragmentNoticeResubscribeBinding +import com.el.yello.presentation.main.MainActivity import com.example.ui.base.BindingDialogFragment import com.example.ui.view.setOnSingleClickListener class PayReSubsNoticeDialog : BindingDialogFragment(R.layout.fragment_notice_resubscribe) { + private val mainActivity: MainActivity by lazy { + requireActivity() as MainActivity + } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setNoticeBtnClickListener() @@ -38,12 +42,14 @@ class PayReSubsNoticeDialog : private fun setNoticeBtnClickListener() { binding.btnNoticeQuit.setOnSingleClickListener { dismiss() + mainActivity.resetUserSubsStateFlow() } binding.btnYelloplusSubscribe.setOnSingleClickListener { Intent(requireContext(), PayActivity::class.java).apply { startActivity(this) } dismiss() + mainActivity.resetUserSubsStateFlow() } } @@ -62,7 +68,6 @@ class PayReSubsNoticeDialog : companion object { private const val ARG_EXPIRED_DATE = "arg_expired_date" - @JvmStatic fun newInstance(expiredDate: String): PayReSubsNoticeDialog { return PayReSubsNoticeDialog().apply { diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml new file mode 100644 index 000000000..fd6791e44 --- /dev/null +++ b/app/src/main/res/drawable/ic_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_profile_quit_reason_check.xml b/app/src/main/res/drawable/ic_profile_quit_reason_check.xml new file mode 100644 index 000000000..51a6bcc93 --- /dev/null +++ b/app/src/main/res/drawable/ic_profile_quit_reason_check.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_profile_quit_reason_uncheck.xml b/app/src/main/res/drawable/ic_profile_quit_reason_uncheck.xml new file mode 100644 index 000000000..0f2c28597 --- /dev/null +++ b/app/src/main/res/drawable/ic_profile_quit_reason_uncheck.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/shape_black_fill_grayscales600_line_100_rect.xml b/app/src/main/res/drawable/shape_black_fill_grayscales600_line_100_rect.xml new file mode 100644 index 000000000..1a64a3455 --- /dev/null +++ b/app/src/main/res/drawable/shape_black_fill_grayscales600_line_100_rect.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/app/src/main/res/drawable/shape_black_fill_white_line_8_rect.xml b/app/src/main/res/drawable/shape_black_fill_white_line_8_rect.xml new file mode 100644 index 000000000..36cb2fe16 --- /dev/null +++ b/app/src/main/res/drawable/shape_black_fill_white_line_8_rect.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/app/src/main/res/drawable/shape_grayscales800_line_40_rect.xml b/app/src/main/res/drawable/shape_grayscales800_line_40_rect.xml new file mode 100644 index 000000000..aa982383a --- /dev/null +++ b/app/src/main/res/drawable/shape_grayscales800_line_40_rect.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/app/src/main/res/drawable/shape_grayscales900_fill_grayscales700_circle.xml b/app/src/main/res/drawable/shape_grayscales900_fill_grayscales700_circle.xml deleted file mode 100644 index 132244d0f..000000000 --- a/app/src/main/res/drawable/shape_grayscales900_fill_grayscales700_circle.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_name_edit.xml b/app/src/main/res/layout/activity_name_edit.xml index 7bdeabac8..ccb9e00b5 100644 --- a/app/src/main/res/layout/activity_name_edit.xml +++ b/app/src/main/res/layout/activity_name_edit.xml @@ -7,7 +7,7 @@ + type="com.el.yello.presentation.onboarding.OnBoardingViewModel" /> diff --git a/app/src/main/res/layout/activity_profile_quit_reason.xml b/app/src/main/res/layout/activity_profile_quit_reason.xml new file mode 100644 index 000000000..2ee0facf8 --- /dev/null +++ b/app/src/main/res/layout/activity_profile_quit_reason.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_tutorial_end_point.xml b/app/src/main/res/layout/activity_tutorial_end_point.xml index 47e84dfb9..5156bb705 100644 --- a/app/src/main/res/layout/activity_tutorial_end_point.xml +++ b/app/src/main/res/layout/activity_tutorial_end_point.xml @@ -5,7 +5,7 @@ + type="com.el.yello.presentation.onboarding.OnBoardingViewModel" /> + type="com.el.yello.presentation.onboarding.OnBoardingViewModel" /> + type="com.el.yello.presentation.onboarding.OnBoardingViewModel" /> diff --git a/app/src/main/res/layout/fragment_dialog_check_name.xml b/app/src/main/res/layout/fragment_dialog_check_name.xml index 6d3ad68c6..9590b46be 100644 --- a/app/src/main/res/layout/fragment_dialog_check_name.xml +++ b/app/src/main/res/layout/fragment_dialog_check_name.xml @@ -7,7 +7,7 @@ + type="com.el.yello.presentation.onboarding.OnBoardingViewModel" /> + type="com.el.yello.presentation.onboarding.OnBoardingViewModel" /> + type="com.el.yello.presentation.onboarding.OnBoardingViewModel" /> + type="com.el.yello.presentation.onboarding.OnBoardingViewModel" /> + type="com.el.yello.presentation.onboarding.OnBoardingViewModel" /> + type="com.el.yello.presentation.onboarding.OnBoardingViewModel" /> + type="com.el.yello.presentation.onboarding.OnBoardingViewModel" /> @@ -18,50 +19,80 @@ android:background="@drawable/shape_white_fill_10_rect" android:paddingHorizontal="2dp" android:paddingTop="2dp" - android:paddingBottom="50dp" + android:paddingBottom="36dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> + app:layout_constraintTop_toTopOf="parent" /> + + + app:layout_constraintTop_toBottomOf="@id/tv_recommend_dialog_subtitle_up_box" /> + + + app:layout_constraintTop_toBottomOf="@id/tv_recommend_dialog_subtitle_down_box"> + app:layout_constraintTop_toBottomOf="@id/tv_recommend_dialog_invite_title" + tools:text="sangho.kk" /> @@ -131,7 +162,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginHorizontal="8dp" - android:layout_marginTop="27dp" + android:layout_marginTop="18dp" android:src="@drawable/ic_kakao_share" app:layout_constraintEnd_toStartOf="@id/btn_invite_link" app:layout_constraintHorizontal_chainStyle="packed" @@ -143,7 +174,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginHorizontal="8dp" - android:layout_marginTop="27dp" + android:layout_marginTop="18dp" android:src="@drawable/ic_link_share" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/btn_invite_kakao" diff --git a/app/src/main/res/layout/fragment_look.xml b/app/src/main/res/layout/fragment_look.xml index cc1659e19..ea00f7a7f 100644 --- a/app/src/main/res/layout/fragment_look.xml +++ b/app/src/main/res/layout/fragment_look.xml @@ -23,15 +23,90 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@id/layout_look_list_info"> + app:layout_constraintTop_toBottomOf="@id/layout_look_list_info"> + app:layout_constraintTop_toBottomOf="@id/tv_layout_title"> + type="com.el.yello.presentation.onboarding.OnBoardingViewModel" /> + type="com.el.yello.presentation.onboarding.OnBoardingViewModel" /> + type="com.el.yello.presentation.onboarding.OnBoardingViewModel" /> diff --git a/app/src/main/res/layout/item_profile_quit_reason.xml b/app/src/main/res/layout/item_profile_quit_reason.xml new file mode 100644 index 000000000..fb8099ac5 --- /dev/null +++ b/app/src/main/res/layout/item_profile_quit_reason.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + \ 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 ed2165350..eb72ef450 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -155,6 +155,8 @@ 타임라인 타임라인 가져오기 실패 친구들이 받은 쪽지가 궁금하다면\n친구를 초대해볼까요? + 쪽지를 보낸 사람의 이름은 공개되지 않아요. + 모든 쪽지 Unknown View Type : %d @@ -233,15 +235,17 @@ 추천친구 친구 초대하기 - 친구가 내 추천인 코드로 가입하면 - 40분 대기 초기화 + 100포인트 지급! + 친구가 내 추천인 코드로 가입하면, + 40분 대기 초기화 + 100포인트 + 내 추천인 코드가 처음 쓰였다면?! + 열람권 1개 추가 지급! 내 추천인 코드 \@ 친구 초대하기 찾는 친구가 없다면 친구를 초대해볼까요? 찾는 친구가 없다면\n친구를 초대해볼까요? - 친구 초대하고 100포인트 받기 + 친구 초대하고 리워드 받기 친구추가 친구 검색 @@ -356,9 +360,24 @@ 초성 힌트 무제한 제공 곧 위와 같은 혜택을 누릴 수 없게 돼요. \n\n옐로 플러스의 특별한 서비스를\n계속 이용하시려면, 버튼을 눌러\n구독을 계속해 보세요! 계속 옐로플러스 구독하기 + 탈퇴 사유를 적어주세요. + 완료 + 사유를 적어주세요.(최대 30자) 다시 보지 않기 닫기 다시 보지 않기 아이콘 + 스토리 공유하기 + + + 앱에 아는 사람들이 없어서 + 구독권과 열람권의 가격이 비싸서 + 오류가 많아서 + 재밌는 콘텐츠 또는 질문이 없어서 + 포인트를 너무 적게 줘서 + 내 정보를 삭제하고 싶어서 + 다른 앱이 더 재밌어서 + 기타 + diff --git a/data/src/main/java/com/example/data/datasource/ProfileDataSource.kt b/data/src/main/java/com/example/data/datasource/ProfileDataSource.kt index c0447d6d7..92ce35397 100644 --- a/data/src/main/java/com/example/data/datasource/ProfileDataSource.kt +++ b/data/src/main/java/com/example/data/datasource/ProfileDataSource.kt @@ -1,6 +1,7 @@ package com.example.data.datasource import com.example.data.model.request.profile.ProfileModRequestDto +import com.example.data.model.request.profile.RequestQuitReasonDto import com.example.data.model.response.BaseResponse import com.example.data.model.response.profile.ResponseProfileFriendsListDto import com.example.data.model.response.profile.ResponseProfileModValidDto @@ -14,16 +15,17 @@ interface ProfileDataSource { page: Int, ): BaseResponse - suspend fun deleteUserData(): BaseResponse + suspend fun deleteUserData( + request: RequestQuitReasonDto, + ): BaseResponse suspend fun deleteFriendData( friendId: Long, ): BaseResponse suspend fun postToModUserData( - request: ProfileModRequestDto + request: ProfileModRequestDto, ): BaseResponse - suspend fun getModValidData() : BaseResponse - + suspend fun getModValidData(): BaseResponse } diff --git a/data/src/main/java/com/example/data/datasource/paging/LookPagingSource.kt b/data/src/main/java/com/example/data/datasource/paging/LookPagingSource.kt index 8c147d5e0..1b41f0c8d 100644 --- a/data/src/main/java/com/example/data/datasource/paging/LookPagingSource.kt +++ b/data/src/main/java/com/example/data/datasource/paging/LookPagingSource.kt @@ -7,7 +7,8 @@ import com.example.domain.entity.LookListModel.LookModel import javax.inject.Inject class LookPagingSource @Inject constructor( - private val lookService: LookService + private val lookService: LookService, + private val onlyMine: Boolean, ) : PagingSource() { override fun getRefreshKey(state: PagingState): Int? { @@ -21,7 +22,11 @@ class LookPagingSource @Inject constructor( val currentPosition = params.key ?: 0 val currentPage = currentPosition.times(LOOK_POSITION_TO_PAGE).toInt() val response = runCatching { - lookService.getLookList(currentPage) + if (onlyMine) { + lookService.getLookList(currentPage, ONLY_MINE) + } else { + lookService.getLookList(currentPage) + } }.getOrElse { return LoadResult.Error(it) } @@ -42,5 +47,7 @@ class LookPagingSource @Inject constructor( companion object { const val LOOK_PAGE_SIZE = 10 const val LOOK_POSITION_TO_PAGE = 0.1 + + const val ONLY_MINE = "send" } } \ No newline at end of file diff --git a/data/src/main/java/com/example/data/datasource/remote/ProfileDataSourceImpl.kt b/data/src/main/java/com/example/data/datasource/remote/ProfileDataSourceImpl.kt index c05aabc28..e48f895ee 100644 --- a/data/src/main/java/com/example/data/datasource/remote/ProfileDataSourceImpl.kt +++ b/data/src/main/java/com/example/data/datasource/remote/ProfileDataSourceImpl.kt @@ -1,6 +1,7 @@ package com.example.data.datasource.remote import com.example.data.datasource.ProfileDataSource +import com.example.data.model.request.profile.RequestQuitReasonDto import com.example.data.model.request.profile.ProfileModRequestDto import com.example.data.model.response.BaseResponse import com.example.data.model.response.profile.ResponseProfileFriendsListDto @@ -23,10 +24,11 @@ class ProfileDataSourceImpl @Inject constructor( return profileService.getFriendsData(page) } - override suspend fun deleteUserData(): BaseResponse { - return profileService.deleteUserData() + override suspend fun deleteUserData(request: RequestQuitReasonDto): BaseResponse { + return profileService.deleteUserData(request) } + override suspend fun deleteFriendData( friendId: Long ): BaseResponse { diff --git a/data/src/main/java/com/example/data/model/request/profile/RequestQuitReasonDto.kt b/data/src/main/java/com/example/data/model/request/profile/RequestQuitReasonDto.kt new file mode 100644 index 000000000..1a07981de --- /dev/null +++ b/data/src/main/java/com/example/data/model/request/profile/RequestQuitReasonDto.kt @@ -0,0 +1,13 @@ +package com.example.data.model.request.profile + +import com.example.domain.entity.ProfileQuitReasonModel +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class RequestQuitReasonDto( + @SerialName("value") + val value: String, +) + +fun ProfileQuitReasonModel.toRequestDto() = RequestQuitReasonDto(value) diff --git a/data/src/main/java/com/example/data/model/response/look/ResponseLookListDto.kt b/data/src/main/java/com/example/data/model/response/look/ResponseLookListDto.kt index b40acc015..08df3c238 100644 --- a/data/src/main/java/com/example/data/model/response/look/ResponseLookListDto.kt +++ b/data/src/main/java/com/example/data/model/response/look/ResponseLookListDto.kt @@ -14,11 +14,25 @@ data class ResponseLookListDto( @Serializable data class LookDto( @SerialName("id") - val id: Int, - @SerialName("receiverName") - val receiverName: String, + val id: Long, + @SerialName("senderId") + val senderId: Long, + @SerialName("senderName") + val senderName: String, + @SerialName("senderYelloId") + val senderYelloId: String, @SerialName("senderGender") val senderGender: String, + @SerialName("senderProfileImage") + val senderProfileImage: String, + @SerialName("receiverId") + val receiverId: Long, + @SerialName("receiverName") + val receiverName: String, + @SerialName("receiverYelloId") + val receiverYelloId: String, + @SerialName("receiverGender") + val receiverGender: String, @SerialName("receiverProfileImage") val receiverProfileImage: String, @SerialName("vote") @@ -26,7 +40,9 @@ data class ResponseLookListDto( @SerialName("isHintUsed") val isHintUsed: Boolean, @SerialName("createdAt") - val createdAt: String + val createdAt: String, + @SerialName("isUserSenderVote") + val isUserSenderVote: Boolean ) { @Serializable data class LookVoteDto( @@ -59,7 +75,8 @@ data class ResponseLookListDto( it.vote.keywordFoot ), it.isHintUsed, - it.createdAt + it.createdAt, + it.isUserSenderVote ) } ) diff --git a/data/src/main/java/com/example/data/remote/service/LookService.kt b/data/src/main/java/com/example/data/remote/service/LookService.kt index ae3e0725e..1f583cee7 100644 --- a/data/src/main/java/com/example/data/remote/service/LookService.kt +++ b/data/src/main/java/com/example/data/remote/service/LookService.kt @@ -6,8 +6,10 @@ import retrofit2.http.GET import retrofit2.http.Query interface LookService { - @GET("/api/v1/vote/friend") + + @GET("/api/v2/vote/friend") suspend fun getLookList( @Query("page") page: Int, + @Query("type") type: String? = null ): BaseResponse } diff --git a/data/src/main/java/com/example/data/remote/service/ProfileService.kt b/data/src/main/java/com/example/data/remote/service/ProfileService.kt index 7f6079a9a..fb292cdac 100644 --- a/data/src/main/java/com/example/data/remote/service/ProfileService.kt +++ b/data/src/main/java/com/example/data/remote/service/ProfileService.kt @@ -1,6 +1,7 @@ package com.example.data.remote.service import com.example.data.model.request.profile.ProfileModRequestDto +import com.example.data.model.request.profile.RequestQuitReasonDto import com.example.data.model.response.BaseResponse import com.example.data.model.response.profile.ResponseProfileFriendsListDto import com.example.data.model.response.profile.ResponseProfileModValidDto @@ -8,6 +9,7 @@ import com.example.data.model.response.profile.ResponseProfileUserDto import retrofit2.http.Body import retrofit2.http.DELETE import retrofit2.http.GET +import retrofit2.http.HTTP import retrofit2.http.POST import retrofit2.http.Path import retrofit2.http.Query @@ -22,8 +24,10 @@ interface ProfileService { @Query("page") page: Int, ): BaseResponse - @DELETE("/api/v1/user") - suspend fun deleteUserData(): BaseResponse + @HTTP(method = "DELETE", path = "/api/v2/user", hasBody = true) + suspend fun deleteUserData( + @Body request: RequestQuitReasonDto, + ): BaseResponse @DELETE("/api/v1/friend/{friendId}") suspend fun deleteFriendData( @@ -32,10 +36,9 @@ interface ProfileService { @POST("/api/v1/user") suspend fun postToModUserData( - @Body request: ProfileModRequestDto + @Body request: ProfileModRequestDto, ): BaseResponse @GET("/api/v1/user/data/account-update-at") suspend fun getModValidData(): BaseResponse - } diff --git a/data/src/main/java/com/example/data/repository/OnboardingRepositoryImpl.kt b/data/src/main/java/com/example/data/repository/OnboardingRepositoryImpl.kt index cdbdd16dd..c3211bdbe 100644 --- a/data/src/main/java/com/example/data/repository/OnboardingRepositoryImpl.kt +++ b/data/src/main/java/com/example/data/repository/OnboardingRepositoryImpl.kt @@ -3,8 +3,8 @@ package com.example.data.repository import com.example.data.datasource.OnboardingDataSource import com.example.data.model.request.onboarding.toRequestDto import com.example.data.model.request.onboarding.toRequestPostSignupDto -import com.example.domain.entity.AuthTokenRequestModel import com.example.domain.entity.AuthTokenModel +import com.example.domain.entity.AuthTokenRequestModel import com.example.domain.entity.onboarding.AddFriendListModel import com.example.domain.entity.onboarding.GroupHighSchool import com.example.domain.entity.onboarding.GroupList diff --git a/data/src/main/java/com/example/data/repository/ProfileRepositoryImpl.kt b/data/src/main/java/com/example/data/repository/ProfileRepositoryImpl.kt index 6defb8848..02fad3499 100644 --- a/data/src/main/java/com/example/data/repository/ProfileRepositoryImpl.kt +++ b/data/src/main/java/com/example/data/repository/ProfileRepositoryImpl.kt @@ -5,6 +5,7 @@ import com.example.data.model.request.profile.toRequestDto import com.example.domain.entity.ProfileFriendsListModel import com.example.domain.entity.ProfileModRequestModel import com.example.domain.entity.ProfileModValidModel +import com.example.domain.entity.ProfileQuitReasonModel import com.example.domain.entity.ProfileUserModel import com.example.domain.repository.ProfileRepository import javax.inject.Inject @@ -20,21 +21,21 @@ class ProfileRepositoryImpl @Inject constructor( } override suspend fun getFriendsData( - page: Int + page: Int, ): Result { return runCatching { profileDataSource.getFriendsData(page).data?.toProfileFriendsListModel() } } - override suspend fun deleteUserData(): Result { + override suspend fun deleteUserData(request: ProfileQuitReasonModel): Result { return runCatching { - profileDataSource.deleteUserData().data + profileDataSource.deleteUserData(request.toRequestDto()) } } override suspend fun deleteFriendData( - friendId: Long + friendId: Long, ): Result { return runCatching { profileDataSource.deleteFriendData(friendId).data @@ -42,7 +43,7 @@ class ProfileRepositoryImpl @Inject constructor( } override suspend fun postToModUserData( - request: ProfileModRequestModel + request: ProfileModRequestModel, ): Result { return runCatching { profileDataSource.postToModUserData(request.toRequestDto()) @@ -54,5 +55,4 @@ class ProfileRepositoryImpl @Inject constructor( profileDataSource.getModValidData().data?.toProfileModValidModel() } } - } diff --git a/domain/src/main/java/com/example/domain/entity/LookListModel.kt b/domain/src/main/java/com/example/domain/entity/LookListModel.kt index 124e50c21..6e5258d85 100644 --- a/domain/src/main/java/com/example/domain/entity/LookListModel.kt +++ b/domain/src/main/java/com/example/domain/entity/LookListModel.kt @@ -5,13 +5,14 @@ data class LookListModel( val friendVotes: List ) { data class LookModel( - val id: Int, + val id: Long, val receiverName: String, val senderGender: String, val receiverProfileImage: String, val vote: LookVoteModel, val isHintUsed: Boolean, - val createdAt: String + val createdAt: String, + val isUserSenderVote: Boolean ) { data class LookVoteModel( val nameHead: String?, diff --git a/domain/src/main/java/com/example/domain/entity/ProfileQuitReasonModel.kt b/domain/src/main/java/com/example/domain/entity/ProfileQuitReasonModel.kt new file mode 100644 index 000000000..191d3130e --- /dev/null +++ b/domain/src/main/java/com/example/domain/entity/ProfileQuitReasonModel.kt @@ -0,0 +1,5 @@ +package com.example.domain.entity + +data class ProfileQuitReasonModel( + val value: String, +) \ No newline at end of file diff --git a/domain/src/main/java/com/example/domain/repository/OnboardingRepository.kt b/domain/src/main/java/com/example/domain/repository/OnboardingRepository.kt index e3f6f7740..045b08078 100644 --- a/domain/src/main/java/com/example/domain/repository/OnboardingRepository.kt +++ b/domain/src/main/java/com/example/domain/repository/OnboardingRepository.kt @@ -1,7 +1,7 @@ package com.example.domain.repository -import com.example.domain.entity.AuthTokenRequestModel import com.example.domain.entity.AuthTokenModel +import com.example.domain.entity.AuthTokenRequestModel import com.example.domain.entity.onboarding.AddFriendListModel import com.example.domain.entity.onboarding.GroupHighSchool import com.example.domain.entity.onboarding.GroupList diff --git a/domain/src/main/java/com/example/domain/repository/ProfileRepository.kt b/domain/src/main/java/com/example/domain/repository/ProfileRepository.kt index 0b71ad2fc..d78fe32a2 100644 --- a/domain/src/main/java/com/example/domain/repository/ProfileRepository.kt +++ b/domain/src/main/java/com/example/domain/repository/ProfileRepository.kt @@ -3,6 +3,7 @@ package com.example.domain.repository import com.example.domain.entity.ProfileFriendsListModel import com.example.domain.entity.ProfileModRequestModel import com.example.domain.entity.ProfileModValidModel +import com.example.domain.entity.ProfileQuitReasonModel import com.example.domain.entity.ProfileUserModel interface ProfileRepository { @@ -13,16 +14,17 @@ interface ProfileRepository { page: Int, ): Result - suspend fun deleteUserData(): Result + suspend fun deleteUserData( + request: ProfileQuitReasonModel, + ): Result suspend fun deleteFriendData( friendId: Long, ): Result suspend fun postToModUserData( - request: ProfileModRequestModel + request: ProfileModRequestModel, ): Result - suspend fun getModValidData() : Result - + suspend fun getModValidData(): Result }