diff --git a/app/src/main/java/com/isolaatti/images/image_list/data/repository/ImagesRepositoryImpl.kt b/app/src/main/java/com/isolaatti/images/image_list/data/repository/ImagesRepositoryImpl.kt new file mode 100644 index 0000000..945cf6d --- /dev/null +++ b/app/src/main/java/com/isolaatti/images/image_list/data/repository/ImagesRepositoryImpl.kt @@ -0,0 +1,29 @@ +package com.isolaatti.images.image_list.data.repository + +import com.isolaatti.images.image_list.data.remote.ImagesApi +import com.isolaatti.images.image_list.domain.entity.Image +import com.isolaatti.images.image_list.domain.repository.ImagesRepository +import com.isolaatti.utils.Resource +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import retrofit2.awaitResponse +import javax.inject.Inject + +class ImagesRepositoryImpl @Inject constructor(private val imagesApi: ImagesApi) : ImagesRepository { + override fun getImagesOfUser(userId: Int, lastId: String?): Flow>> = flow { + try { + val response = imagesApi.getImagesOfUser(userId, lastId).awaitResponse() + if(response.isSuccessful) { + val imagesDto = response.body() + val images = imagesDto?.map { Image.fromDto(it) } + + emit(Resource.Success(images)) + + } else { + emit(Resource.Error(Resource.Error.mapErrorCode(response.code()))) + } + } catch(_: Exception) { + emit(Resource.Error(Resource.Error.ErrorType.NetworkError)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/images/image_list/domain/entity/Image.kt b/app/src/main/java/com/isolaatti/images/image_list/domain/entity/Image.kt new file mode 100644 index 0000000..8b88dc9 --- /dev/null +++ b/app/src/main/java/com/isolaatti/images/image_list/domain/entity/Image.kt @@ -0,0 +1,18 @@ +package com.isolaatti.images.image_list.domain.entity + +import com.isolaatti.images.image_list.data.remote.ImageDto +import com.isolaatti.utils.UrlGen + +data class Image( + val id: String, + val userId: Int, + val name: String +) { + val imageUrl: String get() = UrlGen.imageUrl(id) + val smallImageUrl : String get() = UrlGen.imageUrl(id, UrlGen.IMAGE_MODE_SMALL) + val reducedImageUrl: String get() = UrlGen.imageUrl(id, UrlGen.IMAGE_MODE_REDUCED) + + companion object { + fun fromDto(imageDto: ImageDto) = Image(imageDto.id, imageDto.userId, imageDto.name) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/images/image_list/domain/repository/ImagesRepository.kt b/app/src/main/java/com/isolaatti/images/image_list/domain/repository/ImagesRepository.kt index cfb338f..c7d224d 100644 --- a/app/src/main/java/com/isolaatti/images/image_list/domain/repository/ImagesRepository.kt +++ b/app/src/main/java/com/isolaatti/images/image_list/domain/repository/ImagesRepository.kt @@ -1,5 +1,9 @@ package com.isolaatti.images.image_list.domain.repository -interface ImagesRepository { +import com.isolaatti.images.image_list.domain.entity.Image +import com.isolaatti.utils.Resource +import kotlinx.coroutines.flow.Flow +interface ImagesRepository { + fun getImagesOfUser(userId: Int, lastId: String? = null): Flow>> } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/images/image_list/presentation/ImageListViewModel.kt b/app/src/main/java/com/isolaatti/images/image_list/presentation/ImageListViewModel.kt index 675c25f..e6f204e 100644 --- a/app/src/main/java/com/isolaatti/images/image_list/presentation/ImageListViewModel.kt +++ b/app/src/main/java/com/isolaatti/images/image_list/presentation/ImageListViewModel.kt @@ -1,6 +1,12 @@ package com.isolaatti.images.image_list.presentation import androidx.lifecycle.ViewModel +import com.isolaatti.images.image_list.domain.repository.ImagesRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class ImageListViewModel @Inject constructor(private val imagesRepository: ImagesRepository) : ViewModel() { + -class ImageListViewModel : ViewModel() { } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/images/image_list/ui/ImagesFragment.kt b/app/src/main/java/com/isolaatti/images/image_list/ui/ImagesFragment.kt index 480c153..931fb9c 100644 --- a/app/src/main/java/com/isolaatti/images/image_list/ui/ImagesFragment.kt +++ b/app/src/main/java/com/isolaatti/images/image_list/ui/ImagesFragment.kt @@ -6,8 +6,10 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import com.isolaatti.databinding.FragmentImagesBinding +import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.lifecycle.HiltViewModel +@AndroidEntryPoint class ImagesFragment : Fragment() { lateinit var viewBinding: FragmentImagesBinding @@ -15,9 +17,13 @@ class ImagesFragment : Fragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { + ): View { viewBinding = FragmentImagesBinding.inflate(inflater) return viewBinding.root } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + } } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/utils/UrlGen.kt b/app/src/main/java/com/isolaatti/utils/UrlGen.kt index 02805f0..ee60dd1 100644 --- a/app/src/main/java/com/isolaatti/utils/UrlGen.kt +++ b/app/src/main/java/com/isolaatti/utils/UrlGen.kt @@ -3,7 +3,10 @@ package com.isolaatti.utils import com.isolaatti.connectivity.RetrofitClient.Companion.BASE_URL object UrlGen { + const val IMAGE_MODE_SMALL = "small" + const val IMAGE_MODE_REDUCED = "reduced" + const val IMAGE_MODE_ORIGINAL = "original" fun userProfileImage(userId: Int) = "${BASE_URL}images/profile_image/of_user/$userId?mode=small" fun userProfileImageFullQuality(userId: Int) = "${BASE_URL}images/profile_image/of_user/$userId?mode=original" - fun imageUrl(imageId: String) = "${BASE_URL}images/image/${imageId}" + fun imageUrl(imageId: String, mode: String? = IMAGE_MODE_ORIGINAL) = "${BASE_URL}images/image/${imageId}?mode=${mode}" } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_images.xml b/app/src/main/res/layout/fragment_images.xml index a7a6d17..30cfe58 100644 --- a/app/src/main/res/layout/fragment_images.xml +++ b/app/src/main/res/layout/fragment_images.xml @@ -15,4 +15,10 @@ app:navigationIconTint="@color/on_surface" app:titleCentered="true"/> + + \ No newline at end of file