diff --git a/README.md b/README.md index df2a6477..bf324ecf 100644 --- a/README.md +++ b/README.md @@ -1 +1,17 @@ -# android-map-keyword +# android-map-keyword (2단계) + +### 기능 사항 +- 검색어 입력 레이아웃 구현한다.0 +- 검색에 사용될 데이터를 로컬 데이터베이스에 생성한다.0 +- 검색어를 입력하면 검색 결과 목록이 표시된다.0 +- 검색 결과 목록은 세로 스크롤이 된다. RecyclerView를 사용한다.0 +- 입력한 검색어는 X를 눌러서 삭제할 수 있다. 0 +- 검색 결과 목록에서 하나의 항목을 선택할 수 있다.0 +- 선택된 항목은 검색어 저장 목록에 추가된다. 0 +- 저장된 검색어 목록은 가로 스크롤이 된다. 0 +- 저장된 검색어는 X를 눌러서 삭제할 수 있다. +- 저장된 검색어는 앱을 재실행하여도 유지된다.0 + +### 프로그래밍 요구 사항 +- 가능한 MVVM 아키텍처 패턴을 적용하도록 한다. + diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9932d6bb..d2701204 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") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6bca2f54..181fbeae 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> + 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/HistoryAdapter.kt b/app/src/main/java/campus/tech/kakao/map/HistoryAdapter.kt new file mode 100644 index 00000000..4275a0eb --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/HistoryAdapter.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/MainActivity.kt b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt index 95b43803..1a17b20f 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,115 @@ package campus.tech.kakao.map import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +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) + } + } + ) + } + + 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) + } + } + + override fun onXMarkClick(position: Int) { + viewModel.deleteSearchHistory(position) + } + } + ) + } + + 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..12a0d660 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt @@ -0,0 +1,60 @@ +package campus.tech.kakao.map + +import android.util.Log +import android.widget.EditText +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel + +class MainViewModel(private val placeRepository: PlaceRepository) : ViewModel() { + private val searchRepository: SearchRepository = SearchRepository() + + private var _placeList = MutableLiveData>() + private val _searchHistoryList = MutableLiveData>() + + init { + _searchHistoryList.value = searchRepository.getSearchHistory() + } + + val searchHistoryList: LiveData> + get() = _searchHistoryList + + val placeList: LiveData> + get() = _placeList + + fun insertPlace(place: Place) { + placeRepository.insertPlace(place) + } + + fun getPlace(): List? { + return placeRepository.getPlace() + } + + override fun onCleared() { + super.onCleared() + placeRepository.dbClose() + } + + fun getSearchResult(searchText: String) { + if (searchText.isEmpty()) { + _placeList.postValue(emptyList()) + } else { + val results = placeRepository.getSearchResults(searchText) + _placeList.postValue(results) + } + } + + fun saveSearchHistory(searchHistory: SearchHistory) { + searchRepository.saveSearchHistory(searchHistory) + _searchHistoryList.value = searchRepository.getSearchHistory() + } + + fun deleteSearchHistory(position: Int) { + searchRepository.deleteSearchHistory(position) + _searchHistoryList.value = searchRepository.getSearchHistory() + } + + fun getSearchHistoryList() { + _searchHistoryList.value = searchRepository.getSearchHistory() + } +} \ No newline at end of file diff --git a/app/src/main/java/campus/tech/kakao/map/MyApplication.kt b/app/src/main/java/campus/tech/kakao/map/MyApplication.kt new file mode 100644 index 00000000..037a93df --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/MyApplication.kt @@ -0,0 +1,15 @@ +package campus.tech.kakao.map + +import android.app.Application +import android.content.SharedPreferences + +class MyApplication: 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..16369a85 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/Place.kt @@ -0,0 +1,9 @@ +package campus.tech.kakao.map + +import androidx.annotation.DrawableRes + +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/PlaceRepository.kt b/app/src/main/java/campus/tech/kakao/map/PlaceRepository.kt new file mode 100644 index 00000000..27a898b0 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/PlaceRepository.kt @@ -0,0 +1,41 @@ +package campus.tech.kakao.map + +import android.content.Context +import android.database.sqlite.SQLiteDatabase + +class PlaceRepository(context: Context) { + private val dbHelper: DBHelper = DBHelper(context) + private val db = dbHelper.writableDatabase + fun insertPlace(place: Place) { + dbHelper.insert(db,place) + } + + fun getPlace(): List?{ + return null + } + + fun dbClose() { + if(db.isOpen) db.close() + } + + fun getSearchResults(searchText: String): List { + 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() + } + return places + } +} \ 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..243f7789 --- /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/SearchRepository.kt b/app/src/main/java/campus/tech/kakao/map/SearchRepository.kt new file mode 100644 index 00000000..5ca79fb5 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/SearchRepository.kt @@ -0,0 +1,19 @@ +package campus.tech.kakao.map + +class SearchRepository() { + private val preferenceManager = MyApplication.prefs + + 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) + } + + fun deleteSearchHistory(position: Int) { + val currentList = getSearchHistory() + preferenceManager.deleteArrayListItem(Constants.SEARCH_HISTORY_KEY, position) + } +} \ No newline at end of file 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..4105b592 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/ViewModelFactory.kt @@ -0,0 +1,17 @@ +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)) { + val repository = PlaceRepository(context) + return MainViewModel(repository) 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/history_background.xml b/app/src/main/res/drawable/history_background.xml new file mode 100644 index 00000000..e107d40e --- /dev/null +++ b/app/src/main/res/drawable/history_background.xml @@ -0,0 +1,9 @@ + + + + + + + \ 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/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..be768b96 --- /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/ids.xml b/app/src/main/res/values/ids.xml new file mode 100644 index 00000000..86449904 --- /dev/null +++ b/app/src/main/res/values/ids.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file 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 @@