diff --git a/keyword/chapter07/keyword.md b/keyword/chapter07/keyword.md
new file mode 100644
index 0000000..4c65293
--- /dev/null
+++ b/keyword/chapter07/keyword.md
@@ -0,0 +1,41 @@
+- Database (DB)
+ - Database의 정의는 무엇일까요?
+ - 데이터를 체계적으로 저장하고 관리하는 시스템. 여러 데이터를 빠르게 조회, 삽입, 수정, 삭제할 수 있도록 도움
+ - Database는 어디서 주로 사용될까요?
+ - 웹 서비스, 모바일 앱, IoT 기기 등 데이터를 저장하고 활용하는 모든 곳에서 사용됨
+- Database Management System (DBMS)
+ - DBMS란 무엇일까요?
+ - 데이터를 효율적으로 관리하고 사용할 수 있도록 해주는 소프트웨어 시스템. 데이터의 저장, 조화, 수정, 삭제 등의 작업을 지원
+ - 대표적인 DBMS는 무엇이 있을까요?
+ - MySQL, PostgreSQL 등
+ - 관계형 저장 방식은 무엇일까요?
+ - 테이블 형태로 데이터를 저장하며, 데이터 간의 관계를 외래 키(foreign key) 등을 통해 표현
+ - 관계형이 아닌 저장 방식에는 무엇이 있을까요?
+ - 데이터를 JSON 형식, Key-Value 형식 등으로 저장하며, 관계형 제약이 적음. (e.g. MongoDB)
+ - SQL이란 무엇일까요?
+ 1. DDL(Data Definition Language)
+ - 데이터베이스 구조를 정의하는 언어 (`CREATE`, `DROP` 등)
+ 2. DML(Data Manipulation Language)
+ - 데이터베이스에 저장된 데이터를 조작하는 언어 (`INSERT`, `UPDATE`, `DELETE`)
+ 3. ~~DCL(Data Control Language)~~
+- Key-Value 구조
+ - Java나 Kotlin에서 Key-Value를 사용하는 대표적인 자료 구조는 무엇인가요?
+ - `HashMap`, `Map` 등
+ - 해당 구조의 특징에는 무엇이 있을까요?
+ - Key와 Value의 쌍으로 데이터를 저장하며, Key를 통해 빠르게 Value를 조회할 수 있음
+ - 배열이나 리스트가 아닌 경우 하나의 Key에 여러 값을 넣을 수 있을까요?
+ - 일반적으로 Key-Value 구조는 하나의 Key에 하나의 Value만 저장하지만, 값에 `List`나 `Set` 등을 저장하여 여러 값을 가질 수 있음
+- SharedPreferences
+ - 하나의 Key에 여러 값을 넣는 방법이 있을까요? (Hint: JSON)
+ - JSON 형식으로 데이터를 직렬화하여 하나의 Key에 여러 값을 저장할 수 있음
+- RoomDB
+ - RoomDB는 무엇일까요?
+ - 안드로이드에서 SQLite 데이터베이스를 편리하게 사용하도록 돕는 ORM 라이브러리
+ - RoomDB 개발 이전에 사용하였고, 현재 RoomDB의 기반인 DBMS는 무엇일까요? → SQLite 기반
+ - RoomDB는 어떤 방식으로 값을 저장할까요?
+ - RoomDB는 테이블 구조로 데이터를 저장하며, DAO를 통해 데이터를 조작함
+- Firebase
+ - Firebase는 무엇이고 왜 사용할까요?
+ - Google에서 제공하는 모바일 및 웹 애플리케이션 개발 플랫폼
+ - Firebase에서 제공해주는 기능은 어떤 것이 있나요?
+ - 실시간 데이터베이스, 사용자 인증, 클라우드 스토리지, 푸시 알림, 애널리틱스, 원격 설정, 앱 배포 등의 다양한 기능을 제공
\ No newline at end of file
diff --git a/keyword/chapter08/keyword.md b/keyword/chapter08/keyword.md
new file mode 100644
index 0000000..7b392c5
--- /dev/null
+++ b/keyword/chapter08/keyword.md
@@ -0,0 +1,46 @@
+- OAuth2 방식
+ - OAuth2란 무엇일까요?
+ - Open Authorization 2.0, 인터넷 사용자들이 애플리케이션 또는 서비스에 접근할 수 있도록 인증을 제공하는 프로토콜. 사용자가 애플리케이션의 비밀번호를 직접 입력하지 않고, 신뢰할 수 있는 인증 기관(Google, Facebook 등)을 통해 권한을 부여
+ - 우리 주변에서 OAuth2 방식이 주로 사용되는 곳은 어디일까요? (Hint: 간편 로그인)
+ - 간편 로그인(소셜 로그인): Google, Facebook, GitHub, Twitter 계정을 사용하여 타사 앱에 로그인
+ - 토큰이란 무엇일까요?
+ - 토큰은 권한을 확인하기 위해 발급되는 교유한 문자열. OAuth2에서 클라이언트와 서버 간의 인증 및 데이터 요청 시 사용됨
+ - OAuth2에서 사용되는 토큰은 어떤 것이 있고, 각각 어떤 용도일까요?
+ 1. Access Token
+ - 보호된 리소스에 접근하기 위한 토큰. 제한된 기간동안 유효하며, 주로 클라이언트가 서버로 요청할 때 사용됨
+ 2. Refresh Token
+ - Access Token이 만료되었을 때 새 Access Token을 발급받기 위해 사용됨. 보통 더 긴 유효기간을 가짐
+ - OAuth2 방식의 장점과 단점은 무엇일까요?
+ - 장점
+ - 비밀번호를 공유하지 않아도 안전하게 권한을 위임할 수 있음
+ - 여러 애플리케이션 간 권한 관리 용이
+ - 단점
+ - 구현 복잡성
+ - 토큰이 탈취될 경우 보안 위험있음
+- Cookie와 Session
+ - Cookie란 무엇일까요?
+ - 쿠키는 사용자의 웹 브라우저에 저장되는 작은 데이터 조각으로, 웹사이트가 사용자의 정보를 유지하거나 사용자 추적을 위해 사용됨
+ - Cookie는 어떤 형식으로 이루어져 있나요?
+ - Key-Value 쌍으로 이루어져 있으며 옵션으로는 유효 기간, 도메인, 경로, 보안 속성 등이 포함
+ - Session이란 무엇일까요?
+ - 서버에 저장된 클라이언트 상태 정보를 관리하기 위한 방법. 사용자가 웹사이트에 접속하면 고유의 세션 ID가 발급되며, 서버는 해당 세션 ID를 기반으로 데이터를 식별
+ - Cookie와 Session을 사용하는 이유는 무엇일까요?
+ - 웹이 stateless 프로토콜이기 때문에, 상태 정보를 유지하려면 추가적인 메커니즘이 필요함
+ - Cookie와 Session의 차이는 무엇일까요?
+ - Cookie : 클라이언트(브라우저)에 저장. 데이터가 노출될 위험 있음
+ - Session: 서버에 저장. 클라이언트에는 세션 ID만 전달. 더 안전함
+- JWT 방식
+ - JWT (JSON Web Token)은 무엇일까요?
+ - JWT는 클라이언트와 서버 간의 데이터 교환에 사용되는 JSON 기반의 토큰. 클라이언트는 서버로부터 JWT를 발급받고, 이후 요청 시 이를 포함하여 인증
+ - JWT 방식의 토큰은 어떤 구조로 되어있고, 각각 어떤 용도로 사용되나요?
+ 1. Header : 토큰의 타입과 서명 알고리즘 정보
+ 2. Payload : 사용자 정보와 기타 데이터
+ 3. Signature : Header와 Payload를 암호화한 값. 토큰의 무결성을 검증함
+ - JWT 방식의 장점과 단점은 무엇일까요?
+ - 장점
+ - 토큰 자체에 데이터를 포함하므로 서버에 상태 정보를 저장할 필요가 없음
+ - 다양한 클라이언트(모바일, 웹 등) 에서 사용 가능함
+ - 단점
+ - 토큰이 길어 네트워크 대역폭이 증가할 수 있음
+ - 만료 전 탈취 시 보안 위험성 있음
+ - 토큰 갱신이 어려움
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/.gitignore b/mission/chapter06/recyclertest/.gitignore
new file mode 100644
index 0000000..aa724b7
--- /dev/null
+++ b/mission/chapter06/recyclertest/.gitignore
@@ -0,0 +1,15 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/mission/chapter06/recyclertest/.idea/.gitignore b/mission/chapter06/recyclertest/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/mission/chapter06/recyclertest/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/mission/chapter06/recyclertest/.idea/compiler.xml b/mission/chapter06/recyclertest/.idea/compiler.xml
new file mode 100644
index 0000000..b589d56
--- /dev/null
+++ b/mission/chapter06/recyclertest/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/.idea/deploymentTargetSelector.xml b/mission/chapter06/recyclertest/.idea/deploymentTargetSelector.xml
new file mode 100644
index 0000000..b268ef3
--- /dev/null
+++ b/mission/chapter06/recyclertest/.idea/deploymentTargetSelector.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/.idea/gradle.xml b/mission/chapter06/recyclertest/.idea/gradle.xml
new file mode 100644
index 0000000..0897082
--- /dev/null
+++ b/mission/chapter06/recyclertest/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/.idea/kotlinc.xml b/mission/chapter06/recyclertest/.idea/kotlinc.xml
new file mode 100644
index 0000000..fdf8d99
--- /dev/null
+++ b/mission/chapter06/recyclertest/.idea/kotlinc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/.idea/material_theme_project_new.xml b/mission/chapter06/recyclertest/.idea/material_theme_project_new.xml
new file mode 100644
index 0000000..a04cb93
--- /dev/null
+++ b/mission/chapter06/recyclertest/.idea/material_theme_project_new.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/.idea/migrations.xml b/mission/chapter06/recyclertest/.idea/migrations.xml
new file mode 100644
index 0000000..f8051a6
--- /dev/null
+++ b/mission/chapter06/recyclertest/.idea/migrations.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/.idea/misc.xml b/mission/chapter06/recyclertest/.idea/misc.xml
new file mode 100644
index 0000000..0ad17cb
--- /dev/null
+++ b/mission/chapter06/recyclertest/.idea/misc.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/.gitignore b/mission/chapter06/recyclertest/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/build.gradle.kts b/mission/chapter06/recyclertest/app/build.gradle.kts
new file mode 100644
index 0000000..24398b5
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/build.gradle.kts
@@ -0,0 +1,51 @@
+plugins {
+ alias(libs.plugins.android.application)
+ alias(libs.plugins.kotlin.android)
+}
+
+android {
+ namespace = "com.umc.recyclertest"
+ compileSdk = 35
+
+ defaultConfig {
+ applicationId = "com.umc.recyclertest"
+ minSdk = 24
+ targetSdk = 34
+ versionCode = 1
+ versionName = "1.0"
+
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ isMinifyEnabled = false
+ proguardFiles(
+ getDefaultProguardFile("proguard-android-optimize.txt"),
+ "proguard-rules.pro"
+ )
+ }
+ }
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_1_8
+ targetCompatibility = JavaVersion.VERSION_1_8
+ }
+ kotlinOptions {
+ jvmTarget = "1.8"
+ }
+ buildFeatures {
+ viewBinding = true
+ }
+}
+
+dependencies {
+
+ implementation(libs.androidx.core.ktx)
+ implementation(libs.androidx.appcompat)
+ implementation(libs.material)
+ implementation(libs.androidx.activity)
+ implementation(libs.androidx.constraintlayout)
+ testImplementation(libs.junit)
+ androidTestImplementation(libs.androidx.junit)
+ androidTestImplementation(libs.androidx.espresso.core)
+}
diff --git a/mission/chapter06/recyclertest/app/proguard-rules.pro b/mission/chapter06/recyclertest/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/src/androidTest/java/com/umc/recyclertest/ExampleInstrumentedTest.kt b/mission/chapter06/recyclertest/app/src/androidTest/java/com/umc/recyclertest/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..56e3b9e
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/androidTest/java/com/umc/recyclertest/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.umc.recyclertest
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.umc.recyclertest", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/src/main/AndroidManifest.xml b/mission/chapter06/recyclertest/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..bce9e6c
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/main/AndroidManifest.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/src/main/java/com/umc/recyclertest/Fruit.kt b/mission/chapter06/recyclertest/app/src/main/java/com/umc/recyclertest/Fruit.kt
new file mode 100644
index 0000000..0a66501
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/main/java/com/umc/recyclertest/Fruit.kt
@@ -0,0 +1,7 @@
+package com.umc.recyclertest
+
+data class Fruit(
+ val imageRes : Int,
+ val name: String,
+ val price: Int
+)
diff --git a/mission/chapter06/recyclertest/app/src/main/java/com/umc/recyclertest/FruitAdapter.kt b/mission/chapter06/recyclertest/app/src/main/java/com/umc/recyclertest/FruitAdapter.kt
new file mode 100644
index 0000000..9cbdb6f
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/main/java/com/umc/recyclertest/FruitAdapter.kt
@@ -0,0 +1,32 @@
+package com.umc.recyclertest
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import java.text.DecimalFormat
+
+class FruitAdapter(private val fruitList: List) : RecyclerView.Adapter() {
+ inner class FruitViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+ val fruitImage : ImageView = itemView.findViewById(R.id.fruitImage)
+ val fruitName : TextView = itemView.findViewById(R.id.fruitName)
+ val fruitPrice: TextView = itemView.findViewById(R.id.fruitPrice)
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FruitViewHolder {
+ val itemView = LayoutInflater.from(parent.context)
+ .inflate(R.layout.item_fruit, parent, false)
+ return FruitViewHolder(itemView)
+ }
+
+ override fun getItemCount(): Int = fruitList.size
+
+ override fun onBindViewHolder(holder: FruitViewHolder, position: Int) {
+ val fruit = fruitList[position]
+ holder.fruitImage.setImageResource(fruit.imageRes)
+ holder.fruitName.text = fruit.name
+ holder.fruitPrice.text = DecimalFormat("#,###").format(fruit.price) + "원"
+ }
+}
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/src/main/java/com/umc/recyclertest/MainActivity.kt b/mission/chapter06/recyclertest/app/src/main/java/com/umc/recyclertest/MainActivity.kt
new file mode 100644
index 0000000..520c15d
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/main/java/com/umc/recyclertest/MainActivity.kt
@@ -0,0 +1,38 @@
+package com.umc.recyclertest
+
+import android.os.Bundle
+import androidx.activity.enableEdgeToEdge
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.umc.recyclertest.databinding.ActivityMainBinding
+
+class MainActivity : AppCompatActivity() {
+
+ private lateinit var binding: ActivityMainBinding
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivityMainBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ val fruitList = listOf(
+ Fruit(R.drawable.coupang, "사과", 3000),
+ Fruit(R.drawable.coupang, "바나나", 1500),
+ Fruit(R.drawable.coupang, "오렌지", 2000),
+ Fruit(R.drawable.coupang, "딸기", 5000),
+ Fruit(R.drawable.coupang, "수박", 10000),
+ Fruit(R.drawable.coupang, "포도", 4000),
+ Fruit(R.drawable.coupang, "파인애플", 7000),
+ Fruit(R.drawable.coupang, "망고", 6000),
+ Fruit(R.drawable.coupang, "블루베리", 8000),
+ Fruit(R.drawable.coupang, "복숭아", 3500)
+ )
+
+ binding.mainRv.layoutManager = LinearLayoutManager(this)
+ binding.mainRv.adapter = FruitAdapter(fruitList)
+
+
+ }
+}
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/src/main/res/drawable/coupang.png b/mission/chapter06/recyclertest/app/src/main/res/drawable/coupang.png
new file mode 100644
index 0000000..bfe9cc5
Binary files /dev/null and b/mission/chapter06/recyclertest/app/src/main/res/drawable/coupang.png differ
diff --git a/mission/chapter06/recyclertest/app/src/main/res/drawable/ic_launcher_background.xml b/mission/chapter06/recyclertest/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mission/chapter06/recyclertest/app/src/main/res/drawable/ic_launcher_foreground.xml b/mission/chapter06/recyclertest/app/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/src/main/res/layout/activity_main.xml b/mission/chapter06/recyclertest/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..c39ed29
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/src/main/res/layout/item_fruit.xml b/mission/chapter06/recyclertest/app/src/main/res/layout/item_fruit.xml
new file mode 100644
index 0000000..bb15d52
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/main/res/layout/item_fruit.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mission/chapter06/recyclertest/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/mission/chapter06/recyclertest/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..6f3b755
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/mission/chapter06/recyclertest/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..6f3b755
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/mission/chapter06/recyclertest/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
Binary files /dev/null and b/mission/chapter06/recyclertest/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/mission/chapter06/recyclertest/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/mission/chapter06/recyclertest/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
Binary files /dev/null and b/mission/chapter06/recyclertest/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/mission/chapter06/recyclertest/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/mission/chapter06/recyclertest/app/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000..4f0f1d6
Binary files /dev/null and b/mission/chapter06/recyclertest/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/mission/chapter06/recyclertest/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/mission/chapter06/recyclertest/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..62b611d
Binary files /dev/null and b/mission/chapter06/recyclertest/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/mission/chapter06/recyclertest/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/mission/chapter06/recyclertest/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000..948a307
Binary files /dev/null and b/mission/chapter06/recyclertest/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/mission/chapter06/recyclertest/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/mission/chapter06/recyclertest/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..1b9a695
Binary files /dev/null and b/mission/chapter06/recyclertest/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/mission/chapter06/recyclertest/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/mission/chapter06/recyclertest/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..28d4b77
Binary files /dev/null and b/mission/chapter06/recyclertest/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/mission/chapter06/recyclertest/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/mission/chapter06/recyclertest/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9287f50
Binary files /dev/null and b/mission/chapter06/recyclertest/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/mission/chapter06/recyclertest/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/mission/chapter06/recyclertest/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..aa7d642
Binary files /dev/null and b/mission/chapter06/recyclertest/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/mission/chapter06/recyclertest/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/mission/chapter06/recyclertest/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9126ae3
Binary files /dev/null and b/mission/chapter06/recyclertest/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/mission/chapter06/recyclertest/app/src/main/res/values-night/themes.xml b/mission/chapter06/recyclertest/app/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..be34e0e
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/main/res/values-night/themes.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/src/main/res/values/colors.xml b/mission/chapter06/recyclertest/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..c8524cd
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/main/res/values/colors.xml
@@ -0,0 +1,5 @@
+
+
+ #FF000000
+ #FFFFFFFF
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/src/main/res/values/strings.xml b/mission/chapter06/recyclertest/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..3c094d2
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ recyclertest
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/src/main/res/values/themes.xml b/mission/chapter06/recyclertest/app/src/main/res/values/themes.xml
new file mode 100644
index 0000000..1201097
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/main/res/values/themes.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/src/main/res/xml/backup_rules.xml b/mission/chapter06/recyclertest/app/src/main/res/xml/backup_rules.xml
new file mode 100644
index 0000000..fa0f996
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/src/main/res/xml/data_extraction_rules.xml b/mission/chapter06/recyclertest/app/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 0000000..9ee9997
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/app/src/test/java/com/umc/recyclertest/ExampleUnitTest.kt b/mission/chapter06/recyclertest/app/src/test/java/com/umc/recyclertest/ExampleUnitTest.kt
new file mode 100644
index 0000000..efb15c6
--- /dev/null
+++ b/mission/chapter06/recyclertest/app/src/test/java/com/umc/recyclertest/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.umc.recyclertest
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/build.gradle.kts b/mission/chapter06/recyclertest/build.gradle.kts
new file mode 100644
index 0000000..922f551
--- /dev/null
+++ b/mission/chapter06/recyclertest/build.gradle.kts
@@ -0,0 +1,5 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+plugins {
+ alias(libs.plugins.android.application) apply false
+ alias(libs.plugins.kotlin.android) apply false
+}
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/gradle.properties b/mission/chapter06/recyclertest/gradle.properties
new file mode 100644
index 0000000..20e2a01
--- /dev/null
+++ b/mission/chapter06/recyclertest/gradle.properties
@@ -0,0 +1,23 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. For more details, visit
+# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Kotlin code style for this project: "official" or "obsolete":
+kotlin.code.style=official
+# Enables namespacing of each library's R class so that its R class includes only the
+# resources declared in the library itself and none from the library's dependencies,
+# thereby reducing the size of the R class for that library
+android.nonTransitiveRClass=true
\ No newline at end of file
diff --git a/mission/chapter06/recyclertest/gradle/libs.versions.toml b/mission/chapter06/recyclertest/gradle/libs.versions.toml
new file mode 100644
index 0000000..04e14fb
--- /dev/null
+++ b/mission/chapter06/recyclertest/gradle/libs.versions.toml
@@ -0,0 +1,26 @@
+[versions]
+agp = "8.6.0"
+kotlin = "1.9.0"
+coreKtx = "1.15.0"
+junit = "4.13.2"
+junitVersion = "1.2.1"
+espressoCore = "3.6.1"
+appcompat = "1.7.0"
+material = "1.12.0"
+activity = "1.9.3"
+constraintlayout = "2.2.0"
+
+[libraries]
+androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
+junit = { group = "junit", name = "junit", version.ref = "junit" }
+androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
+androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
+androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
+material = { group = "com.google.android.material", name = "material", version.ref = "material" }
+androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
+androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
+
+[plugins]
+android-application = { id = "com.android.application", version.ref = "agp" }
+kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
+
diff --git a/mission/chapter06/recyclertest/gradle/wrapper/gradle-wrapper.jar b/mission/chapter06/recyclertest/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..e708b1c
Binary files /dev/null and b/mission/chapter06/recyclertest/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/mission/chapter06/recyclertest/gradle/wrapper/gradle-wrapper.properties b/mission/chapter06/recyclertest/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..5ef9830
--- /dev/null
+++ b/mission/chapter06/recyclertest/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Thu Oct 31 22:53:21 KST 2024
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/mission/chapter06/recyclertest/gradlew b/mission/chapter06/recyclertest/gradlew
new file mode 100644
index 0000000..4f906e0
--- /dev/null
+++ b/mission/chapter06/recyclertest/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/mission/chapter06/recyclertest/gradlew.bat b/mission/chapter06/recyclertest/gradlew.bat
new file mode 100644
index 0000000..107acd3
--- /dev/null
+++ b/mission/chapter06/recyclertest/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/mission/chapter06/recyclertest/settings.gradle.kts b/mission/chapter06/recyclertest/settings.gradle.kts
new file mode 100644
index 0000000..3ef69b9
--- /dev/null
+++ b/mission/chapter06/recyclertest/settings.gradle.kts
@@ -0,0 +1,23 @@
+pluginManagement {
+ repositories {
+ google {
+ content {
+ includeGroupByRegex("com\\.android.*")
+ includeGroupByRegex("com\\.google.*")
+ includeGroupByRegex("androidx.*")
+ }
+ }
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+rootProject.name = "recyclertest"
+include(":app")
diff --git a/mission/chapter08/login_practice/.gitignore b/mission/chapter08/login_practice/.gitignore
new file mode 100644
index 0000000..aa724b7
--- /dev/null
+++ b/mission/chapter08/login_practice/.gitignore
@@ -0,0 +1,15 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/mission/chapter08/login_practice/.idea/.gitignore b/mission/chapter08/login_practice/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/mission/chapter08/login_practice/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/mission/chapter08/login_practice/.idea/compiler.xml b/mission/chapter08/login_practice/.idea/compiler.xml
new file mode 100644
index 0000000..b589d56
--- /dev/null
+++ b/mission/chapter08/login_practice/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mission/chapter08/login_practice/.idea/deploymentTargetSelector.xml b/mission/chapter08/login_practice/.idea/deploymentTargetSelector.xml
new file mode 100644
index 0000000..b268ef3
--- /dev/null
+++ b/mission/chapter08/login_practice/.idea/deploymentTargetSelector.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+