From 1ca12954bec6cb9dd4eae212c35f03ecbda55944 Mon Sep 17 00:00:00 2001 From: suminjang <127755029+sumintnals@users.noreply.github.com> Date: Mon, 1 Jul 2024 14:48:01 +0900 Subject: [PATCH 01/32] =?UTF-8?q?docs(README):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index df2a6477..af2a65f5 100644 --- a/README.md +++ b/README.md @@ -1 +1,7 @@ # android-map-keyword + +### 기능 사항 +- 검색어 입력 레이아웃 구현한다. +- 검색 결과를 표시할 기본 레이아웃을 리스트뷰로 구현한다. +- 검색에 사용될 데이터를 로컬 데이터베이스에 생성한다. + From da15ddee80919904972d4ccd13f6ee1e59266add Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 1 Jul 2024 15:40:45 +0900 Subject: [PATCH 02/32] =?UTF-8?q?feat(search=5Fhistory=5Fitem):=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=EB=90=9C=20=EA=B2=80=EC=83=89=EC=96=B4=20?= =?UTF-8?q?=EB=B3=B4=EC=97=AC=EC=A3=BC=EB=8A=94=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EB=B7=B0=20UI=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 추가된 파일은 모두 뷰를 구현하기 위한 리소스 파일입니다. --- .../main/res/drawable/history_background.xml | 9 +++++++ app/src/main/res/drawable/xmark.xml | 15 +++++++++++ app/src/main/res/layout/place_item.xml | 6 +++++ .../main/res/layout/search_history_item.xml | 26 +++++++++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 app/src/main/res/drawable/history_background.xml create mode 100644 app/src/main/res/drawable/xmark.xml create mode 100644 app/src/main/res/layout/place_item.xml create mode 100644 app/src/main/res/layout/search_history_item.xml 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/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/place_item.xml b/app/src/main/res/layout/place_item.xml new file mode 100644 index 00000000..cdc89f25 --- /dev/null +++ b/app/src/main/res/layout/place_item.xml @@ -0,0 +1,6 @@ + + + + \ 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..0654a3e7 --- /dev/null +++ b/app/src/main/res/layout/search_history_item.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file From 3ca3473a96affa48c42644c6a624c9f02734c6a2 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 1 Jul 2024 16:42:16 +0900 Subject: [PATCH 03/32] =?UTF-8?q?feat(place=5Fitem):=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=20=EA=B2=B0=EA=B3=BC=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EB=B7=B0?= =?UTF-8?q?=EC=9D=98=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EB=B7=B0=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/map_marker.xml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 app/src/main/res/drawable/map_marker.xml 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 @@ + + + From dcb732e20ff0424c89ba6bd7be0f61e7d50383a9 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 1 Jul 2024 18:33:43 +0900 Subject: [PATCH 04/32] =?UTF-8?q?feat(place=5Fitem):=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=20=EA=B2=B0=EA=B3=BC=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=ED=85=9C=20=EB=B7=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/place_item.xml | 48 ++++++++++++++++++++++++-- app/src/main/res/values/strings.xml | 2 ++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/place_item.xml b/app/src/main/res/layout/place_item.xml index cdc89f25..6342b296 100644 --- a/app/src/main/res/layout/place_item.xml +++ b/app/src/main/res/layout/place_item.xml @@ -1,6 +1,50 @@ + android:layout_width="match_parent" + android:layout_height="wrap_content" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:padding="10dp"> + + + + + + + \ 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..8e559fe9 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 From c2149fd793e32a5aeb22364e7c4f5bf9d26c28d1 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 1 Jul 2024 18:44:29 +0900 Subject: [PATCH 05/32] =?UTF-8?q?feat(activity=5Fmain):=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=B7=B0=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=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 --- app/src/main/res/layout/activity_main.xml | 28 ++++++++++++++++++++--- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 24d17df2..9a95d96b 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,15 +5,37 @@ 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/values/strings.xml b/app/src/main/res/values/strings.xml index 8e559fe9..c1e67643 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ Map - 장소 검색 + 검색어를 입력해주세요. 검색 결과가 없습니다. \ No newline at end of file From 0fe2c1670a033a6852ec98ac9e46d29003d41791 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 1 Jul 2024 20:23:17 +0900 Subject: [PATCH 06/32] =?UTF-8?q?feat(Place):=20Place=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/campus/tech/kakao/map/Place.kt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 app/src/main/java/campus/tech/kakao/map/Place.kt 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..f1625078 --- /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 address: String, + val category: String, + val name: String +) \ No newline at end of file From 6d8ba382bec77765617fc287e817d3dc0edb9d4d Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 1 Jul 2024 20:37:26 +0900 Subject: [PATCH 07/32] =?UTF-8?q?feat(DBHelper):=20DBHelper=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4,=20PlaceContract=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/campus/tech/kakao/map/DBHelper.kt | 22 +++++++++++++++++++ .../campus/tech/kakao/map/PlaceContract.kt | 10 +++++++++ 2 files changed, 32 insertions(+) create mode 100644 app/src/main/java/campus/tech/kakao/map/DBHelper.kt create mode 100644 app/src/main/java/campus/tech/kakao/map/PlaceContract.kt diff --git a/app/src/main/java/campus/tech/kakao/map/DBHelper.kt b/app/src/main/java/campus/tech/kakao/map/DBHelper.kt new file mode 100644 index 00000000..a5fbe944 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/DBHelper.kt @@ -0,0 +1,22 @@ +package campus.tech.kakao.map + +import android.content.Context +import android.database.sqlite.SQLiteDatabase +import android.database.sqlite.SQLiteOpenHelper + +class DBHelper (context: Context): SQLiteOpenHelper(context, "place.db", null, 1) { + override fun onCreate(db: SQLiteDatabase?) { + db?.execSQL( + "CREATE TABLE ${PlaceContract.TABLE_NAME} ("+ + "${PlaceContract.TABLE_COLUMN_NAME} VARCHAR(30) NOT NULL,"+ + "${PlaceContract.TABLE_COLUMN_ADDRESS} VARCHAR(50) NOT NULL,"+ + "${PlaceContract.TABLE_COLUMN_CATEGORY} VARCHAR(30) NOT NULL"+ + ");" + ) + } + + override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { + db?.execSQL("DROP TABLE IF EXISTS ${PlaceContract.TABLE_NAME}") + onCreate(db) + } +} \ 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 From fc3fd8956699bb3d40b4c9afa930e312d4b67c85 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 1 Jul 2024 21:42:14 +0900 Subject: [PATCH 08/32] =?UTF-8?q?feat(PlaceRepository):=20PlaceRepository?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/campus/tech/kakao/map/DBHelper.kt | 15 ++++++++++++++- .../java/campus/tech/kakao/map/PlaceRepository.kt | 12 ++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/campus/tech/kakao/map/PlaceRepository.kt diff --git a/app/src/main/java/campus/tech/kakao/map/DBHelper.kt b/app/src/main/java/campus/tech/kakao/map/DBHelper.kt index a5fbe944..4f233b53 100644 --- a/app/src/main/java/campus/tech/kakao/map/DBHelper.kt +++ b/app/src/main/java/campus/tech/kakao/map/DBHelper.kt @@ -7,7 +7,7 @@ import android.database.sqlite.SQLiteOpenHelper class DBHelper (context: Context): SQLiteOpenHelper(context, "place.db", null, 1) { override fun onCreate(db: SQLiteDatabase?) { db?.execSQL( - "CREATE TABLE ${PlaceContract.TABLE_NAME} ("+ + "CREATE TABLE IF NOT EXISTS ${PlaceContract.TABLE_NAME} ("+ "${PlaceContract.TABLE_COLUMN_NAME} VARCHAR(30) NOT NULL,"+ "${PlaceContract.TABLE_COLUMN_ADDRESS} VARCHAR(50) NOT NULL,"+ "${PlaceContract.TABLE_COLUMN_CATEGORY} VARCHAR(30) NOT NULL"+ @@ -19,4 +19,17 @@ class DBHelper (context: Context): SQLiteOpenHelper(context, "place.db", null, 1 db?.execSQL("DROP TABLE IF EXISTS ${PlaceContract.TABLE_NAME}") onCreate(db) } + + fun insert(db: SQLiteDatabase, place: Place{ + val sql = " INSERT INTO " + + "${PlaceContract.TABLE_NAME}("+ + "${PlaceContract.TABLE_COLUMN_NAME}, ${PlaceContract.TABLE_COLUMN_ADDRESS}, ${PlaceContract.TABLE_COLUMN_CATEGORY})"+ + " VALUES(${place.name}, ${place.address}, ${place.category});" + + db.execSQL(sql) + } + + fun select(db: SQLiteDatabase,name:String, address: String, category: String) : String? { + return null + } } \ 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..722babfc --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/PlaceRepository.kt @@ -0,0 +1,12 @@ +package campus.tech.kakao.map + +class PlaceRepository(private val dbHelper: DBHelper) { + fun insertPlace(place: Place) { + val db = dbHelper.writableDatabase + dbHelper.insert(db,place) + } + + fun getPlace(): Place?{ + return null + } +} \ No newline at end of file From 89f53cf24a4582f62899c6393d09940a2fd5e407 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Mon, 1 Jul 2024 22:12:46 +0900 Subject: [PATCH 09/32] =?UTF-8?q?feat(DBHelper):=20insertDummyData()=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit private fun insertDummyData(db: SQLiteDatabase?): 더미 데이터를 삽입하기 위한 함수입니다. onCreate()안에 호출하여 한 번만 삽입하도록 했습니다. --- .../java/campus/tech/kakao/map/DBHelper.kt | 22 ++++++++++++++++++- .../campus/tech/kakao/map/MainViewModel.kt | 5 +++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/campus/tech/kakao/map/MainViewModel.kt diff --git a/app/src/main/java/campus/tech/kakao/map/DBHelper.kt b/app/src/main/java/campus/tech/kakao/map/DBHelper.kt index 4f233b53..aacb5a74 100644 --- a/app/src/main/java/campus/tech/kakao/map/DBHelper.kt +++ b/app/src/main/java/campus/tech/kakao/map/DBHelper.kt @@ -13,6 +13,7 @@ class DBHelper (context: Context): SQLiteOpenHelper(context, "place.db", null, 1 "${PlaceContract.TABLE_COLUMN_CATEGORY} VARCHAR(30) NOT NULL"+ ");" ) + insertDummyData(db) } override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { @@ -20,7 +21,7 @@ class DBHelper (context: Context): SQLiteOpenHelper(context, "place.db", null, 1 onCreate(db) } - fun insert(db: SQLiteDatabase, place: Place{ + fun insert(db: SQLiteDatabase, place: Place) { val sql = " INSERT INTO " + "${PlaceContract.TABLE_NAME}("+ "${PlaceContract.TABLE_COLUMN_NAME}, ${PlaceContract.TABLE_COLUMN_ADDRESS}, ${PlaceContract.TABLE_COLUMN_CATEGORY})"+ @@ -32,4 +33,23 @@ class DBHelper (context: Context): SQLiteOpenHelper(context, "place.db", null, 1 fun select(db: SQLiteDatabase,name:String, address: String, category: String) : String? { return null } + + private fun insertDummyData(db: SQLiteDatabase?) { + db?.let { + val categories = listOf("카페", "약국", "식당") + val baseAddress = "서울 성동구 성수동" + + categories.forEach { category -> + 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/MainViewModel.kt b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt new file mode 100644 index 00000000..62d438ec --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt @@ -0,0 +1,5 @@ +package campus.tech.kakao.map + +class MainViewModel { + +} \ No newline at end of file From 828ecd4ea43cebf4b718f0c07a6e02eb97cad435 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Thu, 4 Jul 2024 15:23:21 +0900 Subject: [PATCH 10/32] =?UTF-8?q?feat(PlaceRepository):=20dbClose()?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/campus/tech/kakao/map/DBHelper.kt | 1 - .../java/campus/tech/kakao/map/MainActivity.kt | 7 +++++++ .../java/campus/tech/kakao/map/MainViewModel.kt | 15 ++++++++++++++- .../java/campus/tech/kakao/map/PlaceRepository.kt | 6 +++++- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/campus/tech/kakao/map/DBHelper.kt b/app/src/main/java/campus/tech/kakao/map/DBHelper.kt index aacb5a74..5bb8785e 100644 --- a/app/src/main/java/campus/tech/kakao/map/DBHelper.kt +++ b/app/src/main/java/campus/tech/kakao/map/DBHelper.kt @@ -51,5 +51,4 @@ class DBHelper (context: Context): SQLiteOpenHelper(context, "place.db", null, 1 } } } - } \ 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..873fdadc 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt @@ -4,8 +4,15 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } + + override fun onStop() { + super.onStop() + + } } diff --git a/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt index 62d438ec..db137add 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt @@ -1,5 +1,18 @@ package campus.tech.kakao.map -class MainViewModel { +import androidx.lifecycle.ViewModel +class MainViewModel(private val placeRepository: PlaceRepository): ViewModel() { + fun insertPlace(place: Place) { + placeRepository.insertPlace(place) + } + + fun getPlace(): Place? { + return placeRepository.getPlace() + } + + override fun onCleared() { + super.onCleared() + placeRepository.dbClose() + } } \ 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 index 722babfc..1e3c9e11 100644 --- a/app/src/main/java/campus/tech/kakao/map/PlaceRepository.kt +++ b/app/src/main/java/campus/tech/kakao/map/PlaceRepository.kt @@ -1,12 +1,16 @@ package campus.tech.kakao.map class PlaceRepository(private val dbHelper: DBHelper) { + val db = dbHelper.writableDatabase fun insertPlace(place: Place) { - val db = dbHelper.writableDatabase dbHelper.insert(db,place) } fun getPlace(): Place?{ return null } + + fun dbClose() { + if(db.isOpen) db.close() + } } \ No newline at end of file From 86fdd512af16f66f02fb3fc8b3b6b57462aa944e Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Thu, 4 Jul 2024 15:53:31 +0900 Subject: [PATCH 11/32] =?UTF-8?q?feat(MainActivity):=20=EB=B7=B0=EB=AA=A8?= =?UTF-8?q?=EB=8D=B8=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 | 5 +++++ app/src/main/java/campus/tech/kakao/map/MainActivity.kt | 8 ++------ app/src/main/java/campus/tech/kakao/map/MainViewModel.kt | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9932d6bb..6a66c508 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,10 @@ android { } dependencies { + kapt("com.android.databinding:compiler:3.1.4") + implementation("androidx.fragment:fragment-ktx:1.5.5") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1") + implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.5.1") implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.appcompat:appcompat:1.6.1") 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 873fdadc..d56c6b7e 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt @@ -1,18 +1,14 @@ package campus.tech.kakao.map import android.os.Bundle +import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { - + private val viewModel : MainViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } - - override fun onStop() { - super.onStop() - - } } diff --git a/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt index db137add..18df09bc 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.ViewModel class MainViewModel(private val placeRepository: PlaceRepository): ViewModel() { fun insertPlace(place: Place) { - placeRepository.insertPlace(place) + placeRepository.insertPlace(place) } fun getPlace(): Place? { From 8072b2d6b8087800310f2b8f3e94d1cff6136aa9 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Thu, 4 Jul 2024 17:28:13 +0900 Subject: [PATCH 12/32] =?UTF-8?q?feat(PlaceAdapter):=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=B7=B0=20=EC=9C=84=ED=95=9C=20PlaceAdapter=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../campus/tech/kakao/map/PlaceAdapter.kt | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt 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..018316b1 --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt @@ -0,0 +1,48 @@ +package campus.tech.kakao.map + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.BaseAdapter +import android.widget.TextView +import androidx.appcompat.content.res.AppCompatResources + +class PlaceAdapter(private val items: List): BaseAdapter() { + override fun getCount(): Int { + return items.size + } + + override fun getItem(position: Int): Any { + return items[position] + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val placeViewHolder : PlaceViewHolder + if (convertView == null) { + view = + LayoutInflater.from(parent?.context).inflate(R.layout.place_item, parent, false) + placeViewHolder = PlaceViewHolder(view) + view.tag = placeViewHolder + } else { + view = convertView + placeViewHolder = convertView.tag as PlaceViewHolder + } + + val item = items[position] + placeViewHolder.place.text = item.name + placeViewHolder.address.text = item.address + placeViewHolder.category.text = item.category + return view + } + + class PlaceViewHolder(view: View) { + val place: TextView = view.findViewById(R.id.place) + val address: TextView = view.findViewById(R.id.address) + val category: TextView = view.findViewById(R.id.category) + } +} \ No newline at end of file From 89855fe87e41a3397193d244386a8fcdb09f96ba Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Thu, 4 Jul 2024 18:24:56 +0900 Subject: [PATCH 13/32] =?UTF-8?q?feat(MainActivity):=20Place=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=B7=B0=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/campus/tech/kakao/map/HistoryAdapter.kt | 4 ++++ .../java/campus/tech/kakao/map/MainActivity.kt | 15 +++++++++++++++ .../java/campus/tech/kakao/map/MainViewModel.kt | 2 +- .../java/campus/tech/kakao/map/PlaceRepository.kt | 2 +- app/src/main/res/layout/activity_main.xml | 10 ++++++++++ 5 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/campus/tech/kakao/map/HistoryAdapter.kt 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..36591f4a --- /dev/null +++ b/app/src/main/java/campus/tech/kakao/map/HistoryAdapter.kt @@ -0,0 +1,4 @@ +package campus.tech.kakao.map + +class HistoryAdapter() { +} \ 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 d56c6b7e..225bf6c9 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt @@ -1,14 +1,29 @@ package campus.tech.kakao.map import android.os.Bundle +import android.view.View import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import campus.tech.kakao.map.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private val viewModel : MainViewModel by viewModels() + private lateinit var placeAdapter: PlaceAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + + val binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + + val items = viewModel.getPlace() + + if (items == null) { + binding.emptyMainText.visibility = View.VISIBLE + } else { + placeAdapter = PlaceAdapter(items) + binding.placeResult.adapter = placeAdapter + } } } diff --git a/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt index 18df09bc..4614e394 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt @@ -7,7 +7,7 @@ class MainViewModel(private val placeRepository: PlaceRepository): ViewModel() { placeRepository.insertPlace(place) } - fun getPlace(): Place? { + fun getPlace(): List? { return placeRepository.getPlace() } diff --git a/app/src/main/java/campus/tech/kakao/map/PlaceRepository.kt b/app/src/main/java/campus/tech/kakao/map/PlaceRepository.kt index 1e3c9e11..bb0aeb70 100644 --- a/app/src/main/java/campus/tech/kakao/map/PlaceRepository.kt +++ b/app/src/main/java/campus/tech/kakao/map/PlaceRepository.kt @@ -6,7 +6,7 @@ class PlaceRepository(private val dbHelper: DBHelper) { dbHelper.insert(db,place) } - fun getPlace(): Place?{ + fun getPlace(): List?{ return null } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 9a95d96b..e73a13f6 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -28,14 +28,24 @@ /> + + + From 3980334edbfff5929a582f17f97f559965c71f88 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Thu, 4 Jul 2024 20:17:59 +0900 Subject: [PATCH 14/32] =?UTF-8?q?feat(MainActivity):=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=EA=B8=B0=EB=A1=9D=20=EB=B7=B0=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../campus/tech/kakao/map/HistoryAdapter.kt | 41 ++++++++++++++++++- .../campus/tech/kakao/map/MainActivity.kt | 17 ++++++-- .../campus/tech/kakao/map/SearchHistory.kt | 5 +++ app/src/main/res/layout/activity_main.xml | 12 +++++- .../main/res/layout/search_history_item.xml | 1 + app/src/main/res/values/ids.xml | 4 ++ 6 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/campus/tech/kakao/map/SearchHistory.kt create mode 100644 app/src/main/res/values/ids.xml diff --git a/app/src/main/java/campus/tech/kakao/map/HistoryAdapter.kt b/app/src/main/java/campus/tech/kakao/map/HistoryAdapter.kt index 36591f4a..340db74f 100644 --- a/app/src/main/java/campus/tech/kakao/map/HistoryAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/HistoryAdapter.kt @@ -1,4 +1,43 @@ package campus.tech.kakao.map -class HistoryAdapter() { +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.BaseAdapter +import android.widget.TextView + +class HistoryAdapter(private val items: List): BaseAdapter() { + override fun getCount(): Int { + return items.size + } + + override fun getItem(position: Int): Any { + return items[position] + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val placeViewHolder : PlaceViewHolder + if (convertView == null) { + view = + LayoutInflater.from(parent?.context).inflate(R.layout.search_history_item, parent, false) + placeViewHolder = PlaceViewHolder(view) + view.tag = placeViewHolder + } else { + view = convertView + placeViewHolder = convertView.tag as PlaceViewHolder + } + + val item = items[position] + placeViewHolder.history.text = item + return view + } + + class PlaceViewHolder(view: View) { + val history: TextView = view.findViewById(R.id.history) + } } \ 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 225bf6c9..77e22910 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt @@ -1,7 +1,11 @@ package campus.tech.kakao.map +import android.content.Context import android.os.Bundle +import android.view.LayoutInflater import android.view.View +import android.widget.LinearLayout +import android.widget.TextView import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import campus.tech.kakao.map.databinding.ActivityMainBinding @@ -9,6 +13,8 @@ import campus.tech.kakao.map.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private val viewModel : MainViewModel by viewModels() private lateinit var placeAdapter: PlaceAdapter + private lateinit var historyAdapter: HistoryAdapter + private lateinit var container: LinearLayout override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -17,13 +23,18 @@ class MainActivity : AppCompatActivity() { val binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - val items = viewModel.getPlace() + val placeItems = viewModel.getPlace() - if (items == null) { + if (placeItems == null) { binding.emptyMainText.visibility = View.VISIBLE } else { - placeAdapter = PlaceAdapter(items) + placeAdapter = PlaceAdapter(placeItems) binding.placeResult.adapter = placeAdapter } + + val layoutInflater = this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater + val customLayout = layoutInflater.inflate(R.layout.search_history_item, null) + var textView: TextView = customLayout.findViewById(R.id.history) + binding.searchHistory.addView(customLayout) } } 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/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index e73a13f6..a28e4109 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -45,7 +45,17 @@ android:id="@+id/placeResult" android:layout_width="match_parent" android:layout_height="wrap_content" - app:layout_constraintTop_toBottomOf="@id/search" + app:layout_constraintTop_toBottomOf="@id/searchHistory" /> + + + diff --git a/app/src/main/res/layout/search_history_item.xml b/app/src/main/res/layout/search_history_item.xml index 0654a3e7..c3a84299 100644 --- a/app/src/main/res/layout/search_history_item.xml +++ b/app/src/main/res/layout/search_history_item.xml @@ -10,6 +10,7 @@ > + + + \ No newline at end of file From 917463a64e7d9455b96d7f5bd15273b3368a2da7 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Thu, 4 Jul 2024 23:38:31 +0900 Subject: [PATCH 15/32] =?UTF-8?q?docs(README):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=82=AC=ED=95=AD=202=EB=8B=A8=EA=B3=84=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index af2a65f5..acbbed3d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,18 @@ -# android-map-keyword +# android-map-keyword (2단계) ### 기능 사항 - 검색어 입력 레이아웃 구현한다. - 검색 결과를 표시할 기본 레이아웃을 리스트뷰로 구현한다. - 검색에 사용될 데이터를 로컬 데이터베이스에 생성한다. +- 검색어를 입력하면 검색 결과 목록이 표시된다. +- 검색 결과 목록은 세로 스크롤이 된다. RecyclerView를 사용한다. +- 입력한 검색어는 X를 눌러서 삭제할 수 있다. +- 검색 결과 목록에서 하나의 항목을 선택할 수 있다. +- 선택된 항목은 검색어 저장 목록에 추가된다. +- 저장된 검색어 목록은 가로 스크롤이 된다. +- 저장된 검색어는 X를 눌러서 삭제할 수 있다. +- 저장된 검색어는 앱을 재실행하여도 유지된다. + +### 프로그래밍 요구 사항 +- 가능한 MVVM 아키텍처 패턴을 적용하도록 한다. From 5013e50c284e465a4826a4fc9a16ae23eaffbd2f Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Fri, 5 Jul 2024 00:14:37 +0900 Subject: [PATCH 16/32] =?UTF-8?q?feat(MainActivity):=20TextWatcher=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80(=EC=B6=94=EA=B0=80=EB=A7=8C=20=ED=95=B4?= =?UTF-8?q?=EB=91=A0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../campus/tech/kakao/map/MainActivity.kt | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) 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 77e22910..aeea363a 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt @@ -2,6 +2,8 @@ package campus.tech.kakao.map import android.content.Context import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher import android.view.LayoutInflater import android.view.View import android.widget.LinearLayout @@ -9,6 +11,7 @@ import android.widget.TextView import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import campus.tech.kakao.map.databinding.ActivityMainBinding +import campus.tech.kakao.map.databinding.SearchHistoryItemBinding class MainActivity : AppCompatActivity() { private val viewModel : MainViewModel by viewModels() @@ -20,21 +23,40 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - val binding = ActivityMainBinding.inflate(layoutInflater) - setContentView(binding.root) + val mainBinding = ActivityMainBinding.inflate(layoutInflater) + setContentView(mainBinding.root) val placeItems = viewModel.getPlace() if (placeItems == null) { - binding.emptyMainText.visibility = View.VISIBLE + mainBinding.emptyMainText.visibility = View.VISIBLE } else { placeAdapter = PlaceAdapter(placeItems) - binding.placeResult.adapter = placeAdapter + mainBinding.placeResult.adapter = placeAdapter } + val itemBinding = SearchHistoryItemBinding.inflate(layoutInflater, mainBinding.searchHistory, false) + itemBinding.history.text = "" val layoutInflater = this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater val customLayout = layoutInflater.inflate(R.layout.search_history_item, null) var textView: TextView = customLayout.findViewById(R.id.history) - binding.searchHistory.addView(customLayout) + mainBinding.searchHistory.addView(customLayout) + + 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?) { + + } + } + ) } } From 5740bec6f416e5250c6f5d2d638337de495e4908 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Fri, 5 Jul 2024 00:52:31 +0900 Subject: [PATCH 17/32] =?UTF-8?q?feat(PlaceAdapter):=20ListAdapter=20?= =?UTF-8?q?=EC=96=B4=EB=8C=91=ED=84=B0=EC=97=90=EC=84=9C=20RecyclerView=20?= =?UTF-8?q?=EC=96=B4=EB=8C=91=ED=84=B0=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 --- .../campus/tech/kakao/map/MainActivity.kt | 5 +- .../campus/tech/kakao/map/PlaceAdapter.kt | 63 ++++++++++--------- 2 files changed, 38 insertions(+), 30 deletions(-) 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 aeea363a..8aab4255 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt @@ -28,6 +28,7 @@ class MainActivity : AppCompatActivity() { val placeItems = viewModel.getPlace() + // 검색 결과 if (placeItems == null) { mainBinding.emptyMainText.visibility = View.VISIBLE } else { @@ -35,6 +36,7 @@ class MainActivity : AppCompatActivity() { mainBinding.placeResult.adapter = placeAdapter } + // 검색 기록 val itemBinding = SearchHistoryItemBinding.inflate(layoutInflater, mainBinding.searchHistory, false) itemBinding.history.text = "" val layoutInflater = this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater @@ -42,6 +44,7 @@ class MainActivity : AppCompatActivity() { var textView: TextView = customLayout.findViewById(R.id.history) mainBinding.searchHistory.addView(customLayout) + // 검색 필터링 val searchEditText = mainBinding.search searchEditText.addTextChangedListener(object: TextWatcher { @@ -50,7 +53,7 @@ class MainActivity : AppCompatActivity() { } override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { - + } override fun afterTextChanged(s: Editable?) { diff --git a/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt b/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt index 018316b1..52966d43 100644 --- a/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt @@ -3,46 +3,51 @@ package campus.tech.kakao.map 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(private val items: List): BaseAdapter() { - override fun getCount(): Int { - return items.size - } +class PlaceAdapter(val items: List, val inflater: LayoutInflater): RecyclerView.Adapter() { - override fun getItem(position: Int): Any { - return items[position] + interface OnItemClickListener { + fun onItemClick(position: Int) {} } + var itemClickListener: OnItemClickListener? = null - override fun getItemId(position: Int): Long { - return position.toLong() + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): PlaceAdapter.PlaceViewHolder { + val view = inflater.inflate(R.layout.place_item, parent, false) + return PlaceViewHolder(view) } - override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { - val view: View - val placeViewHolder : PlaceViewHolder - if (convertView == null) { - view = - LayoutInflater.from(parent?.context).inflate(R.layout.place_item, parent, false) - placeViewHolder = PlaceViewHolder(view) - view.tag = placeViewHolder - } else { - view = convertView - placeViewHolder = convertView.tag as PlaceViewHolder - } + 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 + } - val item = items[position] - placeViewHolder.place.text = item.name - placeViewHolder.address.text = item.address - placeViewHolder.category.text = item.category - return view + override fun getItemCount(): Int { + return items.size } - class PlaceViewHolder(view: View) { - val place: TextView = view.findViewById(R.id.place) - val address: TextView = view.findViewById(R.id.address) - val category: TextView = view.findViewById(R.id.category) + 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 From bc9c04ce6c2994a67dbdaab138382f8357e6fd75 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Fri, 5 Jul 2024 01:05:41 +0900 Subject: [PATCH 18/32] =?UTF-8?q?feat(MainActivity):=20=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=20=EC=95=A1=ED=8B=B0=EB=B9=84=ED=8B=B0=EC=97=90=20=EB=A6=AC?= =?UTF-8?q?=EC=82=AC=EC=9D=B4=ED=81=B4=EB=9F=AC=20=EB=B7=B0=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/campus/tech/kakao/map/MainActivity.kt | 7 +++++-- app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt | 1 - app/src/main/res/layout/activity_main.xml | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) 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 8aab4255..1eb6d7f6 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt @@ -10,6 +10,8 @@ import android.widget.LinearLayout import android.widget.TextView import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView.LayoutManager import campus.tech.kakao.map.databinding.ActivityMainBinding import campus.tech.kakao.map.databinding.SearchHistoryItemBinding @@ -26,13 +28,14 @@ class MainActivity : AppCompatActivity() { val mainBinding = ActivityMainBinding.inflate(layoutInflater) setContentView(mainBinding.root) + mainBinding.placeResult.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) + val placeItems = viewModel.getPlace() - // 검색 결과 if (placeItems == null) { mainBinding.emptyMainText.visibility = View.VISIBLE } else { - placeAdapter = PlaceAdapter(placeItems) + placeAdapter = PlaceAdapter(placeItems, LayoutInflater.from(this)) mainBinding.placeResult.adapter = placeAdapter } diff --git a/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt b/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt index 52966d43..d0876132 100644 --- a/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt @@ -47,7 +47,6 @@ class PlaceAdapter(val items: List, val inflater: LayoutInflater): Recycl itemView.setOnClickListener { itemClickListener?.onItemClick(absoluteAdapterPosition) } - } } } \ 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 a28e4109..147976c0 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -41,11 +41,12 @@ app:layout_constraintEnd_toEndOf="parent"/> - Date: Fri, 5 Jul 2024 06:03:10 +0900 Subject: [PATCH 19/32] =?UTF-8?q?feat(MainActivity):=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=EC=96=B4=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 전체적으로 nullable -> non-nullable 타입으로 변경했습니다. ViewModelFactory: Repository에 context를 전달하기 위해 추가했습니다. getSearchResult(): 검색창에 입력한 문자열을 토대로 해당 문자열을 포함하는 모든 로우를 Place 리스트로 반환합니다. --- app/build.gradle.kts | 6 +- .../java/campus/tech/kakao/map/DBHelper.kt | 2 +- .../campus/tech/kakao/map/MainActivity.kt | 68 +++++++++++++------ .../campus/tech/kakao/map/MainViewModel.kt | 24 ++++++- .../main/java/campus/tech/kakao/map/Place.kt | 2 +- .../campus/tech/kakao/map/PlaceAdapter.kt | 9 ++- .../campus/tech/kakao/map/PlaceRepository.kt | 29 +++++++- .../campus/tech/kakao/map/ViewModelFactory.kt | 17 +++++ 8 files changed, 125 insertions(+), 32 deletions(-) create mode 100644 app/src/main/java/campus/tech/kakao/map/ViewModelFactory.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6a66c508..edf42a67 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -42,9 +42,9 @@ android { dependencies { kapt("com.android.databinding:compiler:3.1.4") - implementation("androidx.fragment:fragment-ktx:1.5.5") - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1") - implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.5.1") + 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("androidx.core:core-ktx:1.12.0") implementation("androidx.appcompat:appcompat:1.6.1") diff --git a/app/src/main/java/campus/tech/kakao/map/DBHelper.kt b/app/src/main/java/campus/tech/kakao/map/DBHelper.kt index 5bb8785e..246ea74d 100644 --- a/app/src/main/java/campus/tech/kakao/map/DBHelper.kt +++ b/app/src/main/java/campus/tech/kakao/map/DBHelper.kt @@ -30,7 +30,7 @@ class DBHelper (context: Context): SQLiteOpenHelper(context, "place.db", null, 1 db.execSQL(sql) } - fun select(db: SQLiteDatabase,name:String, address: String, category: String) : String? { + fun select(db: SQLiteDatabase, name:String, address: String, category: String) : String? { return null } 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 1eb6d7f6..afa1ef90 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt @@ -4,63 +4,87 @@ import android.content.Context 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 android.widget.LinearLayout import android.widget.TextView import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContentProviderCompat.requireContext +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewmodel.ViewModelFactoryDsl import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView.LayoutManager import campus.tech.kakao.map.databinding.ActivityMainBinding import campus.tech.kakao.map.databinding.SearchHistoryItemBinding class MainActivity : AppCompatActivity() { - private val viewModel : MainViewModel by viewModels() + private val viewModel: MainViewModel by viewModels { + ViewModelFactory(applicationContext) + } + private lateinit var placeAdapter: PlaceAdapter private lateinit var historyAdapter: HistoryAdapter private lateinit var container: LinearLayout + private var placeList: List = emptyList() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) + + val mainBinding = ActivityMainBinding.inflate(layoutInflater) setContentView(mainBinding.root) mainBinding.placeResult.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) - - val placeItems = viewModel.getPlace() - // 검색 결과 - if (placeItems == null) { + + // 검색 기록 +// val itemBinding = SearchHistoryItemBinding.inflate(layoutInflater, mainBinding.searchHistory, false) +// itemBinding.history.text = "" +// val layoutInflater = this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater +// val customLayout = layoutInflater.inflate(R.layout.search_history_item, null) +// var textView: TextView = customLayout.findViewById(R.id.history) +// mainBinding.searchHistory.addView(customLayout) + + if (placeList.isNullOrEmpty()) { mainBinding.emptyMainText.visibility = View.VISIBLE } else { - placeAdapter = PlaceAdapter(placeItems, LayoutInflater.from(this)) - mainBinding.placeResult.adapter = placeAdapter + mainBinding.emptyMainText.visibility = View.GONE } - // 검색 기록 - val itemBinding = SearchHistoryItemBinding.inflate(layoutInflater, mainBinding.searchHistory, false) - itemBinding.history.text = "" - val layoutInflater = this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater - val customLayout = layoutInflater.inflate(R.layout.search_history_item, null) - var textView: TextView = customLayout.findViewById(R.id.history) - mainBinding.searchHistory.addView(customLayout) - // 검색 필터링 val searchEditText = mainBinding.search - searchEditText.addTextChangedListener(object: TextWatcher - { - override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + // 검색 결과 토대로 UI 업데이트 + + viewModel.placeList.observe(this@MainActivity, Observer { + Log.d("여기인가", "호출!") + (mainBinding.placeResult.adapter as? PlaceAdapter)?.setData(it) + if (it.isNullOrEmpty()) { + mainBinding.emptyMainText.visibility = View.VISIBLE + } else { + mainBinding.emptyMainText.visibility = View.GONE } + }) - override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + placeAdapter = PlaceAdapter(placeList, LayoutInflater.from(this@MainActivity)) + mainBinding.placeResult.apply { + layoutManager = LinearLayoutManager(this@MainActivity, LinearLayoutManager.VERTICAL, false) + adapter = placeAdapter + } - } + searchEditText.addTextChangedListener(object: TextWatcher + { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} - override fun afterTextChanged(s: Editable?) { + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} + override fun afterTextChanged(s: Editable?) { + val searchText = searchEditText.text.toString() + Log.d("여기인가",""+ searchText) + viewModel.getSearchResult(searchText) } } ) diff --git a/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt index 4614e394..996b0aa9 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt @@ -1,8 +1,15 @@ package campus.tech.kakao.map +import android.util.Log +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -class MainViewModel(private val placeRepository: PlaceRepository): ViewModel() { +class MainViewModel(private val placeRepository: PlaceRepository) : ViewModel() { + private var _placeList = MutableLiveData>() + val placeList: LiveData> + get() = _placeList + fun insertPlace(place: Place) { placeRepository.insertPlace(place) } @@ -15,4 +22,19 @@ class MainViewModel(private val placeRepository: PlaceRepository): ViewModel() { super.onCleared() placeRepository.dbClose() } + + fun getSearchResult(searchText: String) { + if (searchText.isEmpty()) { + _placeList.postValue(emptyList()) + } else { + val results = placeRepository.getSearchResults(searchText) + _placeList.postValue(results) + } + + + } + + private fun clearSearchResults() { + _placeList.postValue(emptyList()) + } } \ 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 index f1625078..16369a85 100644 --- a/app/src/main/java/campus/tech/kakao/map/Place.kt +++ b/app/src/main/java/campus/tech/kakao/map/Place.kt @@ -3,7 +3,7 @@ package campus.tech.kakao.map import androidx.annotation.DrawableRes data class Place ( + val name: String, val address: String, val category: String, - val name: 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 index d0876132..d09598cf 100644 --- a/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt @@ -9,7 +9,7 @@ import android.widget.TextView import androidx.appcompat.content.res.AppCompatResources import androidx.recyclerview.widget.RecyclerView -class PlaceAdapter(val items: List, val inflater: LayoutInflater): RecyclerView.Adapter() { +class PlaceAdapter(var items: List, val inflater: LayoutInflater): RecyclerView.Adapter() { interface OnItemClickListener { fun onItemClick(position: Int) {} @@ -31,7 +31,12 @@ class PlaceAdapter(val items: List, val inflater: LayoutInflater): Recycl } override fun getItemCount(): Int { - return items.size + return items.size ?: 0 + } + + fun setData(searchResults: List) { + items = searchResults + notifyDataSetChanged() } inner class PlaceViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) { diff --git a/app/src/main/java/campus/tech/kakao/map/PlaceRepository.kt b/app/src/main/java/campus/tech/kakao/map/PlaceRepository.kt index bb0aeb70..27a898b0 100644 --- a/app/src/main/java/campus/tech/kakao/map/PlaceRepository.kt +++ b/app/src/main/java/campus/tech/kakao/map/PlaceRepository.kt @@ -1,7 +1,11 @@ package campus.tech.kakao.map -class PlaceRepository(private val dbHelper: DBHelper) { - val db = dbHelper.writableDatabase +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) } @@ -13,4 +17,25 @@ class PlaceRepository(private val dbHelper: DBHelper) { 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/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 From c8faa90cb2eeed23133901f8e41d8c9ddbe56891 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Fri, 5 Jul 2024 06:11:15 +0900 Subject: [PATCH 20/32] =?UTF-8?q?chore(README):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95(1=EB=8B=A8=EA=B3=84=20?= =?UTF-8?q?=EB=82=B4=EC=9A=A9=20=EC=82=AD=EC=A0=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index acbbed3d..48c2a8c0 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,8 @@ ### 기능 사항 - 검색어 입력 레이아웃 구현한다. -- 검색 결과를 표시할 기본 레이아웃을 리스트뷰로 구현한다. - 검색에 사용될 데이터를 로컬 데이터베이스에 생성한다. -- 검색어를 입력하면 검색 결과 목록이 표시된다. +- 검색어를 입력하면 검색 결과 목록이 표시된다. - 검색 결과 목록은 세로 스크롤이 된다. RecyclerView를 사용한다. - 입력한 검색어는 X를 눌러서 삭제할 수 있다. - 검색 결과 목록에서 하나의 항목을 선택할 수 있다. From b2da1d32d2dabddc8e0a213308c2ad91a28c6c7d Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Fri, 5 Jul 2024 06:27:55 +0900 Subject: [PATCH 21/32] =?UTF-8?q?feat(MainActivity):=20X=20=EB=88=8C?= =?UTF-8?q?=EB=9F=AC=20=EA=B2=80=EC=83=89=EC=96=B4=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/campus/tech/kakao/map/MainActivity.kt | 7 +++++++ app/src/main/java/campus/tech/kakao/map/MainViewModel.kt | 5 +---- 2 files changed, 8 insertions(+), 4 deletions(-) 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 afa1ef90..4c035e44 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt @@ -88,5 +88,12 @@ class MainActivity : AppCompatActivity() { } } ) + + // X 누르면 초기화 + mainBinding.xmark.setOnClickListener { + searchEditText.setText("") + } + + } } diff --git a/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt index 996b0aa9..350f3a8e 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt @@ -1,6 +1,7 @@ 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 @@ -33,8 +34,4 @@ class MainViewModel(private val placeRepository: PlaceRepository) : ViewModel() } - - private fun clearSearchResults() { - _placeList.postValue(emptyList()) - } } \ No newline at end of file From 1871f63df544c542283e6d6355c6c74ff7956518 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Fri, 5 Jul 2024 14:53:09 +0900 Subject: [PATCH 22/32] =?UTF-8?q?feat(MainActivity):=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=EC=96=B4=20=EB=AA=A9=EB=A1=9D=20=EB=88=84=EB=A5=B4=EB=A9=B4=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20=EA=B8=B0=EB=A1=9D=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 리사이클러 뷰를 이용해 구현했습니다. 검색어 저장은 SharedPreference를 이용하였고, 배열을 json 형태로 저장하였습니다. HistoryAdapter 내부에서 findViewById 사용 대신 바인딩을 사용하도록 수정했습니다. --- app/build.gradle.kts | 1 + app/src/main/AndroidManifest.xml | 1 + .../java/campus/tech/kakao/map/Constants.kt | 6 ++ .../campus/tech/kakao/map/HistoryAdapter.kt | 57 ++++++++++--------- .../campus/tech/kakao/map/MainActivity.kt | 41 +++++++------ .../campus/tech/kakao/map/MainViewModel.kt | 2 - .../campus/tech/kakao/map/MyApplication.kt | 15 +++++ .../campus/tech/kakao/map/PlaceAdapter.kt | 6 +- .../tech/kakao/map/PreferenceManager.kt | 44 ++++++++++++++ app/src/main/res/layout/activity_main.xml | 15 +++-- .../main/res/layout/search_history_item.xml | 1 + 11 files changed, 134 insertions(+), 55 deletions(-) create mode 100644 app/src/main/java/campus/tech/kakao/map/Constants.kt create mode 100644 app/src/main/java/campus/tech/kakao/map/MyApplication.kt create mode 100644 app/src/main/java/campus/tech/kakao/map/PreferenceManager.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index edf42a67..d2701204 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -45,6 +45,7 @@ dependencies { 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"> ): BaseAdapter() { - override fun getCount(): Int { - return items.size +class HistoryAdapter(var items: List, val inflater: LayoutInflater) : RecyclerView.Adapter() { + + interface OnItemClickListener { + fun onItemClick(position: Int) } - override fun getItem(position: Int): Any { - return items[position] + var itemClickListener: OnItemClickListener? = null + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HistoryViewHolder { + val binding = SearchHistoryItemBinding.inflate(inflater, parent, false) + return HistoryViewHolder(binding) } - override fun getItemId(position: Int): Long { - return position.toLong() + override fun onBindViewHolder(holder: HistoryViewHolder, position: Int) { + holder.bind(items[position]) } - override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { - val view: View - val placeViewHolder : PlaceViewHolder - if (convertView == null) { - view = - LayoutInflater.from(parent?.context).inflate(R.layout.search_history_item, parent, false) - placeViewHolder = PlaceViewHolder(view) - view.tag = placeViewHolder - } else { - view = convertView - placeViewHolder = convertView.tag as PlaceViewHolder - } + override fun getItemCount(): Int { + return items.size + } - val item = items[position] - placeViewHolder.history.text = item - return view + fun setData(searchHistory: List) { + items = searchHistory + notifyDataSetChanged() } - class PlaceViewHolder(view: View) { - val history: TextView = view.findViewById(R.id.history) + inner class HistoryViewHolder(private val binding: SearchHistoryItemBinding) : RecyclerView.ViewHolder(binding.root) { + fun bind(searchHistory: SearchHistory) { + binding.history.text = searchHistory.searchHistory + } + + init { + itemView.setOnClickListener { + itemClickListener?.onItemClick(absoluteAdapterPosition) + } + } } -} \ 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 4c035e44..57c0a471 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt @@ -1,6 +1,5 @@ package campus.tech.kakao.map -import android.content.Context import android.os.Bundle import android.text.Editable import android.text.TextWatcher @@ -8,17 +7,11 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.widget.LinearLayout -import android.widget.TextView import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity -import androidx.core.content.ContentProviderCompat.requireContext import androidx.lifecycle.Observer -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.viewmodel.ViewModelFactoryDsl import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView.LayoutManager import campus.tech.kakao.map.databinding.ActivityMainBinding -import campus.tech.kakao.map.databinding.SearchHistoryItemBinding class MainActivity : AppCompatActivity() { private val viewModel: MainViewModel by viewModels { @@ -29,6 +22,7 @@ class MainActivity : AppCompatActivity() { private lateinit var historyAdapter: HistoryAdapter private lateinit var container: LinearLayout private var placeList: List = emptyList() + private lateinit var searchHistoryList: ArrayList override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -37,17 +31,8 @@ class MainActivity : AppCompatActivity() { val mainBinding = ActivityMainBinding.inflate(layoutInflater) setContentView(mainBinding.root) - mainBinding.placeResult.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) - // 검색 기록 -// val itemBinding = SearchHistoryItemBinding.inflate(layoutInflater, mainBinding.searchHistory, false) -// itemBinding.history.text = "" -// val layoutInflater = this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater -// val customLayout = layoutInflater.inflate(R.layout.search_history_item, null) -// var textView: TextView = customLayout.findViewById(R.id.history) -// mainBinding.searchHistory.addView(customLayout) - if (placeList.isNullOrEmpty()) { mainBinding.emptyMainText.visibility = View.VISIBLE } else { @@ -60,7 +45,7 @@ class MainActivity : AppCompatActivity() { // 검색 결과 토대로 UI 업데이트 viewModel.placeList.observe(this@MainActivity, Observer { - Log.d("여기인가", "호출!") + Log.d("여기인가ㅌ", "호출!") (mainBinding.placeResult.adapter as? PlaceAdapter)?.setData(it) if (it.isNullOrEmpty()) { mainBinding.emptyMainText.visibility = View.VISIBLE @@ -83,7 +68,6 @@ class MainActivity : AppCompatActivity() { override fun afterTextChanged(s: Editable?) { val searchText = searchEditText.text.toString() - Log.d("여기인가",""+ searchText) viewModel.getSearchResult(searchText) } } @@ -94,6 +78,27 @@ class MainActivity : AppCompatActivity() { searchEditText.setText("") } + // PlaceAdapter OnclickListener + searchHistoryList = MyApplication.prefs.getArrayList(Constants.SEARCH_HISTORY_KEY) + if (searchHistoryList.isEmpty()) { + searchHistoryList = ArrayList() + } + + historyAdapter = HistoryAdapter(searchHistoryList, LayoutInflater.from(this@MainActivity)) + mainBinding.searchHistory.apply { + layoutManager = LinearLayoutManager(this@MainActivity, LinearLayoutManager.HORIZONTAL, false) + adapter = historyAdapter + } + + placeAdapter.itemClickListener = object : PlaceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + Log.d("여기인가", "왜 안 돼 미친!") + val item = placeAdapter.getItem(position) + val searchHistory = SearchHistory(item.name) + MyApplication.prefs.savePreference(Constants.SEARCH_HISTORY_KEY, searchHistory ,searchHistoryList) + historyAdapter.setData(searchHistoryList) + } + } } } diff --git a/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt index 350f3a8e..75d22030 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainViewModel.kt @@ -31,7 +31,5 @@ class MainViewModel(private val placeRepository: PlaceRepository) : ViewModel() val results = placeRepository.getSearchResults(searchText) _placeList.postValue(results) } - - } } \ 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/PlaceAdapter.kt b/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt index d09598cf..e7df7773 100644 --- a/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/PlaceAdapter.kt @@ -31,7 +31,7 @@ class PlaceAdapter(var items: List, val inflater: LayoutInflater): Recycl } override fun getItemCount(): Int { - return items.size ?: 0 + return items.size } fun setData(searchResults: List) { @@ -39,6 +39,10 @@ class PlaceAdapter(var items: List, val inflater: LayoutInflater): Recycl notifyDataSetChanged() } + fun getItem(position: Int): Place { + return items[position] + } + inner class PlaceViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) { val name: TextView val address: TextView 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..c0fd447a --- /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() + } + } + + 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/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 147976c0..d18baf2b 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -48,15 +48,14 @@ app:layout_constraintTop_toBottomOf="@id/searchHistory" tools:listitem="@layout/place_item" /> - - + app:layout_constraintTop_toBottomOf="@+id/search" + app:layout_constraintBottom_toTopOf="@+id/placeResult" + tools:listitem="@layout/search_history_item" + app:layout_constraintStart_toStartOf="parent"/> - diff --git a/app/src/main/res/layout/search_history_item.xml b/app/src/main/res/layout/search_history_item.xml index c3a84299..9de14ee5 100644 --- a/app/src/main/res/layout/search_history_item.xml +++ b/app/src/main/res/layout/search_history_item.xml @@ -6,6 +6,7 @@ android:padding="10dp" android:gravity="center" android:layout_marginRight="15dp" + android:layout_marginBottom="5dp" android:background="@drawable/history_background" > From db3e5c7822b920006e72c9c992836f41f6ee6269 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Fri, 5 Jul 2024 15:10:14 +0900 Subject: [PATCH 23/32] =?UTF-8?q?feat(MainActivity):=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=20=EA=B8=B0=EB=A1=9D=20=ED=81=B4=EB=A6=AD=20=EC=8B=9C=20?= =?UTF-8?q?=ED=95=B4=EB=8B=B9=20=EA=B2=80=EC=83=89=EC=96=B4=EB=A1=9C=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=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 --- README.md | 18 +++++++++--------- .../campus/tech/kakao/map/HistoryAdapter.kt | 5 +++++ .../java/campus/tech/kakao/map/MainActivity.kt | 11 +++++++++++ .../main/res/layout/search_history_item.xml | 1 + 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 48c2a8c0..bf324ecf 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ # android-map-keyword (2단계) ### 기능 사항 -- 검색어 입력 레이아웃 구현한다. -- 검색에 사용될 데이터를 로컬 데이터베이스에 생성한다. -- 검색어를 입력하면 검색 결과 목록이 표시된다. -- 검색 결과 목록은 세로 스크롤이 된다. RecyclerView를 사용한다. -- 입력한 검색어는 X를 눌러서 삭제할 수 있다. -- 검색 결과 목록에서 하나의 항목을 선택할 수 있다. -- 선택된 항목은 검색어 저장 목록에 추가된다. -- 저장된 검색어 목록은 가로 스크롤이 된다. +- 검색어 입력 레이아웃 구현한다.0 +- 검색에 사용될 데이터를 로컬 데이터베이스에 생성한다.0 +- 검색어를 입력하면 검색 결과 목록이 표시된다.0 +- 검색 결과 목록은 세로 스크롤이 된다. RecyclerView를 사용한다.0 +- 입력한 검색어는 X를 눌러서 삭제할 수 있다. 0 +- 검색 결과 목록에서 하나의 항목을 선택할 수 있다.0 +- 선택된 항목은 검색어 저장 목록에 추가된다. 0 +- 저장된 검색어 목록은 가로 스크롤이 된다. 0 - 저장된 검색어는 X를 눌러서 삭제할 수 있다. -- 저장된 검색어는 앱을 재실행하여도 유지된다. +- 저장된 검색어는 앱을 재실행하여도 유지된다.0 ### 프로그래밍 요구 사항 - 가능한 MVVM 아키텍처 패턴을 적용하도록 한다. diff --git a/app/src/main/java/campus/tech/kakao/map/HistoryAdapter.kt b/app/src/main/java/campus/tech/kakao/map/HistoryAdapter.kt index 061d7261..5b4c791c 100644 --- a/app/src/main/java/campus/tech/kakao/map/HistoryAdapter.kt +++ b/app/src/main/java/campus/tech/kakao/map/HistoryAdapter.kt @@ -12,6 +12,7 @@ class HistoryAdapter(var items: List, val inflater: LayoutInflate interface OnItemClickListener { fun onItemClick(position: Int) + fun onXMarkClick(position: Int) } var itemClickListener: OnItemClickListener? = null @@ -43,6 +44,10 @@ class HistoryAdapter(var items: List, val inflater: LayoutInflate itemView.setOnClickListener { itemClickListener?.onItemClick(absoluteAdapterPosition) } + + binding.xmark.setOnClickListener { + itemClickListener?.onXMarkClick(absoluteAdapterPosition) + } } } } 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 57c0a471..04c2e97a 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt @@ -100,5 +100,16 @@ class MainActivity : AppCompatActivity() { historyAdapter.setData(searchHistoryList) } } + + historyAdapter.itemClickListener = object : HistoryAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + val item = searchHistoryList[position] + searchEditText.setText(item.searchHistory) + } + + override fun onXMarkClick(position: Int) { + + } + } } } diff --git a/app/src/main/res/layout/search_history_item.xml b/app/src/main/res/layout/search_history_item.xml index 9de14ee5..be768b96 100644 --- a/app/src/main/res/layout/search_history_item.xml +++ b/app/src/main/res/layout/search_history_item.xml @@ -20,6 +20,7 @@ /> Date: Fri, 5 Jul 2024 15:23:48 +0900 Subject: [PATCH 24/32] =?UTF-8?q?feat(MainActivity):=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=20=EA=B8=B0=EB=A1=9D=20X=EB=B2=84=ED=8A=BC=20=EB=88=84?= =?UTF-8?q?=EB=A5=B4=EB=A9=B4=20=EC=82=AD=EC=A0=9C=EB=90=98=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/campus/tech/kakao/map/MainActivity.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 04c2e97a..3a42d86c 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt @@ -43,7 +43,6 @@ class MainActivity : AppCompatActivity() { val searchEditText = mainBinding.search // 검색 결과 토대로 UI 업데이트 - viewModel.placeList.observe(this@MainActivity, Observer { Log.d("여기인가ㅌ", "호출!") (mainBinding.placeResult.adapter as? PlaceAdapter)?.setData(it) @@ -108,7 +107,9 @@ class MainActivity : AppCompatActivity() { } override fun onXMarkClick(position: Int) { - + MyApplication.prefs.deleteArrayListItem(Constants.SEARCH_HISTORY_KEY, position) + searchHistoryList = MyApplication.prefs.getArrayList(Constants.SEARCH_HISTORY_KEY) + historyAdapter.setData(searchHistoryList) } } } From 595cef6a0bf9d8cbb858d26399e08766e022c37e Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Fri, 5 Jul 2024 15:28:53 +0900 Subject: [PATCH 25/32] =?UTF-8?q?refactor(PreferenceManager):=20setArrayLi?= =?UTF-8?q?st()=EB=A5=BC=20private=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/MainActivity.kt | 1 - app/src/main/java/campus/tech/kakao/map/PreferenceManager.kt | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) 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 3a42d86c..5d1085d4 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt @@ -20,7 +20,6 @@ class MainActivity : AppCompatActivity() { private lateinit var placeAdapter: PlaceAdapter private lateinit var historyAdapter: HistoryAdapter - private lateinit var container: LinearLayout private var placeList: List = emptyList() private lateinit var searchHistoryList: ArrayList diff --git a/app/src/main/java/campus/tech/kakao/map/PreferenceManager.kt b/app/src/main/java/campus/tech/kakao/map/PreferenceManager.kt index c0fd447a..243f7789 100644 --- a/app/src/main/java/campus/tech/kakao/map/PreferenceManager.kt +++ b/app/src/main/java/campus/tech/kakao/map/PreferenceManager.kt @@ -24,7 +24,7 @@ class PreferenceManager(context: Context) { } } - fun setArrayList(key: String, list: ArrayList) { + private fun setArrayList(key: String, list: ArrayList) { val jsonString = GsonBuilder().create().toJson(list) prefs.edit().putString(key, jsonString).apply() } From 5fc7d6ed0a525d4beba15106cf7748d6f5ae0234 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Fri, 5 Jul 2024 15:31:03 +0900 Subject: [PATCH 26/32] =?UTF-8?q?refactor(MainActivity):=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=20=EC=82=AD=EC=A0=9C...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/campus/tech/kakao/map/MainActivity.kt | 2 -- 1 file changed, 2 deletions(-) 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 5d1085d4..b3350f51 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt @@ -43,7 +43,6 @@ class MainActivity : AppCompatActivity() { // 검색 결과 토대로 UI 업데이트 viewModel.placeList.observe(this@MainActivity, Observer { - Log.d("여기인가ㅌ", "호출!") (mainBinding.placeResult.adapter as? PlaceAdapter)?.setData(it) if (it.isNullOrEmpty()) { mainBinding.emptyMainText.visibility = View.VISIBLE @@ -90,7 +89,6 @@ class MainActivity : AppCompatActivity() { placeAdapter.itemClickListener = object : PlaceAdapter.OnItemClickListener { override fun onItemClick(position: Int) { - Log.d("여기인가", "왜 안 돼 미친!") val item = placeAdapter.getItem(position) val searchHistory = SearchHistory(item.name) From 0d8ab18c98a6d92179a82043414f076c5dfc7f77 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Fri, 5 Jul 2024 15:42:50 +0900 Subject: [PATCH 27/32] =?UTF-8?q?design(Map):=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=EC=BD=98=20=EC=B6=94=EA=B0=80,=20=EC=95=B1=20=EC=83=89?= =?UTF-8?q?=EC=83=81=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/ic_launcher-playstore.png | Bin 0 -> 17459 bytes .../campus/tech/kakao/map/MainActivity.kt | 1 + .../res/drawable/ic_launcher_background.xml | 236 ++++++------------ .../ic_launcher.xml | 7 +- .../ic_launcher_round.xml | 7 +- app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1404 -> 1212 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 0 -> 932 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 2898 -> 2662 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 982 -> 816 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 0 -> 654 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 1772 -> 1726 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1900 -> 1590 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 0 -> 1456 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3918 -> 3684 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 2884 -> 2308 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 0 -> 2280 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 5914 -> 5926 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 3844 -> 3068 bytes .../ic_launcher_foreground.webp | Bin 0 -> 3120 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 7778 -> 8262 bytes app/src/main/res/values/themes.xml | 4 + 21 files changed, 81 insertions(+), 174 deletions(-) create mode 100644 app/src/main/ic_launcher-playstore.png rename app/src/main/res/{mipmap-anydpi => mipmap-anydpi-v26}/ic_launcher.xml (51%) rename app/src/main/res/{mipmap-anydpi => mipmap-anydpi-v26}/ic_launcher_round.xml (51%) create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..5e6a55a31a82cf811a1e99f532030485cfe46df5 GIT binary patch literal 17459 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∈?v|N5s<6j^5fYJ*TYjPk4AdLxk8;h4K5I+@fP`S%T) z5jY0s(AhK>1I=|dgBsZ+Sr;{gvLqA=?kK} z3I}`eI=In-gZ0*?^~?bEPj6CeTU*gwtu*|W?eCJqw zgWC3CH6k5IvJZ)}uwTH!J$?_gHffy&&OJr$@QUH3o1hZ*?o9j5J? zC$EOnz$HgKMa5KIH{M3SzLn(?k9|b_cso&Ym+LX`x(kNDD5e7yp$?oG)_U7$Q2Kco zIliRH0Ttf2EPB~;9nsUCu1YNAnzJ8z)*_^ck~~yCU6dqPCYsP%Lp^f*E*pt%#j)mo z^56Q!S~llZ<5;+&ya13>*JnSpZEset)9=1Prd;({|eM4<2!@phkumGHB()`{oJi}LOpi0t|erg{c!{9tQ*%0j=)5`c5@8(kBimS}K*#2-wcxdLo{^NY=IGQPjr zqT{r3TcFz7CjfDWkyU|+NEv8_2ZF>BL0O#Ze0WNZT&UnZbr`vn*G-frzp%bR+ zt8r1VvgBkJ9!s^LOMcDIIbxGBJG%u!oLZId+Gu+qvGmq*2iZmsmZq5&EDdY!2YdKe z!xn%3alD8@fa@Dz)OKP+$H309f}K+Z+7BT>Ch$IaLWgt-sRQy5Gkln|o}Hla3>F3J znj)_WfM)8pulhmwQ!%{vS}dF}=}#(h4|D+QstN}2lAJ~jhXHLUsiyz}hD{SoMpPf$ ziIgCkhHTaV@+$Nq@c3N6brec<4fuyXdif$y1hE4ui6clJ&=7#*Hrg)hE}$f)ljxO; zJ35K?=fA1j8YyQ9RF(bM{4-q~U?6YN14JMW1K7zdMp$EDTKRz#fANhXo(G)91#U;m1CkbvR2>32yi4qBH9UTs~!& zE%s+07^5CwKg5)2N!1Lsyo{Lm^FpxH6LBm}dMxJ@g=pA9Z@9KCQJZ)RVi9opiv z7>AqkcI)me04W`2TM`rxipDv2Y&zW}4#C!Oi=9Mro{(~n@=Ib+D9Wx}FuK>P0$puV z^8Enjkoci>#hth9Ms+aYFF1iUQ@G2uC4T9XU_r4+O2#i#7Ug&R36>lXn6wBJh&X5# z*!rM%aTM()l?7Mio|rKuCpm5)6#>#9|NVuapFsKAzc7qQwFdHzayy3sk~h&EY6j+E zi<@{cf$;Ux&S0Q&-%Jsk_Nh)HWgc+13fjul0K8`vD@SPnL-fCYyy5@TKV`8>q8aDW WX-fWPp$v8r(o)mETcvvc+5Z7d#s_Nv literal 0 HcmV?d00001 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 b3350f51..4256196e 100644 --- a/app/src/main/java/campus/tech/kakao/map/MainActivity.kt +++ b/app/src/main/java/campus/tech/kakao/map/MainActivity.kt @@ -97,6 +97,7 @@ class MainActivity : AppCompatActivity() { } } + // HistoryAdapter OnclickListener historyAdapter.itemClickListener = object : HistoryAdapter.OnItemClickListener { override fun onItemClick(position: Int) { val item = searchHistoryList[position] 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/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 c209e78ecd372343283f4157dcfd918ec5165bb3..1cb2bc1c65f937d6d04898f2f21a0a176e9fcf07 100644 GIT binary patch literal 1212 zcmV;t1Vj5$Nk&Gr1ONb6MM6+kP&iDe1ONapN5Byf6$gU0Z4>jSz3qn(5fji~4DO9y ztI!orwttS4p8!%9HxKhi00z##u$g=Qe^U9csc~@~(E=?Vwj*tQ?Fb;P5pulb00GFj z=@~_mq^SI>Is>O-@Mezr$u^QCC*y;sPrMeSK@#Lc=uT^GTbnR5lZ{Gg1ClwF)%9JW zwu(V9gGxIC4S?&=Hvw{NYdf}QHnwfEjBVStZQHh!%C>Fix8GFn|2^Nz`+O6K+rJL$ zbWX-_t(8ty$~%~WlRB;OqmNl<5=n2@nE=B8K+^F4or2xE0E1xwAZf#Zt?LfL{!f7J zz5~$C03mYF1@L1kwDoFLNo%|=sXzTAbAkDx( z^eEKO)@h(>wOj&e{)i05^9_LMz@;-lsI^iKO)ZkNe5@tNI#smiG_V?*VyqP?(}n}L zzKJrbg)}kmxa_+D2xD<9HIFVD7tbI(xshpy0!$wtgeNqczd&>@%EsPkD zswv}56D@Ig+l+B4N8f|tfC7Nur5O@C&LLH}wNbf>=iU*24!^JgK&AjNfm4cb^P_^j zT3Z4yfjJnkai7((bF!`Jm_jc?&M?5v&!B^yk6f8B8a;C-q2m^}TjN2;PsS#@1hH~ZJ?%i2u<;D0cIe>phc?HK@I#dcZZ zrG}j%+?Fcb3wHp3Az#rUeA^|L3-qwiJOi89n0x)|;0~9tLw6T8zuwVykD^hzE3BdoNwGlQG ztt+G<%iTLTe<`Q024WxYhf`Y9r|Yg*i^H# z)N&Sp0MKmAJ7k@&*_Lns0IRoiu*~mW)wTjaC}5j89*Po08Id;ZbMQp~xTU6yA6;Cr z9mMljs8m-E`yV*zV*k>0pD7VypF{SRNkCNjx<(-9hf6$=A<6RX`@9}=NQhw42iEv0Z@i`2>>Wm4pIo` zM{~aaN-S&5$qi$lx;zUm2vi32Nrc#=??_)d+f{@#ol}vrIvTA)R zWX%#RZBm6o3QVVv6^8D>A0#FFe5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG 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 0000000000000000000000000000000000000000..3a8c85f6025970eabd7a6c820f2458f40c61d28e GIT binary patch literal 932 zcmV;V16%x3Nk>0{{S5MM6+kP&iDF0{{Rop+G1AH|L;jBS8v(%6D7qe-8x1wr#`c z|C6`IRM@s{qyB&LFy~)E+6Ih(c1H##N|7i9DH0_piAaDjp9Ub3A&^fcNQ41EigS}( zj_gJdfUp4ohH_0Cx9@pVkf4Mi0XR31z&6kSkm9@nNVZV|+2(dFh>enLv&}|0BM`7r z!X$u_0PN;{U$L4 z2Q4})kPpk-xq-4%!;(j`_%t^LG=}Cs5yZZ_pgDTI6uwPz1?`T5--zHO?P&8@Jq2jDaYentp<7~YTige9#?&-nD@G@7E~jqtm@P>)V_goe!$aZ2kMNzcOeAq;Atn2 z3BUAVcWORQE2va7m`&yIG>aNzVlFk3r$Q>j#1d*KPqV4fCgxD-JguZsOk`5IJng39 ze;VjQE#T>fBLOG$y$+yu@q{r{zP?f*T^}+vfU5jL*UzR@6J&ZF1$nwkfu73M%LvN* zpq|SWDd*E%;dlz-F6(&F4Ct=N_61)GYMrz9pfxCN=L^#nAZn9k<3JK9wzU|$=%WCT za#-ce5LZxi*n^ypRRYIm1$%FQ`|;q=tWNHr+!uSfzH>KTWk{G6yG;HoTev5pKB=I3O4LHDGArS`H= zoL}qM3BM~3Tw`Yn3iMljwaAAO!Od#ZQKUZ_sZ@9>6WpRwh(i6|oT~OxD!7d*La|z{ z{uc92F1Y<~^HH$B+y4>!Q8KvK5dapTXsu2F$sc8d`y62zO1EdtFXB183gv4FsLcQW G4-WtcM!k~& literal 0 HcmV?d00001 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 b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9..df98a81944c55691419549f54d052c1f30b9b398 100644 GIT binary patch literal 2662 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp index 4f0f1d64e58ba64d180ce43ee13bf9a17835fbca..cb81f4ae88271d586e02b65f689d044cf41ad7eb 100644 GIT binary patch literal 816 zcmV-01JC?YNk&E}0{{S5MM6+kP&iB*0{{RoFTe{B=jAApZC9E92|FC%Uk7T~=X_^u zIBX+Hk?JV_OrK$Cx*WHSgA0+cdJr7VF`h)I}01W<`oswkyGfC4E5 zD1d+t@BwbXA51_BK4264fhovAfE8F)#tw9#E9xi`G($|K-pu z`;co|D}h?Opq1+H>|pNfS4tbS8vIjR$zJ<=P-)XIn9#7y!Z!Nw~WRSbi+c$~Y4REV#{QZ3klRTSR0%Nd&eQv%Oe?(5oNF@kS&TK47~U zhPZTc&RL6~t85p2vANJ-Z3B+8T?xd-SB8Qu@IA+NXFitRGdy02h+AwgV}Tv-918XT z(b;Tt#2+C^xn*SK?+b_Te&WlF1+Ze*f!$F6qLT&C34fS<50Zq8H7>*^i=eXs2H(S$ zjEr@L_!N>s7Xlr8k6Kc)HaM(GB`I{t4}kB@#)O3HjtSq&`>M747U5cEhw9o};wKk2YIi>vvDBoZLsh uwKO$1u{Jlgd>wN)DDCMpJ~hcaHR0o_m06E?d9!B%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!Tw4PUP6aA=PMtcWjqtjT0#HYC*Llco76_0!ZEi;ibtbQKhRW?!Ugz97 zaOYIoyv_r+soYK*0&VKN&H=LUeLo7h9Yr8Ro!daAPG=+wL?AelhcZCl6Q?AW$#JGI-?O>NtDYTJl?e&}=F=Xo#obDfC(PXHF& z7?+uq;D_wx$M64{nf*U>a$PaI%KbmZa`;FcwbkFn@$dF%TFJ*G#Pd0%lFmt}H*z^0 zmEgIt(b*um7{h3#=+hUL)x^hCEj~S|$snQP&)TCl1UBE&h8y_o74=FUEK|=Ya*R&u z7iFjb)+slYkqS2bV$OEJv1#0pO>7P+m*IRuIm_mzvfiy%dBx^~((G0=ZA_++8By}w zB7Yh4Wt8&WqLeu{@0Av}l38OSnank1qg$VtFG2R8a@FmWa)wQ>GS}_WGO27}ll;Mu z=OuP&x5XSTVT0X@TrajsJ16Q9&@KF?$kWcC*1MvPHSobMO=d5xX-rC}Uw&>%^ur*W z{Yi5lsbz%0unvN9#`|#oRdd4Da1MZU`nxcGm$Sm=F!q6V>KnHorMxiUwgBsS4E!0d!tKa1^jvWL99pGm%^tJURfw00J3XIfdBvi literal 0 HcmV?d00001 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 62b611da081676d42f6c3f78a2c91e7bcedddedb..e6bc028e56eba052e78b9444e7ac45242da452fb 100644 GIT binary patch literal 1726 zcmV;v20{5!Nk&Gt1^@t8MM6+kP&iDf1^@srFTe{BHHSbTIe+dQB4PqsD!6Fr#{cKY zQvRp)9a^m3o#{dA1TGVNLL<$$-Lo%)Up))qt#uh7f*=58QMH}GD@<*7;mZsz15zM> zKgy*vbPi{uX&)DhGslAZBTVYqs7?T_#=UhrhQ&JXEFxHwI-3ZTkNxTe@NCGDBq@?Y zf2mdhhWGAWXI9hjF+AYbw&X~8<}O;cuBuBX%{Y~f&bDo< zv-tyTr?zeOpX%7=nE=VPwH@12j&0kvZJSfg{+Vqvwry){+ZuiE^E`EArGj+89?}Zu znf;AiRo$`rNG;z=E#D{&{Y`}pWt39BIm1X&+t7cVAS*d52cBWuNQ$!yN6*Z^H{1US zKxqOb@sGZ257t5JYL~Fc#0|B72L=nzyMI#7d2!)cFQNSGs{gRiR*O+t0B1kSL`9{X zm7?n``KEH|3gwk@KHU7ktA8H7@h|{ejjRU#E1U_+xl|;*6iO&0F#YS1!xvr#8K_5- z9FlTn7b!J?xsd*q>(4MU^RW*TY#MScJ2z?u4YXP^zLJ!dg>fHQ#)Ahg(FF$5osD z+4A@qEQRt-^T@vbRbd~-5|s6uML44#QUS_& z$ey*f&erw@vNu52i6OgfWM}tl*mIV3On^eQz(QGBL89gy2^N$Fz&YivGzNrMi=oNz z@n1`tPpbe})yun@I9}_Q$cF_`p%K5NWBe>@FYf~`f`KDj3$H^?M5HdBd0qQg0IqGFzK@$k!21_PfQHA) zf_}C%SR_DMOYC))hwWPl*gcbpF=85;y0K^AzzR0bSe~=+)k8=Q10Ule#S4qh$^GY4 zfWb0q2v};2wtoVyfjr#DlAw~mbV|2`tC2^fg~)nW|6d0I4gaiQQT4mr1OZblj`MD} zT+|MEL@$ehqqDORU?>k70@j`OGyzwM-TluY+^;s29FkJ(7=7Qn60mos$E z74C}=;ON$p>(FAzC_f$80hmmS7jb1duFhD70%$i=7t+1izm=l_a30c^#!&z0NYxSq z#JBSw&!_;{GP0a6k9cSd(~JOtR^P@YC_3DyRKR@>l6qbwaK_XvfyO*#%DO7?cXny{ zmh{%ZRDnGF`n0vFfqm;U^V1TfyiCk<9TXpL61Zdc`#ldJz~|O(8EvT(xxdGHv7k1( z0s-z9J0u{%t`3S1mZ1oL-)5axPKwuEk#0L<1Xx?AZaMiJqnYAA>x(*rxMQ3*hgFtp zherRjQqCt9GYSdsv8__4p|SBMehFE`^Xb!@BZxmt0s$q9SZ7~Co9k#Eq~?}ZPpW|D zUa>6#Iuh(^r;Y-S(Tv>OcL5?ZIYs=+`Clmi=gpy&ty+M%p|IoYD$PP#ezt_V__rIx zz`a?ul?yx@24TAG-xmcc0G5Ez?!A01Ml%Ww?<3$xbi9c_&Xfg>snz^#0iXhbaFG3! zeF^GLBQQ~V6>$O2y=vzK61WAhlhc;>U?qKpXG{2o_wd$}s!HO|qkco~_&VwREn-q* z`2HOj0!DM3P4k(UX^3~GaU}QJ0zR232QXnWu02{>Y@ps8dZqB;XU6?)`Z5J7f8*>a;o4E9db4Ec-j_b@`ug#|BJ`2pL@@j?!WzkmGwt|vK1CNy}7jX U)8_0Jj5U3IG5A literal 1772 zcmVQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp index 948a3070fe34c611c42c0d3ad3013a0dce358be0..e6be427e6d177a5d90d7322e192de8b8b15d33cd 100644 GIT binary patch literal 1590 zcmV-62FdwSNk&F41^@t8MM6+kP&iB?1^@srU%(d-^@f7BjU1Oh>>EE2M8pJ;(aqE@ zf3mp?jfZd~+g7dY6nFUk;c?%=LMFicCw4FOE*c%&-Q6X2cXxMZ4E{(Qw~gdT%0H@0 z;4<(x)#GQ*t>1mPjU?NN#zSi@-v9fcurM!{%ZJe2*tT^%>yK^QwpC_j0>)^vQl?Lx zDjAKf%C`AUfLv|c4%<1KW$qo@wp|&OZQHi3%2ws1+O}<1^R1b=GT#v-m2Gr?oa&2{ zGL@!_E8AIJ$S?qqH2!}lV0SGP97wX&#FF@*w78PYB0uzh0yv*F_+a1EdWzc-uMprsF;-0OU=Jft)Tn5wfeJ4bB%i0L+sYqgI5%#nF1#vK#>J&a+u7t8u;e zbmdB^P}3VK=|_!l)k|mnbks~&8UJQ7qya%mftt}!qkJrQlI!)MjByGQ6(lJWuS__D z$Fa-a)T->+?NoxIlUj3^+8vIMSHO5CC~&)eKyOxDl&EF=yY7qsn7~A3?0;W5-f9p; zcGXR12qP0QQm}2=bSP+88|NchfQkB`OWU-lSX7QrqyV$LEk?}dZI)P^n1=aKg5r?F zPWS5=9KkSitu^A6PLmq-R%)V(;hr#aFeAhQ*%tEyg(K6}%D_Z1*YdmX5rJxuY?fxu zf4mrgE&3KS2?k~T8^#E{8q#YrV&Z8+?oxY<0C4g;0=K5km4TCHHWL$XJxc%HwsF|v zH(iom7E5l|0glIKph*Ig6R-MyKmgl9en{_5tOB5U-j$$2s9LxZmEmk_UUupA>y2^4 z1XF4z!3LCX95!ub>CM>*SpFreFcrx3xdLn7pahlNsy6~-XOV?bx7q=R6O1U5+xQ1y zP_GJ95!#e(8^`51TV%=o2e!x}bZ?z;9ga65OK#R)fR*o04Ju3pGGnd4nlH+d>)RR- zE|{7~*n7|GfT=5!U03SvG#d-i@Eh!LnBFG4_z z@*7~=mVT*-9~x9hjhe@PvsOwF!@!F_F`#08Tmu-35}3W0TKPJx1<`Qj0b~BVwoc-neOK9vG zGmAK%^&ogqHaoYA5htdEAB2b!b<`|J70lg94T1?}H8WIDE=HiJAA|~x7-gHFIXe+D znJopf6%rv>#1Cxf_BH{}l_2OG_PUl|Fyk{qM+w@mw*$N;t*ipYhq79F%g3K>5kC~5 z2+6%#Pf%bfNzC|}tr$^OJDrcS3GPOZ9exAQq-w- zX!xk_(Mn5Xe>}(U+U#x;T5{{MbNctDLdA*oi-cn7oy-zO7m@qvS~TCp^rc zC!r=cN=L8OR3NyK0XPLQA-8Gf1qg+U5_g^~T3L@h7~aPA zJ;^^u8YJm+Z~N0R4LC9nfCyfc8~}dNg)UwCC%Qs> zkz)V?R1AP3Y)ymCwif;A7#YEihPRvH!?oVh>-7oYJbgI&QVLs=&;cl!HYk literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? 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 0000000000000000000000000000000000000000..2d29b9289d63af44824a1622549ad5421770c555 GIT binary patch literal 1456 zcmV;h1yA}?Nk&Gf1pok7MM6+kP&iDS1pojq*T6LZ717J$k;bNbrq zaSwQ{ll^hwWmZ!1H4JnRC~TGZI?*>o ziP<@)t4BV}%CuXqRTRZ|fI+|KngkWFxu+G2S5T@UW}uRyz9LpHu{pc1FqIkVo<-{k9)>F_?YoMSpF=G& zE;ZreW9AN&o}WWZ|yDF@dxMb*b}=x44j zWF~*vYu^eg`8#YtK8WIBALAWGF>2g*sLU5uPRBCvwfGq*$b8EtBSok_`2rj$co?-= zt_09oXT9>rDM**?Kxq2mg}#(>Eitj?tlVZ9PGNcFbMSda=u4@oA{5r12HQ;2)1>RR z<1@}X&^(Q5m&69Ma$RH@+QQo;0Y#^nk3(9=^ej8Gw zcpFlD4KuJnvy3t+w=Xv2TXHicz+rA*q1k~{)P^z(EkltiLxJX3QU+=^#0SMGhE&mp z#Hj00B6D+rCW>^l4Oe|i`7}KXG?V|4)L}hss5vH~uB?<0J2bzOMt(*cI;{ukC5E=M zdXSdhoD|i9N&ZM0^%=3LOMa3xmR@t&x%wEAx~K;>=X^q%_>1Ox>6?&CV#D{5BI}Uf zRCSG^`##j9{HVUz6K4+YoZcg z9ujg?B2aj0i+`X4lB}RqQ%w2}pKDs7cU(`#_dc5J`c=cwa3i*FPggF)leNM4zprB7P3Xc*lC>PlTQFV~IiU z#luLH?`Mq1`35BsS!A2R@1>RUyqu0C0rUi*sYs4$I=}s#>q~(KqQ3Al$xuP6Hk2JT zm_C(JzQMMImbnt9YC;Jxu&j-8GtM{IHP3SU0ac|hpIX(@aWm2v+O&B-s182MqLz+_ zu^#%K?U{A@{lKck*GH^rJiUx|VOwS#J^^;P4)ip#r1AVR-UFPA9WxDI2C!dNF|y&# zhSJA~KWW2GKSGv;>PklDqUx28G4G?V=KhHf9kicUFg6ucxBQHHc~cX8u?%eKsGVu% z#6ubP9@}Q-SqA>9hfJ(fb4bW>eiP3!^r=wJ(C24ZeaP5x7wyzH(mOHu?<}!d*Z)=c zf*yBNPhBHE6T_br^g%uUAB7*Es%MycVh1d{myWI9bpdX>TsjJ~6DC2OZ&@`j!z0{) zTRa}ML9c}!@$I>%Q}Hm$#?=+LrQ=cQ_gdK*6M=q1i_OT*9k`kN(E2)8cF2UFGYn68 z_;8otT`9et8#`s88AgcchkM$-+J^q0Xq~mt7la_gQ@x{qe+=Ocksl9r!t0sW%EP4E& K$Nzc!zp6LyvDlOV literal 0 HcmV?d00001 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 1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f..5d46a9c901dbdf6c281e36793693c73a90ef3b7b 100644 GIT binary patch literal 3684 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 Csy-qB literal 3918 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 literal 2884 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 C&1dKU literal 0 HcmV?d00001 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 9287f5083623b375139afb391af71cc533a7dd37..04544edde12051bf5a8462c599afbf38b891b866 100644 GIT binary patch literal 5926 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 IP3~M307Ji*5&!@I literal 5914 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeN=tyIF%OGhb#MQ|TY@|9{%PIcv7p9A+l9@u&+as4C2OyD*bd;R$L^ z6S|!#%#4~aY?zr*VP?{G?KYBRSDE~y`Uzm-Y1n&O@jv=G5F^=c+njRF637pLzD-S7K8D|Kh&*vzs^DP%?U!|Gms=Htso8wIigtfg#J$e&)Oz{7x0IixPY3l1Fd~OlpZ5~ z$V3c%=?UU9GmpP?UMqZ!WA3wA`)4d-X7&Xg@Q+x`JlcA^k_VK$JNm8{C0Ug0P_kX~ z?+#Hs7b6Rq-Mgb*&Fe}ALi$@Whp0kkC3RYBmF#kDc2Ur^*`21TwN|Nj zF^7m2GrwZ(`bzRB3CMW+`u4b%(~$6DG_qK3v`Y5udmJg#mt7My!qhK|1?8uJ2lhTB!Q~Xb~K~xUMBxdpkXDw+%l*spdR+ z5C`y!0zkUvVY}~f1l_k=NqH=YQHV)g^MOrC@>n&M3jl&K7~-JrL#pIAnxw87s;PeF z+RG3CKWGf&_h6E8ZGlR*5yjShwdKYuE@>UWV)zmOQ%xo8eI>({6uHvYLv@aPq~xe} z0VmSQF#xz~%Hc|KP^IpRGvA)6zmx0O=ZGA)SUq1&2BfO;Y2e z23n*VsH&(aQ^jG1#kOT%^2E+1+k2GkYt@0ZCe~h9?ZeVz>-Fa}E@4hmOn}QAb6U zDveY8`a9=)G+%M#wc22&fC1`&8LPI#KNN3knAoiuQm28X^_{uju-EoVF6NM9OZ3&d zJcnXP_8@P?ktQf`(Z5(Vc)Vt!$FZYwJ&jl3l1^6BXw5$SBcsLyX~J9vUa#a*k5Zej z?UoHAX2!7-6*z<10BzRfK|UENk9d~1)1Ek^gRhGan?6d^XatK_|KmBcV=g2s*$5%` zhlo~)T)b%t$f{sUmglp(^oN2`~8Z@wRNx$Pc<73oDO6?I`*s#*}AGx?Mj8;4R z+F{p?x^^OfIDCy2P%*PYM=s(xwe{zmqGq4++-H*Y5o0tAtTB0XZ=6yq4;*o=2)x4z zRt;eyR<2tJ>%ILxb}eb5%A~6b>bF)5$4Is1iaG#-<`-()BY2q6_joS!gLKbn-O!07 zP&UUBHMLD<3*ciE{Q4UWDm3!9T}O=oZ7|JN^dzquDv7wf14k8lI$i*8v7!MMoXfu_ zhfh){)0baKWYeta>UoZU$pB$fM}jJjqHX2yNooqT-5d*vJ~Kfsd%}3@6^(FU%kt*1 z>E%Z<&rA}|O#9@CYGCvIhZ_ZQl3F;t^_py2CP__`>@XX|D~zOxih&1yg6-+kKP0i8 zA9ddWwx`V>W5A{SZ^ClDyS`L%gxHiI9xXKl$Vp4);K9euAj!>;G+Pl?Zlsy|GpPC@ zEO*=Qmrf3sx)Ri5dn-)(JG{pZph*Dk-AfEwH1Y)KQkU}S&x!r_19kjQCRtdx|0NI) z8@v7j_?v_Cx6P0RikKQK{d4Mlv2%q*&YhTa?0(owC+d0Wo(%hl4bv=RFMz6lXrSli zd3V?hHoiRz)L_nY^t>W%g;^wK1g%&?5V22|}sEmA!%W~#7gsj}hReH>h(t?z2juYX{L+p0=~ zi72_j(mwe(?KyO$0CnBrI~LY2I}$8R?E16J+-(QY3oEd2_!^+&ox4wehgKR0;)U9( zFP*#*2P-WZ*57G=!j^Stf9cE;w^|XlgC?r}$cg(e1@Zr8N+tiH0|vG~5x@j%vo*uU zDFg_&RE`|=Ii7<*_!R?kyi#Gj<3HH9B#k+iDg!yZRA2QmK-LToyAGzT@!=&>9Gc@j zE`@2U@!=mrfhuaQch>;`@yTFH_w^F-PEJ!#Lk@4Y;-NSodzL{|-p@3i$?d8`5#ahyWna1$cvL!}7P*PHWP zRM@lBYkT(22^eld#rEl*Q_0-1M!29Kdv4F#n!e>GWT@guS@V3xDh@P3f(^Q{>ke#< zzVI=jLj^~YlBY9O@k=I1@If{#D_OeGtA7b0+b1rCrP6&p6eD!_)$EK_>q6C@~CZp!NJEa?Ttuyx%YUqmnq*CU4HyJteTCGW{0mnITM988471AiP zJco=Pvn(r1(`WmcgdSR`kYb9O%+GNmf)1;*P>Q8DBm~hyg?Q7`JXsADMP^CrP89EI zJC+DV8A>uusJZP_rPiM+_G z4MvouwnvmYjcNnM=yk%2gedxGoPx0V@k)_VrHbP(Vegq^Ayknk`9`S|a%r4g30e1_ zwZDK4|H(WHw#c)*o5LoliJmK=%dl)uumcXm7rBvd$aRp308w%ygq>KVZIG5LnrFrs zxs`7X-6kl6kDX99w_w|JYdGh}a7HfWA9UTcjt>w)7tqltdSG@Z#LC_A>&18 zTR+EpOm({%7QB%|OT&)k{L)tlaX)5x4$f;&G{PL&`0*Z-0ety~P-pmTorMOtBTI%o zx|fhgGWr%l7gJ5iPTG|OKF#-tQj(P>N_N{?sJ7wTBO|>810b9?sy|Ii`XEZT8uQQ4 z?HZZ_6^{S_0f6xU*e$11qO_c#QsNFk=mB620ss{7q{L0vM(xTZY4`?(IxNIzW+;Yq zsBy8TLe~V=HGAlxB#*7d0wdOYbv$@L!yuUlzygppd^!06wi}vbXNsX1em7HPN`m8y*-wW=o0SW*d03A4p0o28uM(SY#*W|g9 z7AxOgO$Bn}J$ukOonJ7pi2x|TQ2?L-Fcr(NSc?^06Fhi39d3W{lU)n#vvmF@z(LrK z42r~i5!fpLv;f|@mZoYk!(QE$S6+GLE49D!$}6vIo32462ju!|9>C{~RbTWH00bkH z;1>WY01wz{01OWJ4BsBL#X8*YdQHnZxF%2%C>iwMZCQtgpP-sD6l!`Hw%zNWne**q z>;4i51~!QYzyuHhTOF`9KjT2qi0#&t?`f%6$LC5O|7$Vq)mUBCn4Oxh#^S2Q?5O1U zKP%rq%OkdHivz*W{I$zH3%$fJN(p=ba(ps?#+mp$=zyOC{(T{A&}UaL=yxv~^1hYo ze#rY)Hg|*HSM2cMwriXmU+D*egC+Z=9iI%K0x&ugUx$sK1HL<~Am9$?zw1o=o>_cy z-2NpK#$vKx+AjhKZa4@)2Ve#^zRtwonFKhKK+P{Y4cPeXaLGY8Z1rOMm&~AHF`1us z062dGNCD)F4_ZU}2Q5DQ`@h3Z>Ssn6ub3dZ^~%nRApn1?zqP;Bnc<6_D{qYgBaB*1 z7X9L-?R5cY@4nm7_`C1EyKX!6eu*+8j9tV8SrYmFFPiuLD9HjN!aY#L7!wfC7$d?x KR|v>6y9fYuD%=|Y literal 3844 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 K_}}n<_Xh}l=o(T0 literal 0 HcmV?d00001 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 9126ae37cbc3587421d6889eadd1d91fbf1994d4..a228ba7fd7cc63479b8d17045c58316f5f100f5a 100644 GIT binary patch literal 8262 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 literal 7778 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s 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 @@