diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f2caaa90..953966b1 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -94,12 +94,11 @@ dependencies { kapt("androidx.room:room-compiler:2.6.1") kapt("com.google.dagger:hilt-compiler:2.51.1") kapt("com.google.dagger:hilt-android-compiler:2.51.1") - kapt("org.xerial:sqlite-jdbc:3.41.2.2") kapt("androidx.lifecycle:lifecycle-compiler:$lifecycle_version") testImplementation("junit:junit:4.13.2") - testImplementation("io.mockk:mockk-android:1.13.11") - testImplementation("io.mockk:mockk-agent:1.13.11") + testImplementation("io.mockk:mockk-android:1.13.12") + testImplementation("io.mockk:mockk-agent:1.13.12") testImplementation("androidx.arch.core:core-testing:2.2.0") testImplementation("org.robolectric:robolectric:4.13") testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.1") diff --git a/app/src/main/java/campus/tech/kakao/map/data/di/DatabaseModule.kt b/app/src/main/java/campus/tech/kakao/map/data/di/DatabaseModule.kt new file mode 100644 index 00000000..023f03ed --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/data/di/DatabaseModule.kt @@ -0,0 +1,26 @@ +package campus.tech.kakao.map.data.di + +import android.content.Context +import campus.tech.kakao.map.data.db.AppDatabase +import campus.tech.kakao.map.data.db.PlaceDao +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object DatabaseModule { + @Provides + @Singleton + fun provideDatabase(@ApplicationContext context: Context): AppDatabase { + return AppDatabase.getDatabase(context) + } + + @Provides + fun providePlaceDao(database: AppDatabase): PlaceDao { + return database.placeDao() + } +} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/data/di/NetworkModule.kt b/app/src/main/java/campus/tech/kakao/map/data/di/NetworkModule.kt new file mode 100644 index 00000000..c726fe9a --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/data/di/NetworkModule.kt @@ -0,0 +1,32 @@ +package campus.tech.kakao.map.data.di + +import campus.tech.kakao.map.data.remote.api.KakaoApiService +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object NetworkModule { + + private const val BASE_URL = "https://dapi.kakao.com/" + + @Provides + @Singleton + fun provideRetrofit(): Retrofit { + return Retrofit.Builder() + .baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .build() + } + + @Provides + @Singleton + fun provideKakaoApiService(retrofit: Retrofit): KakaoApiService { + return retrofit.create(KakaoApiService::class.java) + } +} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/data/di/PreferencesModule.kt b/app/src/main/java/campus/tech/kakao/map/data/di/PreferencesModule.kt new file mode 100644 index 00000000..e9ed1fc6 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/data/di/PreferencesModule.kt @@ -0,0 +1,21 @@ +package campus.tech.kakao.map.data.di + +import android.content.Context +import android.content.SharedPreferences +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object PreferencesModule { + + @Provides + @Singleton + fun provideSharedPreferences(@ApplicationContext context: Context): SharedPreferences { + return context.getSharedPreferences("LastLocation", Context.MODE_PRIVATE) + } +} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/data/di/RepositoryModule.kt b/app/src/main/java/campus/tech/kakao/map/data/di/RepositoryModule.kt new file mode 100644 index 00000000..852d4e5c --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/data/di/RepositoryModule.kt @@ -0,0 +1,50 @@ +package campus.tech.kakao.map.data.di + +import android.app.Application +import android.content.Context +import android.content.SharedPreferences +import campus.tech.kakao.map.base.MyApplication +import campus.tech.kakao.map.data.db.PlaceDao +import campus.tech.kakao.map.data.remote.api.KakaoApiService +import campus.tech.kakao.map.repository.LogRepository +import campus.tech.kakao.map.repository.LogRepositoryInterface +import campus.tech.kakao.map.repository.MapRepository +import campus.tech.kakao.map.repository.MapRepositoryInterface +import campus.tech.kakao.map.repository.PlaceRepository +import campus.tech.kakao.map.repository.PlaceRepositoryInterface +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object RepositoryModule { + + @Provides + @Singleton + fun provideContext(@ApplicationContext context: Context): Context { + return context + } + + + @Provides + @Singleton + fun providePlaceRepository(sharedPreferences: SharedPreferences, kakaoApiService: KakaoApiService): PlaceRepositoryInterface { + return PlaceRepository(sharedPreferences, kakaoApiService) + } + + @Provides + @Singleton + fun provideLogRepository(context: Context, placeDao: PlaceDao): LogRepositoryInterface { + return LogRepository(context.applicationContext as MyApplication, placeDao) + } + + @Provides + @Singleton + fun provideMapRepository(context: Context): MapRepositoryInterface { + return MapRepository(context.applicationContext as MyApplication) + } +} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/data/remote/api/KakaoApiService.kt b/app/src/main/java/campus/tech/kakao/map/data/remote/api/KakaoApiService.kt index f207730a..9c32a179 100644 --- a/app/src/main/java/campus/tech/kakao/map/data/remote/api/KakaoApiService.kt +++ b/app/src/main/java/campus/tech/kakao/map/data/remote/api/KakaoApiService.kt @@ -8,8 +8,8 @@ import retrofit2.http.Query interface KakaoApiService { @GET("v2/local/search/keyword") - fun getPlace( + suspend fun getPlace( @Header("Authorization") apiKey: String, @Query("query") query: String, - ): Call + ): KakaoResponse } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/repository/LogRepository.kt b/app/src/main/java/campus/tech/kakao/map/repository/LogRepository.kt index 0dbb3289..3b8c1e09 100644 --- a/app/src/main/java/campus/tech/kakao/map/repository/LogRepository.kt +++ b/app/src/main/java/campus/tech/kakao/map/repository/LogRepository.kt @@ -9,9 +9,10 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext +import javax.inject.Inject + +class LogRepository @Inject constructor (private val application: MyApplication, private val placeDao: PlaceDao): LogRepositoryInterface { -class LogRepository(private val application: MyApplication): LogRepositoryInterface { - private val placeDao: PlaceDao = AppDatabase.getDatabase(application).placeDao() private var logList = mutableListOf() override fun getAllLogs(): List { diff --git a/app/src/main/java/campus/tech/kakao/map/repository/PlaceRepository.kt b/app/src/main/java/campus/tech/kakao/map/repository/PlaceRepository.kt index 9a7cd7db..584d68e7 100644 --- a/app/src/main/java/campus/tech/kakao/map/repository/PlaceRepository.kt +++ b/app/src/main/java/campus/tech/kakao/map/repository/PlaceRepository.kt @@ -1,54 +1,42 @@ package campus.tech.kakao.map.repository -import android.content.ContentValues -import android.content.Context +import android.content.SharedPreferences import android.util.Log import campus.tech.kakao.map.BuildConfig import campus.tech.kakao.map.R -import campus.tech.kakao.map.base.MyApplication import campus.tech.kakao.map.data.db.entity.Place +import campus.tech.kakao.map.data.remote.api.KakaoApiService import campus.tech.kakao.map.data.remote.model.KakaoResponse -import campus.tech.kakao.map.data.remote.api.RetrofitClient import retrofit2.Call import retrofit2.Callback import retrofit2.Response +import javax.inject.Inject -class PlaceRepository(private val application: MyApplication): PlaceRepositoryInterface { - private val sharedPreferences = application.getSharedPreferences("LastLocation", Context.MODE_PRIVATE) +class PlaceRepository @Inject constructor( + private val sharedPreferences: SharedPreferences, + private val kakaoApiService: KakaoApiService +): PlaceRepositoryInterface { - override fun searchPlaces(query: String, callback: (List) -> Unit){ + override suspend fun searchPlaces(query: String): List{ val apiKey = "KakaoAK " + BuildConfig.KAKAO_REST_API_KEY - val retrofitService = RetrofitClient.retrofitService - retrofitService.getPlace(apiKey, query) - .enqueue(object : Callback { - override fun onResponse( - call: Call, - response: Response - ) { - if (response.isSuccessful) { - val documentList = response.body()?.documents ?: emptyList() - val placeList = documentList.map { - Place( - img = R.drawable.location, - name = it.placeName, - location = it.addressName, - category = it.categoryGroupName, - x = it.x, - y = it.y) - } - callback(placeList) - } else { - Log.d("KakaoAPI", response.errorBody()?.string().toString()) - callback(emptyList()) - } - } - - override fun onFailure(call: Call, t: Throwable) { - Log.d("KakaoAPI", "Failure: ${t.message}") - callback(emptyList()) - } - }) + return try { + val response = kakaoApiService.getPlace(apiKey, query) + val documentList = response.documents ?: emptyList() + documentList.map { + Place( + img = R.drawable.location, + name = it.placeName, + location = it.addressName, + category = it.categoryGroupName, + x = it.x, + y = it.y + ) + } + } catch (e: Exception) { + Log.e("KakaoAPI", "Failure: ${e.message}") + emptyList() + } } override fun saveLastLocation(item: Place) { diff --git a/app/src/main/java/campus/tech/kakao/map/repository/PlaceRepositoryInterface.kt b/app/src/main/java/campus/tech/kakao/map/repository/PlaceRepositoryInterface.kt index 91709de6..873e4e3e 100644 --- a/app/src/main/java/campus/tech/kakao/map/repository/PlaceRepositoryInterface.kt +++ b/app/src/main/java/campus/tech/kakao/map/repository/PlaceRepositoryInterface.kt @@ -3,6 +3,7 @@ package campus.tech.kakao.map.repository import campus.tech.kakao.map.data.db.entity.Place interface PlaceRepositoryInterface { - fun searchPlaces(query: String, callback: (List) -> Unit) + suspend fun searchPlaces(query: String): List + fun saveLastLocation(item: Place) } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/view/MainActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/MainActivity.kt index 70875b1b..50a70484 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/MainActivity.kt @@ -73,10 +73,8 @@ class MainActivity : AppCompatActivity() { } } private fun handleTextChanged(query: String){ - // ViewModel에 콜백전달 -> 순서부여 - placeViewModel.callResultList(query){ - observePlaceListChanges() - } + placeViewModel.callResultList(query) + observePlaceListChanges() } private fun observePlaceListChanges(){ updatePlaceList() diff --git a/app/src/main/java/campus/tech/kakao/map/view/MapViewActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/MapViewActivity.kt index 0adb18db..6ff91676 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/MapViewActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/MapViewActivity.kt @@ -27,12 +27,6 @@ import javax.inject.Inject @AndroidEntryPoint class MapViewActivity : AppCompatActivity() { - companion object { - const val EXTRA_ERROR_MSG = "ERROR" - const val DEFAULT_LONGITUDE = "127.0016985" - const val DEFAULT_LATITUDE = "37.5642135" - } - private lateinit var binding: ActivityMapViewBinding @Inject lateinit var mapRepository: MapRepositoryInterface private val mapViewModel: MapViewModel by viewModels() @@ -41,10 +35,8 @@ class MapViewActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = DataBindingUtil.setContentView(this, R.layout.activity_map_view) - - binding.viewModel = mapViewModel - binding.lifecycleOwner = this + setupBinding() + setupBottomSheetBehavior() bottomSheetBehavior = BottomSheetBehavior.from(binding.bottomView.bottomSheetLayout) @@ -55,8 +47,30 @@ class MapViewActivity : AppCompatActivity() { val placeX = intent.getStringExtra(MainActivity.EXTRA_PLACE_X) ?: DEFAULT_LONGITUDE val placeY = intent.getStringExtra(MainActivity.EXTRA_PLACE_Y) ?: DEFAULT_LATITUDE - processBottomSheet(placeName, placeAddr) + observeBottomSheetStateChanges() + mapViewModel.setPlaceInfo(placeName, placeAddr) + + startMap(lastLocation, placeName, placeAddr, placeX, placeY) + } + fun onSearchTextViewClick() { + startActivity(Intent(this@MapViewActivity, MainActivity::class.java)) + } + private fun setupBinding(){ + binding = DataBindingUtil.setContentView(this, R.layout.activity_map_view) + binding.view = this + binding.viewModel = mapViewModel + binding.lifecycleOwner = this + } + private fun setupBottomSheetBehavior(){ + bottomSheetBehavior = BottomSheetBehavior.from(binding.bottomView.bottomSheetLayout) + } + private fun observeBottomSheetStateChanges(){ + mapViewModel.bottomSheetState.observe(this) { state -> + bottomSheetBehavior.state = state + } + } + private fun startMap(lastLocation: Pair?, placeName: String?, placeAddr: String?, placeX: String, placeY: String){ try { binding.map.start(object : MapLifeCycleCallback() { override fun onMapDestroy() { @@ -64,11 +78,11 @@ class MapViewActivity : AppCompatActivity() { } override fun onMapError(exception: Exception?) { - val errorMsg = extractErrorMsg(exception.toString()) + val errorMsg = mapViewModel.extractErrorMsg(exception.toString()) val intent = Intent(this@MapViewActivity, ErrorActivity::class.java) intent.putExtra(EXTRA_ERROR_MSG, errorMsg) startActivity(intent) - Log.d("KakaoMap", errorMsg.toString()) + Log.d("KakaoMap", errorMsg) } }, object : KakaoMapReadyCallback() { override fun onMapReady(map: KakaoMap) { @@ -93,41 +107,11 @@ class MapViewActivity : AppCompatActivity() { val cameraUpdate = CameraUpdateFactory.newCenterPosition(position) map.moveCamera(cameraUpdate, CameraAnimation.from(500, true, true)) } - }) Log.d("MapViewActivity", "mapView start called") } catch (e: Exception) { Log.e("MapViewActivity", "Exception during mapView.start", e) } - - binding.search.setOnClickListener { onSearchTextViewClick() } - } - - private fun onSearchTextViewClick() { - startActivity(Intent(this@MapViewActivity, MainActivity::class.java)) - } - - private fun processBottomSheet(placeName: String?, placeAddr: String?) { - if (!placeName.isNullOrEmpty() && !placeAddr.isNullOrEmpty()) { - showBottomSheet(placeName, placeAddr) - } else { - hideBottomSheet() - } - } - - private fun showBottomSheet(placeName: String, placeAddr: String){ - binding.bottomView.placeName.text = placeName - binding.bottomView.placeAddress.text = placeAddr - bottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED - } - - private fun hideBottomSheet(){ - bottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN - } - - private fun extractErrorMsg(fullMsg: String): String { - val parts = fullMsg.split(": ", limit = 2) - return if (parts.size > 1) parts[1] else "" } override fun onResume() { @@ -139,4 +123,11 @@ class MapViewActivity : AppCompatActivity() { super.onPause() binding.map.pause() } + + companion object { + const val EXTRA_ERROR_MSG = "ERROR" + const val DEFAULT_LONGITUDE = "127.0016985" + const val DEFAULT_LATITUDE = "37.5642135" + } + } diff --git a/app/src/main/java/campus/tech/kakao/map/view/RecyclerViewAdapter.kt b/app/src/main/java/campus/tech/kakao/map/view/RecyclerViewAdapter.kt index eda81376..9154fdaf 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/RecyclerViewAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/RecyclerViewAdapter.kt @@ -5,11 +5,13 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import campus.tech.kakao.map.R import campus.tech.kakao.map.data.db.entity.Place +import campus.tech.kakao.map.databinding.PlaceCardBinding class RecyclerViewAdapter( private val onItemClicked: (Place) -> Unit @@ -23,17 +25,10 @@ class RecyclerViewAdapter( } } ) { - inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - private val img: ImageView = itemView.findViewById(R.id.place_img) - private val name: TextView = itemView.findViewById(R.id.place_name) - private val location: TextView = itemView.findViewById(R.id.place_location) - private val category: TextView = itemView.findViewById(R.id.place_category) - + inner class ViewHolder(private val binding: PlaceCardBinding) : RecyclerView.ViewHolder(binding.root) { fun bind(place: Place) { - img.setImageResource(place.img) - name.text = place.name - location.text = place.location - category.text = place.category + binding.place = place + binding.executePendingBindings() itemView.setOnClickListener { onItemClicked(place) } } @@ -41,8 +36,8 @@ class RecyclerViewAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val inflater = LayoutInflater.from(parent.context) - val view = inflater.inflate(R.layout.place_card, parent, false) - return ViewHolder(view) + val binding = DataBindingUtil.inflate(inflater, R.layout.place_card, parent, false) + return ViewHolder(binding) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { diff --git a/app/src/main/java/campus/tech/kakao/map/view/TapViewAdapter.kt b/app/src/main/java/campus/tech/kakao/map/view/TapViewAdapter.kt index b9543a44..7bc3a8a3 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/TapViewAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/TapViewAdapter.kt @@ -5,11 +5,13 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import campus.tech.kakao.map.R import campus.tech.kakao.map.data.db.entity.Place +import campus.tech.kakao.map.databinding.TabCardBinding class TapViewAdapter( private val onItemRemoved: (Place) -> Unit @@ -26,12 +28,12 @@ class TapViewAdapter( } ) { - inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - private val cancelButton: ImageView = itemView.findViewById(R.id.tab_close_button) - private val placeName: TextView = itemView.findViewById(R.id.tab_place_textview) + inner class ViewHolder(private val binding: TabCardBinding) : RecyclerView.ViewHolder(binding.root) { fun bind(place: Place) { - placeName.text = place.name - cancelButton.setOnClickListener { + binding.place = place + binding.executePendingBindings() + + binding.tabCloseButton.setOnClickListener { onItemRemoved(place) } } @@ -39,8 +41,8 @@ class TapViewAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val inflater = LayoutInflater.from(parent.context) - val view = inflater.inflate(R.layout.tab_card, parent, false) - return ViewHolder(view) + val binding = DataBindingUtil.inflate(inflater, R.layout.tab_card, parent, false) + return ViewHolder(binding) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { diff --git a/app/src/main/java/campus/tech/kakao/map/viewmodel/MapViewModel.kt b/app/src/main/java/campus/tech/kakao/map/viewmodel/MapViewModel.kt index d9a282c1..19904914 100644 --- a/app/src/main/java/campus/tech/kakao/map/viewmodel/MapViewModel.kt +++ b/app/src/main/java/campus/tech/kakao/map/viewmodel/MapViewModel.kt @@ -1,10 +1,9 @@ package campus.tech.kakao.map.viewmodel -import android.app.Application -import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import campus.tech.kakao.map.repository.MapRepository import campus.tech.kakao.map.repository.MapRepositoryInterface +import com.google.android.material.bottomsheet.BottomSheetBehavior import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @@ -12,9 +11,27 @@ import javax.inject.Inject class MapViewModel @Inject constructor( private val mapRepository: MapRepositoryInterface ): ViewModel() { + val placeName = MutableLiveData() + val placeAddr = MutableLiveData() + val bottomSheetState = MutableLiveData() + fun getLastLocation(): Pair? { return mapRepository.getLastLocation() } + fun setPlaceInfo(placeName: String?, placeAddr: String?){ + if (!placeName.isNullOrEmpty() && !placeAddr.isNullOrEmpty()) { + this.placeName.value = placeName + this.placeAddr.value = placeAddr + bottomSheetState.value = BottomSheetBehavior.STATE_COLLAPSED + } else { + bottomSheetState.value = BottomSheetBehavior.STATE_HIDDEN + } + } + fun extractErrorMsg(fullMsg: String): String { + val parts = fullMsg.split(": ", limit = 2) + return if (parts.size > 1) parts[1] else "" + } + } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/viewmodel/PlaceViewModel.kt b/app/src/main/java/campus/tech/kakao/map/viewmodel/PlaceViewModel.kt index 3f247a5b..f7040c21 100644 --- a/app/src/main/java/campus/tech/kakao/map/viewmodel/PlaceViewModel.kt +++ b/app/src/main/java/campus/tech/kakao/map/viewmodel/PlaceViewModel.kt @@ -3,9 +3,11 @@ package campus.tech.kakao.map.viewmodel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import campus.tech.kakao.map.data.db.entity.Place import campus.tech.kakao.map.repository.PlaceRepositoryInterface import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel @@ -19,15 +21,14 @@ class PlaceViewModel @Inject constructor( private var _placeListVisible = MutableLiveData() val placeListVisible: LiveData get() = _placeListVisible - fun callResultList(userInput: String, callback: () -> Unit){ - if (userInput == ""){ - _placeList.value = emptyList() - callback() - } else{ - placeRepository.searchPlaces(userInput) { - _placeList.value = it + fun callResultList(userInput: String){ + viewModelScope.launch { + if (userInput.isBlank()) { + _placeList.value = emptyList() + } else { + val result = placeRepository.searchPlaces(userInput) + _placeList.value = result updatePlaceListVisibility() - callback() } } } diff --git a/app/src/main/res/layout/activity_map_view.xml b/app/src/main/res/layout/activity_map_view.xml index 4f1c8fb7..ab70034a 100644 --- a/app/src/main/res/layout/activity_map_view.xml +++ b/app/src/main/res/layout/activity_map_view.xml @@ -4,6 +4,10 @@ xmlns:tools="http://schemas.android.com/tools" tools:context=".view.MapViewActivity"> + + @@ -39,6 +43,7 @@ android:text="검색어를 입력해 주세요." android:textColor="#5A5A5A" android:gravity="center_vertical" + android:onClick="@{()->view.onSearchTextViewClick()}" app:layout_constraintTop_toTopOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" /> @@ -56,6 +61,7 @@ diff --git a/app/src/main/res/layout/bottom_sheet.xml b/app/src/main/res/layout/bottom_sheet.xml index 00648437..deb7c501 100644 --- a/app/src/main/res/layout/bottom_sheet.xml +++ b/app/src/main/res/layout/bottom_sheet.xml @@ -1,40 +1,48 @@ - + + + + - + - + - + - \ No newline at end of file + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/place_card.xml b/app/src/main/res/layout/place_card.xml index 7eedc79b..eaf7d412 100644 --- a/app/src/main/res/layout/place_card.xml +++ b/app/src/main/res/layout/place_card.xml @@ -1,57 +1,66 @@ - - - - + + + + + + + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="90dp"> - + + + android:layout_marginStart="10dp" + android:layout_marginBottom="10dp" + android:gravity="left"> + + + + + + + - + android:layout_gravity="right" + android:text="@{place.category}" + android:textColor="#494848" /> - - - - - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/tab_card.xml b/app/src/main/res/layout/tab_card.xml index 98394122..c3380270 100644 --- a/app/src/main/res/layout/tab_card.xml +++ b/app/src/main/res/layout/tab_card.xml @@ -1,23 +1,32 @@ - + - + + + - + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:layout_marginEnd="10dp"> - \ No newline at end of file + + + + + + \ No newline at end of file