Skip to content

Commit 174c881

Browse files
authored
Merge pull request #71 from odaridavid/fix-flow
Refactor Naming and Style Improvements
2 parents 0bdecc8 + 5716b66 commit 174c881

File tree

86 files changed

+656
-658
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+656
-658
lines changed

app/build.gradle

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,6 @@ android {
6666
targetCompatibility 1.8
6767
}
6868

69-
bundle {
70-
density {
71-
enableSplit true
72-
}
73-
abi {
74-
enableSplit true
75-
}
76-
language {
77-
enableSplit false
78-
}
79-
}
8069
}
8170

8271
dependencies {
@@ -110,9 +99,6 @@ dependencies {
11099
implementation appDependencies.recyclerviewAnimations
111100

112101
//Memory leaks
113-
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
114-
implementation 'androidx.appcompat:appcompat:1.1.0'
115-
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
116102
debugImplementation appDependencies.leakCanary
117103

118104
//About Libraries

app/src/androidTest/kotlin/com/k0d4black/theforce/CharacterDetailActivityIntegrationTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import androidx.test.espresso.matcher.ViewMatchers.*
88
import androidx.test.ext.junit.runners.AndroidJUnit4
99
import androidx.test.rule.ActivityTestRule
1010
import com.k0d4black.theforce.features.character_details.CharacterDetailActivity
11-
import com.k0d4black.theforce.models.StarWarsCharacterUiModel
11+
import com.k0d4black.theforce.models.CharacterPresentation
1212
import com.k0d4black.theforce.commons.CHARACTER_PARCEL_KEY
1313
import org.junit.After
1414
import org.junit.Rule
@@ -36,12 +36,12 @@ internal class CharacterDetailActivityIntegrationTest : BaseTest() {
3636
fun shouldLoadDataOnLaunchWithValidCharacterId() {
3737
val intent = Intent().putExtra(
3838
CHARACTER_PARCEL_KEY,
39-
StarWarsCharacterUiModel(
39+
CharacterPresentation(
4040
name = "Luke",
4141
birthYear = "12BBY",
4242
heightInCm = "234",
4343
heightInInches = "544",
44-
url = "1"
44+
url = "https://swapi.py4e.com/api/people/1/"
4545
)
4646
)
4747
activityRule.launchActivity(intent)

app/src/androidTest/kotlin/com/k0d4black/theforce/SearchActivityIntegrationTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import org.junit.runner.RunWith
2828

2929
@RunWith(AndroidJUnit4::class)
3030
internal class SearchActivityIntegrationTest : BaseTest() {
31+
//TODO Use idling resource
3132

3233
@get:Rule
3334
var activityRule: ActivityTestRule<SearchActivity> =
@@ -52,7 +53,6 @@ internal class SearchActivityIntegrationTest : BaseTest() {
5253
fun shouldDisplayDataOnSearch() {
5354
onView(withId(R.id.action_search)).perform(click())
5455
onView(isAssignableFrom(EditText::class.java)).perform(typeText(EXISTING_SEARCH_PARAMS))
55-
SystemClock.sleep(2000)
5656
onView(withId(R.id.search_results_recycler_view)).check(matches(isDisplayed()))
5757
}
5858

@@ -68,13 +68,13 @@ internal class SearchActivityIntegrationTest : BaseTest() {
6868
fun shouldNavigateToCharacterDetailOnItemClick() {
6969
onView(withId(R.id.action_search)).perform(click())
7070
onView(isAssignableFrom(EditText::class.java)).perform(typeText(EXISTING_SEARCH_PARAMS))
71-
SystemClock.sleep(2000)
71+
SystemClock.sleep(1500)
7272
onView(withId(R.id.search_results_recycler_view)).perform(
7373
RecyclerViewActions.actionOnItemAtPosition<SearchResultAdapter.SearchedCharacterViewHolder>(
7474
0, ViewAction.clickChildViewWithId(R.id.more_info_arrow_image_button)
7575
)
7676
)
77-
SystemClock.sleep(2000)
77+
SystemClock.sleep(1500)
7878
intended(hasComponent("com.k0d4black.theforce.features.character_details.CharacterDetailActivity"))
7979
}
8080

app/src/main/kotlin/com/k0d4black/theforce/di/modules/details/CharacterDetailsBindingModule.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.k0d4black.theforce.di.modules.details
22

3-
import com.k0d4black.theforce.data.repository.StarWarsCharacterDetailsRepository
3+
import com.k0d4black.theforce.data.repository.CharacterDetailsRepository
44
import com.k0d4black.theforce.domain.repository.ICharacterDetailsRepository
55
import dagger.Binds
66
import dagger.Module
@@ -11,7 +11,7 @@ abstract class CharacterDetailsBindingModule {
1111
@Singleton
1212
@Binds
1313
abstract fun bindCharacterDetailsRepository(
14-
starWarsCharacterDetailsRepository: StarWarsCharacterDetailsRepository
14+
characterDetailsRepository: CharacterDetailsRepository
1515
): ICharacterDetailsRepository
1616

1717
}

app/src/main/kotlin/com/k0d4black/theforce/di/modules/details/CharacterDetailsModule.kt

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ package com.k0d4black.theforce.di.modules.details
22

33

44
import com.k0d4black.theforce.data.api.StarWarsApiService
5-
import com.k0d4black.theforce.data.repository.StarWarsCharacterDetailsRepository
6-
import com.k0d4black.theforce.data.source.StarWarsCharacterDetailsDataSource
7-
import com.k0d4black.theforce.domain.usecases.GetStarWarsCharacterFilmsUseCase
8-
import com.k0d4black.theforce.domain.usecases.GetStarWarsCharacterPlanetUseCase
9-
import com.k0d4black.theforce.domain.usecases.GetStarWarsCharacterSpeciesUseCase
5+
import com.k0d4black.theforce.data.repository.CharacterDetailsRepository
6+
import com.k0d4black.theforce.data.source.CharacterDetailsDataSource
7+
import com.k0d4black.theforce.domain.usecases.GetFilmsUseCase
8+
import com.k0d4black.theforce.domain.usecases.GetPlanetUseCase
9+
import com.k0d4black.theforce.domain.usecases.GetSpeciesUseCase
1010
import dagger.Module
1111
import dagger.Provides
1212

@@ -15,21 +15,21 @@ class CharacterDetailsModule {
1515

1616
@Provides
1717
fun provideCharacterFilmsUseCase(
18-
starWarsCharacterDetailsRepository: StarWarsCharacterDetailsRepository
19-
): GetStarWarsCharacterFilmsUseCase = GetStarWarsCharacterFilmsUseCase(starWarsCharacterDetailsRepository)
18+
characterDetailsRepository: CharacterDetailsRepository
19+
): GetFilmsUseCase = GetFilmsUseCase(characterDetailsRepository)
2020

2121
@Provides
2222
fun provideCharacterPlanetUseCase(
23-
starWarsCharacterDetailsRepository: StarWarsCharacterDetailsRepository
24-
): GetStarWarsCharacterPlanetUseCase = GetStarWarsCharacterPlanetUseCase(starWarsCharacterDetailsRepository)
23+
characterDetailsRepository: CharacterDetailsRepository
24+
): GetPlanetUseCase = GetPlanetUseCase(characterDetailsRepository)
2525

2626
@Provides
2727
fun provideCharacterSpeciesUseCase(
28-
starWarsCharacterDetailsRepository: StarWarsCharacterDetailsRepository
29-
): GetStarWarsCharacterSpeciesUseCase = GetStarWarsCharacterSpeciesUseCase(starWarsCharacterDetailsRepository)
28+
characterDetailsRepository: CharacterDetailsRepository
29+
): GetSpeciesUseCase = GetSpeciesUseCase(characterDetailsRepository)
3030

3131
@Provides
32-
fun provideCharacterDetailsDataSource(apiService: StarWarsApiService): StarWarsCharacterDetailsDataSource =
33-
StarWarsCharacterDetailsDataSource(apiService)
32+
fun provideCharacterDetailsDataSource(apiService: StarWarsApiService): CharacterDetailsDataSource =
33+
CharacterDetailsDataSource(apiService)
3434

3535
}

app/src/main/kotlin/com/k0d4black/theforce/di/modules/search/CharacterSearchBindingModule.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.k0d4black.theforce.di.modules.search
22

3-
import com.k0d4black.theforce.data.repository.StarWarsCharacterSearchRepository
3+
import com.k0d4black.theforce.data.repository.CharacterSearchRepository
44
import com.k0d4black.theforce.domain.repository.ICharacterSearchRepository
55
import dagger.Binds
66
import dagger.Module
@@ -12,7 +12,7 @@ abstract class CharacterSearchBindingModule {
1212
@Singleton
1313
@Binds
1414
abstract fun bindCharacterSearchRepository(
15-
starWarsCharacterSearchRepository: StarWarsCharacterSearchRepository
15+
characterSearchRepository: CharacterSearchRepository
1616
): ICharacterSearchRepository
1717

1818
}

app/src/main/kotlin/com/k0d4black/theforce/di/modules/search/CharacterSearchModule.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.k0d4black.theforce.di.modules.search
22

33
import com.k0d4black.theforce.data.api.StarWarsApiService
4-
import com.k0d4black.theforce.data.repository.StarWarsCharacterSearchRepository
5-
import com.k0d4black.theforce.data.source.StarWarsCharacterSearchDataSource
6-
import com.k0d4black.theforce.domain.usecases.SearchStarWarsCharacterUseCase
4+
import com.k0d4black.theforce.data.repository.CharacterSearchRepository
5+
import com.k0d4black.theforce.data.source.CharacterSearchDataSource
6+
import com.k0d4black.theforce.domain.usecases.SearchCharactersUseCase
77
import com.k0d4black.theforce.features.character_search.CharacterSearchViewModel
88
import com.k0d4black.theforce.features.character_search.SearchQueryListener
99
import dagger.Module
@@ -19,12 +19,12 @@ class CharacterSearchModule {
1919

2020
@Provides
2121
fun provideCharacterSearchUseCase(
22-
starWarsCharacterSearchRepository: StarWarsCharacterSearchRepository
23-
): SearchStarWarsCharacterUseCase = SearchStarWarsCharacterUseCase(starWarsCharacterSearchRepository)
22+
characterSearchRepository: CharacterSearchRepository
23+
): SearchCharactersUseCase = SearchCharactersUseCase(characterSearchRepository)
2424

2525
@Provides
26-
fun provideCharacterSearchDataSource(apiService: StarWarsApiService): StarWarsCharacterSearchDataSource =
27-
StarWarsCharacterSearchDataSource(apiService)
26+
fun provideCharacterSearchDataSource(apiService: StarWarsApiService): CharacterSearchDataSource =
27+
CharacterSearchDataSource(apiService)
2828

2929
}
3030

app/src/main/kotlin/com/k0d4black/theforce/features/character_details/CharacterDetailActivity.kt

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
1212
import com.k0d4black.theforce.R
1313
import com.k0d4black.theforce.commons.*
1414
import com.k0d4black.theforce.databinding.ActivityCharacterDetailBinding
15-
import com.k0d4black.theforce.models.StarWarsCharacterUiModel
15+
import com.k0d4black.theforce.models.CharacterPresentation
1616
import dagger.android.AndroidInjection
1717
import kotlinx.android.synthetic.main.activity_character_detail.*
1818
import javax.inject.Inject
@@ -36,7 +36,7 @@ class CharacterDetailActivity : AppCompatActivity() {
3636

3737
binding = DataBindingUtil.setContentView(this, R.layout.activity_character_detail)
3838

39-
val character = intent.getParcelableExtra<StarWarsCharacterUiModel>(CHARACTER_PARCEL_KEY)
39+
val character = intent.getParcelableExtra<CharacterPresentation>(CHARACTER_PARCEL_KEY)
4040

4141
character?.run {
4242
characterDetailViewModel.getCharacterDetails(this.url)
@@ -50,19 +50,21 @@ class CharacterDetailActivity : AppCompatActivity() {
5050
}
5151

5252
private fun observeCharacterSpecies() {
53-
characterDetailViewModel.characterStarWarsCharacterSpecies.observe(
53+
characterDetailViewModel.species.observe(
5454
this,
5555
Observer { species ->
56-
binding.characterDetailsSpeciesRecyclerView.apply {
57-
adapter = speciesAdapter.apply { submitList(species) }
58-
initRecyclerViewWithLineDecoration(this@CharacterDetailActivity)
56+
if (species.isNotEmpty()) {
57+
binding.characterDetailsSpeciesRecyclerView.apply {
58+
adapter = speciesAdapter.apply { submitList(species) }
59+
initRecyclerViewWithLineDecoration(this@CharacterDetailActivity)
60+
}
61+
enableGroup(R.id.character_species_group)
5962
}
60-
enableGroup(R.id.character_species_group)
6163
})
6264
}
6365

6466
private fun observeCharacterFilms() {
65-
characterDetailViewModel.starWarsCharacterFilms.observe(this, Observer { films ->
67+
characterDetailViewModel.films.observe(this, Observer { films ->
6668
binding.characterDetailsFilmsRecyclerView.apply {
6769
adapter = filmsAdapter.apply { submitList(films) }
6870
layoutManager =
@@ -77,13 +79,13 @@ class CharacterDetailActivity : AppCompatActivity() {
7779
}
7880

7981
private fun observeCharacterPlanet() {
80-
characterDetailViewModel.characterStarWarsCharacterPlanet.observe(this, Observer { planet ->
82+
characterDetailViewModel.planet.observe(this, Observer { planet ->
8183
binding.planet = planet
8284
enableGroup(R.id.character_planet_group)
8385
})
8486
}
8587

86-
private fun displayCharacterDetails(character: StarWarsCharacterUiModel) {
88+
private fun displayCharacterDetails(character: CharacterPresentation) {
8789
supportActionBar?.title = character.name
8890
binding.character = character
8991
enableGroup(R.id.character_details_group)

app/src/main/kotlin/com/k0d4black/theforce/features/character_details/CharacterDetailViewModel.kt

Lines changed: 43 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,57 +7,69 @@ import com.k0d4black.theforce.commons.Error
77
import com.k0d4black.theforce.commons.Loading
88
import com.k0d4black.theforce.commons.Success
99
import com.k0d4black.theforce.commons.UiStateViewModel
10-
import com.k0d4black.theforce.domain.usecases.GetStarWarsCharacterFilmsUseCase
11-
import com.k0d4black.theforce.domain.usecases.GetStarWarsCharacterPlanetUseCase
12-
import com.k0d4black.theforce.domain.usecases.GetStarWarsCharacterSpeciesUseCase
10+
import com.k0d4black.theforce.domain.usecases.GetFilmsUseCase
11+
import com.k0d4black.theforce.domain.usecases.GetPlanetUseCase
12+
import com.k0d4black.theforce.domain.usecases.GetSpeciesUseCase
1313
import com.k0d4black.theforce.mappers.toPresentation
14-
import com.k0d4black.theforce.models.StarWarsCharacterFilmsUiModel
15-
import com.k0d4black.theforce.models.StarWarsCharacterPlanetUiModel
16-
import com.k0d4black.theforce.models.StarWarsCharacterSpeciesUiModel
14+
import com.k0d4black.theforce.models.FilmPresentation
15+
import com.k0d4black.theforce.models.PlanetPresentation
16+
import com.k0d4black.theforce.models.SpeciePresentation
1717
import kotlinx.coroutines.flow.collect
1818
import kotlinx.coroutines.launch
1919
import javax.inject.Inject
2020

2121
class CharacterDetailViewModel @Inject constructor(
22-
private val getStarWarsCharacterSpeciesUseCase: GetStarWarsCharacterSpeciesUseCase,
23-
private val getStarWarsCharacterPlanetUseCase: GetStarWarsCharacterPlanetUseCase,
24-
private val getStarWarsCharacterFilmsUseCase: GetStarWarsCharacterFilmsUseCase
22+
private val getSpeciesUseCase: GetSpeciesUseCase,
23+
private val getPlanetUseCase: GetPlanetUseCase,
24+
private val getFilmsUseCase: GetFilmsUseCase
2525
) : UiStateViewModel() {
2626

27-
val characterStarWarsCharacterPlanet: LiveData<StarWarsCharacterPlanetUiModel>
28-
get() = _characterPlanet
27+
val planet: LiveData<PlanetPresentation>
28+
get() = _planet
2929

30-
private var _characterPlanet =
31-
MutableLiveData<StarWarsCharacterPlanetUiModel>()
30+
private var _planet = MutableLiveData<PlanetPresentation>()
3231

33-
val starWarsCharacterFilms: LiveData<List<StarWarsCharacterFilmsUiModel>>
34-
get() = _characterFilms
32+
val films: LiveData<List<FilmPresentation>>
33+
get() = _films
3534

36-
private var _characterFilms =
37-
MutableLiveData<List<StarWarsCharacterFilmsUiModel>>()
35+
private var _films = MutableLiveData<List<FilmPresentation>>()
3836

39-
val characterStarWarsCharacterSpecies: LiveData<List<StarWarsCharacterSpeciesUiModel>>
40-
get() = _characterSpecies
37+
val species: LiveData<List<SpeciePresentation>>
38+
get() = _species
4139

42-
private var _characterSpecies =
43-
MutableLiveData<List<StarWarsCharacterSpeciesUiModel>>()
40+
private var _species = MutableLiveData<List<SpeciePresentation>>()
4441

4542
fun getCharacterDetails(characterUrl: String) {
46-
_uiState.value = Loading
4743
viewModelScope.launch(handler) {
48-
getStarWarsCharacterPlanetUseCase(characterUrl).collect {
49-
_characterPlanet.value = it.toPresentation()
50-
}
51-
getStarWarsCharacterFilmsUseCase(characterUrl).collect {
52-
_characterFilms.value = it.map { film -> film.toPresentation() }
53-
}
54-
getStarWarsCharacterSpeciesUseCase(characterUrl).collect {
55-
_characterSpecies.value = it.map { species -> species.toPresentation() }
56-
}
44+
_uiState.value = Loading
45+
loadPlanet(characterUrl)
46+
loadFilms(characterUrl)
47+
loadSpecies(characterUrl)
5748
_uiState.value = Success(Unit)
5849
}
5950
}
6051

52+
private suspend fun loadPlanet(characterUrl: String) {
53+
getPlanetUseCase(characterUrl).collect { planet ->
54+
val planetPresentation = planet.toPresentation()
55+
_planet.value = planetPresentation
56+
}
57+
}
58+
59+
private suspend fun loadFilms(characterUrl: String) {
60+
getFilmsUseCase(characterUrl).collect { films ->
61+
val filmsPresentation = films.map { eachFilm -> eachFilm.toPresentation() }
62+
_films.value = filmsPresentation
63+
}
64+
}
65+
66+
private suspend fun loadSpecies(characterUrl: String) {
67+
getSpeciesUseCase(characterUrl).collect { species ->
68+
val speciesPresentation = species.map { eachSpecie -> eachSpecie.toPresentation() }
69+
_species.value = speciesPresentation
70+
}
71+
}
72+
6173
fun displayCharacterError() {
6274
_uiState.value = Error(Exception("Error Loading Character"))
6375
}

0 commit comments

Comments
 (0)