diff --git a/application/feature/characters/list/api/src/main/java/com/stepango/blockme/feature/characters/list/api/domain/model/ICharacterItem.kt b/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/domain/model/ICharacter.kt similarity index 52% rename from application/feature/characters/list/api/src/main/java/com/stepango/blockme/feature/characters/list/api/domain/model/ICharacterItem.kt rename to application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/domain/model/ICharacter.kt index 5c46b31f..0f40b2ca 100644 --- a/application/feature/characters/list/api/src/main/java/com/stepango/blockme/feature/characters/list/api/domain/model/ICharacterItem.kt +++ b/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/domain/model/ICharacter.kt @@ -1,6 +1,6 @@ -package com.stepango.blockme.feature.characters.list.api.domain.model +package com.stepango.blockme.feature.characters.core.api.domain.model -interface ICharacterItem { +interface ICharacter { val id: Long val name: String val description: String diff --git a/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/domain/repository/MarvelRepository.kt b/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/domain/repository/MarvelRepository.kt index fe9e6a99..cfbd6565 100644 --- a/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/domain/repository/MarvelRepository.kt +++ b/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/domain/repository/MarvelRepository.kt @@ -1,11 +1,10 @@ package com.stepango.blockme.feature.characters.core.api.domain.repository -import com.stepango.blockme.core.network.library.response.BaseResponse -import com.stepango.blockme.feature.characters.core.api.data.response.CharacterResponse +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter interface MarvelRepository { - suspend fun getCharacter(id: Long): BaseResponse + suspend fun getCharacter(id: Long): ICharacter - suspend fun getCharacters(offset: Int, limit: Int): BaseResponse + suspend fun getCharacters(offset: Int, limit: Int): List } \ No newline at end of file diff --git a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/data/mapper/CharacterItemMapper.kt b/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/data/mapper/CharacterMapper.kt similarity index 58% rename from application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/data/mapper/CharacterItemMapper.kt rename to application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/data/mapper/CharacterMapper.kt index beccd017..885da742 100644 --- a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/data/mapper/CharacterItemMapper.kt +++ b/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/data/mapper/CharacterMapper.kt @@ -14,26 +14,28 @@ * limitations under the License. */ -package com.stepango.blockme.feature.characters.list.impl.data.mapper +package com.stepango.blockme.feature.characters.core.impl.data.mapper import com.stepango.blockme.common.util.mapper.Mapper import com.stepango.blockme.core.network.library.response.BaseResponse import com.stepango.blockme.feature.characters.core.api.data.response.CharacterResponse -import com.stepango.blockme.feature.characters.list.impl.domain.model.CharacterItem +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter +import com.stepango.blockme.feature.characters.core.impl.domain.model.Character private const val IMAGE_URL_FORMAT = "%s.%s" -open class CharacterItemMapper : Mapper, List> { +class CharacterMapper : Mapper, List> { - override suspend fun map(from: BaseResponse) = - from.data.results.map { - CharacterItem( - id = it.id, - name = it.name, - description = it.description, + @Throws(NoSuchElementException::class) + override suspend fun map(from: BaseResponse): List = + from.data.results.map { characterResponse -> + Character( + id = characterResponse.id, + name = characterResponse.name, + description = characterResponse.description, imageUrl = IMAGE_URL_FORMAT.format( - it.thumbnail.path.replace("http", "https"), - it.thumbnail.extension + characterResponse.thumbnail.path.replace("http", "https"), + characterResponse.thumbnail.extension ) ) } diff --git a/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/di/CharactersCoreModule.kt b/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/di/CharactersCoreModule.kt index 07114a37..554fc0c2 100644 --- a/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/di/CharactersCoreModule.kt +++ b/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/di/CharactersCoreModule.kt @@ -1,9 +1,14 @@ package com.stepango.blockme.feature.characters.core.impl.di import com.stepango.blockme.common.util.clock.Clock +import com.stepango.blockme.common.util.mapper.Mapper import com.stepango.blockme.core.network.library.Config +import com.stepango.blockme.core.network.library.response.BaseResponse +import com.stepango.blockme.feature.characters.core.api.data.response.CharacterResponse import com.stepango.blockme.feature.characters.core.api.data.service.MarvelService +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.core.api.domain.repository.MarvelRepository +import com.stepango.blockme.feature.characters.core.impl.data.mapper.CharacterMapper import com.stepango.blockme.feature.characters.core.impl.domain.repository.ServiceMarvelRepository import dagger.Module import dagger.Provides @@ -17,8 +22,16 @@ internal class CharactersCoreModule { @Provides fun provideMarvelService(retrofit: Retrofit): MarvelService = retrofit.create(MarvelService::class.java) - @Singleton - @Provides - fun provideMarvelRepository(service: MarvelService, config: Config, clock: Clock): MarvelRepository = - ServiceMarvelRepository(service, config, clock) + @Singleton + @Provides + fun provideMarvelRepository( + service: MarvelService, + config: Config, + clock: Clock, + characterMapper: Mapper, List>, + ): MarvelRepository = + ServiceMarvelRepository(service, config, clock, characterMapper) + + @Provides + fun provideCharacterMapper(): Mapper, List> = CharacterMapper() } \ No newline at end of file diff --git a/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/domain/model/Character.kt b/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/domain/model/Character.kt new file mode 100644 index 00000000..878d2cff --- /dev/null +++ b/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/domain/model/Character.kt @@ -0,0 +1,10 @@ +package com.stepango.blockme.feature.characters.core.impl.domain.model + +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter + +data class Character( + override val id: Long, + override val name: String, + override val description: String, + override val imageUrl: String +) : ICharacter \ No newline at end of file diff --git a/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/domain/repository/ServiceMarvelRepository.kt b/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/domain/repository/ServiceMarvelRepository.kt index a0f966c9..8a26a55d 100644 --- a/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/domain/repository/ServiceMarvelRepository.kt +++ b/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/domain/repository/ServiceMarvelRepository.kt @@ -18,10 +18,12 @@ package com.stepango.blockme.feature.characters.core.impl.domain.repository import com.stepango.blockme.common.extensions.util.toMD5 import com.stepango.blockme.common.util.clock.Clock +import com.stepango.blockme.common.util.mapper.Mapper import com.stepango.blockme.core.network.library.Config import com.stepango.blockme.core.network.library.response.BaseResponse import com.stepango.blockme.feature.characters.core.api.data.response.CharacterResponse import com.stepango.blockme.feature.characters.core.api.data.service.MarvelService +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.core.api.domain.repository.MarvelRepository import javax.inject.Inject @@ -34,6 +36,7 @@ internal class ServiceMarvelRepository @Inject constructor( private val service: MarvelService, private val config: Config, private val clock: Clock, + private val characterMapper: Mapper, List> ) : MarvelRepository { /** @@ -42,15 +45,17 @@ internal class ServiceMarvelRepository @Inject constructor( * @param id A single character id. * @return Response for single character resource. */ - override suspend fun getCharacter(id: Long): BaseResponse { + override suspend fun getCharacter(id: Long): ICharacter { val timestamp = clock.currentTimeMillis().toString() - return service.getCharacter( + val result = service.getCharacter( id = id, apiKey = config.publicApiKey, hash = generateApiHash(timestamp), timestamp = timestamp ) + + return characterMapper.map(result).first() } /** @@ -60,15 +65,17 @@ internal class ServiceMarvelRepository @Inject constructor( * @param limit Limit the result set to the specified number of resources. * @return Response for comic characters resource. */ - override suspend fun getCharacters(offset: Int, limit: Int): BaseResponse { + override suspend fun getCharacters(offset: Int, limit: Int): List { val timestamp = clock.currentTimeMillis().toString() - return service.getCharacters( + val result = service.getCharacters( apiKey = config.publicApiKey, hash = generateApiHash(timestamp), timestamp = timestamp, offset = offset, limit = limit ) + + return characterMapper.map(result) } /** diff --git a/application/feature/characters/core/impl/src/test/java/com/stepango/blockme/feature/characters/core/impl/domain/repository/ServiceMarvelRepositoryTest.kt b/application/feature/characters/core/impl/src/test/java/com/stepango/blockme/feature/characters/core/impl/domain/repository/ServiceMarvelRepositoryTest.kt index 1008b19d..20a24e1c 100644 --- a/application/feature/characters/core/impl/src/test/java/com/stepango/blockme/feature/characters/core/impl/domain/repository/ServiceMarvelRepositoryTest.kt +++ b/application/feature/characters/core/impl/src/test/java/com/stepango/blockme/feature/characters/core/impl/domain/repository/ServiceMarvelRepositoryTest.kt @@ -2,10 +2,12 @@ package com.stepango.blockme.feature.characters.core.impl.domain.repository import com.stepango.blockme.common.extensions.util.toMD5 import com.stepango.blockme.common.util.clock.Clock +import com.stepango.blockme.common.util.mapper.Mapper import com.stepango.blockme.core.network.library.Config import com.stepango.blockme.core.network.library.response.BaseResponse import com.stepango.blockme.feature.characters.core.api.data.response.CharacterResponse import com.stepango.blockme.feature.characters.core.api.data.service.MarvelService +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.core.api.domain.repository.MarvelRepository import io.mockk.coEvery import io.mockk.every @@ -30,21 +32,24 @@ internal class ServiceMarvelRepositoryTest { private val config: Config = mockk() private val marvelService: MarvelService = mockk() private val clock: Clock = mockk() + private val characterMapper: Mapper, List> = mockk() - private val repository: MarvelRepository = ServiceMarvelRepository(marvelService, config, clock) + private val repository: MarvelRepository = ServiceMarvelRepository(marvelService, config, clock, characterMapper) @Test fun `get a character EXPECT the base response`() = runBlocking { - val expectedResponse: BaseResponse = mockk() + val response: BaseResponse = mockk() + val expectedMappedResponse: ICharacter = mockk() every { clock.currentTimeMillis() } returns TIMESTAMP every { config.privateApiKey } returns API_PRIVATE_KEY every { config.publicApiKey } returns API_PUBLIC_KEY - coEvery { marvelService.getCharacter(ID, API_PUBLIC_KEY, HASH, TIMESTAMP.toString()) } returns expectedResponse + coEvery { marvelService.getCharacter(ID, API_PUBLIC_KEY, HASH, TIMESTAMP.toString()) } returns response + coEvery { characterMapper.map(response) } returns listOf(expectedMappedResponse) val result = repository.getCharacter(ID) - assertEquals(expectedResponse, result) + assertEquals(expectedMappedResponse, result) } @Test @@ -52,15 +57,17 @@ internal class ServiceMarvelRepositoryTest { val offset = 10 val limit = 20 - val expectedResponse: BaseResponse = mockk() + val response: BaseResponse = mockk() + val expectedMappedResponse: List = mockk() every { clock.currentTimeMillis() } returns TIMESTAMP every { config.privateApiKey } returns API_PRIVATE_KEY every { config.publicApiKey } returns API_PUBLIC_KEY - coEvery { marvelService.getCharacters(API_PUBLIC_KEY, HASH, TIMESTAMP.toString(), offset, limit) } returns expectedResponse + coEvery { marvelService.getCharacters(API_PUBLIC_KEY, HASH, TIMESTAMP.toString(), offset, limit) } returns response + coEvery { characterMapper.map(response) } returns expectedMappedResponse val result = repository.getCharacters(offset, limit) - assertEquals(expectedResponse, result) + assertEquals(expectedMappedResponse, result) } } \ No newline at end of file diff --git a/application/feature/characters/detail/api/build.gradle.kts b/application/feature/characters/detail/api/build.gradle.kts index 29997c21..6485ca5e 100644 --- a/application/feature/characters/detail/api/build.gradle.kts +++ b/application/feature/characters/detail/api/build.gradle.kts @@ -1,4 +1,7 @@ api( packageName = "com.stepango.blockme.character.detail.api", - owner = Teams.core + owner = Teams.core, + dependencies = deps( + target(":feature:characters:core:api") + ) ) \ No newline at end of file diff --git a/application/feature/characters/detail/api/src/main/empty.kt b/application/feature/characters/detail/api/src/main/empty.kt new file mode 100644 index 00000000..e69de29b diff --git a/application/feature/characters/detail/api/src/main/java/com/stepango/blockme/feature/characters/detail/api/domain/model/ICharacterDetail.kt b/application/feature/characters/detail/api/src/main/java/com/stepango/blockme/feature/characters/detail/api/domain/model/ICharacterDetail.kt deleted file mode 100644 index fdfcc9dd..00000000 --- a/application/feature/characters/detail/api/src/main/java/com/stepango/blockme/feature/characters/detail/api/domain/model/ICharacterDetail.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.stepango.blockme.feature.characters.detail.api.domain.model - -interface ICharacterDetail { - val id: Long - val name: String - val description: String - val imageUrl: String -} \ No newline at end of file diff --git a/application/feature/characters/detail/databinding/src/main/java/com/stepango/blockme/feature/characters/detail/impl/presentation/ICharacterDetailViewModel.kt b/application/feature/characters/detail/databinding/src/main/java/com/stepango/blockme/feature/characters/detail/impl/presentation/ICharacterDetailViewModel.kt index 9dbe44d1..5cf6ca8b 100644 --- a/application/feature/characters/detail/databinding/src/main/java/com/stepango/blockme/feature/characters/detail/impl/presentation/ICharacterDetailViewModel.kt +++ b/application/feature/characters/detail/databinding/src/main/java/com/stepango/blockme/feature/characters/detail/impl/presentation/ICharacterDetailViewModel.kt @@ -1,11 +1,11 @@ package com.stepango.blockme.feature.characters.detail.impl.presentation import androidx.lifecycle.LiveData -import com.stepango.blockme.feature.characters.detail.api.domain.model.ICharacterDetail +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter interface ICharacterDetailViewModel { - val data: LiveData + val data: LiveData val state: LiveData fun loadCharacterDetail(characterId: Long) diff --git a/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/data/mapper/CharacterDetailMapper.kt b/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/data/mapper/CharacterDetailMapper.kt deleted file mode 100644 index 55afeb9e..00000000 --- a/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/data/mapper/CharacterDetailMapper.kt +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2019 vmadalin.com - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.stepango.blockme.feature.characters.detail.impl.data.mapper - -import com.stepango.blockme.common.util.mapper.Mapper -import com.stepango.blockme.core.network.library.response.BaseResponse -import com.stepango.blockme.feature.characters.core.api.data.response.CharacterResponse -import com.stepango.blockme.feature.characters.detail.impl.domain.model.CharacterDetail - -private const val IMAGE_URL_FORMAT = "%s.%s" - -class CharacterDetailMapper : Mapper, CharacterDetail> { - - @Throws(NoSuchElementException::class) - override suspend fun map(from: BaseResponse): CharacterDetail { - val characterResponse = from.data.results.first() - return CharacterDetail( - id = characterResponse.id, - name = characterResponse.name, - description = characterResponse.description, - imageUrl = IMAGE_URL_FORMAT.format( - characterResponse.thumbnail.path.replace("http", "https"), - characterResponse.thumbnail.extension - ) - ) - } -} diff --git a/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/di/CharacterDetailModule.kt b/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/di/CharacterDetailModule.kt index df02bc72..2909e240 100644 --- a/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/di/CharacterDetailModule.kt +++ b/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/di/CharacterDetailModule.kt @@ -19,11 +19,9 @@ package com.stepango.blockme.feature.characters.detail.impl.di import androidx.lifecycle.ViewModel import com.stepango.blockme.core.di.library.scopes.FeatureScope import com.stepango.blockme.core.mvvm.library.di.ViewModelKey -import com.stepango.blockme.feature.characters.detail.impl.data.mapper.CharacterDetailMapper import com.stepango.blockme.feature.characters.detail.impl.presentation.CharacterDetailViewModel import dagger.Binds import dagger.Module -import dagger.Provides import dagger.multibindings.IntoMap @Module @@ -34,11 +32,4 @@ internal abstract class CharacterDetailModule { @IntoMap @ViewModelKey(CharacterDetailViewModel::class) abstract fun bindsCharactersDetailViewModel(viewModel: CharacterDetailViewModel): ViewModel - - companion object { - - @FeatureScope - @Provides - fun providesCharacterDetailMapper() = CharacterDetailMapper() - } } diff --git a/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/domain/model/CharacterDetail.kt b/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/domain/model/CharacterDetail.kt deleted file mode 100644 index 0713836b..00000000 --- a/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/domain/model/CharacterDetail.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2019 vmadalin.com - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.stepango.blockme.feature.characters.detail.impl.domain.model - -import com.stepango.blockme.feature.characters.detail.api.domain.model.ICharacterDetail - -data class CharacterDetail( - override val id: Long, - override val name: String, - override val description: String, - override val imageUrl: String -) : ICharacterDetail diff --git a/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/presentation/CharacterDetailViewModel.kt b/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/presentation/CharacterDetailViewModel.kt index 2a7f8c61..14cf6cfe 100644 --- a/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/presentation/CharacterDetailViewModel.kt +++ b/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/presentation/CharacterDetailViewModel.kt @@ -20,9 +20,8 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.core.api.domain.repository.MarvelRepository -import com.stepango.blockme.feature.characters.detail.api.domain.model.ICharacterDetail -import com.stepango.blockme.feature.characters.detail.impl.data.mapper.CharacterDetailMapper import com.stepango.blockme.feature.characters.favorite.api.domain.usecase.IGetCharacterFavoriteUseCase import com.stepango.blockme.feature.characters.favorite.api.domain.usecase.ISetCharacterFavoriteUseCase import kotlinx.coroutines.launch @@ -32,11 +31,10 @@ class CharacterDetailViewModel @Inject constructor( private val marvelRepository: MarvelRepository, private val getCharacterFavoriteUseCase: IGetCharacterFavoriteUseCase, private val setCharacterFavoriteUseCase: ISetCharacterFavoriteUseCase, - private val characterDetailMapper: CharacterDetailMapper ) : ViewModel(), ICharacterDetailViewModel { - private val _data = MutableLiveData() - override val data: LiveData + private val _data = MutableLiveData() + override val data: LiveData get() = _data private val _state = MutableLiveData() @@ -48,7 +46,7 @@ class CharacterDetailViewModel @Inject constructor( viewModelScope.launch { try { val result = marvelRepository.getCharacter(characterId) - _data.postValue(characterDetailMapper.map(result)) + _data.postValue(result) getCharacterFavoriteUseCase(characterId)?.let { _state.postValue(CharacterDetailViewState.AlreadyAddedToFavorite) @@ -65,9 +63,10 @@ class CharacterDetailViewModel @Inject constructor( _data.value?.let { viewModelScope.launch { setCharacterFavoriteUseCase( - id = it.id, - name = it.name, - imageUrl = it.imageUrl + id = it.id, + name = it.name, + description = it.description, + imageUrl = it.imageUrl ) _state.postValue(CharacterDetailViewState.AddedToFavorite) } diff --git a/application/feature/characters/favorite/api/build.gradle.kts b/application/feature/characters/favorite/api/build.gradle.kts index ad3c1975..dffd7132 100644 --- a/application/feature/characters/favorite/api/build.gradle.kts +++ b/application/feature/characters/favorite/api/build.gradle.kts @@ -1,4 +1,7 @@ api( packageName = "com.stepango.blockme.character.favorite.api", - owner = Teams.core + owner = Teams.core, + dependencies = deps( + target(":feature:characters:core:api") + ) ) \ No newline at end of file diff --git a/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/model/ICharacterFavorite.kt b/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/model/ICharacterFavorite.kt deleted file mode 100644 index eafa4346..00000000 --- a/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/model/ICharacterFavorite.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2019 vmadalin.com - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.stepango.blockme.feature.characters.favorite.api.domain.model - -interface ICharacterFavorite { - val id: Long - val name: String - val imageUrl: String -} diff --git a/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/repository/ICharacterFavoriteRepository.kt b/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/repository/ICharacterFavoriteRepository.kt index 84d51d30..b4f1d918 100644 --- a/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/repository/ICharacterFavoriteRepository.kt +++ b/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/repository/ICharacterFavoriteRepository.kt @@ -1,20 +1,20 @@ package com.stepango.blockme.feature.characters.favorite.api.domain.repository -import com.stepango.blockme.feature.characters.favorite.api.domain.model.ICharacterFavorite +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter interface ICharacterFavoriteRepository { - suspend fun getAllCharactersFavorite(): List + suspend fun getAllCharactersFavorite(): List - suspend fun getCharacterFavorite(characterFavoriteId: Long): ICharacterFavorite? + suspend fun getCharacterFavorite(characterFavoriteId: Long): ICharacter? suspend fun deleteAllCharactersFavorite() suspend fun deleteCharacterFavoriteById(characterFavoriteId: Long) - suspend fun deleteCharacterFavorite(character: ICharacterFavorite) + suspend fun deleteCharacterFavorite(character: ICharacter) - suspend fun insertCharactersFavorites(characters: List) + suspend fun insertCharactersFavorites(characters: List) - suspend fun insertCharacterFavorite(id: Long, name: String, imageUrl: String) + suspend fun insertCharacterFavorite(id: Long, name: String, description: String, imageUrl: String) } diff --git a/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/usecase/IDeleteCharacterFavoriteUseCase.kt b/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/usecase/IDeleteCharacterFavoriteUseCase.kt index 2c666455..ef01c388 100644 --- a/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/usecase/IDeleteCharacterFavoriteUseCase.kt +++ b/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/usecase/IDeleteCharacterFavoriteUseCase.kt @@ -1,8 +1,8 @@ package com.stepango.blockme.feature.characters.favorite.api.domain.usecase -import com.stepango.blockme.feature.characters.favorite.api.domain.model.ICharacterFavorite +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter interface IDeleteCharacterFavoriteUseCase { - suspend operator fun invoke(character: ICharacterFavorite) + suspend operator fun invoke(character: ICharacter) } \ No newline at end of file diff --git a/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/usecase/IGetAllCharactersFavoriteUseCase.kt b/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/usecase/IGetAllCharactersFavoriteUseCase.kt index ad0c6940..fe1ad2eb 100644 --- a/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/usecase/IGetAllCharactersFavoriteUseCase.kt +++ b/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/usecase/IGetAllCharactersFavoriteUseCase.kt @@ -1,8 +1,8 @@ package com.stepango.blockme.feature.characters.favorite.api.domain.usecase -import com.stepango.blockme.feature.characters.favorite.api.domain.model.ICharacterFavorite +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter interface IGetAllCharactersFavoriteUseCase { - suspend operator fun invoke(): List + suspend operator fun invoke(): List } \ No newline at end of file diff --git a/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/usecase/IGetCharacterFavoriteUseCase.kt b/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/usecase/IGetCharacterFavoriteUseCase.kt index 8aba67b3..6ec238a6 100644 --- a/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/usecase/IGetCharacterFavoriteUseCase.kt +++ b/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/usecase/IGetCharacterFavoriteUseCase.kt @@ -1,8 +1,8 @@ package com.stepango.blockme.feature.characters.favorite.api.domain.usecase -import com.stepango.blockme.feature.characters.favorite.api.domain.model.ICharacterFavorite +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter interface IGetCharacterFavoriteUseCase { - suspend operator fun invoke(characterFavoriteId: Long): ICharacterFavorite? + suspend operator fun invoke(characterFavoriteId: Long): ICharacter? } \ No newline at end of file diff --git a/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/usecase/ISetCharacterFavoriteUseCase.kt b/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/usecase/ISetCharacterFavoriteUseCase.kt index 078a5fdf..46e5702b 100644 --- a/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/usecase/ISetCharacterFavoriteUseCase.kt +++ b/application/feature/characters/favorite/api/src/main/java/com/stepango/blockme/feature/characters/favorite/api/domain/usecase/ISetCharacterFavoriteUseCase.kt @@ -2,5 +2,5 @@ package com.stepango.blockme.feature.characters.favorite.api.domain.usecase interface ISetCharacterFavoriteUseCase { - suspend operator fun invoke(id: Long, name: String, imageUrl: String) + suspend operator fun invoke(id: Long, name: String, description: String, imageUrl: String) } \ No newline at end of file diff --git a/application/feature/characters/favorite/databinding/build.gradle.kts b/application/feature/characters/favorite/databinding/build.gradle.kts index 87e022f5..b4782bb6 100644 --- a/application/feature/characters/favorite/databinding/build.gradle.kts +++ b/application/feature/characters/favorite/databinding/build.gradle.kts @@ -8,6 +8,7 @@ dataBinding( androidx.constraintlayout, androidx.navigation ) + deps( + project(":feature:characters:core:api"), project(":feature:characters:favorite:api"), project(":feature:characters:favorite:res"), diff --git a/application/feature/characters/favorite/databinding/src/main/java/com/stepango/blockme/feature/characters/favorite/databinding/presentation/ICharacterFavoriteViewModel.kt b/application/feature/characters/favorite/databinding/src/main/java/com/stepango/blockme/feature/characters/favorite/databinding/presentation/ICharacterFavoriteViewModel.kt index e6564508..da279e1e 100644 --- a/application/feature/characters/favorite/databinding/src/main/java/com/stepango/blockme/feature/characters/favorite/databinding/presentation/ICharacterFavoriteViewModel.kt +++ b/application/feature/characters/favorite/databinding/src/main/java/com/stepango/blockme/feature/characters/favorite/databinding/presentation/ICharacterFavoriteViewModel.kt @@ -17,17 +17,17 @@ package com.stepango.blockme.feature.characters.favorite.databinding.presentation import androidx.lifecycle.LiveData -import com.stepango.blockme.feature.characters.favorite.api.domain.model.ICharacterFavorite +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter interface ICharacterFavoriteViewModel { - val data: LiveData> + val data: LiveData> val state: LiveData fun loadFavoriteCharacters() - fun removeFavoriteCharacter(character: ICharacterFavorite) + fun removeFavoriteCharacter(character: ICharacter) } interface ICharacterFavoriteViewState { diff --git a/application/feature/characters/favorite/databinding/src/main/res/layout/list_item_character_favorite.xml b/application/feature/characters/favorite/databinding/src/main/res/layout/list_item_character_favorite.xml index 438e7122..82a0608d 100644 --- a/application/feature/characters/favorite/databinding/src/main/res/layout/list_item_character_favorite.xml +++ b/application/feature/characters/favorite/databinding/src/main/res/layout/list_item_character_favorite.xml @@ -6,7 +6,7 @@ + type="com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter" /> diff --git a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/data/database/MarvelDatabase.kt b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/data/database/MarvelDatabase.kt index a870f67b..b36df6c2 100644 --- a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/data/database/MarvelDatabase.kt +++ b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/data/database/MarvelDatabase.kt @@ -23,7 +23,7 @@ import com.stepango.blockme.feature.characters.favorite.impl.data.model.Characte @Database( entities = [CharacterFavorite::class], exportSchema = false, - version = 1 + version = 2 ) abstract class MarvelDatabase : RoomDatabase() { diff --git a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/data/database/migrations/MarvelDatabaseMigration1to2.kt b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/data/database/migrations/MarvelDatabaseMigration1to2.kt index aaf7571a..68ac0d30 100644 --- a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/data/database/migrations/MarvelDatabaseMigration1to2.kt +++ b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/data/database/migrations/MarvelDatabaseMigration1to2.kt @@ -21,6 +21,6 @@ import androidx.sqlite.db.SupportSQLiteDatabase val MIGRATION_1_2: Migration = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { - // Implement first migration + database.execSQL("ALTER TABLE character_favorite ADD COLUMN description STRING") } } diff --git a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/data/model/CharacterFavorite.kt b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/data/model/CharacterFavorite.kt index 5ca15d64..615a37f7 100644 --- a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/data/model/CharacterFavorite.kt +++ b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/data/model/CharacterFavorite.kt @@ -19,11 +19,12 @@ package com.stepango.blockme.feature.characters.favorite.impl.data.model import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.stepango.blockme.feature.characters.favorite.api.domain.model.ICharacterFavorite +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter @Entity(tableName = "character_favorite") data class CharacterFavorite( @PrimaryKey override val id: Long, @ColumnInfo(name = "name") override val name: String, + @ColumnInfo(name = "description") override val description: String, @ColumnInfo(name = "imageUrl") override val imageUrl: String -) : ICharacterFavorite +) : ICharacter diff --git a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/data/repository/CharacterFavoriteRepository.kt b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/data/repository/CharacterFavoriteRepository.kt index 8e92f84b..b37e4b89 100644 --- a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/data/repository/CharacterFavoriteRepository.kt +++ b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/data/repository/CharacterFavoriteRepository.kt @@ -16,7 +16,7 @@ package com.stepango.blockme.feature.characters.favorite.impl.data.repository -import com.stepango.blockme.feature.characters.favorite.api.domain.model.ICharacterFavorite +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.favorite.api.domain.repository.ICharacterFavoriteRepository import com.stepango.blockme.feature.characters.favorite.impl.data.database.CharacterFavoriteDao import com.stepango.blockme.feature.characters.favorite.impl.data.model.CharacterFavorite @@ -26,10 +26,10 @@ class CharacterFavoriteRepository @Inject constructor( private val characterFavoriteDao: CharacterFavoriteDao ) : ICharacterFavoriteRepository { - override suspend fun getAllCharactersFavorite(): List = + override suspend fun getAllCharactersFavorite(): List = characterFavoriteDao.getAllCharactersFavorite() - override suspend fun getCharacterFavorite(characterFavoriteId: Long): ICharacterFavorite? = + override suspend fun getCharacterFavorite(characterFavoriteId: Long): ICharacter? = characterFavoriteDao.getCharacterFavorite(characterFavoriteId) override suspend fun deleteAllCharactersFavorite() = @@ -38,16 +38,22 @@ class CharacterFavoriteRepository @Inject constructor( override suspend fun deleteCharacterFavoriteById(characterFavoriteId: Long) = characterFavoriteDao.deleteCharacterFavoriteById(characterFavoriteId) - override suspend fun deleteCharacterFavorite(character: ICharacterFavorite) = + override suspend fun deleteCharacterFavorite(character: ICharacter) = characterFavoriteDao.deleteCharacterFavorite(character as CharacterFavorite) - override suspend fun insertCharactersFavorites(characters: List) = + override suspend fun insertCharactersFavorites(characters: List) = characterFavoriteDao.insertCharactersFavorites(characters as List) - override suspend fun insertCharacterFavorite(id: Long, name: String, imageUrl: String) { + override suspend fun insertCharacterFavorite( + id: Long, + name: String, + description: String, + imageUrl: String, + ) { val characterFavorite = CharacterFavorite( id = id, name = name, + description = description, imageUrl = imageUrl ) characterFavoriteDao.insertCharacterFavorite(characterFavorite) diff --git a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/domain/usecase/DeleteCharacterFavoriteUseCase.kt b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/domain/usecase/DeleteCharacterFavoriteUseCase.kt index 72bc3ec3..26d73084 100644 --- a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/domain/usecase/DeleteCharacterFavoriteUseCase.kt +++ b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/domain/usecase/DeleteCharacterFavoriteUseCase.kt @@ -1,13 +1,13 @@ package com.stepango.blockme.feature.characters.favorite.impl.domain.usecase -import com.stepango.blockme.feature.characters.favorite.api.domain.model.ICharacterFavorite +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.favorite.api.domain.repository.ICharacterFavoriteRepository import com.stepango.blockme.feature.characters.favorite.api.domain.usecase.IDeleteCharacterFavoriteUseCase import javax.inject.Inject class DeleteCharacterFavoriteUseCase @Inject constructor(private val repository: ICharacterFavoriteRepository) : IDeleteCharacterFavoriteUseCase { - override suspend operator fun invoke(character: ICharacterFavorite) { + override suspend operator fun invoke(character: ICharacter) { repository.deleteCharacterFavorite(character) } } \ No newline at end of file diff --git a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/domain/usecase/GetAllCharactersFavoriteUseCase.kt b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/domain/usecase/GetAllCharactersFavoriteUseCase.kt index 8170b195..b23f0889 100644 --- a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/domain/usecase/GetAllCharactersFavoriteUseCase.kt +++ b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/domain/usecase/GetAllCharactersFavoriteUseCase.kt @@ -1,13 +1,12 @@ package com.stepango.blockme.feature.characters.favorite.impl.domain.usecase -import com.stepango.blockme.feature.characters.favorite.api.domain.model.ICharacterFavorite +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.favorite.api.domain.repository.ICharacterFavoriteRepository import com.stepango.blockme.feature.characters.favorite.api.domain.usecase.IGetAllCharactersFavoriteUseCase -import com.stepango.blockme.feature.characters.favorite.api.domain.usecase.IGetCharacterFavoriteUseCase import javax.inject.Inject class GetAllCharactersFavoriteUseCase @Inject constructor(private val repository: ICharacterFavoriteRepository) : IGetAllCharactersFavoriteUseCase { - override suspend operator fun invoke(): List = - repository.getAllCharactersFavorite() + override suspend operator fun invoke(): List = + repository.getAllCharactersFavorite() } \ No newline at end of file diff --git a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/domain/usecase/GetCharacterFavoriteUseCase.kt b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/domain/usecase/GetCharacterFavoriteUseCase.kt index b52bb53a..e69c1f45 100644 --- a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/domain/usecase/GetCharacterFavoriteUseCase.kt +++ b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/domain/usecase/GetCharacterFavoriteUseCase.kt @@ -1,12 +1,12 @@ package com.stepango.blockme.feature.characters.favorite.impl.domain.usecase -import com.stepango.blockme.feature.characters.favorite.api.domain.model.ICharacterFavorite +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.favorite.api.domain.repository.ICharacterFavoriteRepository import com.stepango.blockme.feature.characters.favorite.api.domain.usecase.IGetCharacterFavoriteUseCase import javax.inject.Inject class GetCharacterFavoriteUseCase @Inject constructor(private val repository: ICharacterFavoriteRepository) : IGetCharacterFavoriteUseCase { - override suspend operator fun invoke(characterFavoriteId: Long): ICharacterFavorite? = - repository.getCharacterFavorite(characterFavoriteId) + override suspend operator fun invoke(characterFavoriteId: Long): ICharacter? = + repository.getCharacterFavorite(characterFavoriteId) } \ No newline at end of file diff --git a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/domain/usecase/SetCharacterFavoriteUseCase.kt b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/domain/usecase/SetCharacterFavoriteUseCase.kt index b85c27dd..f895e792 100644 --- a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/domain/usecase/SetCharacterFavoriteUseCase.kt +++ b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/domain/usecase/SetCharacterFavoriteUseCase.kt @@ -6,7 +6,7 @@ import javax.inject.Inject class SetCharacterFavoriteUseCase @Inject constructor(private val repository: ICharacterFavoriteRepository) : ISetCharacterFavoriteUseCase { - override suspend operator fun invoke(id: Long, name: String, imageUrl: String) { - repository.insertCharacterFavorite(id, name, imageUrl) + override suspend operator fun invoke(id: Long, name: String, description: String, imageUrl: String) { + repository.insertCharacterFavorite(id, name, description, imageUrl) } } \ No newline at end of file diff --git a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/presentation/CharacterFavoriteViewModel.kt b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/presentation/CharacterFavoriteViewModel.kt index ae27a800..70f9dd4d 100644 --- a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/presentation/CharacterFavoriteViewModel.kt +++ b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/presentation/CharacterFavoriteViewModel.kt @@ -17,7 +17,7 @@ package com.stepango.blockme.feature.characters.favorite.impl.presentation import androidx.lifecycle.* -import com.stepango.blockme.feature.characters.favorite.api.domain.model.ICharacterFavorite +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.favorite.api.domain.usecase.IDeleteCharacterFavoriteUseCase import com.stepango.blockme.feature.characters.favorite.api.domain.usecase.IGetAllCharactersFavoriteUseCase import com.stepango.blockme.feature.characters.favorite.databinding.presentation.ICharacterFavoriteViewModel @@ -32,8 +32,8 @@ class CharacterFavoriteViewModel @Inject constructor( private val deleteCharacterFavoriteUseCase: IDeleteCharacterFavoriteUseCase ) : ICharacterFavoriteViewModel, ViewModel() { - private val _data = MutableLiveData>() - override val data: LiveData> + private val _data = MutableLiveData>() + override val data: LiveData> get() = _data override val state: LiveData @@ -52,7 +52,7 @@ class CharacterFavoriteViewModel @Inject constructor( } } - override fun removeFavoriteCharacter(character: ICharacterFavorite) { + override fun removeFavoriteCharacter(character: ICharacter) { viewModelScope.launch { deleteCharacterFavoriteUseCase(character) } diff --git a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/ui/CharacterFavoriteFragment.kt b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/ui/CharacterFavoriteFragment.kt index 56a71a3d..601cb78e 100644 --- a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/ui/CharacterFavoriteFragment.kt +++ b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/ui/CharacterFavoriteFragment.kt @@ -23,10 +23,10 @@ import com.stepango.blockme.common.extensions.android.util.observe import com.stepango.blockme.core.di.library.BaseComponentProvider import com.stepango.blockme.core.mvvm.library.ui.BaseFragment import com.stepango.blockme.core.mvvm.library.viewModels -import com.stepango.blockme.feature.characters.favorite.api.domain.model.ICharacterFavorite +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter +import com.stepango.blockme.feature.characters.favorite.databinding.presentation.ICharacterFavoriteViewModel import com.stepango.blockme.feature.characters.favorite.impl.R import com.stepango.blockme.feature.characters.favorite.impl.di.DaggerCharacterFavoriteComponent -import com.stepango.blockme.feature.characters.favorite.databinding.presentation.ICharacterFavoriteViewModel import com.stepango.blockme.feature.characters.favorite.impl.ui.adapter.CharacterFavoriteAdapter import com.stepango.blockme.feature.characters.favorite.impl.ui.adapter.CharacterFavoriteTouchHelper import com.stepango.blockme.feature.favorite.databinding.databinding.FragmentCharacterFavoriteListBinding @@ -65,7 +65,7 @@ class CharacterFavoriteFragment : } } - private fun onViewDataChange(viewData: List) { + private fun onViewDataChange(viewData: List) { viewAdapter.submitList(viewData) } } diff --git a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/ui/adapter/CharacterFavoriteAdapter.kt b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/ui/adapter/CharacterFavoriteAdapter.kt index 3ca6295b..bb122ea0 100644 --- a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/ui/adapter/CharacterFavoriteAdapter.kt +++ b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/ui/adapter/CharacterFavoriteAdapter.kt @@ -20,10 +20,10 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.stepango.blockme.core.mvvm.library.ui.BaseListAdapter -import com.stepango.blockme.feature.characters.favorite.api.domain.model.ICharacterFavorite +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.favorite.impl.ui.adapter.holders.CharacterFavoriteViewHolder -class CharacterFavoriteAdapter : BaseListAdapter( +class CharacterFavoriteAdapter : BaseListAdapter( itemsSame = { old, new -> old.id == new.id }, contentsSame = { old, new -> old == new } ) { diff --git a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/ui/adapter/holders/CharacterFavoriteViewHolder.kt b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/ui/adapter/holders/CharacterFavoriteViewHolder.kt index 71607a0e..4cde261a 100644 --- a/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/ui/adapter/holders/CharacterFavoriteViewHolder.kt +++ b/application/feature/characters/favorite/impl/src/main/java/com/stepango/blockme/feature/characters/favorite/impl/ui/adapter/holders/CharacterFavoriteViewHolder.kt @@ -18,7 +18,7 @@ package com.stepango.blockme.feature.characters.favorite.impl.ui.adapter.holders import android.view.LayoutInflater import com.stepango.blockme.core.mvvm.library.ui.BaseViewHolder -import com.stepango.blockme.feature.characters.favorite.api.domain.model.ICharacterFavorite +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.favorite.databinding.databinding.ListItemCharacterFavoriteBinding class CharacterFavoriteViewHolder( @@ -27,7 +27,7 @@ class CharacterFavoriteViewHolder( binding = ListItemCharacterFavoriteBinding.inflate(inflater) ) { - fun bind(characterFavorite: ICharacterFavorite) { + fun bind(characterFavorite: ICharacter) { binding.character = characterFavorite binding.executePendingBindings() } diff --git a/application/feature/characters/list/databinding/src/main/java/com/stepango/blockme/feature/characters/list/impl/domain/model/ICharactersListViewModel.kt b/application/feature/characters/list/databinding/src/main/java/com/stepango/blockme/feature/characters/list/impl/domain/model/ICharactersListViewModel.kt index dd463f22..fcf4a27b 100644 --- a/application/feature/characters/list/databinding/src/main/java/com/stepango/blockme/feature/characters/list/impl/domain/model/ICharactersListViewModel.kt +++ b/application/feature/characters/list/databinding/src/main/java/com/stepango/blockme/feature/characters/list/impl/domain/model/ICharactersListViewModel.kt @@ -4,12 +4,12 @@ import androidx.lifecycle.LiveData import androidx.paging.PagedList import com.stepango.blockme.core.mvvm.library.lifecycle.SingleLiveData import com.stepango.blockme.core.network.library.NetworkState -import com.stepango.blockme.feature.characters.list.api.domain.model.ICharacterItem +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter interface ICharactersListViewModel { val networkState: LiveData? val event: SingleLiveData - val data: LiveData> + val data: LiveData> val state: LiveData? /** diff --git a/application/feature/characters/list/databinding/src/main/res/layout/list_item_character.xml b/application/feature/characters/list/databinding/src/main/res/layout/list_item_character.xml index 4084f30b..184c8e95 100644 --- a/application/feature/characters/list/databinding/src/main/res/layout/list_item_character.xml +++ b/application/feature/characters/list/databinding/src/main/res/layout/list_item_character.xml @@ -6,7 +6,7 @@ + type="com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter" /> () { +) : PageKeyedDataSource() { val networkState = MutableLiveData() private var retry: (() -> Unit)? = null override fun loadInitial( params: LoadInitialParams, - callback: LoadInitialCallback + callback: LoadInitialCallback ) { networkState.postValue(NetworkState.Loading()) // TODO https://github.com/formatools/forma/issues/48 @@ -64,9 +62,8 @@ open class CharacterPageDataSource @Inject constructor( offset = PAGE_INIT_ELEMENTS, limit = PAGE_MAX_ELEMENTS ) - val data = mapper.map(response) - callback.onResult(data, null, PAGE_MAX_ELEMENTS) - networkState.postValue(NetworkState.Success(isEmptyResponse = data.isEmpty())) + callback.onResult(response, null, PAGE_MAX_ELEMENTS) + networkState.postValue(NetworkState.Success(isEmptyResponse = response.isEmpty())) } } @@ -80,7 +77,7 @@ open class CharacterPageDataSource @Inject constructor( */ override fun loadAfter( params: LoadParams, - callback: LoadCallback + callback: LoadCallback ) { networkState.postValue(NetworkState.Loading(true)) // TODO https://github.com/formatools/forma/issues/48 @@ -96,9 +93,8 @@ open class CharacterPageDataSource @Inject constructor( offset = params.key, limit = PAGE_MAX_ELEMENTS ) - val data = mapper.map(response) - callback.onResult(data, params.key + PAGE_MAX_ELEMENTS) - networkState.postValue(NetworkState.Success(true, data.isEmpty())) + callback.onResult(response, params.key + PAGE_MAX_ELEMENTS) + networkState.postValue(NetworkState.Success(true, response.isEmpty())) } } @@ -112,7 +108,7 @@ open class CharacterPageDataSource @Inject constructor( */ override fun loadBefore( params: LoadParams, - callback: LoadCallback + callback: LoadCallback ) { // Ignored, since we only ever append to our initial load } diff --git a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/data/datasource/CharactersPageDataSourceFactory.kt b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/data/datasource/CharactersPageDataSourceFactory.kt index 86c160a2..20b2dd0e 100644 --- a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/data/datasource/CharactersPageDataSourceFactory.kt +++ b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/data/datasource/CharactersPageDataSourceFactory.kt @@ -18,7 +18,7 @@ package com.stepango.blockme.feature.characters.list.impl.data.datasource import androidx.lifecycle.MutableLiveData import androidx.paging.DataSource -import com.stepango.blockme.feature.characters.list.api.domain.model.ICharacterItem +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import javax.inject.Inject import javax.inject.Provider @@ -31,7 +31,7 @@ import javax.inject.Provider @Deprecated("Seems this class invoke some domain logic. It's wrong!", ReplaceWith("On target UseCase")) class CharactersPageDataSourceFactory @Inject constructor( private val providerDataSource: Provider -) : DataSource.Factory() { +) : DataSource.Factory() { var sourceLiveData = MutableLiveData() @@ -41,7 +41,7 @@ class CharactersPageDataSourceFactory @Inject constructor( * @return The new DataSource. * @see DataSource.Factory.create */ - override fun create(): DataSource { + override fun create(): DataSource { val dataSource = providerDataSource.get() sourceLiveData.postValue(dataSource) return dataSource diff --git a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/di/CharactersListModule.kt b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/di/CharactersListModule.kt index 66b6028e..3d66550c 100644 --- a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/di/CharactersListModule.kt +++ b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/di/CharactersListModule.kt @@ -21,15 +21,11 @@ import com.stepango.blockme.core.di.library.scopes.FeatureScope import com.stepango.blockme.core.mvvm.library.di.ViewModelKey import com.stepango.blockme.feature.characters.core.api.domain.repository.MarvelRepository import com.stepango.blockme.feature.characters.list.impl.data.datasource.CharacterPageDataSource -import com.stepango.blockme.feature.characters.list.impl.data.mapper.CharacterItemMapper import com.stepango.blockme.feature.characters.list.impl.ui.CharactersListViewModel -import com.stepango.blockme.feature.characters.list.impl.ui.adapter.CharactersListAdapter import dagger.Binds import dagger.Module import dagger.Provides import dagger.multibindings.IntoMap -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.GlobalScope @Module internal abstract class CharactersListModule { @@ -45,14 +41,8 @@ internal abstract class CharactersListModule { @Provides fun providesCharactersPageDataSource( repository: MarvelRepository, - mapper: CharacterItemMapper ) = CharacterPageDataSource( repository = repository, - mapper = mapper ) - - @FeatureScope - @Provides - fun providesCharacterItemMapper() = CharacterItemMapper() } } diff --git a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/domain/model/CharacterItem.kt b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/domain/model/CharacterItem.kt deleted file mode 100644 index be68da25..00000000 --- a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/domain/model/CharacterItem.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2019 vmadalin.com - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.stepango.blockme.feature.characters.list.impl.domain.model - -import com.stepango.blockme.feature.characters.list.api.domain.model.ICharacterItem - -data class CharacterItem( - override val id: Long, - override val name: String, - override val description: String, - override val imageUrl: String -) : ICharacterItem diff --git a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/ui/CharactersListFragment.kt b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/ui/CharactersListFragment.kt index eb8d5fa0..ace700c7 100644 --- a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/ui/CharactersListFragment.kt +++ b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/ui/CharactersListFragment.kt @@ -28,7 +28,7 @@ import com.stepango.blockme.feature.characters.core.api.di.CharactersCoreFeature import com.stepango.blockme.feature.characters.list.databinding.databinding.FragmentCharactersListBinding import com.stepango.blockme.feature.characters.list.impl.R import com.stepango.blockme.feature.characters.list.impl.di.DaggerCharactersListComponent -import com.stepango.blockme.feature.characters.list.api.domain.model.ICharacterItem +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.list.impl.domain.model.ICharactersListViewEvent import com.stepango.blockme.feature.characters.list.impl.domain.model.ICharactersListViewState import com.stepango.blockme.feature.characters.list.impl.ui.adapter.CharactersListAdapter @@ -70,7 +70,7 @@ class CharactersListFragment : } } - private fun onViewDataChange(viewData: PagedList) { + private fun onViewDataChange(viewData: PagedList) { viewAdapter.submitList(viewData) } diff --git a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/ui/CharactersListViewModel.kt b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/ui/CharactersListViewModel.kt index 2d0cdf19..df258e93 100644 --- a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/ui/CharactersListViewModel.kt +++ b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/ui/CharactersListViewModel.kt @@ -25,7 +25,7 @@ import com.stepango.blockme.core.mvvm.library.lifecycle.SingleLiveData import com.stepango.blockme.core.network.library.NetworkState import com.stepango.blockme.feature.characters.list.impl.data.datasource.CharactersPageDataSourceFactory import com.stepango.blockme.feature.characters.list.impl.data.datasource.PAGE_MAX_ELEMENTS -import com.stepango.blockme.feature.characters.list.api.domain.model.ICharacterItem +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.list.impl.domain.model.ICharactersListViewEvent import com.stepango.blockme.feature.characters.list.impl.domain.model.ICharactersListViewModel import com.stepango.blockme.feature.characters.list.impl.domain.model.ICharactersListViewState @@ -42,7 +42,7 @@ class CharactersListViewModel @Inject constructor( } override val event = SingleLiveData() - override val data: LiveData> = LivePagedListBuilder(dataSourceFactory, PAGE_MAX_ELEMENTS).build() + override val data: LiveData> = LivePagedListBuilder(dataSourceFactory, PAGE_MAX_ELEMENTS).build() override val state: LiveData = Transformations.map(networkState) { when (it) { is NetworkState.Success -> diff --git a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/ui/adapter/CharactersListAdapter.kt b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/ui/adapter/CharactersListAdapter.kt index 787085ee..c4b2b02e 100644 --- a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/ui/adapter/CharactersListAdapter.kt +++ b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/ui/adapter/CharactersListAdapter.kt @@ -21,7 +21,7 @@ import android.view.ViewGroup import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.stepango.blockme.core.mvvm.library.ui.BasePagedListAdapter -import com.stepango.blockme.feature.characters.list.api.domain.model.ICharacterItem +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.list.impl.ui.CharactersListViewModel import com.stepango.blockme.feature.characters.list.impl.ui.adapter.holders.CharacterViewHolder import com.stepango.blockme.feature.characters.list.impl.ui.adapter.holders.ErrorViewHolder @@ -39,7 +39,7 @@ internal enum class ItemView(val type: Int, val span: Int) { class CharactersListAdapter constructor( private val viewModel: CharactersListViewModel -) : BasePagedListAdapter( +) : BasePagedListAdapter( itemsSame = { old, new -> old.id == new.id }, contentsSame = { old, new -> old == new } ) { diff --git a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/ui/adapter/holders/CharacterViewHolder.kt b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/ui/adapter/holders/CharacterViewHolder.kt index 26f83392..9d894c65 100644 --- a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/ui/adapter/holders/CharacterViewHolder.kt +++ b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/ui/adapter/holders/CharacterViewHolder.kt @@ -19,7 +19,7 @@ package com.stepango.blockme.feature.characters.list.impl.ui.adapter.holders import android.view.LayoutInflater import com.stepango.blockme.core.mvvm.library.ui.BaseViewHolder import com.stepango.blockme.feature.characters.list.databinding.databinding.ListItemCharacterBinding -import com.stepango.blockme.feature.characters.list.api.domain.model.ICharacterItem +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.list.impl.ui.CharactersListViewModel class CharacterViewHolder( @@ -28,7 +28,7 @@ class CharacterViewHolder( binding = ListItemCharacterBinding.inflate(inflater) ) { - fun bind(viewModel: CharactersListViewModel, item: ICharacterItem) { + fun bind(viewModel: CharactersListViewModel, item: ICharacter) { binding.viewModel = viewModel binding.character = item binding.executePendingBindings()