From a5f79d862aec3e045a52ff58bd10faa5acfbae78 Mon Sep 17 00:00:00 2001 From: dolchvita Date: Wed, 15 Jan 2025 14:59:07 +0900 Subject: [PATCH] fragment --- app/build.gradle.kts | 1 + .../java/com/flab/deepsleep/MainActivity.kt | 40 +++---------- .../flab/deepsleep/data/api/UnplashService.kt | 5 -- .../data/source/PhotoPagingSource.kt | 1 + .../flab/deepsleep/ui/home/HomeFragment.kt | 60 +++++++++++++++++++ .../flab/deepsleep/ui/photo/PhotoAdapter.kt | 2 +- .../flab/deepsleep/ui/photo/PhotoViewModel.kt | 8 +-- app/src/main/res/layout/activity_main.xml | 38 ++++++++---- app/src/main/res/layout/fragment_home.xml | 17 ++++++ gradle/libs.versions.toml | 2 + 10 files changed, 118 insertions(+), 56 deletions(-) create mode 100644 app/src/main/java/com/flab/deepsleep/ui/home/HomeFragment.kt create mode 100644 app/src/main/res/layout/fragment_home.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index bf7e595..f3f0a1f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -67,6 +67,7 @@ dependencies { implementation(libs.okhttp.profiler) implementation(libs.room.runtime) implementation(libs.room.ktx) + implementation(libs.fragment.ktx) implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) diff --git a/app/src/main/java/com/flab/deepsleep/MainActivity.kt b/app/src/main/java/com/flab/deepsleep/MainActivity.kt index 836c172..02ed439 100644 --- a/app/src/main/java/com/flab/deepsleep/MainActivity.kt +++ b/app/src/main/java/com/flab/deepsleep/MainActivity.kt @@ -1,56 +1,26 @@ package com.flab.deepsleep -import PhotoAdapter import android.os.Bundle import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.widget.doOnTextChanged -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.Observer -import androidx.lifecycle.lifecycleScope -import androidx.lifecycle.repeatOnLifecycle -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.RecyclerView -import com.flab.deepsleep.data.entity.photos.SinglePhoto import com.flab.deepsleep.databinding.ActivityMainBinding +import com.flab.deepsleep.ui.home.HomeFragment import com.flab.deepsleep.ui.photo.PhotoViewModel -import com.flab.deepsleep.ui.photo.OnButtonClick import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.launch -import timber.log.Timber @AndroidEntryPoint class MainActivity : AppCompatActivity() { private val photoViewModel: PhotoViewModel by viewModels() private val binding: ActivityMainBinding by lazy { ActivityMainBinding.inflate(layoutInflater) } - private val photoRecyclerView: RecyclerView by lazy { binding.photosRecyclerView } - private val photoAdapter: PhotoAdapter by lazy { - PhotoAdapter { singlePhoto -> - photoViewModel.insertPhoto(singlePhoto) - } - } - - private fun setRecyclerView() { - photoRecyclerView.layoutManager = GridLayoutManager(this, 2) - photoRecyclerView.adapter = photoAdapter - } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContentView(binding.root) - setRecyclerView() - - lifecycleScope.launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - photoViewModel.items.collectLatest { - photoAdapter.submitData(it) - } - } - } + setHomeFragment(); /* 검색어 입력시 자동 호출 */ binding.editText.doOnTextChanged { text, start, before, count -> @@ -65,6 +35,12 @@ class MainActivity : AppCompatActivity() { } } + private fun setHomeFragment(){ + supportFragmentManager.beginTransaction() + .replace(binding.mainFragment.id, HomeFragment()) + .commit() + } + private fun showErrorDialog(message: String) { AlertDialog.Builder(this) .setTitle("Error") diff --git a/app/src/main/java/com/flab/deepsleep/data/api/UnplashService.kt b/app/src/main/java/com/flab/deepsleep/data/api/UnplashService.kt index 92833d4..8cdab95 100644 --- a/app/src/main/java/com/flab/deepsleep/data/api/UnplashService.kt +++ b/app/src/main/java/com/flab/deepsleep/data/api/UnplashService.kt @@ -1,21 +1,18 @@ package com.flab.deepsleep.data.api import com.flab.deepsleep.data.entity.photos.SinglePhoto - import com.flab.deepsleep.data.entity.photos.SearchPhotos import retrofit2.http.GET import retrofit2.http.Path import retrofit2.http.Query interface UnplashService { - @GET("/photos/random") suspend fun getRandomPhotos( @Query("client_id") clientId: String, @Query("count") count: Int = 1 ): List - @GET("/search/photos") suspend fun getSearchPhotos( @Query("client_id") clientId: String, @@ -27,6 +24,4 @@ interface UnplashService { @Path("id") photoId: String, @Query("client_id") clientId: String ): SinglePhoto - - } \ No newline at end of file diff --git a/app/src/main/java/com/flab/deepsleep/data/source/PhotoPagingSource.kt b/app/src/main/java/com/flab/deepsleep/data/source/PhotoPagingSource.kt index e5e6f35..d495796 100644 --- a/app/src/main/java/com/flab/deepsleep/data/source/PhotoPagingSource.kt +++ b/app/src/main/java/com/flab/deepsleep/data/source/PhotoPagingSource.kt @@ -3,6 +3,7 @@ package com.flab.deepsleep.data.source import androidx.paging.PagingSource import androidx.paging.PagingState import com.flab.deepsleep.data.entity.photos.SinglePhoto +import timber.log.Timber class PhotoPagingSource( private val photos: List diff --git a/app/src/main/java/com/flab/deepsleep/ui/home/HomeFragment.kt b/app/src/main/java/com/flab/deepsleep/ui/home/HomeFragment.kt new file mode 100644 index 0000000..82bd691 --- /dev/null +++ b/app/src/main/java/com/flab/deepsleep/ui/home/HomeFragment.kt @@ -0,0 +1,60 @@ +package com.flab.deepsleep.ui.home + +import PhotoAdapter +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.viewModels +import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.flab.deepsleep.databinding.FragmentHomeBinding +import com.flab.deepsleep.ui.photo.PhotoViewModel +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import timber.log.Timber + +@AndroidEntryPoint +class HomeFragment : Fragment() { + private val photoViewModel: PhotoViewModel by viewModels() + val binding: FragmentHomeBinding by lazy { FragmentHomeBinding.inflate(layoutInflater) } + private val photoRecyclerView: RecyclerView by lazy { binding.photosRecyclerView } + private val photoAdapter: PhotoAdapter by lazy { + PhotoAdapter { singlePhoto -> + photoViewModel.insertPhoto(singlePhoto) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View { + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setRecyclerView() + + + viewLifecycleOwner.lifecycleScope.launch { + Timber.d("HomeFragment Coroutine 시작됨 (onViewCreated)") // 로그 추가 + viewLifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { + photoViewModel.items.collectLatest { + photoAdapter.submitData(it) + + Timber.d("HomeFragment $it") + } + } + } + } + private fun setRecyclerView() { + photoRecyclerView.layoutManager = GridLayoutManager(context, 2) + photoRecyclerView.adapter = photoAdapter + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/flab/deepsleep/ui/photo/PhotoAdapter.kt b/app/src/main/java/com/flab/deepsleep/ui/photo/PhotoAdapter.kt index 13e3744..737f3c7 100644 --- a/app/src/main/java/com/flab/deepsleep/ui/photo/PhotoAdapter.kt +++ b/app/src/main/java/com/flab/deepsleep/ui/photo/PhotoAdapter.kt @@ -26,7 +26,7 @@ class PhotoAdapter(private val buttonClick: OnButtonClick) : buttonClick.onButtonClick(photo) } - val imageUrl = photo?.urls?.raw + val imageUrl = photo.urls?.raw if (imageUrl != null) { Glide.with(imageView.context) .load(imageUrl) diff --git a/app/src/main/java/com/flab/deepsleep/ui/photo/PhotoViewModel.kt b/app/src/main/java/com/flab/deepsleep/ui/photo/PhotoViewModel.kt index 2b746e2..a967251 100644 --- a/app/src/main/java/com/flab/deepsleep/ui/photo/PhotoViewModel.kt +++ b/app/src/main/java/com/flab/deepsleep/ui/photo/PhotoViewModel.kt @@ -18,6 +18,7 @@ import com.flab.deepsleep.data.source.PhotoPagingSource import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll @@ -44,10 +45,7 @@ class PhotoViewModel @Inject constructor( private val _photoState = MutableLiveData?>() val photoState: MutableLiveData?> get() = _photoState - /* Photo Database */ - val allPhotos: Flow> = photoRepository.getAllPhotos() - - + @OptIn(ExperimentalCoroutinesApi::class) val items: Flow> = _photoState.asFlow() .map { state -> state ?: emptyList() } .flatMapLatest { photos -> @@ -70,7 +68,7 @@ class PhotoViewModel @Inject constructor( } } - suspend fun getSearchPhotos(query: String): List { + private suspend fun getSearchPhotos(query: String): List { return coroutineScope { try { unplashRepository.getSearchPhotos(query) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index ab5b7f2..cec8169 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -40,23 +40,35 @@ - + + + + + + + + + + + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintBottom_toTopOf="@+id/foot_bar"/> + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..0750c2b --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index db7022a..476f59e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -27,6 +27,7 @@ okhttp = "4.12.0" okhttp-profiler = "1.0.8" room = "2.6.1" ksp = "2.0.21-1.0.27" +fragment-ktx = "1.8.5" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -58,6 +59,7 @@ okhttp-profiler = { module = "com.localebro:okhttpprofiler", version.ref = "okht room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" } room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" } room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" } +fragment-ktx = { module = "androidx.fragment:fragment-ktx", version.ref = "fragment-ktx"} [plugins] android-application = { id = "com.android.application", version.ref = "agp" }