Skip to content

Commit

Permalink
[EPMEDU-1998]: Reduce size of downloaded images (#266)
Browse files Browse the repository at this point in the history
* [EPMEDU-1998]: Reduce size of downloaded images

  - Prevent image duplication in cache by using disk cache keys
  - Move StorageApi to a separate module networkstorage
  - Create NetworkFile wrapper

* Fix CI

* Fix build

* Rename get functions

---------

Co-authored-by: Uladzislau Balatayeu <[email protected]>
  • Loading branch information
Fileek and Uladzislau Balatayeu authored Jan 19, 2024
1 parent 2103aed commit 0613525
Show file tree
Hide file tree
Showing 37 changed files with 197 additions and 143 deletions.
1 change: 1 addition & 0 deletions feature/tabsflow/favourites/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ dependencies {
implementation(projects.library.resources)
implementation(projects.shared.feature.feeding)

implementation(projects.shared.feature.networkstorage)
implementation(projects.shared.feature.permissions)

implementation(libs.accompanist.permissions)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ private fun FavouritesList(
onFavouriteChange = { isFavourite ->
onEvent(FavouriteChange(isFavourite, feedingPoint))
},
imageUrl = feedingPoint.image,
image = feedingPoint.image,
onClick = { onEvent(FeedingPointSelected(feedingPoint)) }
)
}
Expand All @@ -300,8 +300,7 @@ private fun FavouritesScreenPreview() {
animalStatus = AnimalState.RED,
animalType = AnimalType.Dogs,
isFavourite = true,
location = MapLocation.Tbilisi,
images = emptyList(),
location = MapLocation.Tbilisi
)
),
)
Expand Down
2 changes: 2 additions & 0 deletions feature/tabsflow/moreflow/donate/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ dependencies {
implementation(projects.library.navigation)
implementation(projects.library.resources)

implementation(projects.shared.feature.networkstorage)

implementation(libs.amplify.core)
implementation(libs.coil)
implementation(libs.compose.ui)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package com.epmedu.animeal.tabs.more.donate.data

import com.epmedu.animeal.api.donate.DonateApi
import com.epmedu.animeal.api.storage.StorageApi
import com.epmedu.animeal.networkstorage.data.api.StorageApi
import com.epmedu.animeal.networkstorage.domain.NetworkFile
import com.epmedu.animeal.tabs.more.donate.data.mapper.toDomain
import com.epmedu.animeal.tabs.more.donate.domain.DonateInformation
import com.epmedu.animeal.tabs.more.donate.domain.repository.DonateRepository
Expand All @@ -21,7 +22,12 @@ class DonateRepositoryImpl(
.filter { it.enabled }
.map { bankAccount ->
bankAccount.toDomain(
iconUrl = storageApi.parseAmplifyUrl(imageId = bankAccount.cover)
icon = with(bankAccount.cover) {
NetworkFile(
name = this,
url = storageApi.getUrlFrom(fileName = this)
)
}
)
}
.toImmutableList()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package com.epmedu.animeal.tabs.more.donate.data.mapper

import com.amplifyframework.datastore.generated.model.BankAccount
import com.epmedu.animeal.networkstorage.domain.NetworkFile
import com.epmedu.animeal.tabs.more.donate.domain.DonateInformation

internal fun BankAccount.toDomain(
iconUrl: String
icon: NetworkFile
) = DonateInformation(
title = name,
paymentCredentials = value,
iconUrl = iconUrl
icon = icon
)
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.epmedu.animeal.tabs.more.donate.di

import com.epmedu.animeal.api.donate.DonateApi
import com.epmedu.animeal.api.storage.StorageApi
import com.epmedu.animeal.networkstorage.data.api.StorageApi
import com.epmedu.animeal.tabs.more.donate.data.DonateRepositoryImpl
import com.epmedu.animeal.tabs.more.donate.domain.repository.DonateRepository
import dagger.Module
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.epmedu.animeal.tabs.more.donate.domain

import com.epmedu.animeal.networkstorage.domain.NetworkFile

data class DonateInformation(
val title: String,
val paymentCredentials: String,
val iconUrl: String,
val icon: NetworkFile?,
)
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ internal fun DonateListItem(
) {
AsyncImage(
model = ImageRequest.Builder(LocalContext.current)
.data(donateInformation.iconUrl)
.data(donateInformation.icon?.url)
.diskCacheKey(donateInformation.icon?.name)
.build(),
modifier = Modifier.size(26.dp),
contentDescription = donateInformation.title
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ import kotlinx.collections.immutable.persistentListOf
internal val tbcBankInformation = DonateInformation(
title = "TBC Bank",
paymentCredentials = "2GE82983752093855555",
iconUrl = "",
icon = null,
)

internal val payPalInformation = DonateInformation(
title = "PayPal",
paymentCredentials = "[email protected]",
iconUrl = "",
icon = null,
)

internal val donateInformationStubList = persistentListOf(
Expand Down
1 change: 1 addition & 0 deletions feature/tabsflow/search/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ dependencies {
implementation(projects.library.resources)

implementation(projects.shared.feature.feeding)
implementation(projects.shared.feature.networkstorage)
implementation(projects.shared.feature.permissions)

implementation(libs.accompanist.permissions)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ private fun LazyListScope.renderGroupedFeedingPoints(
)
)
},
imageUrl = feedingPoint.image,
image = feedingPoint.image,
onClick = { onEvent(SearchScreenEvent.FeedingPointSelected(feedingPoint)) }
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@ import com.epmedu.animeal.api.feeding.FeedingApi
import com.epmedu.animeal.api.feeding.FeedingApiImpl
import com.epmedu.animeal.api.feeding.FeedingPointApi
import com.epmedu.animeal.api.feeding.FeedingPointApiImpl
import com.epmedu.animeal.api.storage.StorageApi
import com.epmedu.animeal.api.storage.StorageApiImpl
import com.epmedu.animeal.token.errorhandler.TokenExpirationHandler
import dagger.Module
import dagger.Provides
Expand Down Expand Up @@ -55,12 +53,6 @@ internal object ApiModule {
animealApi: AnimealApi
): FAQApi = FAQApiImpl(animealApi)

@Singleton
@Provides
fun providesStorageApi(
tokenExpirationHandler: TokenExpirationHandler
): StorageApi = StorageApiImpl(tokenExpirationHandler)

@Singleton
@Provides
fun providesDonateApi(
Expand Down
1 change: 1 addition & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ include(":shared:feature:camera")
include(":shared:feature:debugmenu")
include(":shared:feature:feeding")
include(":shared:feature:feedings")
include(":shared:feature:networkstorage")
include(":shared:feature:networkuser")
include(":shared:feature:permissions")
include(":shared:feature:profile")
Expand Down
3 changes: 2 additions & 1 deletion shared/feature/camera/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@ android {
dependencies {
implementation(platform(libs.androidx.compose.bom))

implementation(projects.library.api)
implementation(projects.library.common)
implementation(projects.library.extensions)
implementation(projects.library.foundation)
implementation(projects.library.resources)

implementation(projects.shared.feature.networkstorage)

implementation(libs.androidx.datastore)
implementation(libs.androidx.viewmodel)
implementation(libs.amplify.aws.auth.cognito)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.epmedu.animeal.camera.data.repository

import android.net.Uri
import com.epmedu.animeal.api.storage.StorageApi
import com.epmedu.animeal.camera.domain.repository.CameraRepository
import com.epmedu.animeal.common.data.wrapper.ApiResult
import com.epmedu.animeal.common.domain.wrapper.ActionResult
import com.epmedu.animeal.networkstorage.data.api.StorageApi

internal class CameraRepositoryImpl(private val storageApi: StorageApi) : CameraRepository {
override suspend fun uploadPhoto(fileName: String, fileUri: Uri): ActionResult<Unit> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.epmedu.animeal.camera.di

import com.epmedu.animeal.api.storage.StorageApi
import com.epmedu.animeal.camera.data.repository.CameraRepositoryImpl
import com.epmedu.animeal.camera.domain.repository.CameraRepository
import com.epmedu.animeal.camera.domain.usecase.DeletePhotoUseCase
import com.epmedu.animeal.camera.domain.usecase.UploadPhotoUseCase
import com.epmedu.animeal.networkstorage.data.api.StorageApi
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand Down
1 change: 1 addition & 0 deletions shared/feature/feeding/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ dependencies {
implementation(projects.library.resources)

debugImplementation(projects.shared.feature.debugmenu)
implementation(projects.shared.feature.networkstorage)
implementation(projects.shared.feature.permissions)
implementation(projects.shared.feature.profile)
implementation(projects.shared.feature.router)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.epmedu.animeal.feeding.domain.repository.FavouriteRepository
import com.epmedu.animeal.feeding.domain.repository.FeedingPointRepository
import com.epmedu.animeal.feeding.presentation.model.MapLocation
import com.epmedu.animeal.foundation.tabs.model.AnimalType
import com.epmedu.animeal.networkstorage.domain.NetworkFile
import kotlin.random.Random
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
Expand Down Expand Up @@ -41,10 +42,9 @@ internal class FeedingPointRepositoryMock(
Random.nextDouble(41.6752, 41.7183),
Random.nextDouble(44.7724, 44.8658)
),
images = listOf(
"https://fastly.picsum.photos/id/866/200/300.jpg?hmac=rcadCENKh4rD6MAp6V_ma-AyWv641M4iiOpe1RyFHeI",
"https://fastly.picsum.photos/id/237/200/300.jpg?hmac=TmmQSbShHz9CdQm0NkEjx1Dyh_Y984R9LpNrpvH2D_U",
"https://fastly.picsum.photos/id/719/200/200.jpg?hmac=WkMnZveCKylVzw33Ui-BNFbah8IQWImYq68wVKznlEo",
image = NetworkFile(
name = "300.jpg",
url = "https://fastly.picsum.photos/id/866/200/300.jpg?hmac=rcadCENKh4rD6MAp6V_ma-AyWv641M4iiOpe1RyFHeI"
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.epmedu.animeal.feeding.di
import com.epmedu.animeal.api.favourite.FavouriteApi
import com.epmedu.animeal.api.feeding.FeedingApi
import com.epmedu.animeal.api.feeding.FeedingPointApi
import com.epmedu.animeal.api.storage.StorageApi
import com.epmedu.animeal.networkstorage.data.api.StorageApi
import com.epmedu.animeal.auth.AuthAPI
import com.epmedu.animeal.debugmenu.domain.DebugMenuRepository
import com.epmedu.animeal.feeding.data.repository.FavouriteRepositoryImpl
Expand Down Expand Up @@ -59,6 +59,7 @@ object FeedDataModule {
authApi: AuthAPI,
feedingAPI: FeedingApi,
feedingPointApi: FeedingPointApi,
storageApi: StorageApi,
favouriteRepository: FavouriteRepository,
usersRepository: UsersRepository,
debugMenuRepository: DebugMenuRepository,
Expand All @@ -73,6 +74,7 @@ object FeedDataModule {
authApi = authApi,
feedingApi = feedingAPI,
feedingPointApi = feedingPointApi,
storageApi = storageApi,
favouriteRepository = favouriteRepository,
usersRepository = usersRepository
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package com.epmedu.animeal.feeding.data.mapper

import com.amplifyframework.datastore.generated.model.FeedingPoint
import com.epmedu.animeal.networkstorage.domain.NetworkFile
import com.amplifyframework.datastore.generated.model.Feeding as DataFeeding
import com.epmedu.animeal.feeding.domain.model.UserFeeding as DomainFeeding

fun DataFeeding.toDomain(isFavourite: Boolean, feedingPoint: FeedingPoint) =
DomainFeeding(
feedingPoint = feedingPoint.toDomainFeedingPoint(isFavourite),
createdAt = createdAt.toDate()
)
suspend fun DataFeeding.toDomain(
getImageFromName: suspend (String) -> NetworkFile,
isFavourite: Boolean,
feedingPoint: FeedingPoint
) = DomainFeeding(
feedingPoint = feedingPoint.toDomainFeedingPoint(getImageFromName, isFavourite),
createdAt = createdAt.toDate()
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,31 @@ import com.epmedu.animeal.common.constants.DefaultConstants.EMPTY_STRING
import com.epmedu.animeal.feeding.domain.model.enum.AnimalState
import com.epmedu.animeal.feeding.presentation.model.MapLocation
import com.epmedu.animeal.foundation.tabs.model.AnimalType
import com.epmedu.animeal.networkstorage.domain.NetworkFile
import com.amplifyframework.datastore.generated.model.FeedingPoint as DataFeedingPoint
import com.epmedu.animeal.feeding.domain.model.FeedingPoint as DomainFeedingPoint

internal fun DataFeedingPoint.toDomainFeedingPoint(isFavourite: Boolean = false) =
DomainFeedingPoint(
id = id ?: EMPTY_STRING,
title = name ?: EMPTY_STRING,
description = description ?: EMPTY_STRING,
city = city.orEmpty(),
animalStatus = when (status) {
FeedingPointStatus.fed -> AnimalState.GREEN
FeedingPointStatus.pending -> AnimalState.YELLOW
else -> AnimalState.RED
},
animalType = when (category?.tag) {
CategoryTag.cats -> AnimalType.Cats
else -> AnimalType.Dogs
},
isFavourite = isFavourite,
location = MapLocation(
latitude = location?.lat ?: 0.0,
longitude = location?.lon ?: 0.0
),
images = images
)
internal suspend fun DataFeedingPoint.toDomainFeedingPoint(
getImageFrom: suspend (fileName: String) -> NetworkFile?,
isFavourite: Boolean = false
) = DomainFeedingPoint(
id = id ?: EMPTY_STRING,
title = name ?: EMPTY_STRING,
description = description ?: EMPTY_STRING,
city = city.orEmpty(),
animalStatus = when (status) {
FeedingPointStatus.fed -> AnimalState.GREEN
FeedingPointStatus.pending -> AnimalState.YELLOW
else -> AnimalState.RED
},
animalType = when (category?.tag) {
CategoryTag.cats -> AnimalType.Cats
else -> AnimalType.Dogs
},
isFavourite = isFavourite,
location = MapLocation(
latitude = location?.lat ?: 0.0,
longitude = location?.lon ?: 0.0
),
image = images.getOrNull(0)?.let { fileName -> getImageFrom(fileName) }
)

This file was deleted.

Loading

0 comments on commit 0613525

Please sign in to comment.