From beafddcf375b7d2c59cc4b5a8032632bccacf643 Mon Sep 17 00:00:00 2001
From: Lemon0610 <92876763+Lemon0610@users.noreply.github.com>
Date: Wed, 6 May 2026 13:00:29 +0900
Subject: [PATCH 1/4] =?UTF-8?q?feat:=206=EC=A3=BC=EC=B0=A8=20=EB=AF=B8?=
=?UTF-8?q?=EC=85=98=5F=EB=A0=88=EB=AA=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 94 -
Week2/app/build.gradle.kts | 53 -
.../java/com/example/week2/BuyAllFragment.kt | 23 -
.../java/com/example/week2/HomeFragment.kt | 23 -
.../java/com/example/week2/MainActivity.kt | 62 -
.../java/com/example/week2/ProfileFragment.kt | 23 -
.../com/example/week2/WishlistFragment.kt | 23 -
.../res/layout/bottom_navigation_view.xml | 10 -
.../src/main/res/layout/fragment_buy_all.xml | 6 -
.../app/src/main/res/layout/fragment_home.xml | 37 -
.../src/main/res/layout/fragment_profile.xml | 6 -
.../src/main/res/layout/fragment_wishlist.xml | 15 -
Week2/app/src/main/res/values/strings.xml | 17 -
Week2/build.gradle.kts | 4 -
{Week2 => Week3}/.gitignore | 0
{Week2 => Week3}/app/.gitignore | 0
Week3/app/build.gradle.kts | 83 +
{Week2 => Week3}/app/proguard-rules.pro | 0
.../example/week3}/ExampleInstrumentedTest.kt | 4 +-
.../app/src/main/AndroidManifest.xml | 6 +-
.../java/com/example/week3/BuyAllFragment.kt | 42 +
.../java/com/example/week3}/BuyFragment.kt | 6 +-
.../com/example/week3}/BuyShoesFragment.kt | 4 +-
.../com/example/week3}/BuyTopsFragment.kt | 4 +-
.../com/example/week3/FollowingAdapter.kt | 35 +
.../java/com/example/week3/HomeFragment.kt | 42 +
.../java/com/example/week3/LocalRepository.kt | 48 +
.../java/com/example/week3/MainActivity.kt | 30 +
.../java/com/example/week3/MainViewModel.kt | 63 +
.../java/com/example/week3/MyApplication.kt | 9 +
.../java/com/example/week3/ProductAdapter.kt | 58 +
.../java/com/example/week3/ProductData.kt | 11 +
.../java/com/example/week3/ProfileFragment.kt | 38 +
.../com/example/week3/RemoteRepository.kt | 13 +
.../main/java/com/example/week3/ReqResData.kt | 19 +
.../java/com/example/week3/ReqResService.kt | 12 +
.../example/week3}/ShoppingcartFragment.kt | 4 +-
.../com/example/week3/WishlistFragment.kt | 43 +
.../java/com/example/week3/di/LocalModule.kt | 19 +
.../com/example/week3/di/NetworkModule.kt | 45 +
.../src/main/res/color/wish_heart_tint.xml | 5 +
Week3/app/src/main/res/drawable/bg_circle.xml | 5 +
.../src/main/res/drawable/ic_bag_simple.png | Bin
Week3/app/src/main/res/drawable/ic_event.xml | 9 +
.../main/res/drawable/ic_heart_straight.png | Bin
.../src/main/res/drawable/ic_house_simple.png | Bin
.../res/drawable/ic_launcher_background.xml | 0
.../res/drawable/ic_launcher_foreground.xml | 0
.../res/drawable/ic_list_magnifying_glass.png | Bin
Week3/app/src/main/res/drawable/ic_order.xml | 9 +
Week3/app/src/main/res/drawable/ic_pass.xml | 9 +
.../app/src/main/res/drawable/ic_setting.xml | 9 +
.../app/src/main/res/drawable/ic_user.png | Bin
.../src/main/res/drawable/ic_wish_heart.xml | 13 +
.../main/res/drawable/ic_wish_heart_fill.xml | 13 +
Week3/app/src/main/res/drawable/image1.png | Bin 0 -> 45806 bytes
Week3/app/src/main/res/drawable/image2.png | Bin 0 -> 13308 bytes
Week3/app/src/main/res/drawable/image3.png | Bin 0 -> 25847 bytes
Week3/app/src/main/res/drawable/image4.png | Bin 0 -> 3096 bytes
.../app/src/main/res/drawable/img_avatar.png | Bin 0 -> 1374 bytes
.../src/main/res/drawable/img_bag_circle.png | Bin
.../app/src/main/res/drawable/img_home.png | Bin
Week3/app/src/main/res/drawable/img_nemo.png | Bin 0 -> 386 bytes
.../app/src/main/res/layout/activity_main.xml | 16 +-
.../app/src/main/res/layout/fragment_buy.xml | 3 +-
.../src/main/res/layout/fragment_buy_all.xml | 12 +
.../main/res/layout/fragment_buy_shoes.xml | 3 +-
.../src/main/res/layout/fragment_buy_tops.xml | 3 +-
.../app/src/main/res/layout/fragment_home.xml | 65 +
.../src/main/res/layout/fragment_profile.xml | 190 +
.../main/res/layout/fragment_shoppingcart.xml | 3 +-
.../src/main/res/layout/fragment_wishlist.xml | 22 +
.../src/main/res/layout/item_following.xml | 22 +
.../src/main/res/layout/item_grid_product.xml | 64 +
.../src/main/res/layout/item_product_home.xml | 30 +
.../src/main/res/layout/item_wish_product.xml | 45 +
.../app/src/main/res/menu/bottom_nav_menu.xml | 0
.../res/mipmap-anydpi-v26/ic_launcher.xml | 0
.../mipmap-anydpi-v26/ic_launcher_round.xml | 0
.../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin
.../res/mipmap-hdpi/ic_launcher_round.webp | Bin
.../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin
.../res/mipmap-mdpi/ic_launcher_round.webp | Bin
.../main/res/mipmap-xhdpi/ic_launcher.webp | Bin
.../res/mipmap-xhdpi/ic_launcher_round.webp | Bin
.../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin
.../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin
.../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin
.../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin
.../app/src/main/res/navigation/nav_graph.xml | 10 +-
.../app/src/main/res/values-night/themes.xml | 2 +-
.../app/src/main/res/values/colors.xml | 1 +
Week3/app/src/main/res/values/strings.xml | 40 +
.../app/src/main/res/values/themes.xml | 4 +-
.../app/src/main/res/xml/backup_rules.xml | 0
.../main/res/xml/data_extraction_rules.xml | 0
.../com/example/week3}/ExampleUnitTest.kt | 2 +-
Week3/build.gradle.kts | 7 +
{Week2 => Week3}/gradle.properties | 4 +-
.../gradle/gradle-daemon-jvm.properties | 0
{Week2 => Week3}/gradle/libs.versions.toml | 0
.../gradle/wrapper/gradle-wrapper.jar | Bin
.../gradle/wrapper/gradle-wrapper.properties | 6 +-
{Week2 => Week3}/gradlew | 0
{Week2 => Week3}/gradlew.bat | 0
Week3/hs_err_pid32732.log | 2522 ++
Week3/replay_pid32732.log | 23127 ++++++++++++++++
{Week2 => Week3}/settings.gradle.kts | 3 +-
pull_request_template.md | 19 -
109 files changed, 26881 insertions(+), 450 deletions(-)
delete mode 100644 README.md
delete mode 100644 Week2/app/build.gradle.kts
delete mode 100644 Week2/app/src/main/java/com/example/week2/BuyAllFragment.kt
delete mode 100644 Week2/app/src/main/java/com/example/week2/HomeFragment.kt
delete mode 100644 Week2/app/src/main/java/com/example/week2/MainActivity.kt
delete mode 100644 Week2/app/src/main/java/com/example/week2/ProfileFragment.kt
delete mode 100644 Week2/app/src/main/java/com/example/week2/WishlistFragment.kt
delete mode 100644 Week2/app/src/main/res/layout/bottom_navigation_view.xml
delete mode 100644 Week2/app/src/main/res/layout/fragment_buy_all.xml
delete mode 100644 Week2/app/src/main/res/layout/fragment_home.xml
delete mode 100644 Week2/app/src/main/res/layout/fragment_profile.xml
delete mode 100644 Week2/app/src/main/res/layout/fragment_wishlist.xml
delete mode 100644 Week2/app/src/main/res/values/strings.xml
delete mode 100644 Week2/build.gradle.kts
rename {Week2 => Week3}/.gitignore (100%)
rename {Week2 => Week3}/app/.gitignore (100%)
create mode 100644 Week3/app/build.gradle.kts
rename {Week2 => Week3}/app/proguard-rules.pro (100%)
rename {Week2/app/src/androidTest/java/com/example/week2 => Week3/app/src/androidTest/java/com/example/week3}/ExampleInstrumentedTest.kt (86%)
rename {Week2 => Week3}/app/src/main/AndroidManifest.xml (81%)
create mode 100644 Week3/app/src/main/java/com/example/week3/BuyAllFragment.kt
rename {Week2/app/src/main/java/com/example/week2 => Week3/app/src/main/java/com/example/week3}/BuyFragment.kt (94%)
rename {Week2/app/src/main/java/com/example/week2 => Week3/app/src/main/java/com/example/week3}/BuyShoesFragment.kt (86%)
rename {Week2/app/src/main/java/com/example/week2 => Week3/app/src/main/java/com/example/week3}/BuyTopsFragment.kt (86%)
create mode 100644 Week3/app/src/main/java/com/example/week3/FollowingAdapter.kt
create mode 100644 Week3/app/src/main/java/com/example/week3/HomeFragment.kt
create mode 100644 Week3/app/src/main/java/com/example/week3/LocalRepository.kt
create mode 100644 Week3/app/src/main/java/com/example/week3/MainActivity.kt
create mode 100644 Week3/app/src/main/java/com/example/week3/MainViewModel.kt
create mode 100644 Week3/app/src/main/java/com/example/week3/MyApplication.kt
create mode 100644 Week3/app/src/main/java/com/example/week3/ProductAdapter.kt
create mode 100644 Week3/app/src/main/java/com/example/week3/ProductData.kt
create mode 100644 Week3/app/src/main/java/com/example/week3/ProfileFragment.kt
create mode 100644 Week3/app/src/main/java/com/example/week3/RemoteRepository.kt
create mode 100644 Week3/app/src/main/java/com/example/week3/ReqResData.kt
create mode 100644 Week3/app/src/main/java/com/example/week3/ReqResService.kt
rename {Week2/app/src/main/java/com/example/week2 => Week3/app/src/main/java/com/example/week3}/ShoppingcartFragment.kt (91%)
create mode 100644 Week3/app/src/main/java/com/example/week3/WishlistFragment.kt
create mode 100644 Week3/app/src/main/java/com/example/week3/di/LocalModule.kt
create mode 100644 Week3/app/src/main/java/com/example/week3/di/NetworkModule.kt
create mode 100644 Week3/app/src/main/res/color/wish_heart_tint.xml
create mode 100644 Week3/app/src/main/res/drawable/bg_circle.xml
rename {Week2 => Week3}/app/src/main/res/drawable/ic_bag_simple.png (100%)
create mode 100644 Week3/app/src/main/res/drawable/ic_event.xml
rename {Week2 => Week3}/app/src/main/res/drawable/ic_heart_straight.png (100%)
rename {Week2 => Week3}/app/src/main/res/drawable/ic_house_simple.png (100%)
rename {Week2 => Week3}/app/src/main/res/drawable/ic_launcher_background.xml (100%)
rename {Week2 => Week3}/app/src/main/res/drawable/ic_launcher_foreground.xml (100%)
rename {Week2 => Week3}/app/src/main/res/drawable/ic_list_magnifying_glass.png (100%)
create mode 100644 Week3/app/src/main/res/drawable/ic_order.xml
create mode 100644 Week3/app/src/main/res/drawable/ic_pass.xml
create mode 100644 Week3/app/src/main/res/drawable/ic_setting.xml
rename {Week2 => Week3}/app/src/main/res/drawable/ic_user.png (100%)
create mode 100644 Week3/app/src/main/res/drawable/ic_wish_heart.xml
create mode 100644 Week3/app/src/main/res/drawable/ic_wish_heart_fill.xml
create mode 100644 Week3/app/src/main/res/drawable/image1.png
create mode 100644 Week3/app/src/main/res/drawable/image2.png
create mode 100644 Week3/app/src/main/res/drawable/image3.png
create mode 100644 Week3/app/src/main/res/drawable/image4.png
create mode 100644 Week3/app/src/main/res/drawable/img_avatar.png
rename {Week2 => Week3}/app/src/main/res/drawable/img_bag_circle.png (100%)
rename {Week2 => Week3}/app/src/main/res/drawable/img_home.png (100%)
create mode 100644 Week3/app/src/main/res/drawable/img_nemo.png
rename {Week2 => Week3}/app/src/main/res/layout/activity_main.xml (68%)
rename {Week2 => Week3}/app/src/main/res/layout/fragment_buy.xml (92%)
create mode 100644 Week3/app/src/main/res/layout/fragment_buy_all.xml
rename {Week2 => Week3}/app/src/main/res/layout/fragment_buy_shoes.xml (80%)
rename {Week2 => Week3}/app/src/main/res/layout/fragment_buy_tops.xml (80%)
create mode 100644 Week3/app/src/main/res/layout/fragment_home.xml
create mode 100644 Week3/app/src/main/res/layout/fragment_profile.xml
rename {Week2 => Week3}/app/src/main/res/layout/fragment_shoppingcart.xml (94%)
create mode 100644 Week3/app/src/main/res/layout/fragment_wishlist.xml
create mode 100644 Week3/app/src/main/res/layout/item_following.xml
create mode 100644 Week3/app/src/main/res/layout/item_grid_product.xml
create mode 100644 Week3/app/src/main/res/layout/item_product_home.xml
create mode 100644 Week3/app/src/main/res/layout/item_wish_product.xml
rename {Week2 => Week3}/app/src/main/res/menu/bottom_nav_menu.xml (100%)
rename {Week2 => Week3}/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%)
rename {Week2 => Week3}/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%)
rename {Week2 => Week3}/app/src/main/res/mipmap-hdpi/ic_launcher.webp (100%)
rename {Week2 => Week3}/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp (100%)
rename {Week2 => Week3}/app/src/main/res/mipmap-mdpi/ic_launcher.webp (100%)
rename {Week2 => Week3}/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp (100%)
rename {Week2 => Week3}/app/src/main/res/mipmap-xhdpi/ic_launcher.webp (100%)
rename {Week2 => Week3}/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp (100%)
rename {Week2 => Week3}/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp (100%)
rename {Week2 => Week3}/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp (100%)
rename {Week2 => Week3}/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp (100%)
rename {Week2 => Week3}/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp (100%)
rename {Week2 => Week3}/app/src/main/res/navigation/nav_graph.xml (74%)
rename {Week2 => Week3}/app/src/main/res/values-night/themes.xml (80%)
rename {Week2 => Week3}/app/src/main/res/values/colors.xml (75%)
create mode 100644 Week3/app/src/main/res/values/strings.xml
rename {Week2 => Week3}/app/src/main/res/values/themes.xml (78%)
rename {Week2 => Week3}/app/src/main/res/xml/backup_rules.xml (100%)
rename {Week2 => Week3}/app/src/main/res/xml/data_extraction_rules.xml (100%)
rename {Week2/app/src/test/java/com/example/week2 => Week3/app/src/test/java/com/example/week3}/ExampleUnitTest.kt (92%)
create mode 100644 Week3/build.gradle.kts
rename {Week2 => Week3}/gradle.properties (91%)
rename {Week2 => Week3}/gradle/gradle-daemon-jvm.properties (100%)
rename {Week2 => Week3}/gradle/libs.versions.toml (100%)
rename {Week2 => Week3}/gradle/wrapper/gradle-wrapper.jar (100%)
rename {Week2 => Week3}/gradle/wrapper/gradle-wrapper.properties (56%)
rename {Week2 => Week3}/gradlew (100%)
rename {Week2 => Week3}/gradlew.bat (100%)
create mode 100644 Week3/hs_err_pid32732.log
create mode 100644 Week3/replay_pid32732.log
rename {Week2 => Week3}/settings.gradle.kts (95%)
delete mode 100644 pull_request_template.md
diff --git a/README.md b/README.md
deleted file mode 100644
index 2c7613b..0000000
--- a/README.md
+++ /dev/null
@@ -1,94 +0,0 @@
-# 10th_Android
-
-
-
팀원 구성
-
-
-### Git 작업 순서
-
-본인의 브랜치에서만 작업하고, `main` 브랜치는 직접 수정하지 않습니다.
-
-#### 1. 현재 브랜치 확인
-```sh
-git branch
-```
-
-#### 2. 변경 사항 확인
-```sh
-git status
-```
-
-#### 3. 변경된 파일 추가
-```sh
-git add .
-```
-
-#### 4. 커밋 메시지 작성
-```sh
-git commit -m "Commit Message"
-```
-
-#### 5. 원격 저장소에 본인 브랜치로 푸시
-```sh
-git push origin <브랜치명>
-```
-
-### Commit Convention
-
-커밋 메시지는 `타입: n주차 미션 설명`의 형식을 갖추어 작성합니다.
-
-| 타입 | 설명 |
-|-----------|--------------------------------|
-| feat | 새로운 기능 추가 |
-| fix | 버그 수정 |
-| refactor | 코드 리팩토링 |
-| docs | 문서 수정 (README 등) |
-| style | 코드 스타일 변경 (세미콜론 추가 등)|
-| chore | 빌드 및 패키지 설정 변경 |
-| test | 테스트 코드 추가 |
-
-#### Commit Example
-```sh
-git commit -m "feat: 1주차 미션 화면 전환 기능"
-git commit -m "fix: 5주차 미션 API 응답 오류 수정"
-```
-
-### PR Convention
-
-- Pull Request(PR)은 미션 별로 생성합니다.
-- PR 제목은 `n주차 미션` 형식으로 작성합니다.
-- 파트장이 승인한 후, main 브랜치로 Merge 합니다.
diff --git a/Week2/app/build.gradle.kts b/Week2/app/build.gradle.kts
deleted file mode 100644
index 8707c64..0000000
--- a/Week2/app/build.gradle.kts
+++ /dev/null
@@ -1,53 +0,0 @@
-plugins {
- alias(libs.plugins.android.application)
-}
-
-android {
- namespace = "com.example.week2"
- compileSdk {
- version = release(36) {
- minorApiLevel = 1
- }
- }
-
- defaultConfig {
- applicationId = "com.example.week2"
- minSdk = 24
- targetSdk = 36
- 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_11
- targetCompatibility = JavaVersion.VERSION_11
- }
-
- 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)
- implementation(libs.androidx.navigation.fragment.ktx)
- implementation(libs.androidx.navigation.ui.ktx)
-}
\ No newline at end of file
diff --git a/Week2/app/src/main/java/com/example/week2/BuyAllFragment.kt b/Week2/app/src/main/java/com/example/week2/BuyAllFragment.kt
deleted file mode 100644
index 79ed64b..0000000
--- a/Week2/app/src/main/java/com/example/week2/BuyAllFragment.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.example.week2
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-
-class BuyAllFragment : Fragment() {
-
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View {
- return inflater.inflate(R.layout.fragment_buy_all, container, false)
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
-
- }
-}
\ No newline at end of file
diff --git a/Week2/app/src/main/java/com/example/week2/HomeFragment.kt b/Week2/app/src/main/java/com/example/week2/HomeFragment.kt
deleted file mode 100644
index 6035368..0000000
--- a/Week2/app/src/main/java/com/example/week2/HomeFragment.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.example.week2
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-
-class HomeFragment : Fragment() {
-
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View {
- return inflater.inflate(R.layout.fragment_home, container, false)
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
-
- }
-}
\ No newline at end of file
diff --git a/Week2/app/src/main/java/com/example/week2/MainActivity.kt b/Week2/app/src/main/java/com/example/week2/MainActivity.kt
deleted file mode 100644
index 88f176a..0000000
--- a/Week2/app/src/main/java/com/example/week2/MainActivity.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.example.week2
-import com.example.week2.databinding.ActivityMainBinding
-
-import android.os.Bundle
-import androidx.activity.enableEdgeToEdge
-import androidx.appcompat.app.AppCompatActivity
-import androidx.core.view.ViewCompat
-import androidx.core.view.WindowInsetsCompat
-import android.util.Log
-import androidx.fragment.app.Fragment
-import androidx.navigation.fragment.NavHostFragment
-import androidx.navigation.ui.setupWithNavController
-
-class MainActivity : AppCompatActivity() {
- private val TAG = "LIFE_QUIZ"
- private lateinit var binding: ActivityMainBinding
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- enableEdgeToEdge()
- Log.d(TAG, "onCreate")
-
- binding = ActivityMainBinding.inflate(layoutInflater)
- setContentView(binding.root)
-
- val navHostFragment = supportFragmentManager
- .findFragmentById(R.id.nav_host_fragment) as NavHostFragment
- val navController = navHostFragment.navController
- binding.bottomBarInclude.bottomNav.setupWithNavController(navController)
-
- ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets ->
- val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
- v.setPadding(systemBars.left, systemBars.top, systemBars.right, 0)
- insets
- }
- }
-
- override fun onStart() {
- super.onStart()
- Log.d(TAG, "onStart")
- }
- override fun onResume() {
- super.onResume()
- Log.d(TAG, "onResume")
- }
- override fun onPause() {
- super.onPause()
- Log.d(TAG, "onPause")
- }
- override fun onStop() {
- super.onStop()
- Log.d(TAG, "onStop")
- }
- override fun onDestroy() {
- super.onDestroy()
- Log.d(TAG, "onDestroy")
- }
- override fun onRestart() {
- super.onRestart()
- Log.d(TAG, "onRestart")
- }
-}
\ No newline at end of file
diff --git a/Week2/app/src/main/java/com/example/week2/ProfileFragment.kt b/Week2/app/src/main/java/com/example/week2/ProfileFragment.kt
deleted file mode 100644
index 3124d89..0000000
--- a/Week2/app/src/main/java/com/example/week2/ProfileFragment.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.example.week2
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-
-class ProfileFragment : Fragment() {
-
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View {
- return inflater.inflate(R.layout.fragment_profile, container, false)
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
-
- }
-}
\ No newline at end of file
diff --git a/Week2/app/src/main/java/com/example/week2/WishlistFragment.kt b/Week2/app/src/main/java/com/example/week2/WishlistFragment.kt
deleted file mode 100644
index 99ab096..0000000
--- a/Week2/app/src/main/java/com/example/week2/WishlistFragment.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.example.week2
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-
-class WishlistFragment : Fragment() {
-
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View {
- return inflater.inflate(R.layout.fragment_wishlist, container, false)
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
-
- }
-}
\ No newline at end of file
diff --git a/Week2/app/src/main/res/layout/bottom_navigation_view.xml b/Week2/app/src/main/res/layout/bottom_navigation_view.xml
deleted file mode 100644
index c59b4ee..0000000
--- a/Week2/app/src/main/res/layout/bottom_navigation_view.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
\ No newline at end of file
diff --git a/Week2/app/src/main/res/layout/fragment_buy_all.xml b/Week2/app/src/main/res/layout/fragment_buy_all.xml
deleted file mode 100644
index 0f36c22..0000000
--- a/Week2/app/src/main/res/layout/fragment_buy_all.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/Week2/app/src/main/res/layout/fragment_home.xml b/Week2/app/src/main/res/layout/fragment_home.xml
deleted file mode 100644
index ee98f38..0000000
--- a/Week2/app/src/main/res/layout/fragment_home.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Week2/app/src/main/res/layout/fragment_profile.xml b/Week2/app/src/main/res/layout/fragment_profile.xml
deleted file mode 100644
index 0f36c22..0000000
--- a/Week2/app/src/main/res/layout/fragment_profile.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/Week2/app/src/main/res/layout/fragment_wishlist.xml b/Week2/app/src/main/res/layout/fragment_wishlist.xml
deleted file mode 100644
index cc03be7..0000000
--- a/Week2/app/src/main/res/layout/fragment_wishlist.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Week2/app/src/main/res/values/strings.xml b/Week2/app/src/main/res/values/strings.xml
deleted file mode 100644
index d52c695..0000000
--- a/Week2/app/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
- Week2
- 홈
- 구매하기
- 위시리스트
- 장바구니
- 프로필
- Discover
- 9월 4일 목요일
- 전체
- Tops & T-Shirts
- Shoes
- 위시리스트
- 장바구니가 비어있습니다.
- 제품을 추가하면 여기에 표시됩니다.
- 주문하기
-
\ No newline at end of file
diff --git a/Week2/build.gradle.kts b/Week2/build.gradle.kts
deleted file mode 100644
index 3756278..0000000
--- a/Week2/build.gradle.kts
+++ /dev/null
@@ -1,4 +0,0 @@
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-plugins {
- alias(libs.plugins.android.application) apply false
-}
\ No newline at end of file
diff --git a/Week2/.gitignore b/Week3/.gitignore
similarity index 100%
rename from Week2/.gitignore
rename to Week3/.gitignore
diff --git a/Week2/app/.gitignore b/Week3/app/.gitignore
similarity index 100%
rename from Week2/app/.gitignore
rename to Week3/app/.gitignore
diff --git a/Week3/app/build.gradle.kts b/Week3/app/build.gradle.kts
new file mode 100644
index 0000000..74aa6be
--- /dev/null
+++ b/Week3/app/build.gradle.kts
@@ -0,0 +1,83 @@
+plugins {
+ id("com.android.application")
+ id("org.jetbrains.kotlin.android")
+ id("kotlin-kapt")
+ id("com.google.dagger.hilt.android")
+}
+
+android {
+ namespace = "com.example.week3"
+ compileSdk = 34
+
+ defaultConfig {
+ applicationId = "com.example.week3"
+ 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_17
+ targetCompatibility = JavaVersion.VERSION_17
+ }
+
+ buildFeatures {
+ viewBinding = true
+ }
+}
+
+dependencies {
+ // AndroidX & UI
+ implementation("androidx.core:core-ktx:1.12.0")
+ implementation("androidx.appcompat:appcompat:1.6.1")
+ implementation("com.google.android.material:material:1.11.0")
+ implementation("androidx.constraintlayout:constraintlayout:2.1.4")
+ implementation("androidx.activity:activity-ktx:1.8.2")
+ implementation("androidx.fragment:fragment-ktx:1.6.2")
+
+ // Hilt
+ implementation("com.google.dagger:hilt-android:2.48.1")
+ kapt("com.google.dagger:hilt-android-compiler:2.48.1")
+
+ // Navigation
+ implementation("androidx.navigation:navigation-fragment-ktx:2.7.7")
+ implementation("androidx.navigation:navigation-ui-ktx:2.7.7")
+
+ // DataStore & Gson
+ implementation("androidx.datastore:datastore-preferences:1.0.0")
+ implementation("com.google.code.gson:gson:2.10.1")
+
+ // Retrofit
+ implementation("com.squareup.retrofit2:retrofit:2.9.0")
+ implementation("com.squareup.retrofit2:converter-gson:2.9.0")
+ implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")
+
+ // Room
+ implementation("androidx.room:room-runtime:2.6.1")
+ kapt("androidx.room:room-compiler:2.6.1")
+ implementation("androidx.room:room-ktx:2.6.1")
+
+ // Glide
+ implementation("com.github.bumptech.glide:glide:4.16.0")
+ kapt("com.github.bumptech.glide:compiler:4.16.0")
+
+ // Coroutines
+ implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0")
+
+ // Test
+ testImplementation("junit:junit:4.13.2")
+ androidTestImplementation("androidx.test.ext:junit:1.1.5")
+ androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
+}
\ No newline at end of file
diff --git a/Week2/app/proguard-rules.pro b/Week3/app/proguard-rules.pro
similarity index 100%
rename from Week2/app/proguard-rules.pro
rename to Week3/app/proguard-rules.pro
diff --git a/Week2/app/src/androidTest/java/com/example/week2/ExampleInstrumentedTest.kt b/Week3/app/src/androidTest/java/com/example/week3/ExampleInstrumentedTest.kt
similarity index 86%
rename from Week2/app/src/androidTest/java/com/example/week2/ExampleInstrumentedTest.kt
rename to Week3/app/src/androidTest/java/com/example/week3/ExampleInstrumentedTest.kt
index e20abc4..460ce62 100644
--- a/Week2/app/src/androidTest/java/com/example/week2/ExampleInstrumentedTest.kt
+++ b/Week3/app/src/androidTest/java/com/example/week3/ExampleInstrumentedTest.kt
@@ -1,4 +1,4 @@
-package com.example.week2
+package com.example.week3
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -19,6 +19,6 @@ class ExampleInstrumentedTest {
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
- assertEquals("com.example.week2", appContext.packageName)
+ assertEquals("com.example.week3", appContext.packageName)
}
}
\ No newline at end of file
diff --git a/Week2/app/src/main/AndroidManifest.xml b/Week3/app/src/main/AndroidManifest.xml
similarity index 81%
rename from Week2/app/src/main/AndroidManifest.xml
rename to Week3/app/src/main/AndroidManifest.xml
index 8a17b4a..a9ea48c 100644
--- a/Week2/app/src/main/AndroidManifest.xml
+++ b/Week3/app/src/main/AndroidManifest.xml
@@ -1,8 +1,9 @@
-
+
+ android:theme="@style/Theme.Week3"
+ android:usesCleartextTraffic="true">
diff --git a/Week3/app/src/main/java/com/example/week3/BuyAllFragment.kt b/Week3/app/src/main/java/com/example/week3/BuyAllFragment.kt
new file mode 100644
index 0000000..1576c5c
--- /dev/null
+++ b/Week3/app/src/main/java/com/example/week3/BuyAllFragment.kt
@@ -0,0 +1,42 @@
+package com.example.week3
+
+import android.os.Bundle
+import android.view.View
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import androidx.recyclerview.widget.GridLayoutManager
+import com.example.week3.databinding.FragmentBuyAllBinding
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class BuyAllFragment : Fragment(R.layout.fragment_buy_all) {
+ private var _binding: FragmentBuyAllBinding? = null
+ private val binding get() = _binding!!
+
+ private val viewModel: MainViewModel by viewModels()
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ _binding = FragmentBuyAllBinding.bind(view)
+
+ val productAdapter = ProductAdapter { clickedItem ->
+ viewModel.toggleWishStatus(clickedItem.id)
+ }
+
+ binding.recyclerGrid.apply {
+ adapter = productAdapter
+ layoutManager = GridLayoutManager(requireContext(), 2)
+ }
+
+ viewModel.productList.observe(viewLifecycleOwner) { updatedList ->
+ productAdapter.submitList(updatedList)
+ }
+
+ viewModel.fetchLocalProducts()
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+}
\ No newline at end of file
diff --git a/Week2/app/src/main/java/com/example/week2/BuyFragment.kt b/Week3/app/src/main/java/com/example/week3/BuyFragment.kt
similarity index 94%
rename from Week2/app/src/main/java/com/example/week2/BuyFragment.kt
rename to Week3/app/src/main/java/com/example/week3/BuyFragment.kt
index 155d22f..8c64b14 100644
--- a/Week2/app/src/main/java/com/example/week2/BuyFragment.kt
+++ b/Week3/app/src/main/java/com/example/week3/BuyFragment.kt
@@ -1,4 +1,4 @@
-package com.example.week2
+package com.example.week3
import android.graphics.Typeface
import android.os.Bundle
@@ -6,9 +6,11 @@ import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
-import com.example.week2.databinding.FragmentBuyBinding
+import com.example.week3.databinding.FragmentBuyBinding
import com.google.android.material.tabs.TabLayout
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class BuyFragment : Fragment(R.layout.fragment_buy) {
private var _binding: FragmentBuyBinding? = null
diff --git a/Week2/app/src/main/java/com/example/week2/BuyShoesFragment.kt b/Week3/app/src/main/java/com/example/week3/BuyShoesFragment.kt
similarity index 86%
rename from Week2/app/src/main/java/com/example/week2/BuyShoesFragment.kt
rename to Week3/app/src/main/java/com/example/week3/BuyShoesFragment.kt
index d818d30..fe2c655 100644
--- a/Week2/app/src/main/java/com/example/week2/BuyShoesFragment.kt
+++ b/Week3/app/src/main/java/com/example/week3/BuyShoesFragment.kt
@@ -1,11 +1,13 @@
-package com.example.week2
+package com.example.week3
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class BuyShoesFragment : Fragment() {
override fun onCreateView(
diff --git a/Week2/app/src/main/java/com/example/week2/BuyTopsFragment.kt b/Week3/app/src/main/java/com/example/week3/BuyTopsFragment.kt
similarity index 86%
rename from Week2/app/src/main/java/com/example/week2/BuyTopsFragment.kt
rename to Week3/app/src/main/java/com/example/week3/BuyTopsFragment.kt
index 27357fe..fddbcaa 100644
--- a/Week2/app/src/main/java/com/example/week2/BuyTopsFragment.kt
+++ b/Week3/app/src/main/java/com/example/week3/BuyTopsFragment.kt
@@ -1,11 +1,13 @@
-package com.example.week2
+package com.example.week3
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class BuyTopsFragment : Fragment() {
override fun onCreateView(
diff --git a/Week3/app/src/main/java/com/example/week3/FollowingAdapter.kt b/Week3/app/src/main/java/com/example/week3/FollowingAdapter.kt
new file mode 100644
index 0000000..7c19fec
--- /dev/null
+++ b/Week3/app/src/main/java/com/example/week3/FollowingAdapter.kt
@@ -0,0 +1,35 @@
+package com.example.week3
+
+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 com.bumptech.glide.Glide
+
+class FollowingAdapter(private val userList: List) :
+ RecyclerView.Adapter() {
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FollowingViewHolder {
+ val view = LayoutInflater.from(parent.context)
+ .inflate(R.layout.item_following, parent, false)
+ return FollowingViewHolder(view)
+ }
+
+ override fun onBindViewHolder(holder: FollowingViewHolder, position: Int) {
+ val user = userList[position]
+ holder.name.text = user.firstName
+
+ Glide.with(holder.itemView.context)
+ .load(user.avatar)
+ .into(holder.image)
+ }
+
+ override fun getItemCount(): Int = userList.size
+
+ class FollowingViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ val image: ImageView = view.findViewById(R.id.ivFollowingProfile)
+ val name: TextView = view.findViewById(R.id.tvFollowingName)
+ }
+}
\ No newline at end of file
diff --git a/Week3/app/src/main/java/com/example/week3/HomeFragment.kt b/Week3/app/src/main/java/com/example/week3/HomeFragment.kt
new file mode 100644
index 0000000..08a39a5
--- /dev/null
+++ b/Week3/app/src/main/java/com/example/week3/HomeFragment.kt
@@ -0,0 +1,42 @@
+package com.example.week3
+
+import android.os.Bundle
+import android.view.View
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.example.week3.databinding.FragmentHomeBinding
+import dagger.hilt.android.AndroidEntryPoint
+import androidx.fragment.app.viewModels
+
+@AndroidEntryPoint
+class HomeFragment : Fragment(R.layout.fragment_home) {
+ private var _binding: FragmentHomeBinding? = null
+ private val binding get() = _binding!!
+
+ private val viewModel: MainViewModel by viewModels()
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ _binding = FragmentHomeBinding.bind(view)
+
+ val productAdapter = ProductAdapter { clickedItem ->
+ viewModel.toggleWishStatus(clickedItem.id)
+ }
+
+ binding.recyclerViewHome.apply {
+ adapter = productAdapter
+ layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
+ isNestedScrollingEnabled = false
+ }
+
+ viewModel.productList.observe(viewLifecycleOwner) { allProducts ->
+ productAdapter.submitList(allProducts)
+ }
+ viewModel.fetchLocalProducts()
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+}
\ No newline at end of file
diff --git a/Week3/app/src/main/java/com/example/week3/LocalRepository.kt b/Week3/app/src/main/java/com/example/week3/LocalRepository.kt
new file mode 100644
index 0000000..4e0730f
--- /dev/null
+++ b/Week3/app/src/main/java/com/example/week3/LocalRepository.kt
@@ -0,0 +1,48 @@
+package com.example.week3
+
+import android.content.Context
+import androidx.datastore.preferences.core.edit
+import androidx.datastore.preferences.core.stringPreferencesKey
+import androidx.datastore.preferences.preferencesDataStore
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+import dagger.hilt.android.qualifiers.ApplicationContext
+import kotlinx.coroutines.flow.first
+import javax.inject.Inject
+import javax.inject.Singleton
+
+private val Context.dataStore by preferencesDataStore(name = "product_prefs")
+
+@Singleton
+class LocalRepository @Inject constructor(
+ @ApplicationContext private val context: Context,
+ private val gson: Gson
+) {
+ private val PRODUCTS_KEY = stringPreferencesKey("products_json")
+
+ private val initialList = listOf(
+ ProductData(1, "image4", "상품1", "설명1", 1, "₩20,000"),
+ ProductData(2, "image2", "상품2", "설명2", 2, "₩40,000"),
+ ProductData(3, "image3", "상품3", "설명3", 4, "₩80,000"),
+ ProductData(4, "image1", "상품4", "설명4", 5, "₩100,000")
+ )
+
+ suspend fun getProducts(): List {
+ val preferences = context.dataStore.data.first()
+ val json = preferences[PRODUCTS_KEY]
+ return if (json == null) {
+ saveProducts(initialList)
+ initialList
+ } else {
+ val type = object : TypeToken>() {}.type
+ gson.fromJson(json, type)
+ }
+ }
+
+ suspend fun saveProducts(productList: List) {
+ val jsonString = gson.toJson(productList)
+ context.dataStore.edit { preferences ->
+ preferences[PRODUCTS_KEY] = jsonString
+ }
+ }
+}
\ No newline at end of file
diff --git a/Week3/app/src/main/java/com/example/week3/MainActivity.kt b/Week3/app/src/main/java/com/example/week3/MainActivity.kt
new file mode 100644
index 0000000..4dd824d
--- /dev/null
+++ b/Week3/app/src/main/java/com/example/week3/MainActivity.kt
@@ -0,0 +1,30 @@
+package com.example.week3
+
+import com.example.week3.databinding.ActivityMainBinding
+
+import android.os.Bundle
+import androidx.activity.enableEdgeToEdge
+import androidx.appcompat.app.AppCompatActivity
+import androidx.navigation.fragment.NavHostFragment
+import androidx.navigation.ui.setupWithNavController
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class MainActivity : AppCompatActivity() {
+
+ private lateinit var binding: ActivityMainBinding
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ enableEdgeToEdge()
+
+ binding = ActivityMainBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ val navHostFragment = supportFragmentManager
+ .findFragmentById(R.id.nav_host_fragment) as NavHostFragment
+ val navController = navHostFragment.navController
+
+ binding.bottomNav.setupWithNavController(navController)
+ }
+}
\ No newline at end of file
diff --git a/Week3/app/src/main/java/com/example/week3/MainViewModel.kt b/Week3/app/src/main/java/com/example/week3/MainViewModel.kt
new file mode 100644
index 0000000..73e4ae8
--- /dev/null
+++ b/Week3/app/src/main/java/com/example/week3/MainViewModel.kt
@@ -0,0 +1,63 @@
+package com.example.week3
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+
+@HiltViewModel
+class MainViewModel @Inject constructor(
+ private val remoteRepository: RemoteRepository,
+ private val localRepository: LocalRepository
+) : ViewModel() {
+ private val _productList = MutableLiveData>()
+ val productList: LiveData> = _productList
+
+ private val _userProfile = MutableLiveData()
+ val userProfile: LiveData = _userProfile
+
+ private val _userList = MutableLiveData>()
+ val userList: LiveData> = _userList
+
+ private val _errorMessage = MutableLiveData()
+ val errorMessage: LiveData = _errorMessage
+
+ fun fetchProfileData() {
+ viewModelScope.launch {
+ try {
+ val profileResponse = remoteRepository.getProfile()
+ _userProfile.value = profileResponse.data
+
+ val listResponse = remoteRepository.getFollowingList()
+ _userList.value = listResponse.data.filter { it.id != 1 }
+
+ } catch (e: Exception) {
+ }
+ }
+ }
+
+ fun fetchLocalProducts() {
+ viewModelScope.launch {
+ val products = localRepository.getProducts()
+ _productList.value = products
+ }
+ }
+
+ fun toggleWishStatus(productId: Int) {
+ viewModelScope.launch {
+ val currentList = _productList.value?.toMutableList() ?: return@launch
+ val index = currentList.indexOfFirst { it.id == productId }
+
+ if (index != -1) {
+ val targetItem = currentList[index]
+ currentList[index] = targetItem.copy(isWished = !targetItem.isWished)
+
+ localRepository.saveProducts(currentList)
+ _productList.value = currentList
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Week3/app/src/main/java/com/example/week3/MyApplication.kt b/Week3/app/src/main/java/com/example/week3/MyApplication.kt
new file mode 100644
index 0000000..0bbb5ae
--- /dev/null
+++ b/Week3/app/src/main/java/com/example/week3/MyApplication.kt
@@ -0,0 +1,9 @@
+package com.example.week3
+
+import android.app.Application
+import dagger.hilt.android.HiltAndroidApp
+
+@HiltAndroidApp
+class MyApplication : Application() {
+
+}
\ No newline at end of file
diff --git a/Week3/app/src/main/java/com/example/week3/ProductAdapter.kt b/Week3/app/src/main/java/com/example/week3/ProductAdapter.kt
new file mode 100644
index 0000000..6ef5f30
--- /dev/null
+++ b/Week3/app/src/main/java/com/example/week3/ProductAdapter.kt
@@ -0,0 +1,58 @@
+package com.example.week3
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.ListAdapter
+import androidx.recyclerview.widget.RecyclerView
+import com.example.week3.databinding.ItemGridProductBinding
+
+
+class ProductAdapter(private val onWishClick: (ProductData) -> Unit
+) : ListAdapter(ProductDiffCallback()) {
+
+ inner class ViewHolder(val binding: ItemGridProductBinding) : RecyclerView.ViewHolder(binding.root)
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+ val binding = ItemGridProductBinding.inflate(LayoutInflater.from(parent.context), parent, false)
+ return ViewHolder(binding)
+ }
+
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ val item = getItem(position)
+ with(holder.binding) {
+ val context = root.context
+ val resourceId = context.resources.getIdentifier(
+ item.imageRes, "drawable", context.packageName
+ )
+
+ if (resourceId != 0) {
+ imgProduct.setImageResource(resourceId)
+ } else {
+ imgProduct.setImageResource(R.drawable.img_nemo)
+ }
+ txtName.text = item.name
+ txtDesc.text = item.desc
+ txtColor.text = "색상 ${item.colorCount}개"
+ txtPrice.text = item.price
+
+ btnWish.setImageResource(
+ if (item.isWished) R.drawable.ic_wish_heart_fill else R.drawable.ic_wish_heart
+ )
+
+ btnWish.setOnClickListener {
+ onWishClick(item)
+ }
+ }
+ }
+}
+
+class ProductDiffCallback : DiffUtil.ItemCallback() {
+ override fun areItemsTheSame(oldItem: ProductData, newItem: ProductData): Boolean {
+ return oldItem.id == newItem.id
+ }
+
+ override fun areContentsTheSame(oldItem: ProductData, newItem: ProductData): Boolean {
+ return oldItem == newItem
+ }
+}
\ No newline at end of file
diff --git a/Week3/app/src/main/java/com/example/week3/ProductData.kt b/Week3/app/src/main/java/com/example/week3/ProductData.kt
new file mode 100644
index 0000000..cd5788e
--- /dev/null
+++ b/Week3/app/src/main/java/com/example/week3/ProductData.kt
@@ -0,0 +1,11 @@
+package com.example.week3
+
+data class ProductData (
+ val id: Int,
+ val imageRes: String,
+ val name: String,
+ val desc: String,
+ val colorCount: Int,
+ val price: String,
+ var isWished: Boolean = false
+)
\ No newline at end of file
diff --git a/Week3/app/src/main/java/com/example/week3/ProfileFragment.kt b/Week3/app/src/main/java/com/example/week3/ProfileFragment.kt
new file mode 100644
index 0000000..98cf872
--- /dev/null
+++ b/Week3/app/src/main/java/com/example/week3/ProfileFragment.kt
@@ -0,0 +1,38 @@
+package com.example.week3
+
+import android.os.Bundle
+import android.view.View
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import dagger.hilt.android.AndroidEntryPoint
+import androidx.fragment.app.viewModels
+
+@AndroidEntryPoint
+class ProfileFragment : Fragment(R.layout.fragment_profile) {
+
+ private val viewModel: MainViewModel by viewModels()
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ val imgProfile = view.findViewById(R.id.imgProfile)
+ val tvNickname = view.findViewById(R.id.nickname)
+ val rvFollowing = view.findViewById(R.id.rvFollowing)
+
+ viewModel.userProfile.observe(viewLifecycleOwner) { user ->
+ tvNickname.text = "${user.firstName} ${user.lastName}"
+ Glide.with(this).load(user.avatar).into(imgProfile)
+ }
+
+ viewModel.userList.observe(viewLifecycleOwner) { users ->
+ rvFollowing.adapter = FollowingAdapter(users)
+ rvFollowing.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
+ }
+
+ viewModel.fetchProfileData()
+ }
+}
\ No newline at end of file
diff --git a/Week3/app/src/main/java/com/example/week3/RemoteRepository.kt b/Week3/app/src/main/java/com/example/week3/RemoteRepository.kt
new file mode 100644
index 0000000..0fe66e2
--- /dev/null
+++ b/Week3/app/src/main/java/com/example/week3/RemoteRepository.kt
@@ -0,0 +1,13 @@
+package com.example.week3
+
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class RemoteRepository @Inject constructor(
+ private val reqResService: ReqResService
+) {
+ suspend fun getProfile() = reqResService.getProfile()
+
+ suspend fun getFollowingList(page: Int = 1) = reqResService.getFollowingList(page)
+}
\ No newline at end of file
diff --git a/Week3/app/src/main/java/com/example/week3/ReqResData.kt b/Week3/app/src/main/java/com/example/week3/ReqResData.kt
new file mode 100644
index 0000000..443a43d
--- /dev/null
+++ b/Week3/app/src/main/java/com/example/week3/ReqResData.kt
@@ -0,0 +1,19 @@
+package com.example.week3
+
+import com.google.gson.annotations.SerializedName
+
+data class SingleUserResponse(
+ val data: UserData
+)
+
+data class UserListResponse(
+ val data: List
+)
+
+data class UserData(
+ val id: Int,
+ val email: String,
+ @SerializedName("first_name") val firstName: String,
+ @SerializedName("last_name") val lastName: String,
+ val avatar: String
+)
\ No newline at end of file
diff --git a/Week3/app/src/main/java/com/example/week3/ReqResService.kt b/Week3/app/src/main/java/com/example/week3/ReqResService.kt
new file mode 100644
index 0000000..67b4df5
--- /dev/null
+++ b/Week3/app/src/main/java/com/example/week3/ReqResService.kt
@@ -0,0 +1,12 @@
+package com.example.week3
+
+import retrofit2.http.GET
+import retrofit2.http.Query
+
+interface ReqResService {
+ @GET("api/users/1")
+ suspend fun getProfile(): SingleUserResponse
+
+ @GET("api/users")
+ suspend fun getFollowingList(@Query("page") page: Int = 1): UserListResponse
+}
\ No newline at end of file
diff --git a/Week2/app/src/main/java/com/example/week2/ShoppingcartFragment.kt b/Week3/app/src/main/java/com/example/week3/ShoppingcartFragment.kt
similarity index 91%
rename from Week2/app/src/main/java/com/example/week2/ShoppingcartFragment.kt
rename to Week3/app/src/main/java/com/example/week3/ShoppingcartFragment.kt
index 4b3f85e..f5c1007 100644
--- a/Week2/app/src/main/java/com/example/week2/ShoppingcartFragment.kt
+++ b/Week3/app/src/main/java/com/example/week3/ShoppingcartFragment.kt
@@ -1,4 +1,4 @@
-package com.example.week2
+package com.example.week3
import android.os.Bundle
import android.view.LayoutInflater
@@ -8,7 +8,9 @@ import androidx.fragment.app.Fragment
import android.widget.Button
import androidx.navigation.fragment.findNavController
import androidx.navigation.NavOptions
+import dagger.hilt.android.AndroidEntryPoint
+@AndroidEntryPoint
class ShoppingcartFragment : Fragment() {
override fun onCreateView(
diff --git a/Week3/app/src/main/java/com/example/week3/WishlistFragment.kt b/Week3/app/src/main/java/com/example/week3/WishlistFragment.kt
new file mode 100644
index 0000000..b090041
--- /dev/null
+++ b/Week3/app/src/main/java/com/example/week3/WishlistFragment.kt
@@ -0,0 +1,43 @@
+package com.example.week3
+
+import android.os.Bundle
+import android.view.View
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.GridLayoutManager
+import com.example.week3.databinding.FragmentWishlistBinding
+import dagger.hilt.android.AndroidEntryPoint
+import androidx.fragment.app.viewModels
+
+@AndroidEntryPoint
+class WishlistFragment : Fragment(R.layout.fragment_wishlist) {
+ private var _binding: FragmentWishlistBinding? = null
+ private val binding get() = _binding!!
+
+ private val viewModel: MainViewModel by viewModels()
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ _binding = FragmentWishlistBinding.bind(view)
+
+ val productAdapter = ProductAdapter { clickedItem ->
+ viewModel.toggleWishStatus(clickedItem.id)
+ }
+
+ binding.recyclerWish.apply {
+ adapter = productAdapter
+ layoutManager = GridLayoutManager(requireContext(), 2)
+ }
+
+ viewModel.productList.observe(viewLifecycleOwner) { allProducts ->
+ val wishList = allProducts.filter { it.isWished }
+ productAdapter.submitList(wishList)
+ }
+
+ viewModel.fetchLocalProducts()
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+}
\ No newline at end of file
diff --git a/Week3/app/src/main/java/com/example/week3/di/LocalModule.kt b/Week3/app/src/main/java/com/example/week3/di/LocalModule.kt
new file mode 100644
index 0000000..3663758
--- /dev/null
+++ b/Week3/app/src/main/java/com/example/week3/di/LocalModule.kt
@@ -0,0 +1,19 @@
+package com.example.week3.di
+
+import android.content.Context
+import com.google.gson.Gson
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.android.qualifiers.ApplicationContext
+import dagger.hilt.components.SingletonComponent
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+object LocalModule {
+
+ @Provides
+ @Singleton
+ fun provideGson(): Gson = Gson()
+}
\ No newline at end of file
diff --git a/Week3/app/src/main/java/com/example/week3/di/NetworkModule.kt b/Week3/app/src/main/java/com/example/week3/di/NetworkModule.kt
new file mode 100644
index 0000000..6e8b860
--- /dev/null
+++ b/Week3/app/src/main/java/com/example/week3/di/NetworkModule.kt
@@ -0,0 +1,45 @@
+package com.example.week3.di
+
+import com.example.week3.ReqResService
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import javax.inject.Singleton
+import okhttp3.OkHttpClient
+
+@Module
+@InstallIn(SingletonComponent::class)
+object NetworkModule {
+
+ @Provides
+ @Singleton
+ fun provideOkHttpClient(): OkHttpClient {
+ return OkHttpClient.Builder()
+ .addInterceptor { chain ->
+ val request = chain.request().newBuilder()
+ .header("x-api-key", "reqres_286fae62df9643f089a91de5a72a2ef4")
+ .build()
+ chain.proceed(request)
+ }
+ .build()
+ }
+
+ @Provides
+ @Singleton
+ fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
+ return Retrofit.Builder()
+ .baseUrl("https://reqres.in/")
+ .client(okHttpClient)
+ .addConverterFactory(GsonConverterFactory.create())
+ .build()
+ }
+
+ @Provides
+ @Singleton
+ fun provideReqResService(retrofit: Retrofit): ReqResService {
+ return retrofit.create(ReqResService::class.java)
+ }
+}
\ No newline at end of file
diff --git a/Week3/app/src/main/res/color/wish_heart_tint.xml b/Week3/app/src/main/res/color/wish_heart_tint.xml
new file mode 100644
index 0000000..42fea8a
--- /dev/null
+++ b/Week3/app/src/main/res/color/wish_heart_tint.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Week3/app/src/main/res/drawable/bg_circle.xml b/Week3/app/src/main/res/drawable/bg_circle.xml
new file mode 100644
index 0000000..36845a7
--- /dev/null
+++ b/Week3/app/src/main/res/drawable/bg_circle.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/Week2/app/src/main/res/drawable/ic_bag_simple.png b/Week3/app/src/main/res/drawable/ic_bag_simple.png
similarity index 100%
rename from Week2/app/src/main/res/drawable/ic_bag_simple.png
rename to Week3/app/src/main/res/drawable/ic_bag_simple.png
diff --git a/Week3/app/src/main/res/drawable/ic_event.xml b/Week3/app/src/main/res/drawable/ic_event.xml
new file mode 100644
index 0000000..94d16b8
--- /dev/null
+++ b/Week3/app/src/main/res/drawable/ic_event.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/Week2/app/src/main/res/drawable/ic_heart_straight.png b/Week3/app/src/main/res/drawable/ic_heart_straight.png
similarity index 100%
rename from Week2/app/src/main/res/drawable/ic_heart_straight.png
rename to Week3/app/src/main/res/drawable/ic_heart_straight.png
diff --git a/Week2/app/src/main/res/drawable/ic_house_simple.png b/Week3/app/src/main/res/drawable/ic_house_simple.png
similarity index 100%
rename from Week2/app/src/main/res/drawable/ic_house_simple.png
rename to Week3/app/src/main/res/drawable/ic_house_simple.png
diff --git a/Week2/app/src/main/res/drawable/ic_launcher_background.xml b/Week3/app/src/main/res/drawable/ic_launcher_background.xml
similarity index 100%
rename from Week2/app/src/main/res/drawable/ic_launcher_background.xml
rename to Week3/app/src/main/res/drawable/ic_launcher_background.xml
diff --git a/Week2/app/src/main/res/drawable/ic_launcher_foreground.xml b/Week3/app/src/main/res/drawable/ic_launcher_foreground.xml
similarity index 100%
rename from Week2/app/src/main/res/drawable/ic_launcher_foreground.xml
rename to Week3/app/src/main/res/drawable/ic_launcher_foreground.xml
diff --git a/Week2/app/src/main/res/drawable/ic_list_magnifying_glass.png b/Week3/app/src/main/res/drawable/ic_list_magnifying_glass.png
similarity index 100%
rename from Week2/app/src/main/res/drawable/ic_list_magnifying_glass.png
rename to Week3/app/src/main/res/drawable/ic_list_magnifying_glass.png
diff --git a/Week3/app/src/main/res/drawable/ic_order.xml b/Week3/app/src/main/res/drawable/ic_order.xml
new file mode 100644
index 0000000..366915e
--- /dev/null
+++ b/Week3/app/src/main/res/drawable/ic_order.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/Week3/app/src/main/res/drawable/ic_pass.xml b/Week3/app/src/main/res/drawable/ic_pass.xml
new file mode 100644
index 0000000..389538c
--- /dev/null
+++ b/Week3/app/src/main/res/drawable/ic_pass.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/Week3/app/src/main/res/drawable/ic_setting.xml b/Week3/app/src/main/res/drawable/ic_setting.xml
new file mode 100644
index 0000000..a96868e
--- /dev/null
+++ b/Week3/app/src/main/res/drawable/ic_setting.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/Week2/app/src/main/res/drawable/ic_user.png b/Week3/app/src/main/res/drawable/ic_user.png
similarity index 100%
rename from Week2/app/src/main/res/drawable/ic_user.png
rename to Week3/app/src/main/res/drawable/ic_user.png
diff --git a/Week3/app/src/main/res/drawable/ic_wish_heart.xml b/Week3/app/src/main/res/drawable/ic_wish_heart.xml
new file mode 100644
index 0000000..13508a9
--- /dev/null
+++ b/Week3/app/src/main/res/drawable/ic_wish_heart.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/Week3/app/src/main/res/drawable/ic_wish_heart_fill.xml b/Week3/app/src/main/res/drawable/ic_wish_heart_fill.xml
new file mode 100644
index 0000000..9d7cc1b
--- /dev/null
+++ b/Week3/app/src/main/res/drawable/ic_wish_heart_fill.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/Week3/app/src/main/res/drawable/image1.png b/Week3/app/src/main/res/drawable/image1.png
new file mode 100644
index 0000000000000000000000000000000000000000..286ad637b0d58faa0586158e5ced1147b18a3caf
GIT binary patch
literal 45806
zcmeEtQ+H+G)AdPCY}>YN+h)hMot(JibZk56usgQZvD2}Qj``&Geu($#f3e0MwJ!D;
zyH?eznse5UQc;pdgu{aa004-xG7@S402tqY3kK?ICqgXG;OhbFETiiN0KlXFx4-~d
zIXGXNU~X#CVu0Eyf|D-;!b((86aZ*QfPXWA{IZeUC3W1@oh;qGOk6DhQZ`l&CV35M
zW&l8=jjV*IhBw$n7c|IF+k>fdsx82`?$of6K{v^7gmB(L4sHydvXg@OpfoWIWlsF*
zUr)*>stgR{FBP$R7nVO8!_D>+ie2eHIJ&0)243-gzASCN{$=0$5&T$BQTxaiYI!O6
ze*S*p%`@QHrC5j;HJ|JThqpG5soTO&*ugY-
zDjJiq`y*%ztX{G*UUp;QCiJc?;e%1I>s>V~FRMg`LTt!2v*yiRHl;?#Cp88bamcgJ
z%Nk8>;41HfC(s%CHtQ1I1h@W;X5Oju(JVqhCoCpkqaHQ&&FygK`
z8}7uw&raL$!e|5T{?BQKS{C_}!T}EdT>xt6##Yez{K8s8PP2hOFXHs%%*NKUQ0_5t
z!BxPc-@@XCxP_%B)^Q-;Ab4)7b{&fhB^oRq4sNkizyP1ZcKRqpAdpB@7BIc65q46gKe8tw>|kJj&$<)yS|-t46_ez-|7CcF?OA?whN5`Rp_E(wXgn
zCb_ZetaS=ez&UICZB_M&^2dYv-R_V1lnT2dyoW}lJRwD!<{{o$n4x4?vE!Vp#^jI-
zFG)|K6w7({iLAI^@3nPvhDI+GgquB~yA5H#=if2@i;_Axux#LHz)g%%N&f3OOt7LM?`XDC{oH#y$S^G9
zx+h#LSgn$0NR3m2SYAz8oc;apPwn}nVZOD-l4O4&t*Yu|D&2I4RZslqAvVdPH1?cn
z(>Qpos&4>SKhLYet+zj0B}+?MU_2mVfP=d`2Ml`O7N9qkUi)^Mt;z&s_p`eEZji(9
zmkqANW^0zG|B1fF{HBycXOOxwcP@|r_oW(ranz=NS+|Y4-D!eOU+0QGZu5?o~
zT;Hd4ZgndwY{enF3Y&jJ`{jD0j6PV$Q|b-=>vEdW4P&CsPFqT^$miHB|2*a@t;KI&;!`r*N_c;
z4(rWvNW?-6>&puZGYbnCm@$%i4W^KW{x?G@RkE_-NsZcA{JA4l)=@2tH$5(vLG$18
zh=Lw)x=cQ8Y~xa__xDLWmKM~+&47|}^Bl85iKo6?w}Fx&`Afr#xkjd%+VsL6rXa*q
zY7y8|>cB}a70tc{$MzGd(~FBz$r!ALtX0{qkB1f;UthgmXH(MN7tC&mmLUκd9cI!W)&*-XYhrC-BJxI
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