diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 41e0209..45cbb88 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,8 @@ + package="com.ftw.hometerview" + > @@ -19,51 +20,67 @@ android:supportsRtl="true" android:theme="@style/Theme.Hometerview" android:usesCleartextTraffic="true" - tools:targetApi="31"> + tools:targetApi="31" + > + + + + - + android:exported="false" + /> - + android:exported="false" + /> - + android:exported="false" + /> - + android:exported="false" + /> - + android:exported="false" + /> - + android:exported="false" + /> - + tools:ignore="Instantiatable" + /> + android:exported="true" + > - - + android:exported="true" + > @@ -87,13 +105,15 @@ + android:scheme="@string/kakao_scheme" + /> + android:value="@string/kakao_api_key" + /> diff --git a/app/src/main/java/com/ftw/hometerview/di/ui/ActivityViewModelModule.kt b/app/src/main/java/com/ftw/hometerview/di/ui/ActivityViewModelModule.kt index 1141f4d..80bcff5 100644 --- a/app/src/main/java/com/ftw/hometerview/di/ui/ActivityViewModelModule.kt +++ b/app/src/main/java/com/ftw/hometerview/di/ui/ActivityViewModelModule.kt @@ -4,18 +4,24 @@ import com.ftw.domain.usecase.buildingreview.GetBuildingReviewsUseCase import com.ftw.domain.usecase.login.LoginUseCase import com.ftw.domain.usecase.review.GetLocationReviewsUseCase import com.ftw.domain.usecase.searchaddressbuilding.GetSearchAddressBuildingUseCase +import com.ftw.domain.usecase.myreviews.GetMyReviewsUseCase import com.ftw.hometerview.dispatcher.Dispatcher import com.ftw.hometerview.ui.buildingreview.BuildingReviewViewModel import com.ftw.hometerview.ui.main.MainViewModel import com.ftw.hometerview.ui.main.home.review.LocationReviewListViewModel +import com.ftw.hometerview.ui.manageaccount.ManageAccountViewModel import com.ftw.hometerview.ui.searchaddressbuilding.SearchAddressBuildingViewModel import com.ftw.hometerview.ui.searchcompanyresult.SearchCompanyResultViewModel import com.ftw.hometerview.ui.splash.SplashViewModel +import com.ftw.hometerview.ui.updatenickname.UpdateNicknameViewModel +import com.ftw.hometerview.ui.myreviews.MyReviewsViewModel +import com.ftw.hometerview.ui.withdrawal.WithdrawalViewModel import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.components.ActivityComponent import dagger.hilt.android.scopes.ActivityScoped +import dagger.hilt.android.scopes.FragmentScoped import javax.inject.Named @Module @@ -81,4 +87,42 @@ class ActivityViewModelModule { getBuildingReviewsUseCase ) } + + @Provides + @ActivityScoped + fun provideUpdateNicknameViewModel( + dispatcher: Dispatcher + ): UpdateNicknameViewModel { + return UpdateNicknameViewModel( + dispatcher + ) + } + + @Provides + @ActivityScoped + fun provideMyReviewsViewModel( + dispatcher: Dispatcher, + getMyReviewsUseCase: GetMyReviewsUseCase + ): MyReviewsViewModel { + return MyReviewsViewModel( + dispatcher, + getMyReviewsUseCase + ) + } + + @Provides + @ActivityScoped + fun provideManageAccountViewModel(): ManageAccountViewModel { + return ManageAccountViewModel() + } + + @Provides + @ActivityScoped + fun provideWithdrawalViewModel( + dispatcher: Dispatcher + ): WithdrawalViewModel { + return WithdrawalViewModel( + dispatcher + ) + } } diff --git a/app/src/main/java/com/ftw/hometerview/di/ui/MainFragmentViewModelModule.kt b/app/src/main/java/com/ftw/hometerview/di/ui/MainFragmentViewModelModule.kt index 44210bd..8eb8c26 100644 --- a/app/src/main/java/com/ftw/hometerview/di/ui/MainFragmentViewModelModule.kt +++ b/app/src/main/java/com/ftw/hometerview/di/ui/MainFragmentViewModelModule.kt @@ -9,6 +9,7 @@ import com.ftw.hometerview.ui.main.favorite.favoritelist.FavoriteBuildingsViewMo import com.ftw.hometerview.ui.main.favorite.favoritelist.FavoriteReviewsViewModel import com.ftw.hometerview.ui.main.home.HomeViewModel import com.ftw.hometerview.ui.main.home.review.LocationReviewListViewModel +import com.ftw.hometerview.ui.main.mypage.MyPageViewModel import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -47,6 +48,18 @@ class MainFragmentViewModelModule { ) } + @Provides + @FragmentScoped + fun provideUpdateNicknameViewModel( + dispatcher: Dispatcher, + getCachedUserUseCase: GetCachedUserUseCase + ): MyPageViewModel { + return MyPageViewModel( + dispatcher, + getCachedUserUseCase + ) + } + @Provides @FragmentScoped @@ -71,4 +84,5 @@ class MainFragmentViewModelModule { getFavoriteReviewsUseCase ) } + } diff --git a/app/src/main/java/com/ftw/hometerview/di/usecase/MyReviewsUseCaseModule.kt b/app/src/main/java/com/ftw/hometerview/di/usecase/MyReviewsUseCaseModule.kt new file mode 100644 index 0000000..06c4cce --- /dev/null +++ b/app/src/main/java/com/ftw/hometerview/di/usecase/MyReviewsUseCaseModule.kt @@ -0,0 +1,19 @@ +package com.ftw.hometerview.di.usecase + +import com.ftw.domain.usecase.myreviews.GetMyReviewsUseCase +import com.ftw.domain.usecase.myreviews.GetMyReviewsUseCaseImpl +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +class MyReviewsUseCaseModule { + @Provides + @Singleton + fun provideGetMyReviewsUseCase(): GetMyReviewsUseCase { + return GetMyReviewsUseCaseImpl() + } +} diff --git a/app/src/main/java/com/ftw/hometerview/ui/dialog/LogoutDialog.kt b/app/src/main/java/com/ftw/hometerview/ui/dialog/LogoutDialog.kt new file mode 100644 index 0000000..ae86bfd --- /dev/null +++ b/app/src/main/java/com/ftw/hometerview/ui/dialog/LogoutDialog.kt @@ -0,0 +1,41 @@ +package com.ftw.hometerview.ui.dialog + +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.DialogFragment +import com.ftw.hometerview.databinding.DialogLogoutBinding + +class LogoutDialog() : DialogFragment() { + private var _binding: DialogLogoutBinding? = null + private val binding get() = _binding!! + + interface Listener { + fun onClickLogoutFromLogoutDialog() + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = DialogLogoutBinding.inflate(inflater, container, false) + val view = binding.root + dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + binding.logoutSelect.setOnClickListener { + (parentFragment as? Listener)?.onClickLogoutFromLogoutDialog() + } + binding.logoutCancle.setOnClickListener { + dismiss() + } + return view + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} diff --git a/app/src/main/java/com/ftw/hometerview/ui/main/home/HomeViewModel.kt b/app/src/main/java/com/ftw/hometerview/ui/main/home/HomeViewModel.kt index 9112848..0d3abcb 100644 --- a/app/src/main/java/com/ftw/hometerview/ui/main/home/HomeViewModel.kt +++ b/app/src/main/java/com/ftw/hometerview/ui/main/home/HomeViewModel.kt @@ -41,7 +41,7 @@ class HomeViewModel( flow { emit(getCachedUserUseCase()) } - .catch { emit(User(Company.NONE)) } + .catch { emit(User("", Company.NONE)) } .collect { _user.value = it } diff --git a/app/src/main/java/com/ftw/hometerview/ui/main/mypage/MyPageFragment.kt b/app/src/main/java/com/ftw/hometerview/ui/main/mypage/MyPageFragment.kt index 1ed264f..cfdf37d 100644 --- a/app/src/main/java/com/ftw/hometerview/ui/main/mypage/MyPageFragment.kt +++ b/app/src/main/java/com/ftw/hometerview/ui/main/mypage/MyPageFragment.kt @@ -1,32 +1,168 @@ package com.ftw.hometerview.ui.main.mypage +import android.app.Activity +import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.animation.Animation +import android.view.animation.AnimationUtils +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.view.isVisible +import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import com.ftw.hometerview.R +import com.ftw.hometerview.databinding.FragmentMyPageBinding +import com.ftw.hometerview.ui.dialog.LogoutDialog +import com.ftw.hometerview.ui.login.LoginActivity +import com.ftw.hometerview.ui.manageaccount.ManageAccountActivity +import com.ftw.hometerview.ui.updatenickname.UpdateNicknameActivity +import com.ftw.hometerview.ui.myreviews.MyReviewsActivity +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch +import javax.inject.Inject -class MyPageFragment : Fragment() { +@AndroidEntryPoint +class MyPageFragment : Fragment(), LogoutDialog.Listener { + + private lateinit var updateNicknameLauncher: ActivityResultLauncher companion object { fun newInstance() = MyPageFragment() } - private lateinit var viewModel: MyPageViewModel + private var _binding: FragmentMyPageBinding? = null + private val binding get() = _binding!! + + @Inject + lateinit var viewModel: MyPageViewModel override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - return inflater.inflate(R.layout.fragment_my_page, container, false) + _binding = DataBindingUtil.inflate( + inflater, + R.layout.fragment_my_page, + container, + false + ).apply { + viewModel = this@MyPageFragment.viewModel + } + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setLauncher() + observeEvent() + observeShowBanner() } - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - viewModel = ViewModelProvider(this).get(MyPageViewModel::class.java) - // TODO: Use the ViewModel + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + private fun observeEvent() { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.event.collect { event -> + when (event) { + MyPageViewModel.Event.None -> {} + is MyPageViewModel.Event.OnClickUpdateNickname -> updateNicknameActivity(event.nickname) + MyPageViewModel.Event.OnClickWrittenReview -> writtenReviewActivity() + MyPageViewModel.Event.OnClickManageAccount -> manageAccountActivity() + MyPageViewModel.Event.OnClickLogout -> onClickLogoutDialog() + } + } + } + } + } + + private fun observeShowBanner() { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.showPopup.collect { showBanner -> + + binding.updateCompletePopup.isVisible = showBanner + if (showBanner) { + binding.updateCompletePopup.apply { + + visibility = View.INVISIBLE + + val appearAnimation = + AnimationUtils.loadAnimation(requireContext(), R.anim.appear_popup) + val fadeoutAnimation = + AnimationUtils.loadAnimation(requireContext(), R.anim.anim_fade_out) + + appearAnimation.setAnimationListener(object : + Animation.AnimationListener { + override fun onAnimationStart(arg0: Animation) { + visibility = View.VISIBLE + } + override fun onAnimationRepeat(arg0: Animation) {} + override fun onAnimationEnd(arg0: Animation) { + startAnimation(fadeoutAnimation) + } + }) + + fadeoutAnimation.setAnimationListener(object : + Animation.AnimationListener { + override fun onAnimationStart(arg0: Animation) {} + override fun onAnimationRepeat(arg0: Animation) {} + override fun onAnimationEnd(arg0: Animation) { + visibility = View.GONE + viewModel.showPopup.value = false + } + }) + + startAnimation(appearAnimation) + } + } + } + } + } + } + + private fun updateNicknameActivity(nickname: String) { + updateNicknameLauncher.launch(UpdateNicknameActivity.newIntent(requireContext(), nickname)) + } + + private fun writtenReviewActivity() { + startActivity(MyReviewsActivity.newIntent(requireContext())) + } + + private fun manageAccountActivity() { + startActivity(ManageAccountActivity.newIntent(requireContext())) + } + + private fun onClickLogoutDialog(){ + val logoutDialog = LogoutDialog() + logoutDialog.show(childFragmentManager, "CustomDialog") + } + + override fun onClickLogoutFromLogoutDialog(){ + requireActivity().apply { + finish() + startActivity(LoginActivity.newIntent(requireContext())) + } + } + + private fun setLauncher() { + updateNicknameLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult + val nickname = + result.data?.getStringExtra(UpdateNicknameActivity.UPDATE_NICKNAME_ARGUMENT_KEY) + if (nickname == null) return@registerForActivityResult + viewModel.showPopup.value = true + } } } diff --git a/app/src/main/java/com/ftw/hometerview/ui/main/mypage/MyPageViewModel.kt b/app/src/main/java/com/ftw/hometerview/ui/main/mypage/MyPageViewModel.kt index e5e6eaf..1136dfb 100644 --- a/app/src/main/java/com/ftw/hometerview/ui/main/mypage/MyPageViewModel.kt +++ b/app/src/main/java/com/ftw/hometerview/ui/main/mypage/MyPageViewModel.kt @@ -1,7 +1,63 @@ package com.ftw.hometerview.ui.main.mypage -import androidx.lifecycle.ViewModel +import com.ftw.domain.entity.Company +import com.ftw.domain.entity.User +import com.ftw.domain.usecase.user.GetCachedUserUseCase +import com.ftw.hometerview.dispatcher.Dispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.* +import kotlinx.coroutines.launch -class MyPageViewModel : ViewModel() { - // TODO: Implement the ViewModel +class MyPageViewModel ( + dispatcher: Dispatcher, + private val getCachedUserUseCase: GetCachedUserUseCase +) { + + sealed class Event { + object None : Event() + class OnClickUpdateNickname(val nickname: String) : Event() + object OnClickWrittenReview : Event() + object OnClickManageAccount : Event() + object OnClickLogout : Event() + } + + private val _user: MutableStateFlow = MutableStateFlow(User.NONE) + val user: StateFlow = _user.asStateFlow() + + private val _event: MutableStateFlow = MutableStateFlow(Event.None) + val event: StateFlow = _event.asStateFlow() + + val showPopup: MutableStateFlow = MutableStateFlow(false) + + init { + CoroutineScope(dispatcher.ui()).launch { + flow { + emit(getCachedUserUseCase()) + } + .catch { emit(User("", Company.NONE)) } + .collect { + _user.value = it + } + } + } + + fun onClickUpdateNickname() { + _event.value = Event.OnClickUpdateNickname(user.value.nickName) + _event.value = Event.None + } + + fun onClickWrittenReview() { + _event.value = Event.OnClickWrittenReview + _event.value = Event.None + } + + fun onClickManageAccount() { + _event.value = Event.OnClickManageAccount + _event.value = Event.None + } + + fun onClickLogout() { + _event.value = Event.OnClickLogout + _event.value = Event.None + } } diff --git a/app/src/main/java/com/ftw/hometerview/ui/manageaccount/ManageAccountActivity.kt b/app/src/main/java/com/ftw/hometerview/ui/manageaccount/ManageAccountActivity.kt new file mode 100644 index 0000000..da94cc3 --- /dev/null +++ b/app/src/main/java/com/ftw/hometerview/ui/manageaccount/ManageAccountActivity.kt @@ -0,0 +1,68 @@ +package com.ftw.hometerview.ui.manageaccount + +import android.content.Context +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.ftw.hometerview.R +import com.ftw.hometerview.databinding.ActivityManageAccountBinding +import com.ftw.hometerview.ui.withdrawal.WithdrawalActivity +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch +import javax.inject.Inject + +@AndroidEntryPoint +class ManageAccountActivity : AppCompatActivity() { + + companion object { + fun newIntent(context: Context): Intent { + return Intent(context, ManageAccountActivity::class.java) + } + } + + @Inject + lateinit var viewModel: ManageAccountViewModel + + private lateinit var binding: ActivityManageAccountBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView( + this, + R.layout.activity_manage_account + ).apply { + viewModel = this@ManageAccountActivity.viewModel + } + observe() + } + + + private fun observe() { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.event.collect { event -> + when (event) { + ManageAccountViewModel.Event.None -> {} + ManageAccountViewModel.Event.onClickServiceUseTerms -> onClickServiceUseTerms() + ManageAccountViewModel.Event.onClickUseUserInfo -> onClickUseUserInfo() + ManageAccountViewModel.Event.onClickLocationForService -> onClickLocationForService() + ManageAccountViewModel.Event.onClickOpenSourceLibrary -> onClickOpenSourceLibrary() + ManageAccountViewModel.Event.onClickWithdrawal -> onClickWithdrawal() + } + } + } + } + } + + private fun onClickServiceUseTerms() { } + private fun onClickUseUserInfo() { } + private fun onClickLocationForService() { } + private fun onClickOpenSourceLibrary() { } + private fun onClickWithdrawal() { + startActivity(WithdrawalActivity.newIntent(this)) + } +} diff --git a/app/src/main/java/com/ftw/hometerview/ui/manageaccount/ManageAccountViewModel.kt b/app/src/main/java/com/ftw/hometerview/ui/manageaccount/ManageAccountViewModel.kt new file mode 100644 index 0000000..65fd0a9 --- /dev/null +++ b/app/src/main/java/com/ftw/hometerview/ui/manageaccount/ManageAccountViewModel.kt @@ -0,0 +1,39 @@ +package com.ftw.hometerview.ui.manageaccount + +import kotlinx.coroutines.flow.* + +class ManageAccountViewModel() { + + sealed class Event { + object None : Event() + object onClickServiceUseTerms : Event() + object onClickUseUserInfo : Event() + object onClickLocationForService : Event() + object onClickOpenSourceLibrary : Event() + object onClickWithdrawal : Event() + } + + private val _event: MutableStateFlow = MutableStateFlow(Event.None) + val event: StateFlow = _event.asStateFlow() + + fun onClickServiceUseTerms() { + _event.value = Event.onClickServiceUseTerms + _event.value = Event.None + } + fun onClickUseUserInfo() { + _event.value = Event.onClickUseUserInfo + _event.value = Event.None + } + fun onClickLocationForService() { + _event.value = Event.onClickLocationForService + _event.value = Event.None + } + fun onClickOpenSourceLibrary() { + _event.value = Event.onClickOpenSourceLibrary + _event.value = Event.None + } + fun onClickWithdrawal() { + _event.value = Event.onClickWithdrawal + _event.value = Event.None + } +} diff --git a/app/src/main/java/com/ftw/hometerview/ui/myreviews/MyReviewsActivity.kt b/app/src/main/java/com/ftw/hometerview/ui/myreviews/MyReviewsActivity.kt new file mode 100644 index 0000000..fd9003c --- /dev/null +++ b/app/src/main/java/com/ftw/hometerview/ui/myreviews/MyReviewsActivity.kt @@ -0,0 +1,74 @@ +package com.ftw.hometerview.ui.myreviews + +import android.content.Context +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.ftw.hometerview.R +import com.ftw.hometerview.adapter.DataBindingRecyclerAdapter +import com.ftw.hometerview.adapter.SpacingItemDecoration +import com.ftw.hometerview.databinding.ActivityMyReviewsBinding +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch +import javax.inject.Inject + +@AndroidEntryPoint +class MyReviewsActivity : AppCompatActivity() { + + companion object { + fun newIntent(context: Context): Intent { + return Intent(context, MyReviewsActivity::class.java) + } + } + + @Inject + lateinit var viewModel: MyReviewsViewModel + + private lateinit var binding: ActivityMyReviewsBinding + + private val adapter = DataBindingRecyclerAdapter() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView( + this, + R.layout.activity_my_reviews + ).apply { + viewModel = this@MyReviewsActivity.viewModel + } + + initList() + observe() + } + + private fun initList() { + binding.myReviewRecyclerview.adapter = adapter + this.let { binding.myReviewRecyclerview.addItemDecoration(SpacingItemDecoration(it)) } + } + + private fun observe() { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.myReviewsItems.collect { + adapter.submitList(it) + } + } + } + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.event.collect { event -> + when (event) { + MyReviewsViewModel.Event.None -> {} + MyReviewsViewModel.Event.onClickWriteReview -> { + // ㄹㅣ뷰 작성 화면으로 이동 + } + } + } + } + } + } +} diff --git a/app/src/main/java/com/ftw/hometerview/ui/myreviews/MyReviewsViewModel.kt b/app/src/main/java/com/ftw/hometerview/ui/myreviews/MyReviewsViewModel.kt new file mode 100644 index 0000000..83b4572 --- /dev/null +++ b/app/src/main/java/com/ftw/hometerview/ui/myreviews/MyReviewsViewModel.kt @@ -0,0 +1,66 @@ +package com.ftw.hometerview.ui.myreviews + +import com.ftw.domain.entity.Review +import com.ftw.domain.usecase.myreviews.GetMyReviewsUseCase +import com.ftw.hometerview.BR +import com.ftw.hometerview.R +import com.ftw.hometerview.adapter.RecyclerItem +import com.ftw.hometerview.dispatcher.Dispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.* + +class MyReviewsViewModel( + dispatcher: Dispatcher, + private val getMyReviewsUseCase: GetMyReviewsUseCase +) { + + sealed class State { + object Loading : State() + class OnClickReview(val buildingId: Long) : State() + } + + sealed class Event { + object None : Event() + object onClickWriteReview : Event() + } + + private val _event: MutableStateFlow = MutableStateFlow(Event.None) + val event: StateFlow = _event.asStateFlow() + + private val _state: MutableStateFlow = MutableStateFlow(State.Loading) + val state: StateFlow = _state.asStateFlow() + + val myReviewsItems: StateFlow> = + flow { + emit( + getMyReviewsUseCase() + .map { myReview -> + RecyclerItem( + data = MyReviewItem( + onClickItem = { buildingId -> + _state.value = State.OnClickReview(buildingId) + }, + myReview = myReview + ), + layoutId = R.layout.list_item_my_review, + variableId = BR.item + ) + } + ) + }.stateIn(CoroutineScope(dispatcher.ui()), SharingStarted.Eagerly, emptyList()) + + fun onClickWriteReview() { + _event.value = Event.onClickWriteReview + _event.value = Event.None + } +} + +data class MyReviewItem( + val onClickItem: (buildingId: Long) -> Unit, + val myReview: Review +) { + + fun onItemClick() { + onClickItem(myReview.buildingId) + } +} diff --git a/app/src/main/java/com/ftw/hometerview/ui/updatenickname/UpdateNicknameActivity.kt b/app/src/main/java/com/ftw/hometerview/ui/updatenickname/UpdateNicknameActivity.kt new file mode 100644 index 0000000..2fdf84f --- /dev/null +++ b/app/src/main/java/com/ftw/hometerview/ui/updatenickname/UpdateNicknameActivity.kt @@ -0,0 +1,79 @@ +package com.ftw.hometerview.ui.updatenickname + +import android.app.Activity +import android.content.Context +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.os.Parcelable +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.ftw.hometerview.R +import com.ftw.hometerview.databinding.ActivityUpdateNickNameBinding +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch +import kotlinx.parcelize.Parcelize +import javax.inject.Inject + +@AndroidEntryPoint +class UpdateNicknameActivity : AppCompatActivity() { + + companion object { + val UPDATE_NICKNAME_ARGUMENT_KEY = "UPDATE_NICKNAME_ARGUMENT_KEY" + fun newIntent(context: Context, nickname: String): Intent { + return Intent(context, UpdateNicknameActivity::class.java) + .putExtra(UPDATE_NICKNAME_ARGUMENT_KEY, nickname) + } + } + + @Inject + lateinit var viewModel: UpdateNicknameViewModel + + private lateinit var binding: ActivityUpdateNickNameBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = DataBindingUtil.setContentView( + this, + R.layout.activity_update_nick_name + ).apply { + lifecycleOwner = this@UpdateNicknameActivity + viewModel = this@UpdateNicknameActivity.viewModel + } + + val nickname = intent.getStringExtra(UPDATE_NICKNAME_ARGUMENT_KEY) ?: return + viewModel.nickname.value = nickname + observe() + } + + fun observe() { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.event.collect { event -> + when (event) { + UpdateNicknameViewModel.Event.None -> {} + is UpdateNicknameViewModel.Event.OnClickNext -> { + onClickNextFromThirdStepSearchCompany(event.nickname) + } + } + } + } + } + } + + private fun onClickNextFromThirdStepSearchCompany(nickname: String) { + setResult( + Activity.RESULT_OK, + Intent().putExtra(UPDATE_NICKNAME_ARGUMENT_KEY, nickname) + ) + finish() + } + + @Parcelize + private data class Argument( + val nickname: String + ) : Parcelable +} diff --git a/app/src/main/java/com/ftw/hometerview/ui/updatenickname/UpdateNicknameViewModel.kt b/app/src/main/java/com/ftw/hometerview/ui/updatenickname/UpdateNicknameViewModel.kt new file mode 100644 index 0000000..575166b --- /dev/null +++ b/app/src/main/java/com/ftw/hometerview/ui/updatenickname/UpdateNicknameViewModel.kt @@ -0,0 +1,27 @@ +package com.ftw.hometerview.ui.updatenickname + +import com.ftw.hometerview.dispatcher.Dispatcher +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +class UpdateNicknameViewModel( + dispatcher: Dispatcher +) { + + sealed class Event { + object None : Event() + class OnClickNext(val nickname: String) : Event() + } + + private val _event: MutableStateFlow = MutableStateFlow(Event.None) + val event: StateFlow = _event.asStateFlow() + + val nickname: MutableStateFlow = MutableStateFlow("") + + + fun onClickUpdateComplete() { + _event.value = Event.OnClickNext(nickname.value) + _event.value = Event.None + } +} diff --git a/app/src/main/java/com/ftw/hometerview/ui/withdrawal/WithdrawalActivity.kt b/app/src/main/java/com/ftw/hometerview/ui/withdrawal/WithdrawalActivity.kt new file mode 100644 index 0000000..3399546 --- /dev/null +++ b/app/src/main/java/com/ftw/hometerview/ui/withdrawal/WithdrawalActivity.kt @@ -0,0 +1,38 @@ +package com.ftw.hometerview.ui.withdrawal + +import android.content.Context +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import androidx.databinding.DataBindingUtil +import com.ftw.hometerview.R +import com.ftw.hometerview.databinding.ActivityWithdrawalBinding +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject + +@AndroidEntryPoint +class WithdrawalActivity : AppCompatActivity() { + + companion object { + fun newIntent(context: Context): Intent { + return Intent(context, WithdrawalActivity::class.java) + } + } + + @Inject + lateinit var viewModel: WithdrawalViewModel + + private lateinit var binding: ActivityWithdrawalBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView( + this, + R.layout.activity_withdrawal + ).apply { + lifecycleOwner = this@WithdrawalActivity + viewModel = this@WithdrawalActivity.viewModel + } + } + +} diff --git a/app/src/main/java/com/ftw/hometerview/ui/withdrawal/WithdrawalViewModel.kt b/app/src/main/java/com/ftw/hometerview/ui/withdrawal/WithdrawalViewModel.kt new file mode 100644 index 0000000..6b4be03 --- /dev/null +++ b/app/src/main/java/com/ftw/hometerview/ui/withdrawal/WithdrawalViewModel.kt @@ -0,0 +1,38 @@ +package com.ftw.hometerview.ui.withdrawal + +import com.ftw.hometerview.dispatcher.Dispatcher +import kotlinx.coroutines.flow.* + +class WithdrawalViewModel( + dispatcher: Dispatcher +) { + + val withdrawalFirstCheck: MutableStateFlow = MutableStateFlow(false) + val withdrawalSecondCheck: MutableStateFlow = MutableStateFlow(false) + val withdrawalThirdCheck: MutableStateFlow = MutableStateFlow(false) + val withdrawalCheck: MutableStateFlow = MutableStateFlow(false) + + + fun onClickWithdrawalFirstCheck() { + withdrawalFirstCheck.value = !withdrawalFirstCheck.value + withdrawalCheck.value = withdrawalCheck() + } + + fun onClickWithdrawalSecondCheck() { + withdrawalSecondCheck.value = !withdrawalSecondCheck.value + withdrawalCheck.value = withdrawalCheck() + } + + fun onClickWithdrawalThirdCheck() { + withdrawalThirdCheck.value = !withdrawalThirdCheck.value + withdrawalCheck.value = withdrawalCheck() + } + + private fun withdrawalCheck(): Boolean { + if (withdrawalFirstCheck.value + && withdrawalSecondCheck.value + && withdrawalThirdCheck.value + ) return true + return false + } +} diff --git a/app/src/main/res/anim/appear_popup.xml b/app/src/main/res/anim/appear_popup.xml new file mode 100644 index 0000000..6ff340b --- /dev/null +++ b/app/src/main/res/anim/appear_popup.xml @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/icon_check_disabled.png b/app/src/main/res/drawable-xhdpi/icon_check_disabled.png new file mode 100644 index 0000000..a9be2d8 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_check_disabled.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_check_enabled.png b/app/src/main/res/drawable-xhdpi/icon_check_enabled.png new file mode 100644 index 0000000..66e1c4f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_check_enabled.png differ diff --git a/app/src/main/res/drawable/ic_baseline_check_circle_24.xml b/app/src/main/res/drawable/ic_baseline_check_circle_24.xml new file mode 100644 index 0000000..625e95e --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_check_circle_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_uncheck_circle_24.xml b/app/src/main/res/drawable/ic_baseline_uncheck_circle_24.xml new file mode 100644 index 0000000..bc5180a --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_uncheck_circle_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/round_background_white.xml b/app/src/main/res/drawable/round_background_white.xml new file mode 100644 index 0000000..e08d22a --- /dev/null +++ b/app/src/main/res/drawable/round_background_white.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/selector_bg_checkbox.xml b/app/src/main/res/drawable/selector_bg_checkbox.xml new file mode 100644 index 0000000..03582ee --- /dev/null +++ b/app/src/main/res/drawable/selector_bg_checkbox.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/activity_create_review.xml b/app/src/main/res/layout/activity_create_review.xml index f8385e3..33e30b7 100644 --- a/app/src/main/res/layout/activity_create_review.xml +++ b/app/src/main/res/layout/activity_create_review.xml @@ -1,5 +1,6 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_my_reviews.xml b/app/src/main/res/layout/activity_my_reviews.xml new file mode 100644 index 0000000..898137f --- /dev/null +++ b/app/src/main/res/layout/activity_my_reviews.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_update_nick_name.xml b/app/src/main/res/layout/activity_update_nick_name.xml new file mode 100644 index 0000000..ca8fbdb --- /dev/null +++ b/app/src/main/res/layout/activity_update_nick_name.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_withdrawal.xml b/app/src/main/res/layout/activity_withdrawal.xml new file mode 100644 index 0000000..52d5c47 --- /dev/null +++ b/app/src/main/res/layout/activity_withdrawal.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_logout.xml b/app/src/main/res/layout/dialog_logout.xml new file mode 100644 index 0000000..3fd24fd --- /dev/null +++ b/app/src/main/res/layout/dialog_logout.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_my_page.xml b/app/src/main/res/layout/fragment_my_page.xml index ea8a532..b5a08e8 100644 --- a/app/src/main/res/layout/fragment_my_page.xml +++ b/app/src/main/res/layout/fragment_my_page.xml @@ -1,15 +1,408 @@ - - + + + + + + + tools:context=".ui.main.mypage.MyPageFragment" + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/app/src/main/res/layout/list_item_my_review.xml b/app/src/main/res/layout/list_item_my_review.xml new file mode 100644 index 0000000..cb7d5f1 --- /dev/null +++ b/app/src/main/res/layout/list_item_my_review.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/dimen.xml b/app/src/main/res/values/dimen.xml index 062939c..7f3bd42 100644 --- a/app/src/main/res/values/dimen.xml +++ b/app/src/main/res/values/dimen.xml @@ -7,6 +7,7 @@ 12sp 13sp 14sp + 15sp 16sp 18sp 20sp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b04114a..a484f58 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -108,4 +108,41 @@ 개의 리뷰 저장한 리뷰 저장한 건물 + %s / 20 자 + 닉네임이 변경되었어요! + + + 내가 작성한 집터뷰 + 집터뷰 작성하기 + 작성한 집터뷰가 없어요 + + 내 정보 + 닉네임 + 직장 + 활동 + 내가 작성한 집터뷰 + 계정 + 계정 관리 + 로그아웃 + 현재 버전 + 회사를 입력해주세요 + 6.5.1 (65101) + 내가 작성한 집터뷰 + 계정 관리 + 회원탈퇴 + 서비스 이용약관 + 개인정보 처리방침 + 위치기반 서비스 이용약관 + 오픈소스 라이센스 + 회원 탈퇴 + 탈퇴하기 + 회원 탈뢰 전 아래의 내용을 꼭 확인해 주세요. + 회원 탈퇴 시 회원 정보 및 서비스 이용 기록은 모두 삭제되며, 삭제된 데이터는 복구가 불가능합니다. 다만 법령에 의하여 보관해야 하는 경우 또는 회사 내부 정책에 의하여 보관해야 하는 정보는 탈퇴 후에도 일정 기간 보관됩니다. 자세한 사항은 개인정보처리방침에서 확인하실 수 있습니다. + 회원 탈퇴 후 재가입하더라도 탈퇴 전의 회원 정보 및 서비스 이용 기록은 복구되지 않습니다. + 회원을 탈퇴하더라도 집터뷰 서비스에 기록한 리뷰, 댓글 등의 게시물은 삭제되지 않습니다. 회원을 퇄퇴하면, 개인정보가 삭제되며 게시물을 수정하거나 삭제할 수 없으니게시물 삭제가 필요한 회원은 게시물 삭제 후 탈퇴 신청하시기 바랍니다. + + 취소 + 로그아웃 하시겠습니까? + 확인 + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index b2efc4a..5dc57d4 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -30,6 +30,18 @@ @drawable/selector_rating_bar_star_28 + + + + diff --git a/design/src/main/java/com/ftw/hometerview/design/MainButton.kt b/design/src/main/java/com/ftw/hometerview/design/MainButton.kt index f72b32b..d0499ae 100644 --- a/design/src/main/java/com/ftw/hometerview/design/MainButton.kt +++ b/design/src/main/java/com/ftw/hometerview/design/MainButton.kt @@ -12,6 +12,7 @@ import androidx.core.view.updatePadding private const val DEFAULT_ALIGNMENT = TEXT_ALIGNMENT_CENTER private const val DEFAULT_ELEVATION = 10.0f +private const val DEFAULT_ENABLED = true @RequiresApi(Build.VERSION_CODES.M) class MainButton @JvmOverloads constructor( @@ -30,8 +31,8 @@ class MainButton @JvmOverloads constructor( init { inflate(context, R.layout.view_main_button, this) titleTextView = findViewById(R.id.title_text_view) - - setBackgroundResource(R.drawable.button_main_button) + + setBackgroundResource(R.drawable.selector_bg_main_button) val horizontalPadding = resources.getDimensionPixelSize(R.dimen.button_horizontal_padding) val verticalPadding = resources.getDimensionPixelSize(R.dimen.main_button_vertical_padding) updatePadding( @@ -51,6 +52,7 @@ class MainButton @JvmOverloads constructor( text = getString(R.styleable.MainButton_android_text) titleTextView.textAlignment = getInt(R.styleable.MainButton_android_textAlignment, DEFAULT_ALIGNMENT) elevation = getFloat(R.styleable.MainButton_android_elevation, DEFAULT_ELEVATION) + isEnabled = getBoolean(R.styleable.MainButton_android_enabled, DEFAULT_ENABLED) } catch (e: Exception) { } finally { recycle() @@ -68,4 +70,8 @@ class MainButton @JvmOverloads constructor( children.forEach { it.textAlignment = textAlignment } } + override fun setEnabled(enabled: Boolean) { + super.setEnabled(enabled) + children.forEach { it.isEnabled = enabled } + } } diff --git a/design/src/main/res/drawable/bg_button_disabled.xml b/design/src/main/res/drawable/bg_button_disabled.xml index b916fb9..8582e69 100644 --- a/design/src/main/res/drawable/bg_button_disabled.xml +++ b/design/src/main/res/drawable/bg_button_disabled.xml @@ -2,7 +2,6 @@ - - + diff --git a/design/src/main/res/drawable/selector_bg_main_button.xml b/design/src/main/res/drawable/selector_bg_main_button.xml new file mode 100644 index 0000000..57ca28e --- /dev/null +++ b/design/src/main/res/drawable/selector_bg_main_button.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/design/src/main/res/values/attrs.xml b/design/src/main/res/values/attrs.xml index 2b4e8df..71ab929 100644 --- a/design/src/main/res/values/attrs.xml +++ b/design/src/main/res/values/attrs.xml @@ -11,5 +11,6 @@ + diff --git a/domain/src/main/java/com/ftw/domain/entity/Review.kt b/domain/src/main/java/com/ftw/domain/entity/Review.kt index 809e083..f0b9c04 100644 --- a/domain/src/main/java/com/ftw/domain/entity/Review.kt +++ b/domain/src/main/java/com/ftw/domain/entity/Review.kt @@ -9,6 +9,8 @@ data class Review( val buildingAddress: String, val rating: Int, val summary: String, + val residentialPeriod: String, + val residentialFloor: String, val officeLocation: String, val advantage: String, val disadvantage: String, @@ -16,6 +18,6 @@ data class Review( val leftAt: Date ) { companion object { - val NONE = Review(0, "", BuildingType.OFFICETEL, "", 0, "", "", "", "", false, Date()) + val NONE = Review(0, "", BuildingType.OFFICETEL, "", 0, "", "", "", "", "", "", false, Date()) } } diff --git a/domain/src/main/java/com/ftw/domain/entity/User.kt b/domain/src/main/java/com/ftw/domain/entity/User.kt index d728162..8d7dadb 100644 --- a/domain/src/main/java/com/ftw/domain/entity/User.kt +++ b/domain/src/main/java/com/ftw/domain/entity/User.kt @@ -1,9 +1,10 @@ package com.ftw.domain.entity data class User( + val nickName: String, val company: Company? ) { companion object { - val NONE = User(Company.NONE) + val NONE = User("", Company.NONE) } } diff --git a/domain/src/main/java/com/ftw/domain/usecase/buildingreview/GetBuildingReviewsUseCaseImpl.kt b/domain/src/main/java/com/ftw/domain/usecase/buildingreview/GetBuildingReviewsUseCaseImpl.kt index 3464e07..623e9c8 100644 --- a/domain/src/main/java/com/ftw/domain/usecase/buildingreview/GetBuildingReviewsUseCaseImpl.kt +++ b/domain/src/main/java/com/ftw/domain/usecase/buildingreview/GetBuildingReviewsUseCaseImpl.kt @@ -50,6 +50,8 @@ class GetBuildingReviewsUseCaseImpl : GetBuildingReviewsUseCase { buildingAddress = "인천 남동구 구월남로 125", rating = 4, summary = "내 집이 최고", + residentialPeriod = "3년", + residentialFloor = "고층", officeLocation = "역삼역", advantage = "역근처라 그런지 일단 인프라가 너무 좋아요!", disadvantage = "창문이 많아서 냉난방비 많이나오고 커튼달기도 쉽지 않음... 그리고 새거라 석면가루같은게 막 나오고 그럼.\n그래도 살만합니다.", @@ -70,6 +72,8 @@ class GetBuildingReviewsUseCaseImpl : GetBuildingReviewsUseCase { buildingAddress = "인천 남동구 구월남로 125", rating = 3, summary = "내 집이 최고", + residentialPeriod = "1년", + residentialFloor = "중층", officeLocation = "삼전역", advantage = "지하철 가깝고, 내부 도배, 가구들 깔끔하고, 구조 괜팒습니다. 화장실도 괜찮은 편이고 이중창이라 단열 잘되구요.", disadvantage = "정말 작습니다. 1층 문앞에 외부인들 매일 담배피고 침 뱉습니다ㅣ. 비번입력 잘 안돼서 배달 시키면 1층 내려가서 받아야 함. 남향이라고 했는데 앞에 건물 때문에 직광 전혀 없습니다. 그냥 북향이라고 보면 됨", @@ -90,6 +94,8 @@ class GetBuildingReviewsUseCaseImpl : GetBuildingReviewsUseCase { buildingAddress = "인천 남동구 구월남로 125", rating = 1, summary = "내 집이 최고", + residentialPeriod = "2년", + residentialFloor = "중층", officeLocation = "몽촌토성역", advantage = "관리비 8만원 월세에 포함되어있음\n- 주변에 버스 정류장이 많아 평택역이나 시내에 나가기 편함\n- 건물 내부 엘리베이터 있음\n- 주차공간14개\n- 주변에 신축공원 공사 중", disadvantage = "건물 관리인이 노답임. 통화도 어렵고 어렵게 통화가 되더라도 말이 안 통함. 집주인과 직통으로 연락하는 것이 아닌 건물 관리인이 중간에 있기 때문에 건물 관리인의 역할이 중요하다 진짜 욕나오게 하는 관리인임. 아래는 건무루 관리인과 있었던 트러블(입주 두 달 동안) \n1. 입주한지 두 달 밖에 안 된 월세 세입자를 입주 2년 넘은 전세 세입자로 착각. \n2. 전화통화 어려움. 문자 답장 또한 없음\n3. 월세 확인도 제대로 안 됨. \n 4. 방 내부 관리가 전혀 안 되어있어(화장실 문 안 닫힘, 화장실 내부 창 흔들림 등) 요청하였으나 알겠다고 하고는 그 이후 연락이없음. 화를 내야 그제서야 고쳐줌 \n5. 집이 낡았다는 이유로 방 내부에 있는 옵션 수리 안 해줌", diff --git a/domain/src/main/java/com/ftw/domain/usecase/myreviews/GetMyReviewsUseCase.kt b/domain/src/main/java/com/ftw/domain/usecase/myreviews/GetMyReviewsUseCase.kt new file mode 100644 index 0000000..8191ed2 --- /dev/null +++ b/domain/src/main/java/com/ftw/domain/usecase/myreviews/GetMyReviewsUseCase.kt @@ -0,0 +1,7 @@ +package com.ftw.domain.usecase.myreviews + +import com.ftw.domain.entity.Review + +interface GetMyReviewsUseCase { + suspend operator fun invoke(): List +} diff --git a/domain/src/main/java/com/ftw/domain/usecase/myreviews/GetMyReviewsUseCaseImpl.kt b/domain/src/main/java/com/ftw/domain/usecase/myreviews/GetMyReviewsUseCaseImpl.kt new file mode 100644 index 0000000..b000a25 --- /dev/null +++ b/domain/src/main/java/com/ftw/domain/usecase/myreviews/GetMyReviewsUseCaseImpl.kt @@ -0,0 +1,71 @@ +package com.ftw.domain.usecase.myreviews + +import com.ftw.domain.entity.BuildingType +import com.ftw.domain.entity.Review +import java.util.Calendar +import java.util.Date + +class GetMyReviewsUseCaseImpl : GetMyReviewsUseCase { + override suspend fun invoke(): List { + return listOf( + Review( + buildingId = 0, + buildingName = "아크로텔 오피스텔", + buildingType = BuildingType.OFFICETEL, + buildingAddress = "인천 남동구 구월남로 125", + rating = 4, + summary = "내 집이 최고", + residentialPeriod = "3년", + residentialFloor = "고층", + officeLocation = "역삼역", + advantage = "역근처라 그런지 일단 인프라가 너무 좋아요!", + disadvantage = "창문이 많아서 냉난방비 많이나오고 커튼달기도 쉽지 않음... 그리고 새거라 석면가루같은게 막 나오고 그럼.\n그래도 살만합니다.", + favorite = false, + leftAt = Date().apply { + Calendar.getInstance().apply { + set(2020, 12, 30) + } + } + ), + Review( + buildingId = 0, + buildingName = "한국 아파트", + buildingType = BuildingType.APARTMENT, + buildingAddress = "성남대로 1226번길 2", + rating = 3, + summary = "내 집이 최고", + residentialPeriod = "1년", + residentialFloor = "중층", + officeLocation = "삼전역", + advantage = "지하철 가깝고, 내부 도배, 가구들 깔끔하고, 구조 괜팒습니다. 화장실도 괜찮은 편이고 이중창이라 단열 잘되구요.", + disadvantage = "정말 작습니다. 1층 문앞에 외부인들 매일 담배피고 침 뱉습니다ㅣ. 비번입력 잘 안돼서 배달 시키면 1층 내려가서 받아야 함. 남향이라고 했는데 앞에 건물 때문에 직광 전혀 없습니다. 그냥 북향이라고 보면 됨", + favorite = false, + leftAt = Date().apply { + Calendar.getInstance().apply { + set(2021, 11, 3) + } + } + ), + Review( + buildingId = 0, + buildingName = "한빛 삼성 아파트", + buildingType = BuildingType.APARTMENT, + buildingAddress = "서재2길 41-9", + rating = 1, + summary = "내 집이 최고", + residentialPeriod = "2년", + residentialFloor = "중층", + officeLocation = "몽촌토성역", + advantage = "관리비 8만원 월세에 포함되어있음\n- 주변에 버스 정류장이 많아 평택역이나 시내에 나가기 편함\n- 건물 내부 엘리베이터 있음\n- 주차공간14개\n- 주변에 신축공원 공사 중", + disadvantage = "건물 관리인이 노답임. 통화도 어렵고 어렵게 통화가 되더라도 말이 안 통함. 집주인과 직통으로 연락하는 것이 아닌 건물 관리인이 중간에 있기 때문에 건물 관리인의 역할이 중요하다 진짜 욕나오게 하는 관리인임. 아래는 건무루 관리인과 있었던 트러블(입주 두 달 동안) \n1. 입주한지 두 달 밖에 안 된 월세 세입자를 입주 2년 넘은 전세 세입자로 착각. \n2. 전화통화 어려움. 문자 답장 또한 없음\n3. 월세 확인도 제대로 안 됨. \n 4. 방 내부 관리가 전혀 안 되어있어(화장실 문 안 닫힘, 화장실 내부 창 흔들림 등) 요청하였으나 알겠다고 하고는 그 이후 연락이없음. 화를 내야 그제서야 고쳐줌 \n5. 집이 낡았다는 이유로 방 내부에 있는 옵션 수리 안 해줌", + favorite = false, + leftAt = Date().apply { + Calendar.getInstance().apply { + set(2022, 3, 2) + } + } + ) + ) + } + +} diff --git a/domain/src/main/java/com/ftw/domain/usecase/review/GetLocationReviewsUseCaseImpl.kt b/domain/src/main/java/com/ftw/domain/usecase/review/GetLocationReviewsUseCaseImpl.kt index 5c0d7ee..463b5a3 100644 --- a/domain/src/main/java/com/ftw/domain/usecase/review/GetLocationReviewsUseCaseImpl.kt +++ b/domain/src/main/java/com/ftw/domain/usecase/review/GetLocationReviewsUseCaseImpl.kt @@ -32,6 +32,8 @@ class GetLocationReviewsUseCaseImpl : GetLocationReviewsUseCase { buildingAddress = "인천 남동구 구월남로 125", rating = 4, summary = "내 집이 최고", + residentialPeriod = "3년", + residentialFloor = "고층", officeLocation = "역삼역", advantage = "역근처라 그런지 일단 인프라가 너무 좋아요!", disadvantage = "창문이 많아서 냉난방비 많이나오고 커튼달기도 쉽지 않음... 그리고 새거라 석면가루같은게 막 나오고 그럼.\n그래도 살만합니다.", @@ -52,6 +54,8 @@ class GetLocationReviewsUseCaseImpl : GetLocationReviewsUseCase { buildingAddress = "성남대로 1226번길 2", rating = 3, summary = "내 집이 최고", + residentialPeriod = "1년", + residentialFloor = "중층", officeLocation = "삼전역", advantage = "지하철 가깝고, 내부 도배, 가구들 깔끔하고, 구조 괜팒습니다. 화장실도 괜찮은 편이고 이중창이라 단열 잘되구요.", disadvantage = "정말 작습니다. 1층 문앞에 외부인들 매일 담배피고 침 뱉습니다ㅣ. 비번입력 잘 안돼서 배달 시키면 1층 내려가서 받아야 함. 남향이라고 했는데 앞에 건물 때문에 직광 전혀 없습니다. 그냥 북향이라고 보면 됨", @@ -72,6 +76,8 @@ class GetLocationReviewsUseCaseImpl : GetLocationReviewsUseCase { buildingAddress = "서재2길 41-9", rating = 1, summary = "내 집이 최고", + residentialPeriod = "2년", + residentialFloor = "중층", officeLocation = "몽촌토성역", advantage = "관리비 8만원 월세에 포함되어있음\n- 주변에 버스 정류장이 많아 평택역이나 시내에 나가기 편함\n- 건물 내부 엘리베이터 있음\n- 주차공간14개\n- 주변에 신축공원 공사 중", disadvantage = "건물 관리인이 노답임. 통화도 어렵고 어렵게 통화가 되더라도 말이 안 통함. 집주인과 직통으로 연락하는 것이 아닌 건물 관리인이 중간에 있기 때문에 건물 관리인의 역할이 중요하다 진짜 욕나오게 하는 관리인임. 아래는 건무루 관리인과 있었던 트러블(입주 두 달 동안) \n1. 입주한지 두 달 밖에 안 된 월세 세입자를 입주 2년 넘은 전세 세입자로 착각. \n2. 전화통화 어려움. 문자 답장 또한 없음\n3. 월세 확인도 제대로 안 됨. \n 4. 방 내부 관리가 전혀 안 되어있어(화장실 문 안 닫힘, 화장실 내부 창 흔들림 등) 요청하였으나 알겠다고 하고는 그 이후 연락이없음. 화를 내야 그제서야 고쳐줌 \n5. 집이 낡았다는 이유로 방 내부에 있는 옵션 수리 안 해줌", diff --git a/domain/src/main/java/com/ftw/domain/usecase/user/GetCachedUserUseCaseImpl.kt b/domain/src/main/java/com/ftw/domain/usecase/user/GetCachedUserUseCaseImpl.kt index 819a3b9..5137ad8 100644 --- a/domain/src/main/java/com/ftw/domain/usecase/user/GetCachedUserUseCaseImpl.kt +++ b/domain/src/main/java/com/ftw/domain/usecase/user/GetCachedUserUseCaseImpl.kt @@ -7,6 +7,7 @@ class GetCachedUserUseCaseImpl : GetCachedUserUseCase { override fun invoke(): User { // TODO: UserRepository 추가 및 return value 수정 return User( + nickName = "길동씨", company = Company("삼성전자", "동탄역") ) }