From bc798bcbe98da7e3ab671ca5acec47e347a66f87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Wed, 24 Jul 2024 20:24:58 +0900 Subject: [PATCH 01/22] docs: update README.md --- README.md | 31 ++++--------------------------- 1 file changed, 4 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index f091e3fc..c05db8f0 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,4 @@ -# android-map-location -## step1 기능 목록 -1. 저장된 검색어 목록에 기능 추가하기 - - 저장된 검색어 중 하나를 선택하면 해당 검색어의 검색 결과 목록이 표시된다. -2. 검색 결과 목록에 기능 추가하기 - - 검색 결과 목록 중 하나의 항목을 선택하면 해당 항목의 위치를 지도에 표시한다. -3. 마지막 위치 저장하기 - - 앱 종료 시 마지막 위치를 SharedPreference 저장하여 다시 앱 실행 시 해당 위치로 포커스 한다. -4. 에러 처리하기 - - 카카오지도 onMapError() 호출 시 에러 화면을 보여준다. "지도 인증을 실패했습니다. 다시 시도해주세요. '에러이름(에러코드): 에러메세지' -## step2 기능 목록 -- 테스트 코드 - JUnit과 mockito를 이용하여 단위 테스트 코드를 작성한다. - - data source 테스트 - - local - - SavedLocation 저장 테스트 - - SavedLocation 삭제 테스트 - - SavedLocation 조회 테스트 - - 마지막 위치 저장 테스트 - - UI 테스트 코드 - - 검색 페이지 - - 검색 결과 목록 테스트 - - 검색어 저장 목록 테스트 - - clearButton 테스트 - - 지도 페이지 - - BottomSheet 테스트 - - KakaoMap Label 테스트 - - 지도 에러 화면 테스트 \ No newline at end of file +# android-map-refactoring +## 기능 목록 +- 데이터베이스를 Room으로 변경한다. +- Hilt를 사용하여 의존성 주입을 적용한다. From dd8ed1bcd097ff6d426d52445137da9a9c62fab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Wed, 24 Jul 2024 21:41:35 +0900 Subject: [PATCH 02/22] =?UTF-8?q?feat:=20Room=20=ED=94=8C=EB=9F=AC?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=EA=B3=BC=20=EB=9D=BC=EC=9D=B4=EB=B8=8C?= =?UTF-8?q?=EB=9F=AC=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 90173142..54827516 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -3,6 +3,7 @@ import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties plugins { id("com.android.application") id("org.jetbrains.kotlin.android") + id("kotlin-kapt") } android { @@ -79,4 +80,7 @@ dependencies { implementation("com.squareup.retrofit2:retrofit:2.11.0") implementation("com.squareup.retrofit2:converter-gson:2.11.0") androidTestImplementation("androidx.test.espresso:espresso-intents:3.3.0") + // room + implementation("androidx.room:room-runtime:2.6.1") + kapt("androidx.room:room-compiler:2.6.1") } From 1faf7fd0ce38a0687133230ceaca967499037aa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Wed, 24 Jul 2024 23:55:24 +0900 Subject: [PATCH 03/22] =?UTF-8?q?feat:=20SavedLocation=EC=9D=84=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20entity,=20dao,=20room=20database=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tech/kakao/map/model/AppDatabase.kt | 28 +++++++++++++++++++ .../tech/kakao/map/model/SavedLocation.kt | 6 ++++ .../tech/kakao/map/model/SavedLocationDao.kt | 18 ++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 app/src/main/java/campus/tech/kakao/map/model/AppDatabase.kt create mode 100644 app/src/main/java/campus/tech/kakao/map/model/SavedLocationDao.kt diff --git a/app/src/main/java/campus/tech/kakao/map/model/AppDatabase.kt b/app/src/main/java/campus/tech/kakao/map/model/AppDatabase.kt new file mode 100644 index 00000000..e855f561 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/model/AppDatabase.kt @@ -0,0 +1,28 @@ +package campus.tech.kakao.map.model + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase + +@Database(entities = [SavedLocation::class], version = 1) +abstract class AppDatabase: RoomDatabase() { + abstract fun savedLocationDao(): SavedLocationDao + + companion object{ + @Volatile + private var INSTANCE: AppDatabase? = null + + fun getDatabase(context: Context): AppDatabase { + return INSTANCE ?: synchronized(this) { + val instance = Room.databaseBuilder( + context.applicationContext, + AppDatabase::class.java, + "my-database" + ).build() + INSTANCE = instance + instance + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/SavedLocation.kt b/app/src/main/java/campus/tech/kakao/map/model/SavedLocation.kt index d09e0cb2..32ab8e81 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/SavedLocation.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/SavedLocation.kt @@ -1,5 +1,11 @@ package campus.tech.kakao.map.model +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "savedLocations") data class SavedLocation( + @PrimaryKey(autoGenerate = true) + val id: Long = 0, val title: String ) \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/SavedLocationDao.kt b/app/src/main/java/campus/tech/kakao/map/model/SavedLocationDao.kt new file mode 100644 index 00000000..8fef5a1d --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/model/SavedLocationDao.kt @@ -0,0 +1,18 @@ +package campus.tech.kakao.map.model + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.Query + +@Dao +interface SavedLocationDao { + @Insert + suspend fun insert(savedLocation: SavedLocation): Long + + @Query("SELECT * FROM savedLocations") + suspend fun getAll(): List + + @Delete + suspend fun delete(savedLocation: SavedLocation) +} \ No newline at end of file From e12de89eb84f52ca3b7a79a98d51507e31c03b54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Wed, 24 Jul 2024 23:59:47 +0900 Subject: [PATCH 04/22] =?UTF-8?q?feat:=20SavedLocationRepository=EC=97=90?= =?UTF-8?q?=EC=84=9C=20SavedLocationDataSource=EA=B0=80=20=EC=95=84?= =?UTF-8?q?=EB=8B=8C=20addDatabase=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=A5=BC=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SavedLocation에 id 속성을 추가하기 위해서 Location에도 id 속성 추가(Kakao api에서 id 값을 가져온다) - Location을 객체 직렬화 후 intent로 클래스를 전달하도록 수정 --- app/build.gradle.kts | 1 + .../campus/tech/kakao/map/model/Location.kt | 8 ++- .../datasource/LastLocationlDataSource.kt | 19 ++++--- .../datasource/SavedLocationDataSource.kt | 56 ------------------- .../repository/SavedLocationRepository.kt | 23 ++++---- .../tech/kakao/map/view/map/MapActivity.kt | 21 +++---- .../kakao/map/view/search/MainActivity.kt | 23 +++----- .../map/view/search/SavedLocationAdapter.kt | 6 +- .../map/viewmodel/SavedLocationViewModel.kt | 35 ++++++++---- .../kakao/map/SavedLocationDataSourceTest.kt | 1 - 10 files changed, 72 insertions(+), 121 deletions(-) delete mode 100644 app/src/main/java/campus/tech/kakao/map/model/datasource/SavedLocationDataSource.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 54827516..f053cf86 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -83,4 +83,5 @@ dependencies { // room implementation("androidx.room:room-runtime:2.6.1") kapt("androidx.room:room-compiler:2.6.1") + implementation("androidx.room:room-ktx:2.4.3") } diff --git a/app/src/main/java/campus/tech/kakao/map/model/Location.kt b/app/src/main/java/campus/tech/kakao/map/model/Location.kt index a43c7125..f97c2093 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/Location.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/Location.kt @@ -1,15 +1,19 @@ package campus.tech.kakao.map.model +import java.io.Serializable + data class Location( + val id: Long, val title: String, val address: String, val category: String, val longitude: Double, val latitude: Double -){ +): Serializable +{ companion object { fun LocationDto.toLocation(): Location { - return Location(title, address, category, x.toDouble(), y.toDouble()) + return Location(id.toLong(), title, address, category, x.toDouble(), y.toDouble()) } } diff --git a/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlDataSource.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlDataSource.kt index e2013e90..1ae0bd39 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlDataSource.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlDataSource.kt @@ -6,22 +6,23 @@ import campus.tech.kakao.map.model.Location class LastLocationlDataSource() { fun putLastLocation(location: Location) { - if (location != null) { - App.sharedPreferencesManager.putString("longitude", location.longitude.toString()) - App.sharedPreferencesManager.putString("latitude", location.latitude.toString()) - App.sharedPreferencesManager.putString("title", location.title.toString()) - App.sharedPreferencesManager.putString("address", location.address.toString()) - App.sharedPreferencesManager.putString("category", location.category.toString()) - } + App.sharedPreferencesManager.putString("id", location.id.toString()) + App.sharedPreferencesManager.putString("longitude", location.longitude.toString()) + App.sharedPreferencesManager.putString("latitude", location.latitude.toString()) + App.sharedPreferencesManager.putString("title", location.title.toString()) + App.sharedPreferencesManager.putString("address", location.address.toString()) + App.sharedPreferencesManager.putString("category", location.category.toString()) + } fun getLastLocation(): Location? { + val id = App.sharedPreferencesManager.getString("id", "").toString() + if(id == "") return null val title = App.sharedPreferencesManager.getString("title", "") - if(title == "") return null val longitude = App.sharedPreferencesManager.getString("longitude", "").toString().toDouble() val latitude = App.sharedPreferencesManager.getString("latitude", "").toString().toDouble() val address = App.sharedPreferencesManager.getString("address", "").toString() val category = App.sharedPreferencesManager.getString("category", "").toString() - return Location(title, address, category, longitude, latitude) + return Location(id.toLong(), title, address, category, longitude, latitude) } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/datasource/SavedLocationDataSource.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/SavedLocationDataSource.kt deleted file mode 100644 index 9310c1e8..00000000 --- a/app/src/main/java/campus/tech/kakao/map/model/datasource/SavedLocationDataSource.kt +++ /dev/null @@ -1,56 +0,0 @@ -package campus.tech.kakao.map.model.datasource - -import android.content.ContentValues -import android.util.Log -import campus.tech.kakao.map.model.Contract.SavedLocationEntry -import campus.tech.kakao.map.model.LocationDbHelper -import campus.tech.kakao.map.model.SavedLocation - -class SavedLocationDataSource(private val dbHelper : LocationDbHelper) { - - fun addSavedLocation(title: String): Long { - val db = dbHelper.writableDatabase - val values = ContentValues().apply { - put(SavedLocationEntry.COLUMN_NAME_TITLE, title) - } - Log.d("jieun", "insertSavedLocation 저장완료") - return db.insert(SavedLocationEntry.TABLE_NAME, null, values) - } - - fun getSavedLocationAll(): MutableList { - val db = dbHelper.readableDatabase - - val projection = arrayOf( - SavedLocationEntry.COLUMN_NAME_TITLE - ) - val sortOrder = "${SavedLocationEntry.COLUMN_NAME_TITLE} ASC" - val cursor = db.query( - SavedLocationEntry.TABLE_NAME, - projection, - null, - null, - null, - null, - sortOrder - ) - - val results = mutableListOf() - with(cursor) { - while (moveToNext()) { - val title = getString(getColumnIndexOrThrow(SavedLocationEntry.COLUMN_NAME_TITLE)) - results.add(SavedLocation(title)) - } - } - cursor.close() - return results - } - - fun deleteSavedLocation(title: String): Int { - val db = dbHelper.writableDatabase - - val selection = "${SavedLocationEntry.COLUMN_NAME_TITLE} = ?" - val selectionArgs = arrayOf(title) - - return db.delete(SavedLocationEntry.TABLE_NAME, selection, selectionArgs) - } -} diff --git a/app/src/main/java/campus/tech/kakao/map/model/repository/SavedLocationRepository.kt b/app/src/main/java/campus/tech/kakao/map/model/repository/SavedLocationRepository.kt index e4996d97..f6681a93 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/repository/SavedLocationRepository.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/repository/SavedLocationRepository.kt @@ -1,25 +1,24 @@ package campus.tech.kakao.map.model.repository +import android.util.Log +import campus.tech.kakao.map.model.AppDatabase import campus.tech.kakao.map.model.SavedLocation -import campus.tech.kakao.map.model.datasource.SavedLocationDataSource class SavedLocationRepository( - private val locationLocalRepository: SavedLocationDataSource + private val appDatabase: AppDatabase ) { - fun getSavedLocationAll(): MutableList { - val results = locationLocalRepository.getSavedLocationAll() - return if(results.isNotEmpty()) results else mutableListOf() + suspend fun getSavedLocationAll(): MutableList { + val results = appDatabase.savedLocationDao().getAll() + return if(results.isNotEmpty()) results.toMutableList() else mutableListOf() } - fun addSavedLocation(title: String) { - locationLocalRepository.addSavedLocation(title) + suspend fun addSavedLocation(savedLocation: SavedLocation) { + appDatabase.savedLocationDao().insert(savedLocation) } - fun deleteSavedLocation(title: String): Boolean { - if (locationLocalRepository.deleteSavedLocation(title) == 1) { - return true - } - return false + suspend fun deleteSavedLocation(savedLocation: SavedLocation) { + + appDatabase.savedLocationDao().delete(savedLocation) } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt index c1f66493..eab89f2e 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt @@ -140,7 +140,7 @@ class MapActivity : AppCompatActivity() { } private fun getCoordinates(): Location? { - var location = getCoordinatesByIntent() + var location = getLocationByIntent() if(location == null) { location = lastLocationRepository.getLastLocation() } @@ -148,17 +148,12 @@ class MapActivity : AppCompatActivity() { } - private fun getCoordinatesByIntent(): Location? { - if (intent.hasExtra("title") && intent.hasExtra("longitude") - && intent.hasExtra("latitude") && intent.hasExtra("address")) { - val title = intent.getStringExtra("title") - val longitude = intent.getDoubleExtra("longitude", 0.0) - val latitude = intent.getDoubleExtra("latitude", 0.0) - val address = intent.getStringExtra("address").toString() - val category = intent.getStringExtra("category").toString() - if (title != null) { - return Location(title, address, category, longitude, latitude) - } else return null - } else return null + private fun getLocationByIntent(): Location? { + if (intent.hasExtra("location")) { + val location = intent.getSerializableExtra("location") as Location + Log.d("jieun","getLocationByIntent location "+location.toString()) + return location + } + return null } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt index f0d1bca5..fa783855 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.os.Bundle import android.text.Editable import android.text.TextWatcher +import android.util.Log import android.view.View import android.widget.EditText import android.widget.ImageView @@ -13,12 +14,11 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import campus.tech.kakao.map.model.datasource.SavedLocationDataSource import campus.tech.kakao.map.model.datasource.LocationDataSource import campus.tech.kakao.map.R +import campus.tech.kakao.map.model.AppDatabase import campus.tech.kakao.map.model.Location import campus.tech.kakao.map.model.SavedLocation -import campus.tech.kakao.map.model.LocationDbHelper import campus.tech.kakao.map.model.repository.LocationRepository import campus.tech.kakao.map.model.repository.SavedLocationRepository import campus.tech.kakao.map.view.map.MapActivity @@ -39,17 +39,16 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener { ViewModelProvider(this, SavedLocationViewModelFactory(savedLocationRepository)) .get(SavedLocationViewModel::class.java) } - private val savedLocationAdapter: SavedLocationAdapter by lazy { SavedLocationAdapter(this) } private val savedLocationRecyclerView: RecyclerView by lazy { findViewById(R.id.savedLocationRecyclerView) } - private val locationDbHelper: LocationDbHelper by lazy { LocationDbHelper(this) } - private val locationLocalDataSource: SavedLocationDataSource by lazy { SavedLocationDataSource(locationDbHelper) } private val locationRemoteDataSource: LocationDataSource by lazy { LocationDataSource() } private val locationRepository: LocationRepository by lazy { LocationRepository(locationRemoteDataSource) } - private val savedLocationRepository: SavedLocationRepository by lazy { SavedLocationRepository(locationLocalDataSource) } + + private val appDatabase: AppDatabase by lazy { AppDatabase.getDatabase(this) } + private val savedLocationRepository: SavedLocationRepository by lazy { SavedLocationRepository(appDatabase) } private val clearButton: ImageView by lazy { findViewById(R.id.clearButton) } private val searchEditText: EditText by lazy { findViewById(R.id.SearchEditTextInMain) } @@ -122,19 +121,15 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener { } override fun onLocationViewClicked(location: Location) { - savedLocationViewModel.addSavedLocation(location.title) + savedLocationViewModel.addSavedLocation(location.id, location.title) val intent = Intent(this@MainActivity, MapActivity::class.java) - intent.putExtra("title", location.title) - intent.putExtra("address", location.address) - intent.putExtra("category", location.category) - intent.putExtra("longitude", location.longitude) - intent.putExtra("latitude", location.latitude) + intent.putExtra("location", location) startActivity(intent) } - override fun onSavedLocationXButtonClicked(item: SavedLocation) { - savedLocationViewModel.deleteSavedLocation(item) + override fun onSavedLocationXButtonClicked(savedLocation: SavedLocation) { + savedLocationViewModel.deleteSavedLocation(savedLocation) } override fun onSavedLocationViewClicked(title: String) { diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt b/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt index 97335afb..f852c358 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt @@ -1,5 +1,6 @@ package campus.tech.kakao.map.view.search +import android.util.Log import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -17,7 +18,7 @@ class SavedLocationAdapter( ) : ListAdapter( object: DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: SavedLocation, newItem: SavedLocation): Boolean { - return oldItem.title == newItem.title + return oldItem.id == newItem.id } override fun areContentsTheSame(oldItem: SavedLocation, newItem: SavedLocation): Boolean { return oldItem == newItem @@ -39,7 +40,8 @@ class SavedLocationAdapter( itemSelectedListener.onSavedLocationViewClicked(getItem(bindingAdapterPosition).title) } savedLocationXButton.setOnClickListener { - itemSelectedListener.onSavedLocationXButtonClicked(getItem(bindingAdapterPosition) as SavedLocation) + val savedLocation = getItem(bindingAdapterPosition) as SavedLocation + itemSelectedListener.onSavedLocationXButtonClicked(savedLocation) } } } diff --git a/app/src/main/java/campus/tech/kakao/map/viewmodel/SavedLocationViewModel.kt b/app/src/main/java/campus/tech/kakao/map/viewmodel/SavedLocationViewModel.kt index 4d193c09..2e001e2d 100644 --- a/app/src/main/java/campus/tech/kakao/map/viewmodel/SavedLocationViewModel.kt +++ b/app/src/main/java/campus/tech/kakao/map/viewmodel/SavedLocationViewModel.kt @@ -1,10 +1,13 @@ package campus.tech.kakao.map.viewmodel +import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import campus.tech.kakao.map.model.SavedLocation import campus.tech.kakao.map.model.repository.SavedLocationRepository +import kotlinx.coroutines.launch class SavedLocationViewModel( private val savedLocationRepository: SavedLocationRepository @@ -13,25 +16,33 @@ class SavedLocationViewModel( val savedLocation: LiveData> get() = _savedLocation fun setSavedLocation() { - _savedLocation.value = savedLocationRepository.getSavedLocationAll() + viewModelScope.launch { + _savedLocation.value = savedLocationRepository.getSavedLocationAll() + } } - fun addSavedLocation(title: String) { - val savedLocation = SavedLocation(title) - if(_savedLocation.value?.contains(savedLocation) == false){ - savedLocationRepository.addSavedLocation(title) - val currentList = _savedLocation.value ?: return - if (currentList.add(savedLocation)) { - _savedLocation.value = currentList + fun addSavedLocation(id: Long, title: String) { + val savedLocation = SavedLocation(id, title) + if (_savedLocation.value?.contains(savedLocation) == false) { + viewModelScope.launch { + savedLocationRepository.addSavedLocation(savedLocation) + val currentList = _savedLocation.value + if (currentList != null) { + currentList.add(savedLocation) + _savedLocation.value = currentList + } } } } - fun deleteSavedLocation(savedLocation: SavedLocation) { - if (savedLocationRepository.deleteSavedLocation(savedLocation.title)) { - val currentList = _savedLocation.value ?: return - if (currentList.remove(savedLocation)) { + fun deleteSavedLocation(savedLocation: SavedLocation) { + viewModelScope.launch { + savedLocationRepository.deleteSavedLocation(savedLocation) + val currentList = _savedLocation.value + if (currentList != null) { + currentList.remove(savedLocation) _savedLocation.value = currentList } } + } } diff --git a/app/src/test/java/campus/tech/kakao/map/SavedLocationDataSourceTest.kt b/app/src/test/java/campus/tech/kakao/map/SavedLocationDataSourceTest.kt index 4726ee2c..b2ead7fd 100644 --- a/app/src/test/java/campus/tech/kakao/map/SavedLocationDataSourceTest.kt +++ b/app/src/test/java/campus/tech/kakao/map/SavedLocationDataSourceTest.kt @@ -5,7 +5,6 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import campus.tech.kakao.map.model.LocationDbHelper import campus.tech.kakao.map.model.SavedLocation -import campus.tech.kakao.map.model.datasource.SavedLocationDataSource import org.junit.After import org.junit.Assert.assertEquals import org.junit.Before From a02a8cf27e8c3c83c1e6ec601f5df62f298fcb94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Thu, 25 Jul 2024 00:21:24 +0900 Subject: [PATCH 05/22] =?UTF-8?q?refactor:=20data=20source=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EB=93=A4=EC=9D=98=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20LocationDto=EB=A5=BC=20Location=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95=ED=95=98=EB=8A=94=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20LocationRepository=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../campus/tech/kakao/map/model/Contract.kt | 17 -------- .../tech/kakao/map/model/LocationDbHelper.kt | 40 ------------------- .../map/model/{ => datasource}/AppDatabase.kt | 3 +- .../{repository => datasource}/KakaoAPI.kt | 2 +- ...e.kt => LastLocationlSharedPreferences.kt} | 2 +- .../{LocationDataSource.kt => LocationApi.kt} | 16 ++------ .../{ => datasource}/SavedLocationDao.kt | 3 +- .../repository/LastLocationRepository.kt | 8 ++-- .../model/repository/LocationRepository.kt | 17 ++++++-- .../repository/SavedLocationRepository.kt | 3 +- .../tech/kakao/map/view/map/MapActivity.kt | 6 +-- .../kakao/map/view/search/MainActivity.kt | 9 ++--- .../kakao/map/viewmodel/LocationViewModel.kt | 2 +- ...aSourceTest.kt => SavedLocationApiTest.kt} | 3 +- 14 files changed, 37 insertions(+), 94 deletions(-) delete mode 100644 app/src/main/java/campus/tech/kakao/map/model/Contract.kt delete mode 100644 app/src/main/java/campus/tech/kakao/map/model/LocationDbHelper.kt rename app/src/main/java/campus/tech/kakao/map/model/{ => datasource}/AppDatabase.kt (89%) rename app/src/main/java/campus/tech/kakao/map/model/{repository => datasource}/KakaoAPI.kt (89%) rename app/src/main/java/campus/tech/kakao/map/model/datasource/{LastLocationlDataSource.kt => LastLocationlSharedPreferences.kt} (97%) rename app/src/main/java/campus/tech/kakao/map/model/datasource/{LocationDataSource.kt => LocationApi.kt} (52%) rename app/src/main/java/campus/tech/kakao/map/model/{ => datasource}/SavedLocationDao.kt (79%) rename app/src/test/java/campus/tech/kakao/map/{SavedLocationDataSourceTest.kt => SavedLocationApiTest.kt} (96%) diff --git a/app/src/main/java/campus/tech/kakao/map/model/Contract.kt b/app/src/main/java/campus/tech/kakao/map/model/Contract.kt deleted file mode 100644 index ffe4a09b..00000000 --- a/app/src/main/java/campus/tech/kakao/map/model/Contract.kt +++ /dev/null @@ -1,17 +0,0 @@ -package campus.tech.kakao.map.model - -import android.provider.BaseColumns - -object Contract { - object LocationEntry: BaseColumns{ - const val TABLE_NAME = "locations" - const val COLUMN_NAME_TITLE = "name" - const val COLUMN_NAME_ADDRESS = "address" - const val COLUMN_NAME_CATEGORY = "category" - } - - object SavedLocationEntry: BaseColumns{ - const val TABLE_NAME = "saved_locations" - const val COLUMN_NAME_TITLE = "name" - } -} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/LocationDbHelper.kt b/app/src/main/java/campus/tech/kakao/map/model/LocationDbHelper.kt deleted file mode 100644 index b74b29ac..00000000 --- a/app/src/main/java/campus/tech/kakao/map/model/LocationDbHelper.kt +++ /dev/null @@ -1,40 +0,0 @@ -package campus.tech.kakao.map.model - -import android.content.Context -import android.database.sqlite.SQLiteDatabase -import android.database.sqlite.SQLiteOpenHelper -import campus.tech.kakao.map.model.Contract.LocationEntry -import campus.tech.kakao.map.model.Contract.SavedLocationEntry -class LocationDbHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) { - - private val SQL_CREATE_LOCATION_TABLE = - "CREATE TABLE ${LocationEntry.TABLE_NAME} (" + - "${LocationEntry.COLUMN_NAME_TITLE} TEXT primary key," + - "${LocationEntry.COLUMN_NAME_ADDRESS} TEXT,"+ - "${LocationEntry.COLUMN_NAME_CATEGORY} TEXT"+ - ")" - - private val SQL_DELETE_LOCATION_TABLE = "DROP TABLE IF EXISTS ${LocationEntry.TABLE_NAME}" - - private val SQL_CREATE_SAVED_LOCATION_TABLE = - "CREATE TABLE ${SavedLocationEntry.TABLE_NAME} (" + - "${SavedLocationEntry.COLUMN_NAME_TITLE} TEXT primary key"+ - ")" - - private val SQL_DELETE_SAVED_LOCATION_TABLE = - "DROP TABLE IF EXISTS ${SavedLocationEntry.TABLE_NAME}" - - override fun onCreate(db: SQLiteDatabase) { - db.execSQL(SQL_CREATE_LOCATION_TABLE) - db.execSQL(SQL_CREATE_SAVED_LOCATION_TABLE) - } - override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { - db.execSQL(SQL_DELETE_LOCATION_TABLE) - db.execSQL(SQL_DELETE_SAVED_LOCATION_TABLE) - onCreate(db) - } - companion object { - const val DATABASE_VERSION = 1 - const val DATABASE_NAME = "map.db" - } -} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/AppDatabase.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/AppDatabase.kt similarity index 89% rename from app/src/main/java/campus/tech/kakao/map/model/AppDatabase.kt rename to app/src/main/java/campus/tech/kakao/map/model/datasource/AppDatabase.kt index e855f561..fcf19fc8 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/AppDatabase.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/datasource/AppDatabase.kt @@ -1,9 +1,10 @@ -package campus.tech.kakao.map.model +package campus.tech.kakao.map.model.datasource import android.content.Context import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase +import campus.tech.kakao.map.model.SavedLocation @Database(entities = [SavedLocation::class], version = 1) abstract class AppDatabase: RoomDatabase() { diff --git a/app/src/main/java/campus/tech/kakao/map/model/repository/KakaoAPI.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/KakaoAPI.kt similarity index 89% rename from app/src/main/java/campus/tech/kakao/map/model/repository/KakaoAPI.kt rename to app/src/main/java/campus/tech/kakao/map/model/datasource/KakaoAPI.kt index 6e2b2dac..05d7d10f 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/repository/KakaoAPI.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/datasource/KakaoAPI.kt @@ -1,4 +1,4 @@ -package campus.tech.kakao.map.model.repository +package campus.tech.kakao.map.model.datasource import campus.tech.kakao.map.model.SearchFromKeywordResponse import retrofit2.Response diff --git a/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlDataSource.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlSharedPreferences.kt similarity index 97% rename from app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlDataSource.kt rename to app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlSharedPreferences.kt index 1ae0bd39..b5149c48 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlDataSource.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlSharedPreferences.kt @@ -3,7 +3,7 @@ package campus.tech.kakao.map.model.datasource import campus.tech.kakao.map.App import campus.tech.kakao.map.model.Location -class LastLocationlDataSource() { +class LastLocationlSharedPreferences() { fun putLastLocation(location: Location) { App.sharedPreferencesManager.putString("id", location.id.toString()) diff --git a/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationDataSource.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationApi.kt similarity index 52% rename from app/src/main/java/campus/tech/kakao/map/model/datasource/LocationDataSource.kt rename to app/src/main/java/campus/tech/kakao/map/model/datasource/LocationApi.kt index c2228444..9df5259d 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationDataSource.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationApi.kt @@ -4,29 +4,21 @@ import android.util.Log import campus.tech.kakao.map.model.Location import campus.tech.kakao.map.model.Location.Companion.toLocation import campus.tech.kakao.map.model.LocationDto -import campus.tech.kakao.map.model.repository.KakaoAPI +import campus.tech.kakao.map.model.SearchFromKeywordResponse import campus.tech.kakao.map.model.repository.RetrofitInstance import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -class LocationDataSource { +class LocationApi { companion object{ private const val RESULT_SIZE = 15 } private val client = RetrofitInstance.getInstance().create(KakaoAPI::class.java) - suspend fun getLocations(keyword: String): List { + suspend fun getLocations(keyword: String): SearchFromKeywordResponse? { return withContext(Dispatchers.IO){ - val response = client.searchFromKeyword(keyword, RESULT_SIZE) - val locationDtos: List = response.body()?.documents ?: emptyList() - Log.d("jieun", "locationDtos: " + locationDtos) - toLocations(locationDtos) + client.searchFromKeyword(keyword, RESULT_SIZE).body() } } - - private fun toLocations(locationDtos: List) = - locationDtos.map { - it.toLocation() - } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/SavedLocationDao.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/SavedLocationDao.kt similarity index 79% rename from app/src/main/java/campus/tech/kakao/map/model/SavedLocationDao.kt rename to app/src/main/java/campus/tech/kakao/map/model/datasource/SavedLocationDao.kt index 8fef5a1d..c0428511 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/SavedLocationDao.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/datasource/SavedLocationDao.kt @@ -1,9 +1,10 @@ -package campus.tech.kakao.map.model +package campus.tech.kakao.map.model.datasource import androidx.room.Dao import androidx.room.Delete import androidx.room.Insert import androidx.room.Query +import campus.tech.kakao.map.model.SavedLocation @Dao interface SavedLocationDao { diff --git a/app/src/main/java/campus/tech/kakao/map/model/repository/LastLocationRepository.kt b/app/src/main/java/campus/tech/kakao/map/model/repository/LastLocationRepository.kt index 01024b00..8a52ec4c 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/repository/LastLocationRepository.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/repository/LastLocationRepository.kt @@ -1,16 +1,16 @@ package campus.tech.kakao.map.model.repository import campus.tech.kakao.map.model.Location -import campus.tech.kakao.map.model.datasource.LastLocationlDataSource +import campus.tech.kakao.map.model.datasource.LastLocationlSharedPreferences class LastLocationRepository( - private val locationLocalDataSource: LastLocationlDataSource + private val lastLocationlSharedPreferences: LastLocationlSharedPreferences ) { fun putLastLocation(location: Location){ - locationLocalDataSource.putLastLocation(location) + lastLocationlSharedPreferences.putLastLocation(location) } fun getLastLocation(): Location? { - return locationLocalDataSource.getLastLocation() + return lastLocationlSharedPreferences.getLastLocation() } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/repository/LocationRepository.kt b/app/src/main/java/campus/tech/kakao/map/model/repository/LocationRepository.kt index b8846592..1ab7cc54 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/repository/LocationRepository.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/repository/LocationRepository.kt @@ -1,12 +1,21 @@ package campus.tech.kakao.map.model.repository import campus.tech.kakao.map.model.Location -import campus.tech.kakao.map.model.datasource.LocationDataSource +import campus.tech.kakao.map.model.Location.Companion.toLocation +import campus.tech.kakao.map.model.LocationDto +import campus.tech.kakao.map.model.datasource.LocationApi class LocationRepository( - private val locationRemoteDataSource: LocationDataSource + private val locationApi: LocationApi ) { - suspend fun getLocationRemote(query: String): List { - return locationRemoteDataSource.getLocations(query) + suspend fun getLocations(query: String): List { + val searchFromKeywordResponse = locationApi.getLocations(query) + val locationDtos: List = searchFromKeywordResponse?.documents ?: emptyList() + return toLocations(locationDtos) } + + private fun toLocations(locationDtos: List) = + locationDtos.map { + it.toLocation() + } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/repository/SavedLocationRepository.kt b/app/src/main/java/campus/tech/kakao/map/model/repository/SavedLocationRepository.kt index f6681a93..be8290ea 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/repository/SavedLocationRepository.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/repository/SavedLocationRepository.kt @@ -1,7 +1,6 @@ package campus.tech.kakao.map.model.repository -import android.util.Log -import campus.tech.kakao.map.model.AppDatabase +import campus.tech.kakao.map.model.datasource.AppDatabase import campus.tech.kakao.map.model.SavedLocation class SavedLocationRepository( diff --git a/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt index eab89f2e..9bfbe1c6 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt @@ -11,7 +11,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.widget.ConstraintLayout import campus.tech.kakao.map.R import campus.tech.kakao.map.model.Location -import campus.tech.kakao.map.model.datasource.LastLocationlDataSource +import campus.tech.kakao.map.model.datasource.LastLocationlSharedPreferences import campus.tech.kakao.map.model.repository.LastLocationRepository import campus.tech.kakao.map.view.search.MainActivity import com.google.android.material.bottomsheet.BottomSheetBehavior @@ -34,8 +34,8 @@ class MapActivity : AppCompatActivity() { private val errorMessageTextView by lazy { findViewById(R.id.errorMessageTextView) } private val bottomSheetBehavior: BottomSheetBehavior by lazy { BottomSheetBehavior.from(bottomSheetLayout) } - private val lastLocationLocalDataSource: LastLocationlDataSource by lazy { LastLocationlDataSource() } - private val lastLocationRepository: LastLocationRepository by lazy { LastLocationRepository(lastLocationLocalDataSource) } + private val lastLocationlSharedPreferences: LastLocationlSharedPreferences by lazy { LastLocationlSharedPreferences() } + private val lastLocationRepository: LastLocationRepository by lazy { LastLocationRepository(lastLocationlSharedPreferences) } companion object{ private val DEFAULT_LONGITUDE = 127.115587 diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt index fa783855..12e6c903 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt @@ -4,7 +4,6 @@ import android.content.Intent import android.os.Bundle import android.text.Editable import android.text.TextWatcher -import android.util.Log import android.view.View import android.widget.EditText import android.widget.ImageView @@ -14,9 +13,9 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import campus.tech.kakao.map.model.datasource.LocationDataSource +import campus.tech.kakao.map.model.datasource.LocationApi import campus.tech.kakao.map.R -import campus.tech.kakao.map.model.AppDatabase +import campus.tech.kakao.map.model.datasource.AppDatabase import campus.tech.kakao.map.model.Location import campus.tech.kakao.map.model.SavedLocation import campus.tech.kakao.map.model.repository.LocationRepository @@ -44,8 +43,8 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener { findViewById(R.id.savedLocationRecyclerView) } - private val locationRemoteDataSource: LocationDataSource by lazy { LocationDataSource() } - private val locationRepository: LocationRepository by lazy { LocationRepository(locationRemoteDataSource) } + private val locationApi: LocationApi by lazy { LocationApi() } + private val locationRepository: LocationRepository by lazy { LocationRepository(locationApi) } private val appDatabase: AppDatabase by lazy { AppDatabase.getDatabase(this) } private val savedLocationRepository: SavedLocationRepository by lazy { SavedLocationRepository(appDatabase) } diff --git a/app/src/main/java/campus/tech/kakao/map/viewmodel/LocationViewModel.kt b/app/src/main/java/campus/tech/kakao/map/viewmodel/LocationViewModel.kt index 5e4b8ca6..d19dac60 100644 --- a/app/src/main/java/campus/tech/kakao/map/viewmodel/LocationViewModel.kt +++ b/app/src/main/java/campus/tech/kakao/map/viewmodel/LocationViewModel.kt @@ -27,7 +27,7 @@ class LocationViewModel( fun searchLocationsFromKakaoAPI(query: String, handleNoResultMessage: (Int) -> Unit) { viewModelScope.launch { - _searchedLocations.value = locationRepository.getLocationRemote(query) + _searchedLocations.value = locationRepository.getLocations(query) handleNoResultMessage(getSearchedLocationsSize()) } } diff --git a/app/src/test/java/campus/tech/kakao/map/SavedLocationDataSourceTest.kt b/app/src/test/java/campus/tech/kakao/map/SavedLocationApiTest.kt similarity index 96% rename from app/src/test/java/campus/tech/kakao/map/SavedLocationDataSourceTest.kt rename to app/src/test/java/campus/tech/kakao/map/SavedLocationApiTest.kt index b2ead7fd..f0224a09 100644 --- a/app/src/test/java/campus/tech/kakao/map/SavedLocationDataSourceTest.kt +++ b/app/src/test/java/campus/tech/kakao/map/SavedLocationApiTest.kt @@ -3,7 +3,6 @@ package campus.tech.kakao.map import android.database.sqlite.SQLiteDatabase import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 -import campus.tech.kakao.map.model.LocationDbHelper import campus.tech.kakao.map.model.SavedLocation import org.junit.After import org.junit.Assert.assertEquals @@ -12,7 +11,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class SavedLocationDataSourceTest { +class SavedLocationApiTest { private lateinit var locationLocalDataSource: SavedLocationDataSource private lateinit var locationDbHelper: LocationDbHelper private lateinit var sqLiteDatabase: SQLiteDatabase From b777f094078dec1c9167b286d9364e4ea357857b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Thu, 25 Jul 2024 00:27:23 +0900 Subject: [PATCH 06/22] =?UTF-8?q?refactor:=20=ED=95=A8=EC=88=98=EB=AA=85?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../campus/tech/kakao/map/model/datasource/LocationApi.kt | 5 ----- .../model/{repository => datasource}/RetrofitInstance.kt | 2 +- .../kakao/map/model/repository/SavedLocationRepository.kt | 1 - .../java/campus/tech/kakao/map/view/map/MapActivity.kt | 7 +++---- 4 files changed, 4 insertions(+), 11 deletions(-) rename app/src/main/java/campus/tech/kakao/map/model/{repository => datasource}/RetrofitInstance.kt (97%) diff --git a/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationApi.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationApi.kt index 9df5259d..398d7b98 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationApi.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationApi.kt @@ -1,11 +1,6 @@ package campus.tech.kakao.map.model.datasource -import android.util.Log -import campus.tech.kakao.map.model.Location -import campus.tech.kakao.map.model.Location.Companion.toLocation -import campus.tech.kakao.map.model.LocationDto import campus.tech.kakao.map.model.SearchFromKeywordResponse -import campus.tech.kakao.map.model.repository.RetrofitInstance import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext diff --git a/app/src/main/java/campus/tech/kakao/map/model/repository/RetrofitInstance.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/RetrofitInstance.kt similarity index 97% rename from app/src/main/java/campus/tech/kakao/map/model/repository/RetrofitInstance.kt rename to app/src/main/java/campus/tech/kakao/map/model/datasource/RetrofitInstance.kt index f75e11b2..733814e9 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/repository/RetrofitInstance.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/datasource/RetrofitInstance.kt @@ -1,4 +1,4 @@ -package campus.tech.kakao.map.model.repository +package campus.tech.kakao.map.model.datasource import android.os.Looper import campus.tech.kakao.map.BuildConfig diff --git a/app/src/main/java/campus/tech/kakao/map/model/repository/SavedLocationRepository.kt b/app/src/main/java/campus/tech/kakao/map/model/repository/SavedLocationRepository.kt index be8290ea..70d09262 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/repository/SavedLocationRepository.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/repository/SavedLocationRepository.kt @@ -16,7 +16,6 @@ class SavedLocationRepository( } suspend fun deleteSavedLocation(savedLocation: SavedLocation) { - appDatabase.savedLocationDao().delete(savedLocation) } diff --git a/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt index 9bfbe1c6..b8b0527e 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt @@ -78,14 +78,13 @@ class MapActivity : AppCompatActivity() { showErrorMessage(error) } }, object : KakaoMapReadyCallback() { - val location = getCoordinates() + val location = getLocation() override fun onMapReady(kakaoMap: KakaoMap) { // 인증 후 API 가 정상적으로 실행될 때 호출됨 - Log.d("jieun", "onMapReady coordinates: " + location.toString()) + Log.d("jieun", "onMapReady location: " + location.toString()) if (location != null) { showLabel(location, kakaoMap) showBottomSheet(location) lastLocationRepository.putLastLocation(location) -// Log.d("jieun", "onMapReady setSharedData: " + getSharedData("pref")) } else{ hideBottomSheet() } @@ -139,7 +138,7 @@ class MapActivity : AppCompatActivity() { bottom_sheet_address.text = location.address } - private fun getCoordinates(): Location? { + private fun getLocation(): Location? { var location = getLocationByIntent() if(location == null) { location = lastLocationRepository.getLastLocation() From 5c44b5382e63e64c9a03c2b2fcccbc02e36df2ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Thu, 25 Jul 2024 00:36:48 +0900 Subject: [PATCH 07/22] =?UTF-8?q?feat:=20Hilt=20=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=EB=9F=AC=EB=A6=AC=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?App=EC=9D=98=20=EC=A2=85=EC=86=8D=EC=84=B1=20=EC=BB=A8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=84=88=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 4 ++++ app/src/main/java/campus/tech/kakao/map/App.kt | 2 ++ build.gradle.kts | 1 + 3 files changed, 7 insertions(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f053cf86..db9a5559 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -4,6 +4,7 @@ plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("kotlin-kapt") + id("com.google.dagger.hilt.android") } android { @@ -84,4 +85,7 @@ dependencies { implementation("androidx.room:room-runtime:2.6.1") kapt("androidx.room:room-compiler:2.6.1") implementation("androidx.room:room-ktx:2.4.3") + // hilt + implementation("com.google.dagger:hilt-android:2.48.1") + kapt("com.google.dagger:hilt-compiler:2.48.1") } diff --git a/app/src/main/java/campus/tech/kakao/map/App.kt b/app/src/main/java/campus/tech/kakao/map/App.kt index 5f688ad8..c8a6b838 100644 --- a/app/src/main/java/campus/tech/kakao/map/App.kt +++ b/app/src/main/java/campus/tech/kakao/map/App.kt @@ -3,7 +3,9 @@ package campus.tech.kakao.map import android.app.Application import campus.tech.kakao.map.model.datasource.SharedPreferences import com.kakao.vectormap.KakaoMapSdk +import dagger.hilt.android.HiltAndroidApp +@HiltAndroidApp class App : Application(){ companion object{ lateinit var sharedPreferencesManager : SharedPreferences diff --git a/build.gradle.kts b/build.gradle.kts index 6465d171..d6b55841 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,6 +3,7 @@ plugins { id("com.android.application") version "8.3.1" apply false id("org.jetbrains.kotlin.android") version "1.9.0" apply false id("org.jlleitschuh.gradle.ktlint") version "12.1.0" apply false + id("com.google.dagger.hilt.android") version "2.48.1" apply false } allprojects { From 038b4d9fa6c962bba26a4e3cf68981d22cc734e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Thu, 25 Jul 2024 01:16:04 +0900 Subject: [PATCH 08/22] =?UTF-8?q?feat:=20Repository=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=EB=A5=BC=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/LastLocationRepository.kt | 16 -------------- .../model/repository/LocationRepository.kt | 20 ++++-------------- .../repository/SavedLocationRepository.kt | 21 ++++--------------- .../tech/kakao/map/view/map/MapActivity.kt | 3 +-- .../kakao/map/view/search/MainActivity.kt | 8 +++---- .../kakao/map/viewmodel/LocationViewModel.kt | 6 +++--- .../map/viewmodel/SavedLocationViewModel.kt | 5 ++--- .../kakao/map/viewmodel/ViewModelFactory.kt | 8 +++---- 8 files changed, 22 insertions(+), 65 deletions(-) delete mode 100644 app/src/main/java/campus/tech/kakao/map/model/repository/LastLocationRepository.kt diff --git a/app/src/main/java/campus/tech/kakao/map/model/repository/LastLocationRepository.kt b/app/src/main/java/campus/tech/kakao/map/model/repository/LastLocationRepository.kt deleted file mode 100644 index 8a52ec4c..00000000 --- a/app/src/main/java/campus/tech/kakao/map/model/repository/LastLocationRepository.kt +++ /dev/null @@ -1,16 +0,0 @@ -package campus.tech.kakao.map.model.repository - -import campus.tech.kakao.map.model.Location -import campus.tech.kakao.map.model.datasource.LastLocationlSharedPreferences - -class LastLocationRepository( - private val lastLocationlSharedPreferences: LastLocationlSharedPreferences -) { - fun putLastLocation(location: Location){ - lastLocationlSharedPreferences.putLastLocation(location) - } - - fun getLastLocation(): Location? { - return lastLocationlSharedPreferences.getLastLocation() - } -} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/repository/LocationRepository.kt b/app/src/main/java/campus/tech/kakao/map/model/repository/LocationRepository.kt index 1ab7cc54..9f91916e 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/repository/LocationRepository.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/repository/LocationRepository.kt @@ -1,21 +1,9 @@ package campus.tech.kakao.map.model.repository import campus.tech.kakao.map.model.Location -import campus.tech.kakao.map.model.Location.Companion.toLocation -import campus.tech.kakao.map.model.LocationDto -import campus.tech.kakao.map.model.datasource.LocationApi -class LocationRepository( - private val locationApi: LocationApi -) { - suspend fun getLocations(query: String): List { - val searchFromKeywordResponse = locationApi.getLocations(query) - val locationDtos: List = searchFromKeywordResponse?.documents ?: emptyList() - return toLocations(locationDtos) - } - - private fun toLocations(locationDtos: List) = - locationDtos.map { - it.toLocation() - } +interface LocationRepository { + suspend fun getLocationAll(query: String): List + fun addLastLocation(location: Location) + fun getLastLocation(): Location? } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/repository/SavedLocationRepository.kt b/app/src/main/java/campus/tech/kakao/map/model/repository/SavedLocationRepository.kt index 70d09262..8f5203f3 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/repository/SavedLocationRepository.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/repository/SavedLocationRepository.kt @@ -1,22 +1,9 @@ package campus.tech.kakao.map.model.repository -import campus.tech.kakao.map.model.datasource.AppDatabase import campus.tech.kakao.map.model.SavedLocation -class SavedLocationRepository( - private val appDatabase: AppDatabase -) { - suspend fun getSavedLocationAll(): MutableList { - val results = appDatabase.savedLocationDao().getAll() - return if(results.isNotEmpty()) results.toMutableList() else mutableListOf() - } - - suspend fun addSavedLocation(savedLocation: SavedLocation) { - appDatabase.savedLocationDao().insert(savedLocation) - } - - suspend fun deleteSavedLocation(savedLocation: SavedLocation) { - appDatabase.savedLocationDao().delete(savedLocation) - } - +interface SavedLocationRepository { + suspend fun getSavedLocationAll(): MutableList + suspend fun addSavedLocation(savedLocation: SavedLocation) + suspend fun deleteSavedLocation(savedLocation: SavedLocation) } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt index b8b0527e..0c19c778 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt @@ -12,7 +12,6 @@ import androidx.constraintlayout.widget.ConstraintLayout import campus.tech.kakao.map.R import campus.tech.kakao.map.model.Location import campus.tech.kakao.map.model.datasource.LastLocationlSharedPreferences -import campus.tech.kakao.map.model.repository.LastLocationRepository import campus.tech.kakao.map.view.search.MainActivity import com.google.android.material.bottomsheet.BottomSheetBehavior import com.kakao.vectormap.KakaoMap @@ -84,7 +83,7 @@ class MapActivity : AppCompatActivity() { if (location != null) { showLabel(location, kakaoMap) showBottomSheet(location) - lastLocationRepository.putLastLocation(location) + lastLocationRepository.addLastLocation(location) } else{ hideBottomSheet() } diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt index 12e6c903..da6a5851 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt @@ -18,8 +18,8 @@ import campus.tech.kakao.map.R import campus.tech.kakao.map.model.datasource.AppDatabase import campus.tech.kakao.map.model.Location import campus.tech.kakao.map.model.SavedLocation -import campus.tech.kakao.map.model.repository.LocationRepository -import campus.tech.kakao.map.model.repository.SavedLocationRepository +import campus.tech.kakao.map.model.repository.DefaultLocationRepository +import campus.tech.kakao.map.model.repository.DefaultSavedLocationRepository import campus.tech.kakao.map.view.map.MapActivity import campus.tech.kakao.map.viewmodel.ViewModelFactory.LocationViewModelFactory import campus.tech.kakao.map.viewmodel.ViewModelFactory.SavedLocationViewModelFactory @@ -44,10 +44,10 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener { } private val locationApi: LocationApi by lazy { LocationApi() } - private val locationRepository: LocationRepository by lazy { LocationRepository(locationApi) } + private val locationRepository: DefaultLocationRepository by lazy { DefaultLocationRepository(locationApi) } private val appDatabase: AppDatabase by lazy { AppDatabase.getDatabase(this) } - private val savedLocationRepository: SavedLocationRepository by lazy { SavedLocationRepository(appDatabase) } + private val savedLocationRepository: DefaultSavedLocationRepository by lazy { DefaultSavedLocationRepository(appDatabase) } private val clearButton: ImageView by lazy { findViewById(R.id.clearButton) } private val searchEditText: EditText by lazy { findViewById(R.id.SearchEditTextInMain) } diff --git a/app/src/main/java/campus/tech/kakao/map/viewmodel/LocationViewModel.kt b/app/src/main/java/campus/tech/kakao/map/viewmodel/LocationViewModel.kt index d19dac60..66722522 100644 --- a/app/src/main/java/campus/tech/kakao/map/viewmodel/LocationViewModel.kt +++ b/app/src/main/java/campus/tech/kakao/map/viewmodel/LocationViewModel.kt @@ -5,11 +5,11 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import campus.tech.kakao.map.model.Location -import campus.tech.kakao.map.model.repository.LocationRepository +import campus.tech.kakao.map.model.repository.DefaultLocationRepository import kotlinx.coroutines.launch class LocationViewModel( - private val locationRepository: LocationRepository + private val locationRepository: DefaultLocationRepository ) : ViewModel() { private val _locations = MutableLiveData>() @@ -27,7 +27,7 @@ class LocationViewModel( fun searchLocationsFromKakaoAPI(query: String, handleNoResultMessage: (Int) -> Unit) { viewModelScope.launch { - _searchedLocations.value = locationRepository.getLocations(query) + _searchedLocations.value = locationRepository.getLocationAll(query) handleNoResultMessage(getSearchedLocationsSize()) } } diff --git a/app/src/main/java/campus/tech/kakao/map/viewmodel/SavedLocationViewModel.kt b/app/src/main/java/campus/tech/kakao/map/viewmodel/SavedLocationViewModel.kt index 2e001e2d..d5f2c1b6 100644 --- a/app/src/main/java/campus/tech/kakao/map/viewmodel/SavedLocationViewModel.kt +++ b/app/src/main/java/campus/tech/kakao/map/viewmodel/SavedLocationViewModel.kt @@ -1,16 +1,15 @@ package campus.tech.kakao.map.viewmodel -import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import campus.tech.kakao.map.model.SavedLocation -import campus.tech.kakao.map.model.repository.SavedLocationRepository +import campus.tech.kakao.map.model.repository.DefaultSavedLocationRepository import kotlinx.coroutines.launch class SavedLocationViewModel( - private val savedLocationRepository: SavedLocationRepository + private val savedLocationRepository: DefaultSavedLocationRepository ) : ViewModel() { private val _savedLocation = MutableLiveData>() val savedLocation: LiveData> get() = _savedLocation diff --git a/app/src/main/java/campus/tech/kakao/map/viewmodel/ViewModelFactory.kt b/app/src/main/java/campus/tech/kakao/map/viewmodel/ViewModelFactory.kt index 4667404c..b08d0021 100644 --- a/app/src/main/java/campus/tech/kakao/map/viewmodel/ViewModelFactory.kt +++ b/app/src/main/java/campus/tech/kakao/map/viewmodel/ViewModelFactory.kt @@ -3,12 +3,12 @@ package campus.tech.kakao.map.viewmodel import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewmodel.CreationExtras -import campus.tech.kakao.map.model.repository.LocationRepository -import campus.tech.kakao.map.model.repository.SavedLocationRepository +import campus.tech.kakao.map.model.repository.DefaultLocationRepository +import campus.tech.kakao.map.model.repository.DefaultSavedLocationRepository class ViewModelFactory { class LocationViewModelFactory( - private val locationRepository: LocationRepository + private val locationRepository: DefaultLocationRepository ) : ViewModelProvider.Factory { override fun create(modelClass: Class, extras: CreationExtras): T { if (modelClass.isAssignableFrom(LocationViewModel::class.java)) { @@ -20,7 +20,7 @@ class ViewModelFactory { } class SavedLocationViewModelFactory( - private val savedLocationRepository: SavedLocationRepository + private val savedLocationRepository: DefaultSavedLocationRepository ) : ViewModelProvider.Factory { override fun create(modelClass: Class, extras: CreationExtras): T { if (modelClass.isAssignableFrom(SavedLocationViewModel::class.java)) { From d904772b797f55eacc3f826435870b80a092bf83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Thu, 25 Jul 2024 23:20:52 +0900 Subject: [PATCH 09/22] =?UTF-8?q?refactor:=20LocationModule=EC=9D=84=20?= =?UTF-8?q?=EB=A7=8C=EB=93=A4=EC=96=B4=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EC=84=A0=EC=96=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../campus/tech/kakao/map/LocationModule.kt | 43 +++++++++++++++++++ .../kakao/map/model/datasource/AppDatabase.kt | 29 ------------- .../LastLocationlSharedPreferences.kt | 1 - .../model/datasource/SavedLocationDatabase.kt | 16 +++++++ .../repository/DefaultLocationRepository.kt | 32 ++++++++++++++ .../DefaultSavedLocationRepository.kt | 24 +++++++++++ .../tech/kakao/map/view/map/MapActivity.kt | 15 ++++--- .../kakao/map/view/search/MainActivity.kt | 30 +++++-------- .../kakao/map/viewmodel/LocationViewModel.kt | 15 ++++++- .../map/viewmodel/SavedLocationViewModel.kt | 8 +++- .../kakao/map/viewmodel/ViewModelFactory.kt | 33 -------------- 11 files changed, 153 insertions(+), 93 deletions(-) create mode 100644 app/src/main/java/campus/tech/kakao/map/LocationModule.kt delete mode 100644 app/src/main/java/campus/tech/kakao/map/model/datasource/AppDatabase.kt create mode 100644 app/src/main/java/campus/tech/kakao/map/model/datasource/SavedLocationDatabase.kt create mode 100644 app/src/main/java/campus/tech/kakao/map/model/repository/DefaultLocationRepository.kt create mode 100644 app/src/main/java/campus/tech/kakao/map/model/repository/DefaultSavedLocationRepository.kt delete mode 100644 app/src/main/java/campus/tech/kakao/map/viewmodel/ViewModelFactory.kt diff --git a/app/src/main/java/campus/tech/kakao/map/LocationModule.kt b/app/src/main/java/campus/tech/kakao/map/LocationModule.kt new file mode 100644 index 00000000..f1dc79c4 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/LocationModule.kt @@ -0,0 +1,43 @@ +package campus.tech.kakao.map + +import android.content.Context +import androidx.room.Room +import campus.tech.kakao.map.model.datasource.LastLocationlSharedPreferences +import campus.tech.kakao.map.model.datasource.LocationApi +import campus.tech.kakao.map.model.datasource.SavedLocationDao +import campus.tech.kakao.map.model.datasource.SavedLocationDatabase +import campus.tech.kakao.map.model.repository.DefaultLocationRepository +import campus.tech.kakao.map.model.repository.DefaultSavedLocationRepository +import campus.tech.kakao.map.model.repository.LocationRepository +import campus.tech.kakao.map.model.repository.SavedLocationRepository +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) +class LocationModule { + @Singleton + @Provides + fun provideLocationApi(): LocationApi { + return LocationApi() + } + + @Singleton + @Provides + fun provideLastLocationlSharedPreferences(): LastLocationlSharedPreferences { + return LastLocationlSharedPreferences() + } + + @Singleton + @Provides + fun provideDefaultLocationRepository( + locationApi: LocationApi, + lastLocationlSharedPreferences: LastLocationlSharedPreferences + ): LocationRepository { + return DefaultLocationRepository(locationApi, lastLocationlSharedPreferences) + } +} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/datasource/AppDatabase.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/AppDatabase.kt deleted file mode 100644 index fcf19fc8..00000000 --- a/app/src/main/java/campus/tech/kakao/map/model/datasource/AppDatabase.kt +++ /dev/null @@ -1,29 +0,0 @@ -package campus.tech.kakao.map.model.datasource - -import android.content.Context -import androidx.room.Database -import androidx.room.Room -import androidx.room.RoomDatabase -import campus.tech.kakao.map.model.SavedLocation - -@Database(entities = [SavedLocation::class], version = 1) -abstract class AppDatabase: RoomDatabase() { - abstract fun savedLocationDao(): SavedLocationDao - - companion object{ - @Volatile - private var INSTANCE: AppDatabase? = null - - fun getDatabase(context: Context): AppDatabase { - return INSTANCE ?: synchronized(this) { - val instance = Room.databaseBuilder( - context.applicationContext, - AppDatabase::class.java, - "my-database" - ).build() - INSTANCE = instance - instance - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlSharedPreferences.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlSharedPreferences.kt index b5149c48..3b9fefcb 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlSharedPreferences.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlSharedPreferences.kt @@ -12,7 +12,6 @@ class LastLocationlSharedPreferences() { App.sharedPreferencesManager.putString("title", location.title.toString()) App.sharedPreferencesManager.putString("address", location.address.toString()) App.sharedPreferencesManager.putString("category", location.category.toString()) - } fun getLastLocation(): Location? { diff --git a/app/src/main/java/campus/tech/kakao/map/model/datasource/SavedLocationDatabase.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/SavedLocationDatabase.kt new file mode 100644 index 00000000..a3257d6e --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/model/datasource/SavedLocationDatabase.kt @@ -0,0 +1,16 @@ +package campus.tech.kakao.map.model.datasource + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase +import campus.tech.kakao.map.model.SavedLocation + +@Database(entities = [SavedLocation::class], version = 1) +abstract class SavedLocationDatabase: RoomDatabase() { + abstract fun savedLocationDao(): SavedLocationDao + + companion object { + val DATABASE_NAME = "savedLocationDatabase" + } +} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultLocationRepository.kt b/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultLocationRepository.kt new file mode 100644 index 00000000..74160955 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultLocationRepository.kt @@ -0,0 +1,32 @@ +package campus.tech.kakao.map.model.repository + +import campus.tech.kakao.map.model.Location +import campus.tech.kakao.map.model.Location.Companion.toLocation +import campus.tech.kakao.map.model.LocationDto +import campus.tech.kakao.map.model.datasource.LastLocationlSharedPreferences +import campus.tech.kakao.map.model.datasource.LocationApi +import javax.inject.Inject +import javax.inject.Qualifier + +class DefaultLocationRepository @Inject constructor( + private val locationApi: LocationApi, + private val lastLocationlSharedPreferences: LastLocationlSharedPreferences +): LocationRepository { + override suspend fun getLocationAll(query: String): List { + val searchFromKeywordResponse = locationApi.getLocations(query) + val locationDtos: List = searchFromKeywordResponse?.documents ?: emptyList() + return toLocations(locationDtos) + } + + private fun toLocations(locationDtos: List) = + locationDtos.map { + it.toLocation() + } + override fun addLastLocation(location: Location){ + lastLocationlSharedPreferences.putLastLocation(location) + } + + override fun getLastLocation(): Location? { + return lastLocationlSharedPreferences.getLastLocation() + } +} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultSavedLocationRepository.kt b/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultSavedLocationRepository.kt new file mode 100644 index 00000000..7319cb1f --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultSavedLocationRepository.kt @@ -0,0 +1,24 @@ +package campus.tech.kakao.map.model.repository + +import campus.tech.kakao.map.model.SavedLocation +import campus.tech.kakao.map.model.datasource.SavedLocationDao +import campus.tech.kakao.map.model.datasource.SavedLocationDatabase +import javax.inject.Inject + +class DefaultSavedLocationRepository @Inject constructor( + private val savedLocationDao: SavedLocationDao +): SavedLocationRepository { + override suspend fun getSavedLocationAll(): MutableList { + val results = savedLocationDao.getAll() + return if(results.isNotEmpty()) results.toMutableList() else mutableListOf() + } + + override suspend fun addSavedLocation(savedLocation: SavedLocation) { + savedLocationDao.insert(savedLocation) + } + + override suspend fun deleteSavedLocation(savedLocation: SavedLocation) { + savedLocationDao.delete(savedLocation) + } + +} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt index 0c19c778..d40a9b7c 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt @@ -7,12 +7,14 @@ import android.util.Log import android.view.View import android.widget.EditText import android.widget.TextView +import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.widget.ConstraintLayout import campus.tech.kakao.map.R import campus.tech.kakao.map.model.Location import campus.tech.kakao.map.model.datasource.LastLocationlSharedPreferences import campus.tech.kakao.map.view.search.MainActivity +import campus.tech.kakao.map.viewmodel.LocationViewModel import com.google.android.material.bottomsheet.BottomSheetBehavior import com.kakao.vectormap.KakaoMap import com.kakao.vectormap.KakaoMapReadyCallback @@ -22,9 +24,13 @@ import com.kakao.vectormap.MapView import com.kakao.vectormap.label.LabelOptions import com.kakao.vectormap.label.LabelStyle import com.kakao.vectormap.label.LabelStyles +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject - +@AndroidEntryPoint class MapActivity : AppCompatActivity() { + private val locationViewModel: LocationViewModel by viewModels() + private val searchEditText by lazy { findViewById(R.id.SearchEditTextInMap) } private val mapView by lazy { findViewById(R.id.map_view) } private val bottomSheetLayout by lazy { findViewById(R.id.bottom_sheet_layout) } @@ -33,9 +39,6 @@ class MapActivity : AppCompatActivity() { private val errorMessageTextView by lazy { findViewById(R.id.errorMessageTextView) } private val bottomSheetBehavior: BottomSheetBehavior by lazy { BottomSheetBehavior.from(bottomSheetLayout) } - private val lastLocationlSharedPreferences: LastLocationlSharedPreferences by lazy { LastLocationlSharedPreferences() } - private val lastLocationRepository: LastLocationRepository by lazy { LastLocationRepository(lastLocationlSharedPreferences) } - companion object{ private val DEFAULT_LONGITUDE = 127.115587 private val DEFAULT_LATITUDE = 37.406960 @@ -83,7 +86,7 @@ class MapActivity : AppCompatActivity() { if (location != null) { showLabel(location, kakaoMap) showBottomSheet(location) - lastLocationRepository.addLastLocation(location) + locationViewModel.addLastLocation(location) } else{ hideBottomSheet() } @@ -140,7 +143,7 @@ class MapActivity : AppCompatActivity() { private fun getLocation(): Location? { var location = getLocationByIntent() if(location == null) { - location = lastLocationRepository.getLastLocation() + location = locationViewModel.getLastLocation() } return location diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt index da6a5851..30e83964 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt @@ -8,47 +8,37 @@ import android.view.View import android.widget.EditText import android.widget.ImageView import android.widget.TextView +import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Observer -import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import campus.tech.kakao.map.model.datasource.LocationApi import campus.tech.kakao.map.R -import campus.tech.kakao.map.model.datasource.AppDatabase import campus.tech.kakao.map.model.Location import campus.tech.kakao.map.model.SavedLocation -import campus.tech.kakao.map.model.repository.DefaultLocationRepository +import campus.tech.kakao.map.model.datasource.SavedLocationDatabase import campus.tech.kakao.map.model.repository.DefaultSavedLocationRepository +import campus.tech.kakao.map.model.repository.LocationRepository import campus.tech.kakao.map.view.map.MapActivity -import campus.tech.kakao.map.viewmodel.ViewModelFactory.LocationViewModelFactory -import campus.tech.kakao.map.viewmodel.ViewModelFactory.SavedLocationViewModelFactory import campus.tech.kakao.map.viewmodel.LocationViewModel import campus.tech.kakao.map.viewmodel.SavedLocationViewModel +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject +@AndroidEntryPoint class MainActivity : AppCompatActivity(), OnItemSelectedListener { - private val locationViewModel: LocationViewModel by lazy { - ViewModelProvider(this, LocationViewModelFactory(locationRepository)) - .get(LocationViewModel::class.java) - } + private val locationViewModel: LocationViewModel by viewModels() + private val savedLocationViewModel: SavedLocationViewModel by viewModels() + + private val locationAdapter: LocationAdapter by lazy { LocationAdapter(this) } private val locationRecyclerView: RecyclerView by lazy { findViewById(R.id.locationRecyclerView) } - private val savedLocationViewModel: SavedLocationViewModel by lazy { - ViewModelProvider(this, SavedLocationViewModelFactory(savedLocationRepository)) - .get(SavedLocationViewModel::class.java) - } private val savedLocationAdapter: SavedLocationAdapter by lazy { SavedLocationAdapter(this) } private val savedLocationRecyclerView: RecyclerView by lazy { findViewById(R.id.savedLocationRecyclerView) } - - private val locationApi: LocationApi by lazy { LocationApi() } - private val locationRepository: DefaultLocationRepository by lazy { DefaultLocationRepository(locationApi) } - - private val appDatabase: AppDatabase by lazy { AppDatabase.getDatabase(this) } - private val savedLocationRepository: DefaultSavedLocationRepository by lazy { DefaultSavedLocationRepository(appDatabase) } - private val clearButton: ImageView by lazy { findViewById(R.id.clearButton) } private val searchEditText: EditText by lazy { findViewById(R.id.SearchEditTextInMain) } private val noResultTextView: TextView by lazy { findViewById(R.id.NoResultTextView) } diff --git a/app/src/main/java/campus/tech/kakao/map/viewmodel/LocationViewModel.kt b/app/src/main/java/campus/tech/kakao/map/viewmodel/LocationViewModel.kt index 66722522..1709e627 100644 --- a/app/src/main/java/campus/tech/kakao/map/viewmodel/LocationViewModel.kt +++ b/app/src/main/java/campus/tech/kakao/map/viewmodel/LocationViewModel.kt @@ -6,10 +6,14 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import campus.tech.kakao.map.model.Location import campus.tech.kakao.map.model.repository.DefaultLocationRepository +import campus.tech.kakao.map.model.repository.LocationRepository +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import javax.inject.Inject -class LocationViewModel( - private val locationRepository: DefaultLocationRepository +@HiltViewModel +class LocationViewModel @Inject constructor( + private val locationRepository: LocationRepository ) : ViewModel() { private val _locations = MutableLiveData>() @@ -31,5 +35,12 @@ class LocationViewModel( handleNoResultMessage(getSearchedLocationsSize()) } } + fun addLastLocation(location: Location){ + locationRepository.addLastLocation(location) + } + + fun getLastLocation(): Location? { + return locationRepository.getLastLocation() + } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/viewmodel/SavedLocationViewModel.kt b/app/src/main/java/campus/tech/kakao/map/viewmodel/SavedLocationViewModel.kt index d5f2c1b6..d35ff11c 100644 --- a/app/src/main/java/campus/tech/kakao/map/viewmodel/SavedLocationViewModel.kt +++ b/app/src/main/java/campus/tech/kakao/map/viewmodel/SavedLocationViewModel.kt @@ -6,10 +6,14 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import campus.tech.kakao.map.model.SavedLocation import campus.tech.kakao.map.model.repository.DefaultSavedLocationRepository +import campus.tech.kakao.map.model.repository.SavedLocationRepository +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import javax.inject.Inject -class SavedLocationViewModel( - private val savedLocationRepository: DefaultSavedLocationRepository +@HiltViewModel +class SavedLocationViewModel @Inject constructor( + private val savedLocationRepository: SavedLocationRepository ) : ViewModel() { private val _savedLocation = MutableLiveData>() val savedLocation: LiveData> get() = _savedLocation diff --git a/app/src/main/java/campus/tech/kakao/map/viewmodel/ViewModelFactory.kt b/app/src/main/java/campus/tech/kakao/map/viewmodel/ViewModelFactory.kt deleted file mode 100644 index b08d0021..00000000 --- a/app/src/main/java/campus/tech/kakao/map/viewmodel/ViewModelFactory.kt +++ /dev/null @@ -1,33 +0,0 @@ -package campus.tech.kakao.map.viewmodel - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.viewmodel.CreationExtras -import campus.tech.kakao.map.model.repository.DefaultLocationRepository -import campus.tech.kakao.map.model.repository.DefaultSavedLocationRepository - -class ViewModelFactory { - class LocationViewModelFactory( - private val locationRepository: DefaultLocationRepository - ) : ViewModelProvider.Factory { - override fun create(modelClass: Class, extras: CreationExtras): T { - if (modelClass.isAssignableFrom(LocationViewModel::class.java)) { - return LocationViewModel(locationRepository) as T - } else { - throw IllegalArgumentException() - } - } - } - - class SavedLocationViewModelFactory( - private val savedLocationRepository: DefaultSavedLocationRepository - ) : ViewModelProvider.Factory { - override fun create(modelClass: Class, extras: CreationExtras): T { - if (modelClass.isAssignableFrom(SavedLocationViewModel::class.java)) { - return SavedLocationViewModel(savedLocationRepository) as T - } else { - throw IllegalArgumentException() - } - } - } -} From b930b26d9db9a38dcaa111f3802c459444c3ed32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Thu, 25 Jul 2024 23:21:10 +0900 Subject: [PATCH 10/22] =?UTF-8?q?refactor:=20SavedLocationModule=EC=9D=84?= =?UTF-8?q?=20=EB=A7=8C=EB=93=A4=EC=96=B4=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EC=84=A0=EC=96=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tech/kakao/map/SavedLocationModule.kt | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 app/src/main/java/campus/tech/kakao/map/SavedLocationModule.kt diff --git a/app/src/main/java/campus/tech/kakao/map/SavedLocationModule.kt b/app/src/main/java/campus/tech/kakao/map/SavedLocationModule.kt new file mode 100644 index 00000000..182546f5 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/SavedLocationModule.kt @@ -0,0 +1,47 @@ +package campus.tech.kakao.map + +import android.content.Context +import androidx.room.Room +import campus.tech.kakao.map.model.datasource.LastLocationlSharedPreferences +import campus.tech.kakao.map.model.datasource.LocationApi +import campus.tech.kakao.map.model.datasource.SavedLocationDao +import campus.tech.kakao.map.model.datasource.SavedLocationDatabase +import campus.tech.kakao.map.model.repository.DefaultLocationRepository +import campus.tech.kakao.map.model.repository.DefaultSavedLocationRepository +import campus.tech.kakao.map.model.repository.LocationRepository +import campus.tech.kakao.map.model.repository.SavedLocationRepository +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) +class SavedLocationModule { + @Singleton + @Provides + fun provideSavedLocationDatabase(@ApplicationContext context: Context): SavedLocationDatabase { + return Room.databaseBuilder( + context, + SavedLocationDatabase::class.java, + SavedLocationDatabase.DATABASE_NAME + ).build() + } + + @Singleton + @Provides + fun provideSavedLocationDao(savedLocationDatabase: SavedLocationDatabase): SavedLocationDao { + return savedLocationDatabase.savedLocationDao() + } + + @Singleton + @Provides + fun provideDefaultSavedLocationRepository( + savedLocationDao: SavedLocationDao + ): SavedLocationRepository { + return DefaultSavedLocationRepository(savedLocationDao) + } + +} \ No newline at end of file From 562696594eefc9f5596ececac718151257276f96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Fri, 26 Jul 2024 00:16:39 +0900 Subject: [PATCH 11/22] =?UTF-8?q?refactor:=20Repository=EB=93=A4=EC=9D=84?= =?UTF-8?q?=20Binds=20=EB=B0=A9=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=84=A0=EC=96=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../campus/tech/kakao/map/LocationModule.kt | 10 +------ .../campus/tech/kakao/map/RepositoryModule.kt | 26 +++++++++++++++++++ .../tech/kakao/map/SavedLocationModule.kt | 12 ++------- .../repository/DefaultLocationRepository.kt | 2 ++ 4 files changed, 31 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/campus/tech/kakao/map/RepositoryModule.kt diff --git a/app/src/main/java/campus/tech/kakao/map/LocationModule.kt b/app/src/main/java/campus/tech/kakao/map/LocationModule.kt index f1dc79c4..3abe72f3 100644 --- a/app/src/main/java/campus/tech/kakao/map/LocationModule.kt +++ b/app/src/main/java/campus/tech/kakao/map/LocationModule.kt @@ -10,6 +10,7 @@ import campus.tech.kakao.map.model.repository.DefaultLocationRepository import campus.tech.kakao.map.model.repository.DefaultSavedLocationRepository import campus.tech.kakao.map.model.repository.LocationRepository import campus.tech.kakao.map.model.repository.SavedLocationRepository +import dagger.Binds import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -31,13 +32,4 @@ class LocationModule { fun provideLastLocationlSharedPreferences(): LastLocationlSharedPreferences { return LastLocationlSharedPreferences() } - - @Singleton - @Provides - fun provideDefaultLocationRepository( - locationApi: LocationApi, - lastLocationlSharedPreferences: LastLocationlSharedPreferences - ): LocationRepository { - return DefaultLocationRepository(locationApi, lastLocationlSharedPreferences) - } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/RepositoryModule.kt b/app/src/main/java/campus/tech/kakao/map/RepositoryModule.kt new file mode 100644 index 00000000..42160a4d --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/RepositoryModule.kt @@ -0,0 +1,26 @@ +package campus.tech.kakao.map + +import campus.tech.kakao.map.model.repository.DefaultLocationRepository +import campus.tech.kakao.map.model.repository.DefaultSavedLocationRepository +import campus.tech.kakao.map.model.repository.LocationRepository +import campus.tech.kakao.map.model.repository.SavedLocationRepository +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ViewModelComponent +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +// ViewModelComponent로 설정해도 될까요? Repository가 ViewModel에서 쓰이니까 ViewModelComponent를 쓰면 되겠다고 생각했는데요.. +// 적절한 Component를 선택하는 기준이 뭔지 모르겠습니다! +abstract class RepositoryModule { + @Binds + @Singleton + abstract fun bindDefaultLocationRepository(impl: DefaultLocationRepository) : LocationRepository + + @Binds + @Singleton + abstract fun bindDefaultSavedLocationRepository(impl: DefaultSavedLocationRepository) : SavedLocationRepository +} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/SavedLocationModule.kt b/app/src/main/java/campus/tech/kakao/map/SavedLocationModule.kt index 182546f5..6aff4c39 100644 --- a/app/src/main/java/campus/tech/kakao/map/SavedLocationModule.kt +++ b/app/src/main/java/campus/tech/kakao/map/SavedLocationModule.kt @@ -13,13 +13,14 @@ import campus.tech.kakao.map.model.repository.SavedLocationRepository import dagger.Module import dagger.Provides import dagger.hilt.InstallIn +import dagger.hilt.android.components.ViewModelComponent import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -class SavedLocationModule { +object SavedLocationModule { @Singleton @Provides fun provideSavedLocationDatabase(@ApplicationContext context: Context): SavedLocationDatabase { @@ -35,13 +36,4 @@ class SavedLocationModule { fun provideSavedLocationDao(savedLocationDatabase: SavedLocationDatabase): SavedLocationDao { return savedLocationDatabase.savedLocationDao() } - - @Singleton - @Provides - fun provideDefaultSavedLocationRepository( - savedLocationDao: SavedLocationDao - ): SavedLocationRepository { - return DefaultSavedLocationRepository(savedLocationDao) - } - } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultLocationRepository.kt b/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultLocationRepository.kt index 74160955..917601bb 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultLocationRepository.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultLocationRepository.kt @@ -7,7 +7,9 @@ import campus.tech.kakao.map.model.datasource.LastLocationlSharedPreferences import campus.tech.kakao.map.model.datasource.LocationApi import javax.inject.Inject import javax.inject.Qualifier +import javax.inject.Singleton +@Singleton class DefaultLocationRepository @Inject constructor( private val locationApi: LocationApi, private val lastLocationlSharedPreferences: LastLocationlSharedPreferences From 3670177b74e2a774df7f5b59e81ba30973f80fbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Fri, 26 Jul 2024 00:36:23 +0900 Subject: [PATCH 12/22] docs: update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 5주차 2단계 기능 목록 작성 --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c05db8f0..9b5ef63f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,8 @@ # android-map-refactoring -## 기능 목록 +## step1 기능 목록 - 데이터베이스를 Room으로 변경한다. - Hilt를 사용하여 의존성 주입을 적용한다. +## step2 기능 목록 +- DataBinding을 사용한다. +- LiveData를 사용한다. +- 비동기 처리를 Coroutine으로 변경한다. From 7da86f2a7e013a77d73af6fc0b0963289532d8ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Fri, 26 Jul 2024 13:32:41 +0900 Subject: [PATCH 13/22] =?UTF-8?q?refactor:=20item=5Flocation.xml=EC=97=90?= =?UTF-8?q?=EC=84=9C=20data=20binding=EC=9D=84=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 1 + .../kakao/map/view/search/LocationAdapter.kt | 37 ++++--- app/src/main/res/layout/activity_main.xml | 5 +- app/src/main/res/layout/item_location.xml | 99 ++++++++++--------- 4 files changed, 75 insertions(+), 67 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index db9a5559..10339d3d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -12,6 +12,7 @@ android { compileSdk = 34 buildFeatures { buildConfig = true + dataBinding = true } defaultConfig { applicationId = "campus.tech.kakao.map" diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt b/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt index 07d26ada..4497fb66 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt @@ -1,19 +1,17 @@ package campus.tech.kakao.map.view.search import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import android.widget.TextView 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.view.search.LocationAdapter.LocationHolder +import campus.tech.kakao.map.databinding.ItemLocationBinding +import campus.tech.kakao.map.view.search.LocationAdapter.LocationViewHolder import campus.tech.kakao.map.model.Location class LocationAdapter( private val itemSelectedListener: OnItemSelectedListener -) : ListAdapter( +) : ListAdapter( object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: Location, newItem: Location): Boolean { return oldItem.title == newItem.title @@ -22,14 +20,15 @@ class LocationAdapter( return oldItem == newItem } }) { - inner class LocationHolder( - itemView: View, + inner class LocationViewHolder( // + private val itemLocationBinding: ItemLocationBinding, itemSelectedListener: OnItemSelectedListener - ) : RecyclerView.ViewHolder(itemView) { - val titleTextView: TextView by lazy { itemView.findViewById(R.id.titleTextView) } - val addressTextView: TextView by lazy { itemView.findViewById(R.id.addressTextView) } - val categoryTextView: TextView by lazy { itemView.findViewById(R.id.categoryTextView) } - + ) : RecyclerView.ViewHolder( + itemLocationBinding.root + ) { + fun bind(item: Location) { // ViewHolder와 itemLocationBinding 연동 + itemLocationBinding.location = item + } init { itemView.setOnClickListener { val location = getItem(bindingAdapterPosition) @@ -38,15 +37,13 @@ class LocationAdapter( } } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LocationHolder { - val view = LayoutInflater.from(parent.context).inflate(R.layout.item_location, parent, false) - return LocationHolder(view, itemSelectedListener) + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LocationViewHolder { // ViewHolder 생성 + val inflater = LayoutInflater.from(parent.context) + val listItemBinding = ItemLocationBinding.inflate(inflater, parent, false) + return LocationViewHolder(listItemBinding, itemSelectedListener) } - override fun onBindViewHolder(holder: LocationHolder, position: Int) { - val location = getItem(position) - holder.titleTextView.text = location.title - holder.addressTextView.text = location.address - holder.categoryTextView.text = location.category + override fun onBindViewHolder(holder: LocationViewHolder, position: Int) { // bind를 통해 데이터를 연결 + holder.bind(getItem(position)) } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 26c722b8..93623d80 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,4 +1,5 @@ + - + \ No newline at end of file diff --git a/app/src/main/res/layout/item_location.xml b/app/src/main/res/layout/item_location.xml index f476bbb0..b8b32e63 100644 --- a/app/src/main/res/layout/item_location.xml +++ b/app/src/main/res/layout/item_location.xml @@ -1,49 +1,58 @@ - - - - - - - - - + + + + + + + android:padding="10dp"> + + + + + + + + - \ No newline at end of file + + \ No newline at end of file From 4dd446e6d68fd4f0e988920a22fbc2e52c7d594b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Fri, 26 Jul 2024 13:56:15 +0900 Subject: [PATCH 14/22] =?UTF-8?q?refactor:=20item=5Fsaved=5Flocation.xml?= =?UTF-8?q?=EC=97=90=EC=84=9C=20data=20binding=EC=9D=84=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kakao/map/view/search/LocationAdapter.kt | 33 +++++----- .../map/view/search/SavedLocationAdapter.kt | 52 +++++++--------- .../main/res/layout/item_saved_location.xml | 60 +++++++++++-------- 3 files changed, 75 insertions(+), 70 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt b/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt index 4497fb66..0cd2a79a 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt @@ -20,30 +20,31 @@ class LocationAdapter( return oldItem == newItem } }) { - inner class LocationViewHolder( // + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): LocationViewHolder { // ViewHolder 생성 + val inflater = LayoutInflater.from(parent.context) + val itemLocationBinding = ItemLocationBinding.inflate(inflater, parent, false) + return LocationViewHolder(itemLocationBinding, itemSelectedListener) + } + + override fun onBindViewHolder(holder: LocationViewHolder, position: Int) { // bind를 통해 데이터를 연결 + holder.bind(getItem(position)) + } + + class LocationViewHolder( // private val itemLocationBinding: ItemLocationBinding, - itemSelectedListener: OnItemSelectedListener + private val itemSelectedListener: OnItemSelectedListener ) : RecyclerView.ViewHolder( itemLocationBinding.root ) { fun bind(item: Location) { // ViewHolder와 itemLocationBinding 연동 itemLocationBinding.location = item - } - init { + itemView.setOnClickListener { - val location = getItem(bindingAdapterPosition) - itemSelectedListener.onLocationViewClicked(location) + itemSelectedListener.onLocationViewClicked(item) } } } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LocationViewHolder { // ViewHolder 생성 - val inflater = LayoutInflater.from(parent.context) - val listItemBinding = ItemLocationBinding.inflate(inflater, parent, false) - return LocationViewHolder(listItemBinding, itemSelectedListener) - } - - override fun onBindViewHolder(holder: LocationViewHolder, position: Int) { // bind를 통해 데이터를 연결 - holder.bind(getItem(position)) - } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt b/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt index f852c358..8d113f95 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt @@ -1,8 +1,6 @@ package campus.tech.kakao.map.view.search -import android.util.Log import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import android.widget.ImageView import android.widget.TextView @@ -10,12 +8,13 @@ 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.view.search.SavedLocationAdapter.SavedLocationHolder +import campus.tech.kakao.map.databinding.ItemSavedLocationBinding +import campus.tech.kakao.map.view.search.SavedLocationAdapter.SavedLocationViewHolder import campus.tech.kakao.map.model.SavedLocation class SavedLocationAdapter( private val itemSelectedListener: OnItemSelectedListener -) : ListAdapter( +) : ListAdapter( object: DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: SavedLocation, newItem: SavedLocation): Boolean { return oldItem.id == newItem.id @@ -24,35 +23,28 @@ class SavedLocationAdapter( return oldItem == newItem } }) { - inner class SavedLocationHolder( - itemView:View, - itemSelectedListener: OnItemSelectedListener - ) : RecyclerView.ViewHolder(itemView) { - val savedLocationXButton: ImageView by lazy{ - itemView.findViewById(R.id.savedLocationXButton) - } - val savedLocationTextView: TextView by lazy { - itemView.findViewById(R.id.savedLocationTextView) - } - - init { - itemView.setOnClickListener { - itemSelectedListener.onSavedLocationViewClicked(getItem(bindingAdapterPosition).title) - } - savedLocationXButton.setOnClickListener { - val savedLocation = getItem(bindingAdapterPosition) as SavedLocation - itemSelectedListener.onSavedLocationXButtonClicked(savedLocation) - } - } + override fun onCreateViewHolder(parent:ViewGroup, viewType: Int): SavedLocationViewHolder { + val inflater = LayoutInflater.from(parent.context) + val itemSavedLocationBinding = ItemSavedLocationBinding.inflate(inflater, parent, false) + return SavedLocationViewHolder(itemSavedLocationBinding, itemSelectedListener) } - override fun onCreateViewHolder(parent:ViewGroup, viewType: Int): SavedLocationHolder { - val view = LayoutInflater.from(parent.context).inflate(R.layout.item_saved_location, parent, false) - return SavedLocationHolder(view, itemSelectedListener) + override fun onBindViewHolder(holder:SavedLocationViewHolder, position: Int) { + holder.bind(getItem(position)) } - override fun onBindViewHolder(holder:SavedLocationHolder, position: Int) { - val savedLocation = getItem(position) - holder.savedLocationTextView.setText(savedLocation.title) + class SavedLocationViewHolder( // getItem을 사용하기 위해 inner로 선언 + private val itemSavedLocationBinding: ItemSavedLocationBinding, + private val itemSelectedListener: OnItemSelectedListener + ) : RecyclerView.ViewHolder(itemSavedLocationBinding.root) { + fun bind(item: SavedLocation) { // ViewHolder와 itemLocationBinding 연동 + itemSavedLocationBinding.savedLocation = item + itemView.setOnClickListener { + itemSelectedListener.onSavedLocationViewClicked(item.title) + } + itemSavedLocationBinding.savedLocationXButton.setOnClickListener { + itemSelectedListener.onSavedLocationXButtonClicked(item) + } // -> item_saved_location.xml에서 data binding을 통해 ImageView에 리스너를 달았는데 작동을 안하네요..! 여기서 리스너를 달아도 괜찮은 걸까요? + } } } \ No newline at end of file diff --git a/app/src/main/res/layout/item_saved_location.xml b/app/src/main/res/layout/item_saved_location.xml index 80af92bd..0bd05e03 100644 --- a/app/src/main/res/layout/item_saved_location.xml +++ b/app/src/main/res/layout/item_saved_location.xml @@ -1,29 +1,41 @@ - - - + + + + + + android:padding="10dp"> + + + - + + - \ No newline at end of file + + \ No newline at end of file From 7256a0bfc84327051eb3f23f1fbfe25d0f16f1fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Fri, 26 Jul 2024 16:01:33 +0900 Subject: [PATCH 15/22] =?UTF-8?q?refactor:=20findViewById()=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EB=A5=BC=20=EC=97=86=EC=95=A0=EA=B3=A0=20view=20bindi?= =?UTF-8?q?ng=EC=9D=84=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 1 + .../tech/kakao/map/MainActivityUiTest.kt | 15 ++--- .../tech/kakao/map/view/map/MapActivity.kt | 53 +++++++++-------- .../kakao/map/view/search/MainActivity.kt | 59 ++++++++----------- app/src/main/res/layout/activity_main.xml | 12 ++-- app/src/main/res/layout/activity_map.xml | 7 ++- app/src/main/res/layout/map_bottom_sheet.xml | 10 ++-- 7 files changed, 71 insertions(+), 86 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 10339d3d..0e015ae2 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,6 +13,7 @@ android { buildFeatures { buildConfig = true dataBinding = true + viewBinding = true } defaultConfig { applicationId = "campus.tech.kakao.map" diff --git a/app/src/androidTest/java/campus/tech/kakao/map/MainActivityUiTest.kt b/app/src/androidTest/java/campus/tech/kakao/map/MainActivityUiTest.kt index ee6a22f0..4267d204 100644 --- a/app/src/androidTest/java/campus/tech/kakao/map/MainActivityUiTest.kt +++ b/app/src/androidTest/java/campus/tech/kakao/map/MainActivityUiTest.kt @@ -4,29 +4,22 @@ import androidx.recyclerview.widget.RecyclerView import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.action.ViewActions.replaceText -import androidx.test.espresso.action.ViewActions.typeText import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.contrib.RecyclerViewActions import androidx.test.espresso.intent.Intents import androidx.test.espresso.intent.Intents.intended import androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent import androidx.test.espresso.intent.matcher.IntentMatchers.hasExtra -import androidx.test.espresso.matcher.ViewMatchers.hasDescendant import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 -import campus.tech.kakao.map.model.Location import campus.tech.kakao.map.view.map.MapActivity -import campus.tech.kakao.map.view.search.LocationAdapter import campus.tech.kakao.map.view.search.MainActivity -import org.hamcrest.Matchers.allOf -import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import kotlin.random.Random @RunWith(AndroidJUnit4::class) class MainActivityUiTest { @@ -35,9 +28,9 @@ class MainActivityUiTest { @Test fun `검색창에_검색어를_입력하고_clearButton을_클릭하면_입력한_검색어가_삭제된다`() { - onView(withId(R.id.SearchEditTextInMain)).perform(replaceText("카페")).check(matches(withText("카페"))) + onView(withId(R.id.searchEditTextMain)).perform(replaceText("카페")).check(matches(withText("카페"))) onView(withId(R.id.clearButton)).perform(click()) - onView(withId(R.id.SearchEditTextInMain)).check(matches(withText(""))) + onView(withId(R.id.searchEditTextMain)).check(matches(withText(""))) } @Test @@ -48,14 +41,14 @@ class MainActivityUiTest { @Test fun `검색창에_부산대를_입력하고_리싸이클러뷰의_0번_아이템을_클릭하면_지도와_BottomSheet가_화면에_표시된다`() { Intents.init() - onView(withId(R.id.SearchEditTextInMain)).perform(replaceText("부산대")) + onView(withId(R.id.searchEditTextMain)).perform(replaceText("부산대")) Thread.sleep(3000) onView(withId(R.id.locationRecyclerView)) .perform(RecyclerViewActions.actionOnItemAtPosition(0, click())) intended(hasExtra("title", "부산대학교 부산캠퍼스")) intended(hasComponent(MapActivity::class.java.name)) - onView(withId(R.id.bottom_sheet_layout)).check(matches(isDisplayed())) + onView(withId(R.id.bottomSheetLayout)).check(matches(isDisplayed())) onView(withId(R.id.map_view)).check(matches(isDisplayed())) } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt index d40a9b7c..fad23437 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt @@ -11,8 +11,10 @@ import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.widget.ConstraintLayout import campus.tech.kakao.map.R +import campus.tech.kakao.map.databinding.ActivityMapBinding +import campus.tech.kakao.map.databinding.ErrorMapBinding +import campus.tech.kakao.map.databinding.MapBottomSheetBinding import campus.tech.kakao.map.model.Location -import campus.tech.kakao.map.model.datasource.LastLocationlSharedPreferences import campus.tech.kakao.map.view.search.MainActivity import campus.tech.kakao.map.viewmodel.LocationViewModel import com.google.android.material.bottomsheet.BottomSheetBehavior @@ -25,28 +27,29 @@ import com.kakao.vectormap.label.LabelOptions import com.kakao.vectormap.label.LabelStyle import com.kakao.vectormap.label.LabelStyles import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject @AndroidEntryPoint class MapActivity : AppCompatActivity() { private val locationViewModel: LocationViewModel by viewModels() + private lateinit var bottomSheetBehavior: BottomSheetBehavior - private val searchEditText by lazy { findViewById(R.id.SearchEditTextInMap) } - private val mapView by lazy { findViewById(R.id.map_view) } - private val bottomSheetLayout by lazy { findViewById(R.id.bottom_sheet_layout) } - private val bottom_sheet_title by lazy { findViewById(R.id.bottom_sheet_title) } - private val bottom_sheet_address by lazy { findViewById(R.id.bottom_sheet_address) } - private val errorMessageTextView by lazy { findViewById(R.id.errorMessageTextView) } - private val bottomSheetBehavior: BottomSheetBehavior by lazy { BottomSheetBehavior.from(bottomSheetLayout) } + private lateinit var activityMapBinding: ActivityMapBinding + private lateinit var errorMapBinding: ErrorMapBinding + private lateinit var mapBottomSheetBinding: MapBottomSheetBinding companion object{ - private val DEFAULT_LONGITUDE = 127.115587 - private val DEFAULT_LATITUDE = 37.406960 + private const val DEFAULT_LONGITUDE = 127.115587 + private const val DEFAULT_LATITUDE = 37.406960 } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_map) + activityMapBinding = ActivityMapBinding.inflate(layoutInflater) + setContentView(activityMapBinding.root) + + errorMapBinding = ErrorMapBinding.inflate(layoutInflater) + mapBottomSheetBinding = activityMapBinding.mapBottomSheet + bottomSheetBehavior = BottomSheetBehavior.from(mapBottomSheetBinding.bottomSheetLayout) setupEditText() setupMapView() @@ -54,29 +57,29 @@ class MapActivity : AppCompatActivity() { override fun onResume() { super.onResume() - mapView.resume() // MapView 의 resume 호출 + activityMapBinding.mapView.resume() // MapView 의 resume 호출 } override fun onPause() { super.onPause() - mapView.pause() // MapView 의 pause 호출 + activityMapBinding.mapView.pause() // MapView 의 pause 호출 } private fun setupEditText() { - searchEditText.setOnClickListener { + activityMapBinding.searchEditTextInMap.setOnClickListener { val intent: Intent = Intent(this@MapActivity, MainActivity::class.java) startActivity(intent) } } private fun setupMapView() { - mapView.start(object : MapLifeCycleCallback() { + activityMapBinding.mapView.start(object : MapLifeCycleCallback() { override fun onMapDestroy() { Log.d("jieun", "onMapDestroy") } override fun onMapError(error: Exception) { // 인증 실패 및 지도 사용 중 에러가 발생할 때 호출됨 - Log.d("jieun", "onMapError" + error) + Log.d("jieun", "onMapError$error") showErrorMessage(error) } }, object : KakaoMapReadyCallback() { @@ -93,7 +96,6 @@ class MapActivity : AppCompatActivity() { } override fun getPosition(): LatLng { -// Log.d("jieun", "getPosition coordinates: " + coordinates.toString()) if (location != null) { return LatLng.from(location.latitude, location.longitude) } else{ @@ -107,8 +109,8 @@ class MapActivity : AppCompatActivity() { private fun showErrorMessage(error: Exception) { runOnUiThread { - setContentView(R.layout.error_map) - errorMessageTextView.text = "지도 인증을 실패했습니다.\n다시 시도해주세요.\n\n" + error.message + setContentView(errorMapBinding.root) + errorMapBinding.errorMessageTextView.text = "지도 인증을 실패했습니다.\n다시 시도해주세요.\n\n" + error.message } } @@ -122,7 +124,7 @@ class MapActivity : AppCompatActivity() { .setTextStyles(32, Color.BLACK, 1, Color.GRAY).setZoomLevel(15) ) val position = LatLng.from(location.latitude, location.longitude) - kakaoMap.labelManager?.getLayer()?.addLabel( + kakaoMap.labelManager?.layer?.addLabel( LabelOptions.from(position) .setStyles(labelStyles) .setTexts(location.title) @@ -130,14 +132,15 @@ class MapActivity : AppCompatActivity() { } private fun hideBottomSheet() { - bottomSheetLayout.visibility = View.GONE + mapBottomSheetBinding.bottomSheetLayout.visibility = View.GONE } private fun showBottomSheet(location: Location) { - bottomSheetLayout.visibility = View.VISIBLE + mapBottomSheetBinding.bottomSheetLayout.visibility = View.VISIBLE + mapBottomSheetBinding.bottomSheetTitle.text = location.title + Log.d("jieun", "mapBottomSheetBinding.bottomSheetTitle.text:"+mapBottomSheetBinding.bottomSheetTitle.text) + mapBottomSheetBinding.bottomSheetAddress.text = location.address bottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED - bottom_sheet_title.text = location.title - bottom_sheet_address.text = location.address } private fun getLocation(): Location? { diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt index 30e83964..c6560fe7 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt @@ -5,47 +5,34 @@ import android.os.Bundle import android.text.Editable import android.text.TextWatcher import android.view.View -import android.widget.EditText -import android.widget.ImageView -import android.widget.TextView import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Observer import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import campus.tech.kakao.map.model.datasource.LocationApi -import campus.tech.kakao.map.R +import campus.tech.kakao.map.databinding.ActivityMainBinding import campus.tech.kakao.map.model.Location import campus.tech.kakao.map.model.SavedLocation -import campus.tech.kakao.map.model.datasource.SavedLocationDatabase -import campus.tech.kakao.map.model.repository.DefaultSavedLocationRepository -import campus.tech.kakao.map.model.repository.LocationRepository import campus.tech.kakao.map.view.map.MapActivity import campus.tech.kakao.map.viewmodel.LocationViewModel import campus.tech.kakao.map.viewmodel.SavedLocationViewModel import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject @AndroidEntryPoint class MainActivity : AppCompatActivity(), OnItemSelectedListener { private val locationViewModel: LocationViewModel by viewModels() private val savedLocationViewModel: SavedLocationViewModel by viewModels() - - private val locationAdapter: LocationAdapter by lazy { LocationAdapter(this) } - private val locationRecyclerView: RecyclerView by lazy { findViewById(R.id.locationRecyclerView) } - - private val savedLocationAdapter: SavedLocationAdapter by lazy { SavedLocationAdapter(this) } - private val savedLocationRecyclerView: RecyclerView by lazy { - findViewById(R.id.savedLocationRecyclerView) - } - private val clearButton: ImageView by lazy { findViewById(R.id.clearButton) } - private val searchEditText: EditText by lazy { findViewById(R.id.SearchEditTextInMain) } - private val noResultTextView: TextView by lazy { findViewById(R.id.NoResultTextView) } + private lateinit var locationAdapter: LocationAdapter + private lateinit var savedLocationAdapter: SavedLocationAdapter + private lateinit var activityMainBinding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) + activityMainBinding = ActivityMainBinding.inflate(layoutInflater) + setContentView(activityMainBinding.root) + + locationAdapter = LocationAdapter(this) + savedLocationAdapter = SavedLocationAdapter(this) setupSearchEditText() setupClearButton() @@ -54,7 +41,7 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener { } private fun setupSearchEditText() { - searchEditText.addTextChangedListener(object : TextWatcher { + activityMainBinding.searchEditTextMain.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { @@ -66,12 +53,12 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener { override fun afterTextChanged(s: Editable?) {} }) - searchEditText.requestFocus() + activityMainBinding.searchEditTextMain.requestFocus() } private fun setupClearButton() { - clearButton.setOnClickListener { - searchEditText.setText("") + activityMainBinding.clearButton.setOnClickListener { + activityMainBinding.searchEditTextMain.setText("") } } @@ -87,9 +74,9 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener { savedLocationViewModel.savedLocation.observe(this, Observer { savedLocationAdapter.submitList(it?.toList() ?: emptyList()) if (it.size > 0) { - savedLocationRecyclerView.visibility = View.VISIBLE + activityMainBinding.savedLocationRecyclerView.visibility = View.VISIBLE } else { - savedLocationRecyclerView.visibility = View.GONE + activityMainBinding.savedLocationRecyclerView.visibility = View.GONE } }) } @@ -101,12 +88,12 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener { } private fun setupRecyclerViews() { - locationRecyclerView.layoutManager = LinearLayoutManager(this) - locationRecyclerView.adapter = locationAdapter + activityMainBinding.locationRecyclerView.layoutManager = LinearLayoutManager(this) + activityMainBinding.locationRecyclerView.adapter = locationAdapter - savedLocationRecyclerView.layoutManager = + activityMainBinding.savedLocationRecyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) - savedLocationRecyclerView.adapter = savedLocationAdapter + activityMainBinding.savedLocationRecyclerView.adapter = savedLocationAdapter } override fun onLocationViewClicked(location: Location) { @@ -129,15 +116,15 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener { } private fun updateEditText(title: String) { - searchEditText.setText(title) - searchEditText.setSelection(searchEditText.text.length) + activityMainBinding.searchEditTextMain.setText(title) + activityMainBinding.searchEditTextMain.setSelection(activityMainBinding.searchEditTextMain.text.length) } private fun handleNoResultMessage(searchLocationsSize: Int) { if (searchLocationsSize > 0) { - noResultTextView.visibility = View.GONE + activityMainBinding.noResultTextView.visibility = View.GONE } else { - noResultTextView.visibility = View.VISIBLE + activityMainBinding.noResultTextView.visibility = View.VISIBLE } } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 93623d80..40934381 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -10,7 +10,7 @@ android:background="@color/white"> @@ -39,7 +39,7 @@ android:layout_height="45dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toBottomOf="@id/SearchEditTextInMain" + app:layout_constraintTop_toBottomOf="@id/searchEditTextMain" android:visibility="visible" android:orientation="horizontal"/> @@ -54,14 +54,14 @@ app:layout_constraintTop_toBottomOf="@id/savedLocationRecyclerView" /> diff --git a/app/src/main/res/layout/activity_map.xml b/app/src/main/res/layout/activity_map.xml index 940e1691..eee4a65b 100644 --- a/app/src/main/res/layout/activity_map.xml +++ b/app/src/main/res/layout/activity_map.xml @@ -17,7 +17,7 @@ app:layout_constraintTop_toBottomOf="parent" /> @@ -48,6 +48,7 @@ app:layout_constraintStart_toStartOf="parent"> diff --git a/app/src/main/res/layout/map_bottom_sheet.xml b/app/src/main/res/layout/map_bottom_sheet.xml index aabaa4b7..e6decc21 100644 --- a/app/src/main/res/layout/map_bottom_sheet.xml +++ b/app/src/main/res/layout/map_bottom_sheet.xml @@ -2,7 +2,7 @@ \ No newline at end of file From 33f9b92d3417f9563c367f87acda3f563f2a9130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Fri, 26 Jul 2024 16:39:27 +0900 Subject: [PATCH 16/22] =?UTF-8?q?refactor:=20SharedPreferences=EC=99=80=20?= =?UTF-8?q?KakaoAPI=EC=9D=98=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/campus/tech/kakao/map/App.kt | 5 --- .../campus/tech/kakao/map/LocationModule.kt | 27 ++++++------ .../campus/tech/kakao/map/RepositoryModule.kt | 2 - ...tInstance.kt => RetrofitInstanceModule.kt} | 43 +++++++++++-------- .../tech/kakao/map/SavedLocationModule.kt | 7 --- .../LastLocationlSharedPreferences.kt | 30 +++++++------ ...tionApi.kt => LocationRemoteDataSource.kt} | 9 ++-- .../map/model/datasource/SharedPreferences.kt | 3 +- .../repository/DefaultLocationRepository.kt | 7 ++- ...t => SavedLocationRemoteDataSourceTest.kt} | 2 +- 10 files changed, 66 insertions(+), 69 deletions(-) rename app/src/main/java/campus/tech/kakao/map/{model/datasource/RetrofitInstance.kt => RetrofitInstanceModule.kt} (52%) rename app/src/main/java/campus/tech/kakao/map/model/datasource/{LocationApi.kt => LocationRemoteDataSource.kt} (67%) rename app/src/test/java/campus/tech/kakao/map/{SavedLocationApiTest.kt => SavedLocationRemoteDataSourceTest.kt} (98%) diff --git a/app/src/main/java/campus/tech/kakao/map/App.kt b/app/src/main/java/campus/tech/kakao/map/App.kt index c8a6b838..81ca450b 100644 --- a/app/src/main/java/campus/tech/kakao/map/App.kt +++ b/app/src/main/java/campus/tech/kakao/map/App.kt @@ -7,13 +7,8 @@ import dagger.hilt.android.HiltAndroidApp @HiltAndroidApp class App : Application(){ - companion object{ - lateinit var sharedPreferencesManager : SharedPreferences - } override fun onCreate() { - sharedPreferencesManager = SharedPreferences(applicationContext) KakaoMapSdk.init(this, BuildConfig.KAKAO_API_KEY) super.onCreate() - } } diff --git a/app/src/main/java/campus/tech/kakao/map/LocationModule.kt b/app/src/main/java/campus/tech/kakao/map/LocationModule.kt index 3abe72f3..5b8423d8 100644 --- a/app/src/main/java/campus/tech/kakao/map/LocationModule.kt +++ b/app/src/main/java/campus/tech/kakao/map/LocationModule.kt @@ -1,16 +1,10 @@ package campus.tech.kakao.map import android.content.Context -import androidx.room.Room +import campus.tech.kakao.map.model.datasource.KakaoAPI import campus.tech.kakao.map.model.datasource.LastLocationlSharedPreferences -import campus.tech.kakao.map.model.datasource.LocationApi -import campus.tech.kakao.map.model.datasource.SavedLocationDao -import campus.tech.kakao.map.model.datasource.SavedLocationDatabase -import campus.tech.kakao.map.model.repository.DefaultLocationRepository -import campus.tech.kakao.map.model.repository.DefaultSavedLocationRepository -import campus.tech.kakao.map.model.repository.LocationRepository -import campus.tech.kakao.map.model.repository.SavedLocationRepository -import dagger.Binds +import campus.tech.kakao.map.model.datasource.LocationRemoteDataSource +import campus.tech.kakao.map.model.datasource.SharedPreferences import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -21,15 +15,22 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) class LocationModule { + @Singleton @Provides - fun provideLocationApi(): LocationApi { - return LocationApi() + fun provideLocationRemoteDataSource(kakaoAPI: KakaoAPI): LocationRemoteDataSource { + return LocationRemoteDataSource(kakaoAPI) } + @Provides @Singleton + fun provideSharedPreferences(@ApplicationContext context: Context): SharedPreferences { + return SharedPreferences(context) + } + @Provides - fun provideLastLocationlSharedPreferences(): LastLocationlSharedPreferences { - return LastLocationlSharedPreferences() + @Singleton + fun provideLastLocationSharedPreferences(sharedPreferences: SharedPreferences): LastLocationlSharedPreferences { + return LastLocationlSharedPreferences(sharedPreferences) } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/RepositoryModule.kt b/app/src/main/java/campus/tech/kakao/map/RepositoryModule.kt index 42160a4d..bdbc3e66 100644 --- a/app/src/main/java/campus/tech/kakao/map/RepositoryModule.kt +++ b/app/src/main/java/campus/tech/kakao/map/RepositoryModule.kt @@ -13,8 +13,6 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -// ViewModelComponent로 설정해도 될까요? Repository가 ViewModel에서 쓰이니까 ViewModelComponent를 쓰면 되겠다고 생각했는데요.. -// 적절한 Component를 선택하는 기준이 뭔지 모르겠습니다! abstract class RepositoryModule { @Binds @Singleton diff --git a/app/src/main/java/campus/tech/kakao/map/model/datasource/RetrofitInstance.kt b/app/src/main/java/campus/tech/kakao/map/RetrofitInstanceModule.kt similarity index 52% rename from app/src/main/java/campus/tech/kakao/map/model/datasource/RetrofitInstance.kt rename to app/src/main/java/campus/tech/kakao/map/RetrofitInstanceModule.kt index 733814e9..43ce45ce 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/datasource/RetrofitInstance.kt +++ b/app/src/main/java/campus/tech/kakao/map/RetrofitInstanceModule.kt @@ -1,19 +1,31 @@ -package campus.tech.kakao.map.model.datasource +package campus.tech.kakao.map import android.os.Looper -import campus.tech.kakao.map.BuildConfig +import android.widget.Toast +import campus.tech.kakao.map.model.datasource.KakaoAPI +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent import okhttp3.Interceptor import okhttp3.OkHttpClient import okhttp3.Response import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory +import javax.inject.Singleton -object RetrofitInstance { - val retrofitClient = Retrofit.Builder() - .baseUrl(BuildConfig.BASE_URL) - .addConverterFactory(GsonConverterFactory.create()) - .client(getOkHttpClient()) - .build() +@Module +@InstallIn(SingletonComponent::class) +object RetrofitInstanceModule { + @Provides + @Singleton + fun provideRetrofit(): Retrofit { + return Retrofit.Builder() + .baseUrl(BuildConfig.BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .client(getOkHttpClient()) + .build() + } private fun getOkHttpClient(): OkHttpClient { val client = OkHttpClient.Builder() @@ -28,13 +40,7 @@ object RetrofitInstance { if (response.code != 200) { android.os.Handler(Looper.getMainLooper()).post { - // 백그라운드 스레드에서 작업 중 UI 스레드에서 실행하도록 변경 - // Toast 메세지를 띄우게 하고 싶은데 context 자리에 뭘 넣어야할지 모르겠습니다!! -// Toast.makeText( -// , -// "Error: ${response.code} - ${response.message}", -// Toast.LENGTH_SHORT -// ).show() + Toast.makeText(App(), "Error: ${response.code} - ${response.message}", Toast.LENGTH_SHORT).show() } } return response @@ -42,8 +48,9 @@ object RetrofitInstance { } return client.addInterceptor(interceptor).build() } - - fun getInstance(): Retrofit{ - return retrofitClient + @Provides + @Singleton + fun provideKakaoAPI(retrofit: Retrofit): KakaoAPI { + return retrofit.create(KakaoAPI::class.java) } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/SavedLocationModule.kt b/app/src/main/java/campus/tech/kakao/map/SavedLocationModule.kt index 6aff4c39..97891b6f 100644 --- a/app/src/main/java/campus/tech/kakao/map/SavedLocationModule.kt +++ b/app/src/main/java/campus/tech/kakao/map/SavedLocationModule.kt @@ -2,18 +2,11 @@ package campus.tech.kakao.map import android.content.Context import androidx.room.Room -import campus.tech.kakao.map.model.datasource.LastLocationlSharedPreferences -import campus.tech.kakao.map.model.datasource.LocationApi import campus.tech.kakao.map.model.datasource.SavedLocationDao import campus.tech.kakao.map.model.datasource.SavedLocationDatabase -import campus.tech.kakao.map.model.repository.DefaultLocationRepository -import campus.tech.kakao.map.model.repository.DefaultSavedLocationRepository -import campus.tech.kakao.map.model.repository.LocationRepository -import campus.tech.kakao.map.model.repository.SavedLocationRepository import dagger.Module import dagger.Provides import dagger.hilt.InstallIn -import dagger.hilt.android.components.ViewModelComponent import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import javax.inject.Singleton diff --git a/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlSharedPreferences.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlSharedPreferences.kt index 3b9fefcb..047b0fa0 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlSharedPreferences.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlSharedPreferences.kt @@ -2,26 +2,28 @@ package campus.tech.kakao.map.model.datasource import campus.tech.kakao.map.App import campus.tech.kakao.map.model.Location +import javax.inject.Inject -class LastLocationlSharedPreferences() { - +class LastLocationlSharedPreferences @Inject constructor( + private val sharedPreferences: SharedPreferences +) { fun putLastLocation(location: Location) { - App.sharedPreferencesManager.putString("id", location.id.toString()) - App.sharedPreferencesManager.putString("longitude", location.longitude.toString()) - App.sharedPreferencesManager.putString("latitude", location.latitude.toString()) - App.sharedPreferencesManager.putString("title", location.title.toString()) - App.sharedPreferencesManager.putString("address", location.address.toString()) - App.sharedPreferencesManager.putString("category", location.category.toString()) + sharedPreferences.putString("id", location.id.toString()) + sharedPreferences.putString("longitude", location.longitude.toString()) + sharedPreferences.putString("latitude", location.latitude.toString()) + sharedPreferences.putString("title", location.title.toString()) + sharedPreferences.putString("address", location.address.toString()) + sharedPreferences.putString("category", location.category.toString()) } fun getLastLocation(): Location? { - val id = App.sharedPreferencesManager.getString("id", "").toString() + val id = sharedPreferences.getString("id", "").toString() if(id == "") return null - val title = App.sharedPreferencesManager.getString("title", "") - val longitude = App.sharedPreferencesManager.getString("longitude", "").toString().toDouble() - val latitude = App.sharedPreferencesManager.getString("latitude", "").toString().toDouble() - val address = App.sharedPreferencesManager.getString("address", "").toString() - val category = App.sharedPreferencesManager.getString("category", "").toString() + val title = sharedPreferences.getString("title", "") + val longitude = sharedPreferences.getString("longitude", "").toString().toDouble() + val latitude = sharedPreferences.getString("latitude", "").toString().toDouble() + val address = sharedPreferences.getString("address", "").toString() + val category = sharedPreferences.getString("category", "").toString() return Location(id.toLong(), title, address, category, longitude, latitude) } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationApi.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationRemoteDataSource.kt similarity index 67% rename from app/src/main/java/campus/tech/kakao/map/model/datasource/LocationApi.kt rename to app/src/main/java/campus/tech/kakao/map/model/datasource/LocationRemoteDataSource.kt index 398d7b98..62faffd5 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationApi.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationRemoteDataSource.kt @@ -3,17 +3,18 @@ package campus.tech.kakao.map.model.datasource import campus.tech.kakao.map.model.SearchFromKeywordResponse import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import javax.inject.Inject -class LocationApi { +class LocationRemoteDataSource @Inject constructor( + private val kakaoAPI: KakaoAPI +) { companion object{ private const val RESULT_SIZE = 15 } - private val client = RetrofitInstance.getInstance().create(KakaoAPI::class.java) - suspend fun getLocations(keyword: String): SearchFromKeywordResponse? { return withContext(Dispatchers.IO){ - client.searchFromKeyword(keyword, RESULT_SIZE).body() + kakaoAPI.searchFromKeyword(keyword, RESULT_SIZE).body() } } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/datasource/SharedPreferences.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/SharedPreferences.kt index 8ccd7f09..e2eb9f04 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/datasource/SharedPreferences.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/datasource/SharedPreferences.kt @@ -1,8 +1,9 @@ package campus.tech.kakao.map.model.datasource import android.content.Context +import javax.inject.Inject -class SharedPreferences(context: Context) { +class SharedPreferences (context: Context) { private val prefs = context.getSharedPreferences("myPref", Context.MODE_PRIVATE) fun getString(key: String, defValue: String): String { diff --git a/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultLocationRepository.kt b/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultLocationRepository.kt index 917601bb..88329521 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultLocationRepository.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultLocationRepository.kt @@ -4,18 +4,17 @@ import campus.tech.kakao.map.model.Location import campus.tech.kakao.map.model.Location.Companion.toLocation import campus.tech.kakao.map.model.LocationDto import campus.tech.kakao.map.model.datasource.LastLocationlSharedPreferences -import campus.tech.kakao.map.model.datasource.LocationApi +import campus.tech.kakao.map.model.datasource.LocationRemoteDataSource import javax.inject.Inject -import javax.inject.Qualifier import javax.inject.Singleton @Singleton class DefaultLocationRepository @Inject constructor( - private val locationApi: LocationApi, + private val locationRemoteDataSource: LocationRemoteDataSource, private val lastLocationlSharedPreferences: LastLocationlSharedPreferences ): LocationRepository { override suspend fun getLocationAll(query: String): List { - val searchFromKeywordResponse = locationApi.getLocations(query) + val searchFromKeywordResponse = locationRemoteDataSource.getLocations(query) val locationDtos: List = searchFromKeywordResponse?.documents ?: emptyList() return toLocations(locationDtos) } diff --git a/app/src/test/java/campus/tech/kakao/map/SavedLocationApiTest.kt b/app/src/test/java/campus/tech/kakao/map/SavedLocationRemoteDataSourceTest.kt similarity index 98% rename from app/src/test/java/campus/tech/kakao/map/SavedLocationApiTest.kt rename to app/src/test/java/campus/tech/kakao/map/SavedLocationRemoteDataSourceTest.kt index f0224a09..5f677c9e 100644 --- a/app/src/test/java/campus/tech/kakao/map/SavedLocationApiTest.kt +++ b/app/src/test/java/campus/tech/kakao/map/SavedLocationRemoteDataSourceTest.kt @@ -11,7 +11,7 @@ import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) -class SavedLocationApiTest { +class SavedLocationRemoteDataSourceTest { private lateinit var locationLocalDataSource: SavedLocationDataSource private lateinit var locationDbHelper: LocationDbHelper private lateinit var sqLiteDatabase: SQLiteDatabase From 1488a8d1df7e617d853f078195e9e65605639abc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Mon, 29 Jul 2024 15:18:01 +0900 Subject: [PATCH 17/22] =?UTF-8?q?refactor:=20CoroutineDispatcher=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=A3=BC=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/campus/tech/kakao/map/LocationModule.kt | 10 +++++++++- .../map/model/datasource/LocationRemoteDataSource.kt | 6 ++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/map/LocationModule.kt b/app/src/main/java/campus/tech/kakao/map/LocationModule.kt index 5b8423d8..24e0c8eb 100644 --- a/app/src/main/java/campus/tech/kakao/map/LocationModule.kt +++ b/app/src/main/java/campus/tech/kakao/map/LocationModule.kt @@ -10,6 +10,8 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers import javax.inject.Singleton @Module @@ -19,7 +21,13 @@ class LocationModule { @Singleton @Provides fun provideLocationRemoteDataSource(kakaoAPI: KakaoAPI): LocationRemoteDataSource { - return LocationRemoteDataSource(kakaoAPI) + return LocationRemoteDataSource(kakaoAPI, Dispatchers.IO) + } + + @Singleton + @Provides + fun provideDispatchers(): CoroutineDispatcher { + return Dispatchers.IO } @Provides diff --git a/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationRemoteDataSource.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationRemoteDataSource.kt index 62faffd5..f64bc1ad 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationRemoteDataSource.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/datasource/LocationRemoteDataSource.kt @@ -1,19 +1,21 @@ package campus.tech.kakao.map.model.datasource import campus.tech.kakao.map.model.SearchFromKeywordResponse +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import javax.inject.Inject class LocationRemoteDataSource @Inject constructor( - private val kakaoAPI: KakaoAPI + private val kakaoAPI: KakaoAPI, + private val dispatchersIO: CoroutineDispatcher ) { companion object{ private const val RESULT_SIZE = 15 } suspend fun getLocations(keyword: String): SearchFromKeywordResponse? { - return withContext(Dispatchers.IO){ + return withContext(dispatchersIO){ kakaoAPI.searchFromKeyword(keyword, RESULT_SIZE).body() } } From 89154f66464d7c6fb0b3e59de82b7fb86b2f37e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Mon, 29 Jul 2024 15:40:21 +0900 Subject: [PATCH 18/22] =?UTF-8?q?refactor:=20Location=EC=9D=84=20Parcelabl?= =?UTF-8?q?e=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 1 + app/src/main/java/campus/tech/kakao/map/model/Location.kt | 7 ++++--- .../java/campus/tech/kakao/map/view/map/MapActivity.kt | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0e015ae2..6caa059d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -5,6 +5,7 @@ plugins { id("org.jetbrains.kotlin.android") id("kotlin-kapt") id("com.google.dagger.hilt.android") + id("kotlin-parcelize") } android { diff --git a/app/src/main/java/campus/tech/kakao/map/model/Location.kt b/app/src/main/java/campus/tech/kakao/map/model/Location.kt index f97c2093..a9bdd38f 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/Location.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/Location.kt @@ -1,7 +1,9 @@ package campus.tech.kakao.map.model +import android.os.Parcelable +import kotlinx.parcelize.Parcelize import java.io.Serializable - +@Parcelize data class Location( val id: Long, val title: String, @@ -9,8 +11,7 @@ data class Location( val category: String, val longitude: Double, val latitude: Double -): Serializable -{ +) : Parcelable { companion object { fun LocationDto.toLocation(): Location { return Location(id.toLong(), title, address, category, x.toDouble(), y.toDouble()) diff --git a/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt index fad23437..011ec8e2 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/map/MapActivity.kt @@ -154,7 +154,7 @@ class MapActivity : AppCompatActivity() { private fun getLocationByIntent(): Location? { if (intent.hasExtra("location")) { - val location = intent.getSerializableExtra("location") as Location + val location = intent.getParcelableExtra("location", Location::class.java) // API 레벨 오류, 실행에는 문제없다. Log.d("jieun","getLocationByIntent location "+location.toString()) return location } From 42c2240ef37fd2548303c711f7f93e8c8a718815 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Mon, 29 Jul 2024 16:39:18 +0900 Subject: [PATCH 19/22] =?UTF-8?q?refactor:=20setOnClickListener=EB=A1=9C?= =?UTF-8?q?=20=EB=A6=AC=EC=8A=A4=EB=84=88=EB=A5=BC=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=ED=96=88=EB=8D=98=20=EB=B0=A9=EC=8B=9D=EC=97=90=EC=84=9C=20xml?= =?UTF-8?q?=EC=97=90=EC=84=9C=20data=20binding=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=EB=84=88=20=EB=93=B1=EB=A1=9D=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tech/kakao/map/view/search/LocationAdapter.kt | 5 +---- .../tech/kakao/map/view/search/MainActivity.kt | 12 +++++++----- .../kakao/map/view/search/OnItemSelectedListener.kt | 2 +- .../kakao/map/view/search/OnSearchClickListener.kt | 5 +++++ .../kakao/map/view/search/SavedLocationAdapter.kt | 9 ++------- app/src/main/res/layout/activity_main.xml | 13 ++++++++++--- app/src/main/res/layout/item_location.xml | 6 +++++- app/src/main/res/layout/item_saved_location.xml | 10 +++++----- 8 files changed, 36 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/campus/tech/kakao/map/view/search/OnSearchClickListener.kt diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt b/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt index 0cd2a79a..3fede323 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt @@ -41,10 +41,7 @@ class LocationAdapter( ) { fun bind(item: Location) { // ViewHolder와 itemLocationBinding 연동 itemLocationBinding.location = item - - itemView.setOnClickListener { - itemSelectedListener.onLocationViewClicked(item) - } + itemLocationBinding.onItemSelectedListener = itemSelectedListener } } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt index c6560fe7..9aca9a62 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt @@ -18,7 +18,7 @@ import campus.tech.kakao.map.viewmodel.SavedLocationViewModel import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class MainActivity : AppCompatActivity(), OnItemSelectedListener { +class MainActivity : AppCompatActivity(), OnItemSelectedListener, OnSearchClickListener { private val locationViewModel: LocationViewModel by viewModels() private val savedLocationViewModel: SavedLocationViewModel by viewModels() @@ -57,9 +57,7 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener { } private fun setupClearButton() { - activityMainBinding.clearButton.setOnClickListener { - activityMainBinding.searchEditTextMain.setText("") - } + activityMainBinding.searchClickListener = this } private fun setupViewModels() { @@ -104,7 +102,7 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener { startActivity(intent) } - override fun onSavedLocationXButtonClicked(savedLocation: SavedLocation) { + override fun onSavedLocationClearButtonClicked(savedLocation: SavedLocation) { savedLocationViewModel.deleteSavedLocation(savedLocation) } @@ -115,6 +113,10 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener { } } + override fun onSearchClearButtonClicked() { + activityMainBinding.searchEditTextMain.setText("") + } + private fun updateEditText(title: String) { activityMainBinding.searchEditTextMain.setText(title) activityMainBinding.searchEditTextMain.setSelection(activityMainBinding.searchEditTextMain.text.length) diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/OnItemSelectedListener.kt b/app/src/main/java/campus/tech/kakao/map/view/search/OnItemSelectedListener.kt index ddd4e8d3..c367603a 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/OnItemSelectedListener.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/OnItemSelectedListener.kt @@ -5,6 +5,6 @@ import campus.tech.kakao.map.model.SavedLocation interface OnItemSelectedListener { fun onLocationViewClicked(location: Location) - fun onSavedLocationXButtonClicked(item: SavedLocation) + fun onSavedLocationClearButtonClicked(item: SavedLocation) fun onSavedLocationViewClicked(title: String) } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/OnSearchClickListener.kt b/app/src/main/java/campus/tech/kakao/map/view/search/OnSearchClickListener.kt new file mode 100644 index 00000000..64242b05 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/view/search/OnSearchClickListener.kt @@ -0,0 +1,5 @@ +package campus.tech.kakao.map.view.search + +interface OnSearchClickListener { + fun onSearchClearButtonClicked() +} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt b/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt index 8d113f95..ff77ce28 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt @@ -33,18 +33,13 @@ class SavedLocationAdapter( holder.bind(getItem(position)) } - class SavedLocationViewHolder( // getItem을 사용하기 위해 inner로 선언 + class SavedLocationViewHolder( private val itemSavedLocationBinding: ItemSavedLocationBinding, private val itemSelectedListener: OnItemSelectedListener ) : RecyclerView.ViewHolder(itemSavedLocationBinding.root) { fun bind(item: SavedLocation) { // ViewHolder와 itemLocationBinding 연동 itemSavedLocationBinding.savedLocation = item - itemView.setOnClickListener { - itemSelectedListener.onSavedLocationViewClicked(item.title) - } - itemSavedLocationBinding.savedLocationXButton.setOnClickListener { - itemSelectedListener.onSavedLocationXButtonClicked(item) - } // -> item_saved_location.xml에서 data binding을 통해 ImageView에 리스너를 달았는데 작동을 안하네요..! 여기서 리스너를 달아도 괜찮은 걸까요? + itemSavedLocationBinding.onItemSelectedListener = itemSelectedListener } } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 40934381..c62a1b69 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,5 +1,10 @@ - + + + + + android:layout_marginRight="10dp" + android:onClick="@{() -> searchClickListener.onSearchClearButtonClicked()}"/> - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_location.xml b/app/src/main/res/layout/item_location.xml index b8b32e63..ce73ea29 100644 --- a/app/src/main/res/layout/item_location.xml +++ b/app/src/main/res/layout/item_location.xml @@ -5,6 +5,9 @@ + + android:padding="10dp" + android:onClick="@{() -> onItemSelectedListener.onLocationViewClicked(location)}"> + android:padding="10dp" + android:onClick="@{() -> onItemSelectedListener.onSavedLocationViewClicked(savedLocation.title)}"> - - + app:layout_constraintTop_toTopOf="parent" + android:onClick="@{() -> onItemSelectedListener.onSavedLocationClearButtonClicked(savedLocation)}"/> \ No newline at end of file From 8c7baf918ebe47d031d1f13d00822d2345dbe765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Mon, 29 Jul 2024 17:04:15 +0900 Subject: [PATCH 20/22] =?UTF-8?q?fix:=20=EA=B2=80=EC=83=89=EC=B0=BD=20?= =?UTF-8?q?=ED=81=B4=EB=A6=AC=EC=96=B4=20=EB=B2=84=ED=8A=BC=EC=9D=84=20?= =?UTF-8?q?=EB=88=84=EB=A5=B4=EB=A9=B4=20=EA=BA=BC=EC=A7=80=EB=8A=94=20?= =?UTF-8?q?=ED=98=84=EC=83=81=20=EA=B3=A0=EC=B9=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/campus/tech/kakao/map/view/search/MainActivity.kt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt index 9aca9a62..9f7959d5 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.os.Bundle import android.text.Editable import android.text.TextWatcher +import android.util.Log import android.view.View import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity @@ -35,7 +36,6 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener, OnSearchClickL savedLocationAdapter = SavedLocationAdapter(this) setupSearchEditText() - setupClearButton() setupViewModels() setupRecyclerViews() } @@ -46,17 +46,14 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener, OnSearchClickL override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { val query = s.toString() + if(query.isEmpty()) return locationViewModel.searchLocationsFromKakaoAPI(query) { searchLocationsSize -> handleNoResultMessage(searchLocationsSize) } } - override fun afterTextChanged(s: Editable?) {} }) activityMainBinding.searchEditTextMain.requestFocus() - } - - private fun setupClearButton() { activityMainBinding.searchClickListener = this } From bedeeb61b97167a0fa5b3daf8700bcf62fd01ae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Tue, 30 Jul 2024 15:49:01 +0900 Subject: [PATCH 21/22] =?UTF-8?q?refactor:=20LocationModule=EC=9D=84=20obj?= =?UTF-8?q?ect=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/campus/tech/kakao/map/LocationModule.kt | 8 ++++---- ...redPreferences.kt => LastLocationSharedPreferences.kt} | 3 +-- .../map/model/repository/DefaultLocationRepository.kt | 8 ++++---- 3 files changed, 9 insertions(+), 10 deletions(-) rename app/src/main/java/campus/tech/kakao/map/model/datasource/{LastLocationlSharedPreferences.kt => LastLocationSharedPreferences.kt} (93%) diff --git a/app/src/main/java/campus/tech/kakao/map/LocationModule.kt b/app/src/main/java/campus/tech/kakao/map/LocationModule.kt index 24e0c8eb..aa61a8e5 100644 --- a/app/src/main/java/campus/tech/kakao/map/LocationModule.kt +++ b/app/src/main/java/campus/tech/kakao/map/LocationModule.kt @@ -2,7 +2,7 @@ package campus.tech.kakao.map import android.content.Context import campus.tech.kakao.map.model.datasource.KakaoAPI -import campus.tech.kakao.map.model.datasource.LastLocationlSharedPreferences +import campus.tech.kakao.map.model.datasource.LastLocationSharedPreferences import campus.tech.kakao.map.model.datasource.LocationRemoteDataSource import campus.tech.kakao.map.model.datasource.SharedPreferences import dagger.Module @@ -16,7 +16,7 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -class LocationModule { +object LocationModule { @Singleton @Provides @@ -38,7 +38,7 @@ class LocationModule { @Provides @Singleton - fun provideLastLocationSharedPreferences(sharedPreferences: SharedPreferences): LastLocationlSharedPreferences { - return LastLocationlSharedPreferences(sharedPreferences) + fun provideLastLocationSharedPreferences(sharedPreferences: SharedPreferences): LastLocationSharedPreferences { + return LastLocationSharedPreferences(sharedPreferences) } } \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlSharedPreferences.kt b/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationSharedPreferences.kt similarity index 93% rename from app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlSharedPreferences.kt rename to app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationSharedPreferences.kt index 047b0fa0..c0f7851a 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationlSharedPreferences.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/datasource/LastLocationSharedPreferences.kt @@ -1,10 +1,9 @@ package campus.tech.kakao.map.model.datasource -import campus.tech.kakao.map.App import campus.tech.kakao.map.model.Location import javax.inject.Inject -class LastLocationlSharedPreferences @Inject constructor( +class LastLocationSharedPreferences @Inject constructor( private val sharedPreferences: SharedPreferences ) { fun putLastLocation(location: Location) { diff --git a/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultLocationRepository.kt b/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultLocationRepository.kt index 88329521..3a09248e 100644 --- a/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultLocationRepository.kt +++ b/app/src/main/java/campus/tech/kakao/map/model/repository/DefaultLocationRepository.kt @@ -3,7 +3,7 @@ package campus.tech.kakao.map.model.repository import campus.tech.kakao.map.model.Location import campus.tech.kakao.map.model.Location.Companion.toLocation import campus.tech.kakao.map.model.LocationDto -import campus.tech.kakao.map.model.datasource.LastLocationlSharedPreferences +import campus.tech.kakao.map.model.datasource.LastLocationSharedPreferences import campus.tech.kakao.map.model.datasource.LocationRemoteDataSource import javax.inject.Inject import javax.inject.Singleton @@ -11,7 +11,7 @@ import javax.inject.Singleton @Singleton class DefaultLocationRepository @Inject constructor( private val locationRemoteDataSource: LocationRemoteDataSource, - private val lastLocationlSharedPreferences: LastLocationlSharedPreferences + private val lastLocationSharedPreferences: LastLocationSharedPreferences ): LocationRepository { override suspend fun getLocationAll(query: String): List { val searchFromKeywordResponse = locationRemoteDataSource.getLocations(query) @@ -24,10 +24,10 @@ class DefaultLocationRepository @Inject constructor( it.toLocation() } override fun addLastLocation(location: Location){ - lastLocationlSharedPreferences.putLastLocation(location) + lastLocationSharedPreferences.putLastLocation(location) } override fun getLastLocation(): Location? { - return lastLocationlSharedPreferences.getLastLocation() + return lastLocationSharedPreferences.getLastLocation() } } \ No newline at end of file From 18fdc10535cbfb8506353bf8b73efb2564b5a870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9D=80?= Date: Tue, 30 Jul 2024 15:58:11 +0900 Subject: [PATCH 22/22] =?UTF-8?q?refactor:=20listener=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tech/kakao/map/view/search/ItemSelectedListener.kt | 10 ++++++++++ .../tech/kakao/map/view/search/LocationAdapter.kt | 4 ++-- .../campus/tech/kakao/map/view/search/MainActivity.kt | 9 ++++----- .../kakao/map/view/search/OnItemSelectedListener.kt | 10 ---------- .../tech/kakao/map/view/search/SavedLocationAdapter.kt | 7 ++----- ...ckListener.kt => SearchClearButtonClickListener.kt} | 2 +- app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/layout/item_location.xml | 4 ++-- app/src/main/res/layout/item_saved_location.xml | 6 +++--- 9 files changed, 25 insertions(+), 29 deletions(-) create mode 100644 app/src/main/java/campus/tech/kakao/map/view/search/ItemSelectedListener.kt delete mode 100644 app/src/main/java/campus/tech/kakao/map/view/search/OnItemSelectedListener.kt rename app/src/main/java/campus/tech/kakao/map/view/search/{OnSearchClickListener.kt => SearchClearButtonClickListener.kt} (65%) diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/ItemSelectedListener.kt b/app/src/main/java/campus/tech/kakao/map/view/search/ItemSelectedListener.kt new file mode 100644 index 00000000..29130d5d --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/view/search/ItemSelectedListener.kt @@ -0,0 +1,10 @@ +package campus.tech.kakao.map.view.search + +import campus.tech.kakao.map.model.Location +import campus.tech.kakao.map.model.SavedLocation + +interface ItemSelectedListener { + fun onLocationItemClicked(location: Location) + fun onSavedLocationItemClearButtonClicked(item: SavedLocation) + fun onSavedLocationItemClicked(title: String) +} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt b/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt index 3fede323..40edac7b 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/LocationAdapter.kt @@ -10,7 +10,7 @@ import campus.tech.kakao.map.view.search.LocationAdapter.LocationViewHolder import campus.tech.kakao.map.model.Location class LocationAdapter( - private val itemSelectedListener: OnItemSelectedListener + private val itemSelectedListener: ItemSelectedListener ) : ListAdapter( object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: Location, newItem: Location): Boolean { @@ -35,7 +35,7 @@ class LocationAdapter( class LocationViewHolder( // private val itemLocationBinding: ItemLocationBinding, - private val itemSelectedListener: OnItemSelectedListener + private val itemSelectedListener: ItemSelectedListener ) : RecyclerView.ViewHolder( itemLocationBinding.root ) { diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt index 9f7959d5..8cb94c2a 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/MainActivity.kt @@ -4,7 +4,6 @@ import android.content.Intent import android.os.Bundle import android.text.Editable import android.text.TextWatcher -import android.util.Log import android.view.View import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity @@ -19,7 +18,7 @@ import campus.tech.kakao.map.viewmodel.SavedLocationViewModel import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class MainActivity : AppCompatActivity(), OnItemSelectedListener, OnSearchClickListener { +class MainActivity : AppCompatActivity(), ItemSelectedListener, SearchClearButtonClickListener { private val locationViewModel: LocationViewModel by viewModels() private val savedLocationViewModel: SavedLocationViewModel by viewModels() @@ -91,7 +90,7 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener, OnSearchClickL activityMainBinding.savedLocationRecyclerView.adapter = savedLocationAdapter } - override fun onLocationViewClicked(location: Location) { + override fun onLocationItemClicked(location: Location) { savedLocationViewModel.addSavedLocation(location.id, location.title) val intent = Intent(this@MainActivity, MapActivity::class.java) @@ -99,11 +98,11 @@ class MainActivity : AppCompatActivity(), OnItemSelectedListener, OnSearchClickL startActivity(intent) } - override fun onSavedLocationClearButtonClicked(savedLocation: SavedLocation) { + override fun onSavedLocationItemClearButtonClicked(savedLocation: SavedLocation) { savedLocationViewModel.deleteSavedLocation(savedLocation) } - override fun onSavedLocationViewClicked(title: String) { + override fun onSavedLocationItemClicked(title: String) { updateEditText(title) locationViewModel.searchLocationsFromKakaoAPI(title){ searchLocationsSize -> handleNoResultMessage(searchLocationsSize) diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/OnItemSelectedListener.kt b/app/src/main/java/campus/tech/kakao/map/view/search/OnItemSelectedListener.kt deleted file mode 100644 index c367603a..00000000 --- a/app/src/main/java/campus/tech/kakao/map/view/search/OnItemSelectedListener.kt +++ /dev/null @@ -1,10 +0,0 @@ -package campus.tech.kakao.map.view.search - -import campus.tech.kakao.map.model.Location -import campus.tech.kakao.map.model.SavedLocation - -interface OnItemSelectedListener { - fun onLocationViewClicked(location: Location) - fun onSavedLocationClearButtonClicked(item: SavedLocation) - fun onSavedLocationViewClicked(title: String) -} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt b/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt index ff77ce28..da054ab6 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/SavedLocationAdapter.kt @@ -2,18 +2,15 @@ package campus.tech.kakao.map.view.search import android.view.LayoutInflater; import android.view.ViewGroup; -import android.widget.ImageView -import android.widget.TextView 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.databinding.ItemSavedLocationBinding import campus.tech.kakao.map.view.search.SavedLocationAdapter.SavedLocationViewHolder import campus.tech.kakao.map.model.SavedLocation class SavedLocationAdapter( - private val itemSelectedListener: OnItemSelectedListener + private val itemSelectedListener: ItemSelectedListener ) : ListAdapter( object: DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: SavedLocation, newItem: SavedLocation): Boolean { @@ -35,7 +32,7 @@ class SavedLocationAdapter( class SavedLocationViewHolder( private val itemSavedLocationBinding: ItemSavedLocationBinding, - private val itemSelectedListener: OnItemSelectedListener + private val itemSelectedListener: ItemSelectedListener ) : RecyclerView.ViewHolder(itemSavedLocationBinding.root) { fun bind(item: SavedLocation) { // ViewHolder와 itemLocationBinding 연동 itemSavedLocationBinding.savedLocation = item diff --git a/app/src/main/java/campus/tech/kakao/map/view/search/OnSearchClickListener.kt b/app/src/main/java/campus/tech/kakao/map/view/search/SearchClearButtonClickListener.kt similarity index 65% rename from app/src/main/java/campus/tech/kakao/map/view/search/OnSearchClickListener.kt rename to app/src/main/java/campus/tech/kakao/map/view/search/SearchClearButtonClickListener.kt index 64242b05..4dae1c4f 100644 --- a/app/src/main/java/campus/tech/kakao/map/view/search/OnSearchClickListener.kt +++ b/app/src/main/java/campus/tech/kakao/map/view/search/SearchClearButtonClickListener.kt @@ -1,5 +1,5 @@ package campus.tech.kakao.map.view.search -interface OnSearchClickListener { +interface SearchClearButtonClickListener { fun onSearchClearButtonClicked() } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index c62a1b69..d8cba374 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,7 +3,7 @@ + type="campus.tech.kakao.map.view.search.SearchClearButtonClickListener" /> + type="campus.tech.kakao.map.view.search.ItemSelectedListener" /> + android:onClick="@{() -> onItemSelectedListener.onLocationItemClicked(location)}"> + type="campus.tech.kakao.map.view.search.ItemSelectedListener" /> + android:onClick="@{() -> onItemSelectedListener.onSavedLocationItemClicked(savedLocation.title)}"> + android:onClick="@{() -> onItemSelectedListener.onSavedLocationItemClearButtonClicked(savedLocation)}"/> \ No newline at end of file