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/chapter08/login_practice/app/src/main/res/values/colors.xml b/mission/chapter08/login_practice/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..c8524cd --- /dev/null +++ b/mission/chapter08/login_practice/app/src/main/res/values/colors.xml @@ -0,0 +1,5 @@ + + + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/mission/chapter08/login_practice/app/src/main/res/values/strings.xml b/mission/chapter08/login_practice/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..09ed5ad --- /dev/null +++ b/mission/chapter08/login_practice/app/src/main/res/values/strings.xml @@ -0,0 +1,14 @@ + + login_practice + Sign Up Page + Input your name + Input your password + Input your email + Sign up + Do you already have an account? + Login + Login Page + Log in + Don\'t have an account? + Register + \ No newline at end of file diff --git a/mission/chapter08/login_practice/app/src/main/res/values/themes.xml b/mission/chapter08/login_practice/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..b99df6b --- /dev/null +++ b/mission/chapter08/login_practice/app/src/main/res/values/themes.xml @@ -0,0 +1,9 @@ + + + + +