diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index e25e2553..e1daa24d 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -1,6 +1,7 @@
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
+ id("kotlin-kapt")
}
android {
@@ -40,6 +41,11 @@ android {
}
dependencies {
+ kapt("com.android.databinding:compiler:3.1.4")
+ implementation("androidx.fragment:fragment-ktx:1.8.1")
+ implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.3")
+ implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.3")
+ implementation("com.google.code.gson:gson:2.11.0")
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.appcompat:appcompat:1.6.1")
@@ -49,7 +55,7 @@ dependencies {
implementation("androidx.datastore:datastore-preferences:1.0.0")
implementation("com.squareup.retrofit2:retrofit:2.11.0")
implementation("com.squareup.retrofit2:converter-gson:2.11.0")
- implementation("com.kakao.maps.open:android:2.9.5")
+// implementation("com.kakao.maps.open:android:2.9.5")
implementation("androidx.activity:activity:1.8.0")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 930d7f16..583a82ae 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,6 +5,7 @@
+ for (i in 1..15) {
+ val name = "$category $i"
+ val address = "$baseAddress $i"
+ val sql = "INSERT INTO ${PlaceContract.TABLE_NAME} (" +
+ "${PlaceContract.TABLE_COLUMN_NAME}, ${PlaceContract.TABLE_COLUMN_ADDRESS}, ${PlaceContract.TABLE_COLUMN_CATEGORY}) " +
+ "VALUES ('$name', '$address', '$category');"
+ it.execSQL(sql)
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt
index 95b43803..c195f395 100644
--- a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt
+++ b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt
@@ -1,11 +1,118 @@
package campus.tech.kakao.map
import android.os.Bundle
+import android.text.Editable
+import android.text.TextWatcher
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
+import androidx.lifecycle.Observer
+import androidx.recyclerview.widget.LinearLayoutManager
+import campus.tech.kakao.map.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
+ private val viewModel: MainViewModel by viewModels {
+ ViewModelFactory(applicationContext)
+ }
+
+ private val placeAdapter: PlaceAdapter by lazy {
+ PlaceAdapter(placeList,
+ LayoutInflater.from(this@MainActivity),
+ object :
+ PlaceAdapter.OnItemClickListener {
+ override fun onItemClick(position: Int) {
+ val item = placeAdapter.getItem(position)
+ val searchHistory = SearchHistory(item.name)
+ viewModel.saveSearchHistory(searchHistory)
+ Log.d("실행", "저장")
+ }
+ }
+ )
+ }
+
+ private val historyAdapter: HistoryAdapter by lazy {
+ HistoryAdapter(
+ viewModel.searchHistoryList.value ?: emptyList(),
+ LayoutInflater.from(this@MainActivity),
+ object : HistoryAdapter.OnItemClickListener {
+ override fun onItemClick(position: Int) {
+ val item = viewModel.searchHistoryList.value?.get(position)
+ if (item != null) {
+ mainBinding.search.setText(item.searchHistory)
+ Log.d("실행", "검색창")
+ }
+ }
+ override fun onXMarkClick(position: Int) {
+ viewModel.deleteSearchHistory(position)
+ Log.d("실행", "삭제")
+ }
+ }
+ )
+ }
+
+ private lateinit var mainBinding: ActivityMainBinding
+
+
+ private var placeList: List = emptyList()
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
+ mainBinding = ActivityMainBinding.inflate(layoutInflater)
+ setContentView(mainBinding.root)
+
+ if (placeList.isNullOrEmpty()) {
+ mainBinding.emptyMainText.visibility = View.VISIBLE
+ } else {
+ mainBinding.emptyMainText.visibility = View.GONE
+ }
+
+ setupRecyclerViews(mainBinding)
+ setupSearchEditText(mainBinding)
+ observeViewModel(mainBinding)
+
+ mainBinding.xmark.setOnClickListener {
+ mainBinding.search.setText("")
+ }
+ }
+
+ private fun setupRecyclerViews(mainBinding: ActivityMainBinding) {
+ mainBinding.placeResult.apply {
+ layoutManager = LinearLayoutManager(this@MainActivity, LinearLayoutManager.VERTICAL, false)
+ adapter = placeAdapter
+ }
+
+ mainBinding.searchHistory.apply {
+ layoutManager = LinearLayoutManager(this@MainActivity, LinearLayoutManager.HORIZONTAL, false)
+ adapter = historyAdapter
+ }
+ }
+
+ private fun setupSearchEditText(mainBinding: ActivityMainBinding) {
+ val searchEditText = mainBinding.search
+
+ searchEditText.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) {}
+
+ override fun afterTextChanged(s: Editable?) {
+ val searchText = searchEditText.text.toString()
+ viewModel.getSearchResult(searchText)
+ }
+ })
+ }
+
+ private fun observeViewModel(mainBinding: ActivityMainBinding) {
+ viewModel.searchHistoryList.observe(this@MainActivity, Observer {
+ historyAdapter.setData(it)
+ })
+ viewModel.getSearchHistoryList()
+
+ viewModel.placeList.observe(this@MainActivity, Observer {
+ placeAdapter.setData(it)
+ mainBinding.emptyMainText.visibility = if (it.isNullOrEmpty()) View.VISIBLE else View.GONE
+ })
}
}
diff --git a/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt
new file mode 100644
index 00000000..88e5e8f6
--- /dev/null
+++ b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt
@@ -0,0 +1,78 @@
+package campus.tech.kakao.map
+
+import android.content.Context
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+
+class MainViewModel(context: Context) : ViewModel() {
+ private val dbHelper: DBHelper = DBHelper(context)
+ private val db = dbHelper.writableDatabase
+ private val preferenceManager = MapApplication.prefs
+
+ private var _placeList = MutableLiveData>()
+ private val _searchHistoryList = MutableLiveData>()
+
+ init {
+ _searchHistoryList.value = getSearchHistory()
+ }
+
+ val searchHistoryList: LiveData>
+ get() = _searchHistoryList
+
+ val placeList: LiveData>
+ get() = _placeList
+
+ fun insertPlace(place: Place) {
+ dbHelper.insert(db, place)
+ }
+
+ override fun onCleared() {
+ super.onCleared()
+ if (db.isOpen) db.close()
+ }
+
+ fun getSearchResult(searchText: String) {
+ if (searchText.isEmpty()) {
+ _placeList.postValue(emptyList())
+ } else {
+ val rDb = dbHelper.readableDatabase
+ val places = mutableListOf()
+ val query = "SELECT * FROM ${PlaceContract.TABLE_NAME} WHERE ${PlaceContract.TABLE_COLUMN_NAME} LIKE ?"
+ val cursor = rDb.rawQuery(query, arrayOf("%$searchText%"))
+
+ if (cursor != null) {
+ if (cursor.moveToFirst()) {
+ do {
+ val name = cursor.getString(cursor.getColumnIndexOrThrow(PlaceContract.TABLE_COLUMN_NAME))
+ val address = cursor.getString(cursor.getColumnIndexOrThrow(PlaceContract.TABLE_COLUMN_ADDRESS))
+ val category = cursor.getString(cursor.getColumnIndexOrThrow(PlaceContract.TABLE_COLUMN_CATEGORY))
+ val place = Place(name, address, category)
+ places.add(place)
+ } while (cursor.moveToNext())
+ }
+ cursor.close()
+ }
+ _placeList.postValue(places)
+ }
+ }
+
+ fun getSearchHistoryList() {
+ _searchHistoryList.value = getSearchHistory()
+ }
+
+ private fun getSearchHistory(): ArrayList {
+ return preferenceManager.getArrayList(Constants.SEARCH_HISTORY_KEY)
+ }
+
+ fun saveSearchHistory(searchHistory: SearchHistory) {
+ val currentList = getSearchHistory()
+ preferenceManager.savePreference(Constants.SEARCH_HISTORY_KEY, searchHistory, currentList)
+ getSearchHistoryList()
+ }
+
+ fun deleteSearchHistory(position: Int) {
+ preferenceManager.deleteArrayListItem(Constants.SEARCH_HISTORY_KEY, position)
+ getSearchHistoryList()
+ }
+}
diff --git a/app/src/main/java/campus/tech/kakao/map/MapApplication.kt b/app/src/main/java/campus/tech/kakao/map/MapApplication.kt
new file mode 100644
index 00000000..9af8823b
--- /dev/null
+++ b/app/src/main/java/campus/tech/kakao/map/MapApplication.kt
@@ -0,0 +1,15 @@
+package campus.tech.kakao.map
+
+import android.app.Application
+import android.content.SharedPreferences
+
+class MapApplication: Application() {
+ companion object {
+ lateinit var prefs: PreferenceManager
+ }
+
+ override fun onCreate() {
+ prefs = PreferenceManager(applicationContext)
+ super.onCreate()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/campus/tech/kakao/map/Place.kt b/app/src/main/java/campus/tech/kakao/map/Place.kt
new file mode 100644
index 00000000..b332afdc
--- /dev/null
+++ b/app/src/main/java/campus/tech/kakao/map/Place.kt
@@ -0,0 +1,7 @@
+package campus.tech.kakao.map
+
+data class Place (
+ val name: String,
+ val address: String,
+ val category: String,
+)
\ No newline at end of file
diff --git a/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt b/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt
new file mode 100644
index 00000000..59793a24
--- /dev/null
+++ b/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt
@@ -0,0 +1,61 @@
+package campus.tech.kakao.map
+
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.AdapterView
+import android.widget.BaseAdapter
+import android.widget.TextView
+import androidx.appcompat.content.res.AppCompatResources
+import androidx.recyclerview.widget.RecyclerView
+
+class PlaceAdapter(var items: List, val inflater: LayoutInflater, var itemClickListener: OnItemClickListener): RecyclerView.Adapter() {
+
+ interface OnItemClickListener {
+ fun onItemClick(position: Int) {}
+ }
+
+ override fun onCreateViewHolder(
+ parent: ViewGroup,
+ viewType: Int
+ ): PlaceAdapter.PlaceViewHolder {
+ val view = inflater.inflate(R.layout.place_item, parent, false)
+ return PlaceViewHolder(view)
+ }
+
+ override fun onBindViewHolder(holder: PlaceAdapter.PlaceViewHolder, position: Int) {
+ holder.name.text = items[position].name
+ holder.address.text = items[position].address
+ holder.category.text = items[position].category
+ }
+
+ override fun getItemCount(): Int {
+ return items.size
+ }
+
+ fun setData(searchResults: List) {
+ items = searchResults
+ notifyDataSetChanged()
+ }
+
+ fun getItem(position: Int): Place {
+ return items[position]
+ }
+
+ inner class PlaceViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
+ val name: TextView
+ val address: TextView
+ val category: TextView
+
+ init {
+ name = itemView.findViewById(R.id.place)
+ address = itemView.findViewById(R.id.address)
+ category = itemView.findViewById(R.id.category)
+
+ itemView.setOnClickListener {
+ itemClickListener.onItemClick(absoluteAdapterPosition)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/campus/tech/kakao/map/PlaceContract.kt b/app/src/main/java/campus/tech/kakao/map/PlaceContract.kt
new file mode 100644
index 00000000..1626e61b
--- /dev/null
+++ b/app/src/main/java/campus/tech/kakao/map/PlaceContract.kt
@@ -0,0 +1,10 @@
+package campus.tech.kakao.map
+
+import android.provider.BaseColumns
+
+object PlaceContract: BaseColumns {
+ const val TABLE_NAME = "place"
+ const val TABLE_COLUMN_NAME = "name"
+ const val TABLE_COLUMN_ADDRESS = "address"
+ const val TABLE_COLUMN_CATEGORY = "category"
+}
\ No newline at end of file
diff --git a/app/src/main/java/campus/tech/kakao/map/PreferenceManager.kt b/app/src/main/java/campus/tech/kakao/map/PreferenceManager.kt
new file mode 100644
index 00000000..c42aef15
--- /dev/null
+++ b/app/src/main/java/campus/tech/kakao/map/PreferenceManager.kt
@@ -0,0 +1,44 @@
+package campus.tech.kakao.map
+
+import android.content.Context
+import android.content.SharedPreferences
+import com.google.gson.GsonBuilder
+import com.google.gson.reflect.TypeToken
+
+class PreferenceManager(context: Context) {
+ private val prefs: SharedPreferences
+ = context.getSharedPreferences(Constants.PREFERENCE_NAME, Context.MODE_PRIVATE)
+
+ fun deleteString(key: String) {
+ prefs.edit().remove(key).apply()
+ }
+
+ fun getArrayList(key: String): ArrayList {
+ val stringPrefs = prefs.getString(key, null)
+ return if (stringPrefs != null && stringPrefs != "[]") {
+ GsonBuilder().create().fromJson(
+ stringPrefs, object : TypeToken>() {}.type
+ )
+ } else {
+ ArrayList()
+ }
+ }
+
+ private fun setArrayList(key: String, list: ArrayList) {
+ val jsonString = GsonBuilder().create().toJson(list)
+ prefs.edit().putString(key, jsonString).apply()
+ }
+
+ fun deleteArrayListItem(key: String, index: Int) {
+ val list = getArrayList(key)
+ if (index >= 0 && index < list.size) {
+ list.removeAt(index)
+ setArrayList(key, list)
+ }
+ }
+
+ fun savePreference(key: String, history: SearchHistory, list: ArrayList) {
+ list.add(0, history)
+ setArrayList(key, list)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/campus/tech/kakao/map/SearchHistory.kt b/app/src/main/java/campus/tech/kakao/map/SearchHistory.kt
new file mode 100644
index 00000000..21775e1c
--- /dev/null
+++ b/app/src/main/java/campus/tech/kakao/map/SearchHistory.kt
@@ -0,0 +1,5 @@
+package campus.tech.kakao.map
+
+data class SearchHistory(
+ val searchHistory: String
+)
\ No newline at end of file
diff --git a/app/src/main/java/campus/tech/kakao/map/SearchHistoryAdapter.kt b/app/src/main/java/campus/tech/kakao/map/SearchHistoryAdapter.kt
new file mode 100644
index 00000000..4275a0eb
--- /dev/null
+++ b/app/src/main/java/campus/tech/kakao/map/SearchHistoryAdapter.kt
@@ -0,0 +1,50 @@
+package campus.tech.kakao.map
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import campus.tech.kakao.map.databinding.SearchHistoryItemBinding
+
+class HistoryAdapter(var items: List, val inflater: LayoutInflater, var itemClickListener: OnItemClickListener) : RecyclerView.Adapter() {
+
+ interface OnItemClickListener {
+ fun onItemClick(position: Int)
+ fun onXMarkClick(position: Int)
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HistoryViewHolder {
+ val binding = SearchHistoryItemBinding.inflate(inflater, parent, false)
+ return HistoryViewHolder(binding)
+ }
+
+ override fun onBindViewHolder(holder: HistoryViewHolder, position: Int) {
+ holder.bind(items[position])
+ }
+
+ override fun getItemCount(): Int {
+ return items.size
+ }
+
+ fun setData(searchHistory: List) {
+ items = searchHistory
+ notifyDataSetChanged()
+ }
+
+ inner class HistoryViewHolder(private val binding: SearchHistoryItemBinding) : RecyclerView.ViewHolder(binding.root) {
+ init {
+ itemView.setOnClickListener {
+ itemClickListener.onItemClick(absoluteAdapterPosition)
+ }
+
+ binding.xmark.setOnClickListener {
+ itemClickListener.onXMarkClick(absoluteAdapterPosition)
+ }
+ }
+ fun bind(searchHistory: SearchHistory) {
+ binding.history.text = searchHistory.searchHistory
+ }
+ }
+}
diff --git a/app/src/main/java/campus/tech/kakao/map/ViewModelFactory.kt b/app/src/main/java/campus/tech/kakao/map/ViewModelFactory.kt
new file mode 100644
index 00000000..d48e6646
--- /dev/null
+++ b/app/src/main/java/campus/tech/kakao/map/ViewModelFactory.kt
@@ -0,0 +1,16 @@
+package campus.tech.kakao.map
+
+import android.content.Context
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+
+class ViewModelFactory(private val context: Context): ViewModelProvider.Factory {
+
+ override fun create(modelClass: Class): T {
+ if (modelClass.isAssignableFrom(MainViewModel::class.java)) {
+ return MainViewModel(context) as T
+ } else {
+ throw IllegalArgumentException("Failed to create ViewModel : ${modelClass.name}")
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
index 07d5da9c..ca3826a4 100644
--- a/app/src/main/res/drawable/ic_launcher_background.xml
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -1,170 +1,74 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ xmlns:android="http://schemas.android.com/apk/res/android">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/map_marker.xml b/app/src/main/res/drawable/map_marker.xml
new file mode 100644
index 00000000..9ce300a5
--- /dev/null
+++ b/app/src/main/res/drawable/map_marker.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/search_history_background.xml b/app/src/main/res/drawable/search_history_background.xml
new file mode 100644
index 00000000..e107d40e
--- /dev/null
+++ b/app/src/main/res/drawable/search_history_background.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/xmark.xml b/app/src/main/res/drawable/xmark.xml
new file mode 100644
index 00000000..f5e3a847
--- /dev/null
+++ b/app/src/main/res/drawable/xmark.xml
@@ -0,0 +1,15 @@
+
+
+
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 24d17df2..11a530ee 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -5,15 +5,58 @@
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:paddingHorizontal="20dp"
tools:context=".MainActivity">
+
+
+
+
+
+ app:layout_constraintEnd_toEndOf="parent"/>
+
+
+
+
+
diff --git a/app/src/main/res/layout/place_item.xml b/app/src/main/res/layout/place_item.xml
new file mode 100644
index 00000000..6342b296
--- /dev/null
+++ b/app/src/main/res/layout/place_item.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/search_history_item.xml b/app/src/main/res/layout/search_history_item.xml
new file mode 100644
index 00000000..559b5b4e
--- /dev/null
+++ b/app/src/main/res/layout/search_history_item.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
similarity index 51%
rename from app/src/main/res/mipmap-anydpi/ic_launcher.xml
rename to app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
index b3e26b4c..c4a603d4 100644
--- a/app/src/main/res/mipmap-anydpi/ic_launcher.xml
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -1,6 +1,5 @@
-
-
-
-
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
similarity index 51%
rename from app/src/main/res/mipmap-anydpi/ic_launcher_round.xml
rename to app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
index b3e26b4c..c4a603d4 100644
--- a/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -1,6 +1,5 @@
-
-
-
-
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
index c209e78e..1cb2bc1c 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.webp and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp
new file mode 100644
index 00000000..3a8c85f6
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
index b2dfe3d1..df98a819 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp
index 4f0f1d64..cb81f4ae 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.webp and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp
new file mode 100644
index 00000000..c117c04b
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
index 62b611da..e6bc028e 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
index 948a3070..e6be427e 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp
new file mode 100644
index 00000000..2d29b928
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
index 1b9a6956..5d46a9c9 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
index 28d4b77f..c0bcf7c9 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp
new file mode 100644
index 00000000..9946a9bb
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
index 9287f508..04544edd 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
index aa7d6427..e6c8f5fb 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp
new file mode 100644
index 00000000..ca6fbd99
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
index 9126ae37..a228ba7f 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e5ba5b9c..c1e67643 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,3 +1,5 @@
Map
+ 검색어를 입력해주세요.
+ 검색 결과가 없습니다.
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 05ed4b9e..adc928b4 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -3,6 +3,10 @@