From 2ca7533b008b2bd1f8b3d2ee83b6e10d0e4aad27 Mon Sep 17 00:00:00 2001 From: HayleyKim0716 Date: Sun, 4 Dec 2022 15:56:23 +0900 Subject: [PATCH 1/3] =?UTF-8?q?#40=20feat/=EB=A6=AC=EB=B7=B0=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20:=20=EC=A7=91=ED=84=B0=EB=B7=B0=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20flow=20=EC=A4=91=20=EC=A3=BC=EC=86=8C=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20API=20=ED=98=B8=EC=B6=9C=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ftw/hometerview/di/api/APIModule.kt | 9 ++++- .../ftw/hometerview/di/api/NetworkModule.kt | 4 +- .../di/datasource/SearchDataSourceModule.kt | 21 ++++++++++ .../di/repository/SearchRepositoryModule.kt | 21 ++++++++++ .../ui/CreateReviewFragmentViewModelModule.kt | 6 +-- .../di/usecase/AddressUseCaseModule.kt | 20 ---------- .../di/usecase/SearchUseCaseModule.kt | 20 ++++++++++ .../hometerview/ui/main/home/HomeFragment.kt | 2 + ...eateReviewFirstStepInputAddressFragment.kt | 7 +++- ...ateReviewFirstStepInputAddressViewModel.kt | 38 ++++++++++++------- ...create_review_first_step_input_address.xml | 10 +++++ .../datasource/search/SearchDataSource.kt | 7 ++++ .../java/com/ftw/data/remote/api/SearchAPI.kt | 14 +++++++ .../search/SearchRemoteDataSource.kt | 22 +++++++++++ .../response/address/AddressResponse.kt | 13 +++++++ .../repository/search/SearchRepositoryImpl.kt | 11 ++++++ .../java/com/ftw/domain/entity/Address.kt | 6 +++ .../repository/search/SearchRepository.kt | 7 ++++ .../usecase/address/GetAddressUseCase.kt | 5 --- .../usecase/address/GetAddressUseCaseImpl.kt | 17 --------- .../GetSearchedBuildingAddressesUseCase.kt | 7 ++++ ...GetSearchedBuildingAddressesUseCaseImpl.kt | 21 ++++++++++ 22 files changed, 225 insertions(+), 63 deletions(-) create mode 100644 app/src/main/java/com/ftw/hometerview/di/datasource/SearchDataSourceModule.kt create mode 100644 app/src/main/java/com/ftw/hometerview/di/repository/SearchRepositoryModule.kt delete mode 100644 app/src/main/java/com/ftw/hometerview/di/usecase/AddressUseCaseModule.kt create mode 100644 app/src/main/java/com/ftw/hometerview/di/usecase/SearchUseCaseModule.kt create mode 100644 data/src/main/java/com/ftw/data/datasource/search/SearchDataSource.kt create mode 100644 data/src/main/java/com/ftw/data/remote/api/SearchAPI.kt create mode 100644 data/src/main/java/com/ftw/data/remote/datasource/search/SearchRemoteDataSource.kt create mode 100644 data/src/main/java/com/ftw/data/remote/response/address/AddressResponse.kt create mode 100644 data/src/main/java/com/ftw/data/repository/search/SearchRepositoryImpl.kt create mode 100644 domain/src/main/java/com/ftw/domain/entity/Address.kt create mode 100644 domain/src/main/java/com/ftw/domain/repository/search/SearchRepository.kt delete mode 100644 domain/src/main/java/com/ftw/domain/usecase/address/GetAddressUseCase.kt delete mode 100644 domain/src/main/java/com/ftw/domain/usecase/address/GetAddressUseCaseImpl.kt create mode 100644 domain/src/main/java/com/ftw/domain/usecase/search/GetSearchedBuildingAddressesUseCase.kt create mode 100644 domain/src/main/java/com/ftw/domain/usecase/search/GetSearchedBuildingAddressesUseCaseImpl.kt diff --git a/app/src/main/java/com/ftw/hometerview/di/api/APIModule.kt b/app/src/main/java/com/ftw/hometerview/di/api/APIModule.kt index c47fc91..37a03b2 100644 --- a/app/src/main/java/com/ftw/hometerview/di/api/APIModule.kt +++ b/app/src/main/java/com/ftw/hometerview/di/api/APIModule.kt @@ -2,13 +2,14 @@ package com.ftw.hometerview.di.api import com.ftw.data.remote.api.BuildingReviewsAPI import com.ftw.data.remote.api.LoginAPI +import com.ftw.data.remote.api.SearchAPI import com.ftw.data.remote.api.review.ReviewAPI import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import retrofit2.Retrofit import javax.inject.Singleton +import retrofit2.Retrofit @Module @InstallIn(SingletonComponent::class) @@ -31,4 +32,10 @@ class APIModule { fun provideBuildingReviewsApi(retrofit: Retrofit): BuildingReviewsAPI { return retrofit.create(BuildingReviewsAPI::class.java) } + + @Provides + @Singleton + fun provideSearchApi(retrofit: Retrofit): SearchAPI { + return retrofit.create(SearchAPI::class.java) + } } diff --git a/app/src/main/java/com/ftw/hometerview/di/api/NetworkModule.kt b/app/src/main/java/com/ftw/hometerview/di/api/NetworkModule.kt index ee6c3cf..b69233f 100644 --- a/app/src/main/java/com/ftw/hometerview/di/api/NetworkModule.kt +++ b/app/src/main/java/com/ftw/hometerview/di/api/NetworkModule.kt @@ -19,8 +19,8 @@ import javax.inject.Singleton class NetworkModule { companion object { - private const val DEBUG_BASE_URL = "http://13.125.75.159:8080/" - private const val RELEASE_BASE_URL = "http://13.125.75.159:8080/" + private const val DEBUG_BASE_URL = "http://3.36.37.15/:8080/" + private const val RELEASE_BASE_URL = "http://3.36.37.15/:8080/" } @Provides diff --git a/app/src/main/java/com/ftw/hometerview/di/datasource/SearchDataSourceModule.kt b/app/src/main/java/com/ftw/hometerview/di/datasource/SearchDataSourceModule.kt new file mode 100644 index 0000000..82bc093 --- /dev/null +++ b/app/src/main/java/com/ftw/hometerview/di/datasource/SearchDataSourceModule.kt @@ -0,0 +1,21 @@ +package com.ftw.hometerview.di.datasource + +import com.ftw.data.datasource.search.SearchDataSource +import com.ftw.data.remote.api.SearchAPI +import com.ftw.data.remote.datasource.search.SearchRemoteDataSource +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +class SearchDataSourceModule { + + @Provides + @Singleton + fun provideSearchDataSource(searchAPI: SearchAPI): SearchDataSource { + return SearchRemoteDataSource(searchAPI) + } +} diff --git a/app/src/main/java/com/ftw/hometerview/di/repository/SearchRepositoryModule.kt b/app/src/main/java/com/ftw/hometerview/di/repository/SearchRepositoryModule.kt new file mode 100644 index 0000000..1e484f1 --- /dev/null +++ b/app/src/main/java/com/ftw/hometerview/di/repository/SearchRepositoryModule.kt @@ -0,0 +1,21 @@ +package com.ftw.hometerview.di.repository + +import com.ftw.data.datasource.search.SearchDataSource +import com.ftw.data.repository.search.SearchRepositoryImpl +import com.ftw.domain.repository.search.SearchRepository +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +class SearchRepositoryModule { + + @Provides + @Singleton + fun provideSearchRepository(dataSource: SearchDataSource): SearchRepository { + return SearchRepositoryImpl(dataSource) + } +} diff --git a/app/src/main/java/com/ftw/hometerview/di/ui/CreateReviewFragmentViewModelModule.kt b/app/src/main/java/com/ftw/hometerview/di/ui/CreateReviewFragmentViewModelModule.kt index 34df549..da62069 100644 --- a/app/src/main/java/com/ftw/hometerview/di/ui/CreateReviewFragmentViewModelModule.kt +++ b/app/src/main/java/com/ftw/hometerview/di/ui/CreateReviewFragmentViewModelModule.kt @@ -1,6 +1,6 @@ package com.ftw.hometerview.di.ui -import com.ftw.domain.usecase.address.GetAddressUseCase +import com.ftw.domain.usecase.search.GetSearchedBuildingAddressesUseCase import com.ftw.hometerview.dispatcher.Dispatcher import com.ftw.hometerview.ui.review.first.CreateReviewFirstStepInputAddressViewModel import com.ftw.hometerview.ui.review.first.CreateReviewFirstStepSelectFloorViewModel @@ -20,11 +20,11 @@ class CreateReviewFragmentViewModelModule { @FragmentScoped fun provideCreateReviewFirstStepInputAddressViewModel( dispatcher: Dispatcher, - getAddressUseCase: GetAddressUseCase + getSearchedBuildingAddressesUseCase: GetSearchedBuildingAddressesUseCase ): CreateReviewFirstStepInputAddressViewModel { return CreateReviewFirstStepInputAddressViewModel( dispatcher, - getAddressUseCase + getSearchedBuildingAddressesUseCase ) } diff --git a/app/src/main/java/com/ftw/hometerview/di/usecase/AddressUseCaseModule.kt b/app/src/main/java/com/ftw/hometerview/di/usecase/AddressUseCaseModule.kt deleted file mode 100644 index fcbabc0..0000000 --- a/app/src/main/java/com/ftw/hometerview/di/usecase/AddressUseCaseModule.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.ftw.hometerview.di.usecase - -import com.ftw.domain.usecase.address.GetAddressUseCase -import com.ftw.domain.usecase.address.GetAddressUseCaseImpl -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton - -@Module -@InstallIn(SingletonComponent::class) -class AddressUseCaseModule { - - @Provides - @Singleton - fun provideGetAddressUseCase(): GetAddressUseCase { - return GetAddressUseCaseImpl() - } -} diff --git a/app/src/main/java/com/ftw/hometerview/di/usecase/SearchUseCaseModule.kt b/app/src/main/java/com/ftw/hometerview/di/usecase/SearchUseCaseModule.kt new file mode 100644 index 0000000..2744cba --- /dev/null +++ b/app/src/main/java/com/ftw/hometerview/di/usecase/SearchUseCaseModule.kt @@ -0,0 +1,20 @@ +package com.ftw.hometerview.di.usecase + +import com.ftw.domain.repository.search.SearchRepository +import com.ftw.domain.usecase.search.GetSearchedBuildingAddressesUseCase +import com.ftw.domain.usecase.search.GetSearchedBuildingAddressesUseCaseImpl +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent + +@Module +@InstallIn(SingletonComponent::class) +class SearchUseCaseModule { + @Provides + fun provideSearchBuildingAddressesUseCaseImpl( + repository: SearchRepository + ): GetSearchedBuildingAddressesUseCase { + return GetSearchedBuildingAddressesUseCaseImpl(repository) + } +} diff --git a/app/src/main/java/com/ftw/hometerview/ui/main/home/HomeFragment.kt b/app/src/main/java/com/ftw/hometerview/ui/main/home/HomeFragment.kt index 5e83f66..35a4410 100644 --- a/app/src/main/java/com/ftw/hometerview/ui/main/home/HomeFragment.kt +++ b/app/src/main/java/com/ftw/hometerview/ui/main/home/HomeFragment.kt @@ -177,12 +177,14 @@ class HomeFragment : Fragment() { ).apply { addUpdateListener { valueAnimator -> val value = valueAnimator.animatedValue as? Int ?: 0 + if (_binding == null) return@addUpdateListener binding.inducementEmptyLayout.updateLayoutParams { height = value } } doOnEnd { + if (_binding == null) return@doOnEnd binding.inducementLayout.isVisible = true binding.inducementLayout.startAnimation( AlphaAnimation(0f, 1f).apply { diff --git a/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressFragment.kt b/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressFragment.kt index 78c5b69..faeafdc 100644 --- a/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressFragment.kt +++ b/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment import androidx.lifecycle.Lifecycle @@ -48,7 +49,8 @@ class CreateReviewFirstStepInputAddressFragment : Fragment() { container, false ).apply { - this.viewModel = this@CreateReviewFirstStepInputAddressFragment.viewModel + lifecycleOwner = viewLifecycleOwner + viewModel = this@CreateReviewFirstStepInputAddressFragment.viewModel } return binding.root } @@ -86,6 +88,9 @@ class CreateReviewFirstStepInputAddressFragment : Fragment() { hideKeyboard() (activity as? Listener)?.onClickAddressFromFirstStepAddress(event.address) } + is CreateReviewFirstStepInputAddressViewModel.Event.Error -> { + Toast.makeText(requireContext(), event.throwable.message, Toast.LENGTH_SHORT) + } else -> { // Do Nothing } diff --git a/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressViewModel.kt b/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressViewModel.kt index 55897a2..dd3de1b 100644 --- a/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressViewModel.kt +++ b/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressViewModel.kt @@ -1,6 +1,6 @@ package com.ftw.hometerview.ui.review.first -import com.ftw.domain.usecase.address.GetAddressUseCase +import com.ftw.domain.usecase.search.GetSearchedBuildingAddressesUseCase import com.ftw.hometerview.BR import com.ftw.hometerview.R import com.ftw.hometerview.adapter.RecyclerItem @@ -10,24 +10,31 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.onCompletion +import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.transformLatest class CreateReviewFirstStepInputAddressViewModel( dispatcher: Dispatcher, - private val getAddressUseCase: GetAddressUseCase + private val getSearchedBuildingAddressesUseCase: GetSearchedBuildingAddressesUseCase ) { sealed class Event { object Nothing : Event() + data class Error(val throwable: Throwable) : Event() data class OnClickAddress(val address: String) : Event() } private val _event: MutableStateFlow = MutableStateFlow(Event.Nothing) val event: StateFlow = _event.asStateFlow() + private val _isLoading: MutableStateFlow = MutableStateFlow(false) + val isLoading: StateFlow = _isLoading + val address: MutableStateFlow = MutableStateFlow("") val addressItems: StateFlow> = @@ -35,27 +42,30 @@ class CreateReviewFirstStepInputAddressViewModel( .debounce(500) .transformLatest { address -> flow { - if (address.isNotBlank()) emit(getAddressUseCase(address)) - else emit(Result.success(emptyList())) - }.collect { result -> - if (result.isSuccess && result.getOrNull() != null) { - emit( - result.getOrDefault(emptyList()) - .map { searchedAddress -> + if (address.isNotBlank()) emit(getSearchedBuildingAddressesUseCase(address)) + else emit(emptyList()) + } + .onStart { _isLoading.value = true } + .onCompletion { _isLoading.value = false } + .catch { _event.value = Event.Error(it) } + .collect { addresses -> + if (addresses.isNotEmpty()) { + emit( + addresses.map { searchedAddress -> RecyclerItem( data = CreateReviewAddressItem( - address = searchedAddress, + address = searchedAddress.name, onClick = { _event.value = Event.OnClickAddress(it) } ), layoutId = R.layout.list_item_create_review_search_address, variableId = BR.item ) } - ) - } else { - emit(emptyList()) + ) + } else { + emit(emptyList()) + } } - } }.stateIn(CoroutineScope(dispatcher.ui()), SharingStarted.Eagerly, emptyList()) } diff --git a/app/src/main/res/layout/fragment_create_review_first_step_input_address.xml b/app/src/main/res/layout/fragment_create_review_first_step_input_address.xml index 94121ca..f05ea0e 100644 --- a/app/src/main/res/layout/fragment_create_review_first_step_input_address.xml +++ b/app/src/main/res/layout/fragment_create_review_first_step_input_address.xml @@ -280,5 +280,15 @@ tools:itemCount="10" /> + + diff --git a/data/src/main/java/com/ftw/data/datasource/search/SearchDataSource.kt b/data/src/main/java/com/ftw/data/datasource/search/SearchDataSource.kt new file mode 100644 index 0000000..daa368c --- /dev/null +++ b/data/src/main/java/com/ftw/data/datasource/search/SearchDataSource.kt @@ -0,0 +1,7 @@ +package com.ftw.data.datasource.search + +import com.ftw.domain.entity.Address + +interface SearchDataSource { + suspend fun buildings(keyword: String): List
+} diff --git a/data/src/main/java/com/ftw/data/remote/api/SearchAPI.kt b/data/src/main/java/com/ftw/data/remote/api/SearchAPI.kt new file mode 100644 index 0000000..f9b5c68 --- /dev/null +++ b/data/src/main/java/com/ftw/data/remote/api/SearchAPI.kt @@ -0,0 +1,14 @@ +package com.ftw.data.remote.api + +import com.ftw.data.remote.response.RemoteResponse +import com.ftw.data.remote.response.address.AddressResponse +import retrofit2.Response +import retrofit2.http.GET +import retrofit2.http.Query + +interface SearchAPI { + @GET("/api/v1/place") + suspend fun buildings( + @Query("keyword") keyword: String + ): Response>> +} diff --git a/data/src/main/java/com/ftw/data/remote/datasource/search/SearchRemoteDataSource.kt b/data/src/main/java/com/ftw/data/remote/datasource/search/SearchRemoteDataSource.kt new file mode 100644 index 0000000..edd2207 --- /dev/null +++ b/data/src/main/java/com/ftw/data/remote/datasource/search/SearchRemoteDataSource.kt @@ -0,0 +1,22 @@ +package com.ftw.data.remote.datasource.search + +import com.ftw.data.datasource.search.SearchDataSource +import com.ftw.data.remote.api.SearchAPI +import com.ftw.data.remote.exception.ResponseException +import com.ftw.data.remote.response.address.toEntity +import com.ftw.domain.entity.Address + +class SearchRemoteDataSource(private val api: SearchAPI) : SearchDataSource { + override suspend fun buildings(keyword: String): List
{ + return try { + val response = api.buildings(keyword) + if (response.isSuccessful) { + response.body()?.data?.map { it.toEntity() } ?: emptyList() + } else { + throw ResponseException("Network Exception") + } + } catch (e: Exception) { + throw e + } + } +} diff --git a/data/src/main/java/com/ftw/data/remote/response/address/AddressResponse.kt b/data/src/main/java/com/ftw/data/remote/response/address/AddressResponse.kt new file mode 100644 index 0000000..409ea11 --- /dev/null +++ b/data/src/main/java/com/ftw/data/remote/response/address/AddressResponse.kt @@ -0,0 +1,13 @@ +package com.ftw.data.remote.response.address + +import com.ftw.domain.entity.Address +import com.google.gson.annotations.SerializedName + +data class AddressResponse( + @SerializedName("id") val id: String, + @SerializedName("name") val name: String +) + +fun AddressResponse.toEntity(): Address { + return Address(id, name) +} diff --git a/data/src/main/java/com/ftw/data/repository/search/SearchRepositoryImpl.kt b/data/src/main/java/com/ftw/data/repository/search/SearchRepositoryImpl.kt new file mode 100644 index 0000000..905f60a --- /dev/null +++ b/data/src/main/java/com/ftw/data/repository/search/SearchRepositoryImpl.kt @@ -0,0 +1,11 @@ +package com.ftw.data.repository.search + +import com.ftw.data.datasource.search.SearchDataSource +import com.ftw.domain.entity.Address +import com.ftw.domain.repository.search.SearchRepository + +class SearchRepositoryImpl(private val dataSource: SearchDataSource) : SearchRepository { + override suspend fun buildings(keyword: String): List
{ + return dataSource.buildings(keyword) + } +} diff --git a/domain/src/main/java/com/ftw/domain/entity/Address.kt b/domain/src/main/java/com/ftw/domain/entity/Address.kt new file mode 100644 index 0000000..8785c85 --- /dev/null +++ b/domain/src/main/java/com/ftw/domain/entity/Address.kt @@ -0,0 +1,6 @@ +package com.ftw.domain.entity + +data class Address( + val id: String, + val name: String +) diff --git a/domain/src/main/java/com/ftw/domain/repository/search/SearchRepository.kt b/domain/src/main/java/com/ftw/domain/repository/search/SearchRepository.kt new file mode 100644 index 0000000..125dcb5 --- /dev/null +++ b/domain/src/main/java/com/ftw/domain/repository/search/SearchRepository.kt @@ -0,0 +1,7 @@ +package com.ftw.domain.repository.search + +import com.ftw.domain.entity.Address + +interface SearchRepository { + suspend fun buildings(keyword: String): List
+} diff --git a/domain/src/main/java/com/ftw/domain/usecase/address/GetAddressUseCase.kt b/domain/src/main/java/com/ftw/domain/usecase/address/GetAddressUseCase.kt deleted file mode 100644 index 6d871f0..0000000 --- a/domain/src/main/java/com/ftw/domain/usecase/address/GetAddressUseCase.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.ftw.domain.usecase.address - -interface GetAddressUseCase { - suspend operator fun invoke(query: String): Result> -} diff --git a/domain/src/main/java/com/ftw/domain/usecase/address/GetAddressUseCaseImpl.kt b/domain/src/main/java/com/ftw/domain/usecase/address/GetAddressUseCaseImpl.kt deleted file mode 100644 index 7f18b84..0000000 --- a/domain/src/main/java/com/ftw/domain/usecase/address/GetAddressUseCaseImpl.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.ftw.domain.usecase.address - -class GetAddressUseCaseImpl : GetAddressUseCase { - override suspend operator fun invoke(query: String): Result> { - return Result.success( - listOf( - "서울 마포구 월드컵북로", - "서울 마포구 월드컵북로 1길 35", - "서울 마포구 월드컵북로 2길 3", - "서울 마포구 월드컵북로 4길 6", - "서울 마포구 월드컵북로 5가길 12", - "서울 마포구 월드컵북로 5나길 2", - "서울 마포구 월드컵북로 52길 9" - ) - ) - } -} diff --git a/domain/src/main/java/com/ftw/domain/usecase/search/GetSearchedBuildingAddressesUseCase.kt b/domain/src/main/java/com/ftw/domain/usecase/search/GetSearchedBuildingAddressesUseCase.kt new file mode 100644 index 0000000..fb0f50b --- /dev/null +++ b/domain/src/main/java/com/ftw/domain/usecase/search/GetSearchedBuildingAddressesUseCase.kt @@ -0,0 +1,7 @@ +package com.ftw.domain.usecase.search + +import com.ftw.domain.entity.Address + +interface GetSearchedBuildingAddressesUseCase { + suspend operator fun invoke(keyword: String): List
+} diff --git a/domain/src/main/java/com/ftw/domain/usecase/search/GetSearchedBuildingAddressesUseCaseImpl.kt b/domain/src/main/java/com/ftw/domain/usecase/search/GetSearchedBuildingAddressesUseCaseImpl.kt new file mode 100644 index 0000000..e6a03e8 --- /dev/null +++ b/domain/src/main/java/com/ftw/domain/usecase/search/GetSearchedBuildingAddressesUseCaseImpl.kt @@ -0,0 +1,21 @@ +package com.ftw.domain.usecase.search + +import com.ftw.domain.entity.Address +import com.ftw.domain.repository.search.SearchRepository + +class GetSearchedBuildingAddressesUseCaseImpl( + private val repository: SearchRepository +) : GetSearchedBuildingAddressesUseCase { + override suspend fun invoke(keyword: String): List
{ + return repository.buildings(keyword) +// return listOf( +// Address("0", "서울 마포구 월드컵북로"), +// Address("1", "서울 마포구 월드컵북로 1길 35"), +// Address("2", "서울 마포구 월드컵북로 2길 3"), +// Address("3", "서울 마포구 월드컵북로 4길 6"), +// Address("4", "서울 마포구 월드컵북로 5가길 12"), +// Address("5", "서울 마포구 월드컵북로 5나길 2"), +// Address("6", "서울 마포구 월드컵북로 52길 9") +// ) + } +} From 6e0c8ad2316371d182639936c4eb40436d2b5d36 Mon Sep 17 00:00:00 2001 From: HayleyKim0716 Date: Sun, 4 Dec 2022 17:20:28 +0900 Subject: [PATCH 2/3] =?UTF-8?q?#40=20feat/=EB=A6=AC=EB=B7=B0=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20:=20=EC=A3=BC=EC=86=8C=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=EC=97=90=EC=84=9C=20=EC=A3=BC=EC=86=8C=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=20=EC=8B=9C=20buildingId=20=EB=A5=BC=20?= =?UTF-8?q?=EC=A0=84=EB=8B=AC=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ftw/hometerview/ui/review/CreateReviewActivity.kt | 6 +++--- .../first/CreateReviewFirstStepInputAddressFragment.kt | 4 ++-- .../first/CreateReviewFirstStepInputAddressViewModel.kt | 8 ++++---- .../res/layout/list_item_create_review_search_address.xml | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/ftw/hometerview/ui/review/CreateReviewActivity.kt b/app/src/main/java/com/ftw/hometerview/ui/review/CreateReviewActivity.kt index efcf843..d708780 100644 --- a/app/src/main/java/com/ftw/hometerview/ui/review/CreateReviewActivity.kt +++ b/app/src/main/java/com/ftw/hometerview/ui/review/CreateReviewActivity.kt @@ -51,11 +51,11 @@ class CreateReviewActivity : ) } - override fun onClickAddressFromFirstStepAddress(address: String) { - viewModel.setAddress(buildingId = "test") + override fun onClickAddressFromFirstStepAddress(buildingId: String) { + viewModel.setAddress(buildingId) addFragment( R.id.fragment_container_view, - CreateReviewFirstStepSelectFloorFragment.newInstance(address), + CreateReviewFirstStepSelectFloorFragment.newInstance(buildingId), true ) } diff --git a/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressFragment.kt b/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressFragment.kt index faeafdc..de063b0 100644 --- a/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressFragment.kt +++ b/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressFragment.kt @@ -27,7 +27,7 @@ class CreateReviewFirstStepInputAddressFragment : Fragment() { } interface Listener { - fun onClickAddressFromFirstStepAddress(address: String) + fun onClickAddressFromFirstStepAddress(buildingId: String) } private var _binding: FragmentCreateReviewFirstStepInputAddressBinding? = null @@ -86,7 +86,7 @@ class CreateReviewFirstStepInputAddressFragment : Fragment() { when (event) { is CreateReviewFirstStepInputAddressViewModel.Event.OnClickAddress -> { hideKeyboard() - (activity as? Listener)?.onClickAddressFromFirstStepAddress(event.address) + (activity as? Listener)?.onClickAddressFromFirstStepAddress(event.buildingId) } is CreateReviewFirstStepInputAddressViewModel.Event.Error -> { Toast.makeText(requireContext(), event.throwable.message, Toast.LENGTH_SHORT) diff --git a/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressViewModel.kt b/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressViewModel.kt index dd3de1b..f55220b 100644 --- a/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressViewModel.kt +++ b/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressViewModel.kt @@ -26,7 +26,7 @@ class CreateReviewFirstStepInputAddressViewModel( sealed class Event { object Nothing : Event() data class Error(val throwable: Throwable) : Event() - data class OnClickAddress(val address: String) : Event() + data class OnClickAddress(val buildingId: String) : Event() } private val _event: MutableStateFlow = MutableStateFlow(Event.Nothing) @@ -54,7 +54,7 @@ class CreateReviewFirstStepInputAddressViewModel( addresses.map { searchedAddress -> RecyclerItem( data = CreateReviewAddressItem( - address = searchedAddress.name, + buildingId = searchedAddress.id, onClick = { _event.value = Event.OnClickAddress(it) } ), layoutId = R.layout.list_item_create_review_search_address, @@ -70,10 +70,10 @@ class CreateReviewFirstStepInputAddressViewModel( } data class CreateReviewAddressItem( - val address: String, + val buildingId: String, val onClick: (String) -> Unit ) { fun onClick() { - this.onClick(address) + this.onClick(buildingId) } } diff --git a/app/src/main/res/layout/list_item_create_review_search_address.xml b/app/src/main/res/layout/list_item_create_review_search_address.xml index ee31f45..851f6d1 100644 --- a/app/src/main/res/layout/list_item_create_review_search_address.xml +++ b/app/src/main/res/layout/list_item_create_review_search_address.xml @@ -13,7 +13,7 @@ android:padding="@dimen/dp_size_16" android:background="@color/white" android:onClick="@{() -> item.onClick()}" - android:text="@{item.address}" + android:text="@{item.buildingId}" android:fontFamily="@font/pretendard_regular" android:textSize="@dimen/sp_size_14" android:textColor="@color/gray_900" From 5311b79477aa217577c9a47455fb5c10d9bbb88c Mon Sep 17 00:00:00 2001 From: HayleyKim0716 Date: Sun, 4 Dec 2022 18:15:23 +0900 Subject: [PATCH 3/3] =?UTF-8?q?#40=20feat/=EB=A6=AC=EB=B7=B0=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20:=20=EC=A3=BC=EC=86=8C=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=EC=97=90=EC=84=9C=20=EC=A3=BC=EC=86=8C=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=20=EC=8B=9C=20address=20=EB=A5=BC=20?= =?UTF-8?q?=EC=A0=84=EB=8B=AC=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/review/CreateReviewActivity.kt | 7 ++++--- .../ui/review/CreateReviewViewModel.kt | 2 +- ...eateReviewFirstStepInputAddressFragment.kt | 5 +++-- ...ateReviewFirstStepInputAddressViewModel.kt | 11 +++++----- ..._create_review_first_step_select_floor.xml | 1 + ...list_item_create_review_search_address.xml | 2 +- ...GetSearchedBuildingAddressesUseCaseImpl.kt | 20 +++++++++---------- 7 files changed, 26 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/ftw/hometerview/ui/review/CreateReviewActivity.kt b/app/src/main/java/com/ftw/hometerview/ui/review/CreateReviewActivity.kt index d708780..e47ca09 100644 --- a/app/src/main/java/com/ftw/hometerview/ui/review/CreateReviewActivity.kt +++ b/app/src/main/java/com/ftw/hometerview/ui/review/CreateReviewActivity.kt @@ -6,6 +6,7 @@ import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.databinding.DataBindingUtil +import com.ftw.domain.entity.Address import com.ftw.domain.entity.Review import com.ftw.hometerview.R import com.ftw.hometerview.databinding.ActivityCreateReviewBinding @@ -51,11 +52,11 @@ class CreateReviewActivity : ) } - override fun onClickAddressFromFirstStepAddress(buildingId: String) { - viewModel.setAddress(buildingId) + override fun onClickAddressFromFirstStepAddress(address: Address) { + viewModel.setBuildingId(address.id) addFragment( R.id.fragment_container_view, - CreateReviewFirstStepSelectFloorFragment.newInstance(buildingId), + CreateReviewFirstStepSelectFloorFragment.newInstance(address.name), true ) } diff --git a/app/src/main/java/com/ftw/hometerview/ui/review/CreateReviewViewModel.kt b/app/src/main/java/com/ftw/hometerview/ui/review/CreateReviewViewModel.kt index 072a372..7df2523 100644 --- a/app/src/main/java/com/ftw/hometerview/ui/review/CreateReviewViewModel.kt +++ b/app/src/main/java/com/ftw/hometerview/ui/review/CreateReviewViewModel.kt @@ -19,7 +19,7 @@ class CreateReviewViewModel( private var disadvantage: String? = null private var floor: String? = null - fun setAddress(buildingId: String) { + fun setBuildingId(buildingId: String) { this.buildingId = buildingId } diff --git a/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressFragment.kt b/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressFragment.kt index de063b0..cfcf227 100644 --- a/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressFragment.kt +++ b/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressFragment.kt @@ -10,6 +10,7 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle +import com.ftw.domain.entity.Address import com.ftw.hometerview.R import com.ftw.hometerview.adapter.DataBindingRecyclerAdapter import com.ftw.hometerview.adapter.DividerItemDecoration @@ -27,7 +28,7 @@ class CreateReviewFirstStepInputAddressFragment : Fragment() { } interface Listener { - fun onClickAddressFromFirstStepAddress(buildingId: String) + fun onClickAddressFromFirstStepAddress(address: Address) } private var _binding: FragmentCreateReviewFirstStepInputAddressBinding? = null @@ -86,7 +87,7 @@ class CreateReviewFirstStepInputAddressFragment : Fragment() { when (event) { is CreateReviewFirstStepInputAddressViewModel.Event.OnClickAddress -> { hideKeyboard() - (activity as? Listener)?.onClickAddressFromFirstStepAddress(event.buildingId) + (activity as? Listener)?.onClickAddressFromFirstStepAddress(event.address) } is CreateReviewFirstStepInputAddressViewModel.Event.Error -> { Toast.makeText(requireContext(), event.throwable.message, Toast.LENGTH_SHORT) diff --git a/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressViewModel.kt b/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressViewModel.kt index f55220b..98bbd79 100644 --- a/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressViewModel.kt +++ b/app/src/main/java/com/ftw/hometerview/ui/review/first/CreateReviewFirstStepInputAddressViewModel.kt @@ -1,5 +1,6 @@ package com.ftw.hometerview.ui.review.first +import com.ftw.domain.entity.Address import com.ftw.domain.usecase.search.GetSearchedBuildingAddressesUseCase import com.ftw.hometerview.BR import com.ftw.hometerview.R @@ -26,7 +27,7 @@ class CreateReviewFirstStepInputAddressViewModel( sealed class Event { object Nothing : Event() data class Error(val throwable: Throwable) : Event() - data class OnClickAddress(val buildingId: String) : Event() + data class OnClickAddress(val address: Address) : Event() } private val _event: MutableStateFlow = MutableStateFlow(Event.Nothing) @@ -54,7 +55,7 @@ class CreateReviewFirstStepInputAddressViewModel( addresses.map { searchedAddress -> RecyclerItem( data = CreateReviewAddressItem( - buildingId = searchedAddress.id, + address = searchedAddress, onClick = { _event.value = Event.OnClickAddress(it) } ), layoutId = R.layout.list_item_create_review_search_address, @@ -70,10 +71,10 @@ class CreateReviewFirstStepInputAddressViewModel( } data class CreateReviewAddressItem( - val buildingId: String, - val onClick: (String) -> Unit + val address: Address, + val onClick: (Address) -> Unit ) { fun onClick() { - this.onClick(buildingId) + this.onClick(address) } } diff --git a/app/src/main/res/layout/fragment_create_review_first_step_select_floor.xml b/app/src/main/res/layout/fragment_create_review_first_step_select_floor.xml index cc08958..40c2abd 100644 --- a/app/src/main/res/layout/fragment_create_review_first_step_select_floor.xml +++ b/app/src/main/res/layout/fragment_create_review_first_step_select_floor.xml @@ -46,6 +46,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/dp_size_14" + android:onClick="@{() -> viewModel.onClickBack()}" app:srcCompat="@drawable/icon_back" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/list_item_create_review_search_address.xml b/app/src/main/res/layout/list_item_create_review_search_address.xml index 851f6d1..1a96d16 100644 --- a/app/src/main/res/layout/list_item_create_review_search_address.xml +++ b/app/src/main/res/layout/list_item_create_review_search_address.xml @@ -13,7 +13,7 @@ android:padding="@dimen/dp_size_16" android:background="@color/white" android:onClick="@{() -> item.onClick()}" - android:text="@{item.buildingId}" + android:text="@{item.address.name}" android:fontFamily="@font/pretendard_regular" android:textSize="@dimen/sp_size_14" android:textColor="@color/gray_900" diff --git a/domain/src/main/java/com/ftw/domain/usecase/search/GetSearchedBuildingAddressesUseCaseImpl.kt b/domain/src/main/java/com/ftw/domain/usecase/search/GetSearchedBuildingAddressesUseCaseImpl.kt index e6a03e8..df25399 100644 --- a/domain/src/main/java/com/ftw/domain/usecase/search/GetSearchedBuildingAddressesUseCaseImpl.kt +++ b/domain/src/main/java/com/ftw/domain/usecase/search/GetSearchedBuildingAddressesUseCaseImpl.kt @@ -7,15 +7,15 @@ class GetSearchedBuildingAddressesUseCaseImpl( private val repository: SearchRepository ) : GetSearchedBuildingAddressesUseCase { override suspend fun invoke(keyword: String): List
{ - return repository.buildings(keyword) -// return listOf( -// Address("0", "서울 마포구 월드컵북로"), -// Address("1", "서울 마포구 월드컵북로 1길 35"), -// Address("2", "서울 마포구 월드컵북로 2길 3"), -// Address("3", "서울 마포구 월드컵북로 4길 6"), -// Address("4", "서울 마포구 월드컵북로 5가길 12"), -// Address("5", "서울 마포구 월드컵북로 5나길 2"), -// Address("6", "서울 마포구 월드컵북로 52길 9") -// ) +// return repository.buildings(key®word) + return listOf( + Address("0", "서울 마포구 월드컵북로"), + Address("1", "서울 마포구 월드컵북로 1길 35"), + Address("2", "서울 마포구 월드컵북로 2길 3"), + Address("3", "서울 마포구 월드컵북로 4길 6"), + Address("4", "서울 마포구 월드컵북로 5가길 12"), + Address("5", "서울 마포구 월드컵북로 5나길 2"), + Address("6", "서울 마포구 월드컵북로 52길 9") + ) } }