From 7b30a00476d68e142bffef9dc12d21c45b76862d Mon Sep 17 00:00:00 2001 From: Joaquim Ley Date: Sat, 21 Apr 2018 11:57:25 +0200 Subject: [PATCH] Extract the presentation to a module There are still some issues with the Android P tests The View/ViewObject models are still not mapped or extracted (the UI should not use the FavoriteView anywhere) #29 --- transport-eta-android/mobile-ui/build.gradle | 5 +- .../ui/home/FavoritesFragmentTest.kt | 29 +++--- .../ui/test/MockFavoritesViewModel.kt | 3 +- .../ui/test/util/EspressoExtensions.kt | 20 ++++ .../factory/TestFactoryFavoriteView.kt | 2 +- .../ui/di/module/FavoriteFragmentModule.kt | 5 +- .../transporteta/ui/home/HomeActivity.kt | 10 +- .../ui/home/favorite/FavoritesAdapter.kt | 2 +- .../ui/home/favorite/FavoritesFragment.kt | 6 +- .../transporteta/ui/model/Favorite.kt | 3 - .../ui/model/FavoriteViewObject.kt | 7 ++ .../transporteta/ui/model/data/Resource.kt | 44 ++++----- .../ui/model/data/ResourceState.kt | 16 ++-- .../ui/presentation/home/HomeViewModel.kt | 35 ------- .../favorite/FavoritesViewModelFactory.kt | 14 --- .../mobile-ui/src/main/res/values/strings.xml | 2 +- .../home/favorite/FavoritesViewModelTest.kt | 5 +- transport-eta-android/presentation/.gitignore | 1 + .../presentation/build.gradle | 94 +++++++++++++++++++ .../presentation/proguard-rules.pro | 21 +++++ .../presentation/ExampleInstrumentedTest.java | 26 +++++ .../presentation/src/main/AndroidManifest.xml | 2 + .../presentation/data/Resource.kt | 24 +++++ .../presentation/data/ResourceState.kt | 8 ++ .../presentation/home/HomeViewModel.kt | 26 +++++ .../presentation/home}/NavigationType.kt | 2 +- .../home/favorite/FavoritesViewModel.kt | 8 +- .../favorite/FavoritesViewModelFactory.kt | 14 +++ .../presentation}/model/FavoriteView.kt | 2 +- .../src/main/res/values/strings.xml | 3 + .../presentation/home/HomeViewModelImpl.kt | 20 ++++ .../favorite/FavoritesViewModelFactoryImpl.kt | 10 ++ .../home/favorite/FavoritesViewModelImpl.kt | 7 +- .../presentation/ExampleUnitTest.java | 17 ++++ transport-eta-android/settings.gradle | 2 +- .../SmsBroadcastReceiverImpl.kt | 0 .../SmsControllerImpl.kt | 0 transport-eta-android/versions.gradle | 2 +- 38 files changed, 370 insertions(+), 127 deletions(-) create mode 100644 transport-eta-android/mobile-ui/src/androidTest/java/com/joaquimley/transporteta/ui/test/util/EspressoExtensions.kt delete mode 100644 transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/Favorite.kt create mode 100644 transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/FavoriteViewObject.kt delete mode 100644 transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/home/HomeViewModel.kt delete mode 100644 transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/home/favorite/FavoritesViewModelFactory.kt create mode 100644 transport-eta-android/presentation/.gitignore create mode 100644 transport-eta-android/presentation/build.gradle create mode 100644 transport-eta-android/presentation/proguard-rules.pro create mode 100644 transport-eta-android/presentation/src/androidTest/java/com/joaquimley/transporteta/presentation/ExampleInstrumentedTest.java create mode 100644 transport-eta-android/presentation/src/main/AndroidManifest.xml create mode 100644 transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/data/Resource.kt create mode 100644 transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/data/ResourceState.kt create mode 100644 transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/home/HomeViewModel.kt rename transport-eta-android/{mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation => presentation/src/main/java/com/joaquimley/transporteta/presentation/home}/NavigationType.kt (68%) rename transport-eta-android/{mobile-ui/src/main/java/com/joaquimley/transporteta/ui => presentation/src/main/java/com/joaquimley/transporteta}/presentation/home/favorite/FavoritesViewModel.kt (51%) create mode 100644 transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/home/favorite/FavoritesViewModelFactory.kt rename transport-eta-android/{mobile-ui/src/main/java/com/joaquimley/transporteta/ui => presentation/src/main/java/com/joaquimley/transporteta/presentation}/model/FavoriteView.kt (81%) create mode 100644 transport-eta-android/presentation/src/main/res/values/strings.xml create mode 100644 transport-eta-android/presentation/src/prod/java/com/joaquimley/transporteta/presentation/home/HomeViewModelImpl.kt create mode 100644 transport-eta-android/presentation/src/prod/java/com/joaquimley/transporteta/presentation/home/favorite/FavoritesViewModelFactoryImpl.kt rename transport-eta-android/{mobile-ui/src/main/java/com/joaquimley/transporteta/ui => presentation/src/prod/java/com/joaquimley/transporteta}/presentation/home/favorite/FavoritesViewModelImpl.kt (89%) create mode 100644 transport-eta-android/presentation/src/test/java/com/joaquimley/transporteta/presentation/ExampleUnitTest.java rename transport-eta-android/sms/src/prod/{java/com/joaquimley/transporteta/sms => com.joaquimley.transporteta.sms}/SmsBroadcastReceiverImpl.kt (100%) rename transport-eta-android/sms/src/prod/{java/com/joaquimley/transporteta/sms => com.joaquimley.transporteta.sms}/SmsControllerImpl.kt (100%) diff --git a/transport-eta-android/mobile-ui/build.gradle b/transport-eta-android/mobile-ui/build.gradle index 02249ed..ce721e3 100644 --- a/transport-eta-android/mobile-ui/build.gradle +++ b/transport-eta-android/mobile-ui/build.gradle @@ -14,7 +14,7 @@ android { vectorDrawables.useSupportLibrary = true testInstrumentationRunner "com.joaquimley.transporteta.ui.test.TestRunner" - missingDimensionStrategy 'environment', 'mock', 'prod' + missingDimensionStrategy 'environment', ['prod', 'mock'] } packagingOptions { @@ -36,7 +36,7 @@ android { testLogging { events 'passed', 'skipped', 'failed', 'standardOut', 'standardError' } - jvmArgs '-noverify' +// jvmArgs '-noverify' } buildTypes { @@ -72,6 +72,7 @@ androidExtensions { dependencies { // Modules implementation project(':sms') + implementation project(':presentation') // Javax implementation deps.javax.inject compileOnly deps.javax.annotation diff --git a/transport-eta-android/mobile-ui/src/androidTest/java/com/joaquimley/transporteta/ui/home/FavoritesFragmentTest.kt b/transport-eta-android/mobile-ui/src/androidTest/java/com/joaquimley/transporteta/ui/home/FavoritesFragmentTest.kt index b1fb045..c32f8d2 100644 --- a/transport-eta-android/mobile-ui/src/androidTest/java/com/joaquimley/transporteta/ui/home/FavoritesFragmentTest.kt +++ b/transport-eta-android/mobile-ui/src/androidTest/java/com/joaquimley/transporteta/ui/home/FavoritesFragmentTest.kt @@ -13,13 +13,12 @@ import android.support.test.runner.AndroidJUnit4 import com.joaquimley.transporteta.R import com.joaquimley.transporteta.ui.di.module.TestFavoriteFragmentModule import com.joaquimley.transporteta.ui.home.favorite.FavoritesFragment -import com.joaquimley.transporteta.ui.model.FavoriteView -import com.joaquimley.transporteta.ui.model.data.Resource +import com.joaquimley.transporteta.presentation.data.Resource import com.joaquimley.transporteta.ui.presentation.home.favorite.FavoritesViewModel +import com.joaquimley.transporteta.ui.test.util.RecyclerViewMatcher import com.joaquimley.transporteta.ui.testing.TestFragmentActivity import com.joaquimley.transporteta.ui.testing.factory.TestFactoryFavoriteView import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -73,19 +72,19 @@ class FavoritesFragmentTest { } @Test - fun whenErrorOccursNoDataErrorViewStateIsShown() { + fun whenThereIsNoDataAndErrorOccursErrorViewStateIsShown() { // When empty results.postValue(Resource.empty()) // Error occurs val errorMessage = "Test for error message" results.postValue(Resource.error(errorMessage)) // Then - onView(withId(R.id.message_view)).check(doesNotExist()) + onView(withId(R.id.message_view)).check(matches(isDisplayed())) onView(withId(R.id.recycler_view)).check(doesNotExist()) } @Test - fun whenErrorOccursWithDataDisplayedErrorMessageIsShown() { + fun whenThereIsDataAndErrorOccursErrorMessageIsShown() { // When there is data val resultsList = TestFactoryFavoriteView.generateFavoriteViewList() results.postValue(Resource.success(resultsList)) @@ -102,7 +101,7 @@ class FavoritesFragmentTest { } @Test - fun whenFabIsClickedCreateFavoriteScreenIsShown() { + fun whenCreateFabIsClickedCreateFavoriteScreenIsShown() { // When onView(withId(R.id.fab)).perform(click()) // Check dialog is showing @@ -139,6 +138,7 @@ class FavoritesFragmentTest { onView(withText(R.string.create_favorite_title)).check(matches(isDisplayed())) // Error message is shown onView(withText(R.string.error_create_favorite_code_required)).check(matches(isDisplayed())) +// onView(allOf(withParent(R.id.txtPhoneNumber), withText("error text"))).check(matches(isDisplayed())) } @Test @@ -155,16 +155,15 @@ class FavoritesFragmentTest { @Test - @Ignore("Test ignored: Not yet implemented, can't currently mock ViewModel") - fun whenDataComesInItIsCorrectlyDisplayedOnTheList() { + fun whenThereIsDataItIsCorrectlyDisplayedOnTheList() { + // When val resultsList = TestFactoryFavoriteView.generateFavoriteViewList() results.postValue(Resource.success(resultsList)) -// onView(RecyclerViewMatcher.withRecyclerView(R.id.recycler_view).atPosition(0)) -// .check(matches(hasDescendant(withText(resultsList[0].latestEta)))) -// onView(RecyclerViewMatcher.withRecyclerView(R.id.recycler_view).atPosition(0)).check(matches(hasDescendant(withText(resultsList[0].code.toString())))) -// onView(withId(R.id.progress_bar)).check(matches(not(isDisplayed()))) -// onView(withText(resultsList[0].code.toString())).check(matches(isDisplayed())) -// viewModel.getFavourites() + // Then + onView(RecyclerViewMatcher.withRecyclerView(R.id.recycler_view).atPosition(0)).check(matches(hasDescendant(withText(resultsList[0].latestEta)))) + onView(RecyclerViewMatcher.withRecyclerView(R.id.recycler_view).atPosition(0)).check(matches(hasDescendant(withText(resultsList[0].code.toString())))) + // Assert + onView(withId(R.id.progress_bar)).check(doesNotExist()) } } diff --git a/transport-eta-android/mobile-ui/src/androidTest/java/com/joaquimley/transporteta/ui/test/MockFavoritesViewModel.kt b/transport-eta-android/mobile-ui/src/androidTest/java/com/joaquimley/transporteta/ui/test/MockFavoritesViewModel.kt index a8a8ccf..aed643e 100644 --- a/transport-eta-android/mobile-ui/src/androidTest/java/com/joaquimley/transporteta/ui/test/MockFavoritesViewModel.kt +++ b/transport-eta-android/mobile-ui/src/androidTest/java/com/joaquimley/transporteta/ui/test/MockFavoritesViewModel.kt @@ -3,8 +3,7 @@ package com.joaquimley.transporteta.ui.test import android.arch.lifecycle.LiveData import android.arch.lifecycle.MutableLiveData import com.joaquimley.transporteta.sms.SmsController -import com.joaquimley.transporteta.ui.model.FavoriteView -import com.joaquimley.transporteta.ui.model.data.Resource +import com.joaquimley.transporteta.presentation.data.Resource import com.joaquimley.transporteta.ui.presentation.home.favorite.FavoritesViewModel import com.joaquimley.transporteta.ui.testing.factory.TestFactoryFavoriteView diff --git a/transport-eta-android/mobile-ui/src/androidTest/java/com/joaquimley/transporteta/ui/test/util/EspressoExtensions.kt b/transport-eta-android/mobile-ui/src/androidTest/java/com/joaquimley/transporteta/ui/test/util/EspressoExtensions.kt new file mode 100644 index 0000000..dbf34e3 --- /dev/null +++ b/transport-eta-android/mobile-ui/src/androidTest/java/com/joaquimley/transporteta/ui/test/util/EspressoExtensions.kt @@ -0,0 +1,20 @@ +package com.joaquimley.transporteta.ui.test.util + +import android.app.Activity +import android.support.test.espresso.Espresso.onView +import android.support.test.espresso.action.ViewActions +import android.support.test.espresso.action.ViewActions.typeText +import android.support.test.espresso.assertion.ViewAssertions.matches +import android.support.test.espresso.matcher.RootMatchers.withDecorView +import android.support.test.espresso.matcher.ViewMatchers.* +import android.support.test.rule.ActivityTestRule +import org.hamcrest.CoreMatchers.not + +fun Int.click() = onView(withId(this)).perform(ViewActions.click()) +fun Int.write(text: String) = onView(withId(this)).perform(typeText(text)) +fun Int.textEquals(text: String) = onView(withId(this)).check(matches(withText(text))) + +infix fun ActivityTestRule.containsToast(message: String) = + onView(withText(message)) + .inRoot(withDecorView(not(activity.window.decorView))) + .check(matches(isDisplayed())) \ No newline at end of file diff --git a/transport-eta-android/mobile-ui/src/debug/java/com/joaquimley/transporteta/ui/testing/factory/TestFactoryFavoriteView.kt b/transport-eta-android/mobile-ui/src/debug/java/com/joaquimley/transporteta/ui/testing/factory/TestFactoryFavoriteView.kt index 6687038..802b060 100644 --- a/transport-eta-android/mobile-ui/src/debug/java/com/joaquimley/transporteta/ui/testing/factory/TestFactoryFavoriteView.kt +++ b/transport-eta-android/mobile-ui/src/debug/java/com/joaquimley/transporteta/ui/testing/factory/TestFactoryFavoriteView.kt @@ -1,7 +1,7 @@ package com.joaquimley.transporteta.ui.testing.factory import android.support.annotation.RestrictTo -import com.joaquimley.transporteta.ui.model.FavoriteView +import com.joaquimley.transporteta.presentation.model.FavoriteView import com.joaquimley.transporteta.ui.testing.factory.ui.DataFactory @RestrictTo(RestrictTo.Scope.TESTS) diff --git a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/di/module/FavoriteFragmentModule.kt b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/di/module/FavoriteFragmentModule.kt index f10ecdf..6de2493 100644 --- a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/di/module/FavoriteFragmentModule.kt +++ b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/di/module/FavoriteFragmentModule.kt @@ -1,7 +1,8 @@ package com.joaquimley.transporteta.ui.di.module +import com.joaquimley.transporteta.presentation.home.favorite.FavoritesViewModelFactory +import com.joaquimley.transporteta.presentation.home.favorite.FavoritesViewModelFactoryImpl import com.joaquimley.transporteta.sms.SmsController -import com.joaquimley.transporteta.ui.presentation.home.favorite.FavoritesViewModelFactory import dagger.Module import dagger.Provides @@ -10,6 +11,6 @@ class FavoriteFragmentModule { @Provides fun provideFavouritesViewModelFactory(smsController: SmsController): FavoritesViewModelFactory { - return FavoritesViewModelFactory(smsController) + return FavoritesViewModelFactoryImpl(smsController) } } \ No newline at end of file diff --git a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/home/HomeActivity.kt b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/home/HomeActivity.kt index 6ae2d8b..e335525 100644 --- a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/home/HomeActivity.kt +++ b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/home/HomeActivity.kt @@ -9,8 +9,9 @@ import android.support.v4.app.Fragment import android.support.v4.content.ContextCompat import android.support.v7.app.AppCompatActivity import com.joaquimley.transporteta.R +import com.joaquimley.transporteta.presentation.home.HomeViewModel +import com.joaquimley.transporteta.presentation.home.HomeViewModelImpl import com.joaquimley.transporteta.ui.home.favorite.FavoritesFragment -import com.joaquimley.transporteta.ui.presentation.home.HomeViewModel import dagger.android.AndroidInjection import dagger.android.AndroidInjector import dagger.android.DispatchingAndroidInjector @@ -42,7 +43,8 @@ class HomeActivity : AppCompatActivity(), HasSupportFragmentInjector/*, BottomNa } private fun setupViewModel() { - viewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java) + // Create a HomeViewModelFactory to abstract the HomeViewModelImpl class + viewModel = ViewModelProviders.of(this).get(HomeViewModelImpl::class.java) } /** @@ -71,7 +73,7 @@ class HomeActivity : AppCompatActivity(), HasSupportFragmentInjector/*, BottomNa // private val favouritesFragment = FavoritesFragment.newInstance("") -// lateinit var viewModel: HomeViewModel +// lateinit var viewModel: HomeViewModelImpl // // override fun onCreate(savedInstanceState: Bundle?) { // super.onCreate(savedInstanceState) @@ -93,7 +95,7 @@ class HomeActivity : AppCompatActivity(), HasSupportFragmentInjector/*, BottomNa // // // private fun setupViewModel() { -// viewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java) +// viewModel = ViewModelProviders.of(this).get(HomeViewModelImpl::class.java) // } // // private fun setupNavigationView() { diff --git a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/home/favorite/FavoritesAdapter.kt b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/home/favorite/FavoritesAdapter.kt index 4cfd7ca..5baadf2 100644 --- a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/home/favorite/FavoritesAdapter.kt +++ b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/home/favorite/FavoritesAdapter.kt @@ -7,7 +7,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.joaquimley.transporteta.R -import com.joaquimley.transporteta.ui.model.FavoriteView +import com.joaquimley.transporteta.presentation.model.FavoriteView import com.joaquimley.transporteta.ui.util.load import kotlinx.android.synthetic.main.item_favorite.view.* diff --git a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/home/favorite/FavoritesFragment.kt b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/home/favorite/FavoritesFragment.kt index e09d603..204daf7 100644 --- a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/home/favorite/FavoritesFragment.kt +++ b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/home/favorite/FavoritesFragment.kt @@ -16,10 +16,10 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.joaquimley.transporteta.R -import com.joaquimley.transporteta.ui.model.FavoriteView +import com.joaquimley.transporteta.presentation.home.favorite.FavoritesViewModel +import com.joaquimley.transporteta.presentation.home.favorite.FavoritesViewModelFactory +import com.joaquimley.transporteta.presentation.model.FavoriteView import com.joaquimley.transporteta.ui.model.data.ResourceState -import com.joaquimley.transporteta.ui.presentation.home.favorite.FavoritesViewModel -import com.joaquimley.transporteta.ui.presentation.home.favorite.FavoritesViewModelFactory import com.joaquimley.transporteta.ui.util.clear import com.joaquimley.transporteta.ui.util.isEmpty import com.joaquimley.transporteta.ui.util.onChange diff --git a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/Favorite.kt b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/Favorite.kt deleted file mode 100644 index f853253..0000000 --- a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/Favorite.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.joaquimley.transporteta.ui.model - -class Favorite(val code: Int = -1, val latestEta: String = "") \ No newline at end of file diff --git a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/FavoriteViewObject.kt b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/FavoriteViewObject.kt new file mode 100644 index 0000000..8155c7d --- /dev/null +++ b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/FavoriteViewObject.kt @@ -0,0 +1,7 @@ +package com.joaquimley.transporteta.ui.model + +import android.os.Parcelable +import kotlinx.android.parcel.Parcelize + +@Parcelize +class FavoriteViewObject(val code: Int = -1, val latestEta: String = "", val originalText: String = ""): Parcelable \ No newline at end of file diff --git a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/data/Resource.kt b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/data/Resource.kt index 1d855c4..90f9596 100644 --- a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/data/Resource.kt +++ b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/data/Resource.kt @@ -1,22 +1,22 @@ -package com.joaquimley.transporteta.ui.model.data - -open class Resource constructor(val status: ResourceState, val data: T? = null, val message: String? = null) { - - companion object { - fun success(data: T): Resource { - return Resource(ResourceState.SUCCESS, data, null) - } - - fun empty(): Resource { - return Resource(ResourceState.EMPTY, null, null) - } - - fun error(message: String): Resource { - return Resource(ResourceState.ERROR, null, message) - } - - fun loading(): Resource { - return Resource(ResourceState.LOADING, null, null) - } - } -} \ No newline at end of file +//package com.joaquimley.transporteta.ui.model.data +// +//open class Resource constructor(val status: ResourceState, val data: T? = null, val message: String? = null) { +// +// companion object { +// fun success(data: T): com.joaquimley.transporteta.presentation.data.Resource { +// return Resource(ResourceState.SUCCESS, data, null) +// } +// +// fun empty(): com.joaquimley.transporteta.presentation.data.Resource { +// return Resource(ResourceState.EMPTY, null, null) +// } +// +// fun error(message: String): com.joaquimley.transporteta.presentation.data.Resource { +// return Resource(ResourceState.ERROR, null, message) +// } +// +// fun loading(): com.joaquimley.transporteta.presentation.data.Resource { +// return Resource(ResourceState.LOADING, null, null) +// } +// } +//} \ No newline at end of file diff --git a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/data/ResourceState.kt b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/data/ResourceState.kt index ea68ab8..c78e474 100644 --- a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/data/ResourceState.kt +++ b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/data/ResourceState.kt @@ -1,8 +1,8 @@ -package com.joaquimley.transporteta.ui.model.data - -/** - * Represents the state in which a [Resource] is currently in - */ -enum class ResourceState { - LOADING, SUCCESS, EMPTY, ERROR -} \ No newline at end of file +//package com.joaquimley.transporteta.ui.model.data +// +///** +// * Represents the state in which a [Resource] is currently in +// */ +//enum class ResourceState { +// LOADING, SUCCESS, EMPTY, ERROR +//} \ No newline at end of file diff --git a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/home/HomeViewModel.kt b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/home/HomeViewModel.kt deleted file mode 100644 index a744532..0000000 --- a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/home/HomeViewModel.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.joaquimley.transporteta.ui.presentation.home - -import android.arch.lifecycle.LiveData -import android.arch.lifecycle.MutableLiveData -import android.arch.lifecycle.ViewModel -import com.joaquimley.transporteta.ui.presentation.NavigationType - -/** - * Created by joaquimley on 24/03/2018. - */ -class HomeViewModel: ViewModel() { - - private val selectedScreenLiveData: MutableLiveData = MutableLiveData() - - init { - setInitialScreen() - } - - fun observeSelectedScreen(): LiveData { - return selectedScreenLiveData - } - - fun setSelectedScreen(navigationType: NavigationType) { - if (selectedScreenLiveData.value != navigationType) { - // TODO Track -> e.g. navigationType.name clicked - selectedScreenLiveData.postValue(navigationType) - } - } - - private fun setInitialScreen() { - // Possibly get from shared preferences, A/B testing etc.? - selectedScreenLiveData.postValue(NavigationType.FAVOURITES) - } - -} \ No newline at end of file diff --git a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/home/favorite/FavoritesViewModelFactory.kt b/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/home/favorite/FavoritesViewModelFactory.kt deleted file mode 100644 index 97a572f..0000000 --- a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/home/favorite/FavoritesViewModelFactory.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.joaquimley.transporteta.ui.presentation.home.favorite - -import android.arch.lifecycle.ViewModel -import android.arch.lifecycle.ViewModelProvider -import com.joaquimley.transporteta.sms.SmsController - -class FavoritesViewModelFactory(private val smsController: SmsController): ViewModelProvider.Factory { - override fun create(modelClass: Class): T { - if (modelClass.isAssignableFrom(FavoritesViewModelImpl::class.java)) { - return FavoritesViewModelImpl(smsController) as T - } - throw IllegalArgumentException("Unknown ViewModel class") - } -} \ No newline at end of file diff --git a/transport-eta-android/mobile-ui/src/main/res/values/strings.xml b/transport-eta-android/mobile-ui/src/main/res/values/strings.xml index 18f7140..8ffa173 100644 --- a/transport-eta-android/mobile-ui/src/main/res/values/strings.xml +++ b/transport-eta-android/mobile-ui/src/main/res/values/strings.xml @@ -53,7 +53,7 @@ Favorites Station: %s - + Create favorite Bus station code * Bus station title diff --git a/transport-eta-android/mobile-ui/src/test/java/com/joaquimley/transporteta/ui/home/favorite/FavoritesViewModelTest.kt b/transport-eta-android/mobile-ui/src/test/java/com/joaquimley/transporteta/ui/home/favorite/FavoritesViewModelTest.kt index 38a982a..0859569 100644 --- a/transport-eta-android/mobile-ui/src/test/java/com/joaquimley/transporteta/ui/home/favorite/FavoritesViewModelTest.kt +++ b/transport-eta-android/mobile-ui/src/test/java/com/joaquimley/transporteta/ui/home/favorite/FavoritesViewModelTest.kt @@ -4,10 +4,9 @@ import android.arch.core.executor.testing.InstantTaskExecutorRule import android.arch.lifecycle.Observer import com.joaquimley.transporteta.sms.SmsController import com.joaquimley.transporteta.sms.model.SmsModel -import com.joaquimley.transporteta.ui.model.FavoriteView -import com.joaquimley.transporteta.ui.model.data.Resource +import com.joaquimley.transporteta.presentation.data.Resource import com.joaquimley.transporteta.ui.model.data.ResourceState -import com.joaquimley.transporteta.ui.presentation.home.favorite.FavoritesViewModelImpl +import com.joaquimley.transporteta.presentation.home.favorite.FavoritesViewModelImpl import com.nhaarman.mockito_kotlin.times import com.nhaarman.mockito_kotlin.verify import io.reactivex.Observable.just diff --git a/transport-eta-android/presentation/.gitignore b/transport-eta-android/presentation/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/transport-eta-android/presentation/.gitignore @@ -0,0 +1 @@ +/build diff --git a/transport-eta-android/presentation/build.gradle b/transport-eta-android/presentation/build.gradle new file mode 100644 index 0000000..562fb5d --- /dev/null +++ b/transport-eta-android/presentation/build.gradle @@ -0,0 +1,94 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-kapt' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion build_versions.target_sdk + defaultConfig { + minSdkVersion build_versions.min_sdk + targetSdkVersion build_versions.target_sdk +// testInstrumentationRunner "com.joaquimley.transporteta.ui.test.TestRunner" + } + + packagingOptions { + exclude 'LICENSE.txt' + exclude 'META-INF/DEPENDENCIES' + exclude 'META-INF/ASL2.0' + exclude 'META-INF/NOTICE' + exclude 'META-INF/LICENSE' + } + + lintOptions { + quiet true + abortOnError false + ignoreWarnings true + disable 'InvalidPackage' //Some libraries have issues with this. + disable 'OldTargetApi' + // Lint gives this warning but SDK 20 would be Android L Beta. + disable 'IconDensities' //For testing purpose. This is safe to remove. + disable 'IconMissingDensityFolder' //For testing purpose. This is safe to remove. + } + + + dexOptions { + preDexLibraries true + } + + buildTypes { + debug { + testCoverageEnabled true + } + + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + flavorDimensions "environment" + productFlavors { + prod { + dimension "environment" + } + + mock { + dimension "environment" + } + } + + /** + * Prevent shipping the mock flavor with release variant + * read more at: https://developer.android.com/studio/build/build-variants.html + */ + variantFilter { variant -> + def names = variant.flavors*.name + // To check for a certain build type, use variant.buildType.name == "" + if (names.contains("mock") && variant.buildType.name == "release") { + // Gradle ignores any variants that satisfy the conditions above. + setIgnore(true) + } + } +} + +androidExtensions { + experimental = true +} + +dependencies { + // Module + implementation project(':sms') + + // Javax + implementation deps.javax.inject + compileOnly deps.javax.annotation + // Rx + implementation deps.rxjava2 + implementation deps.rx_android + // Kotlin + implementation deps.kotlin.stdlib + implementation deps.kotlin.rx + // ACC + kapt deps.lifecycle.compiler + implementation deps.lifecycle.extensions +} diff --git a/transport-eta-android/presentation/proguard-rules.pro b/transport-eta-android/presentation/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/transport-eta-android/presentation/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/transport-eta-android/presentation/src/androidTest/java/com/joaquimley/transporteta/presentation/ExampleInstrumentedTest.java b/transport-eta-android/presentation/src/androidTest/java/com/joaquimley/transporteta/presentation/ExampleInstrumentedTest.java new file mode 100644 index 0000000..8d8097a --- /dev/null +++ b/transport-eta-android/presentation/src/androidTest/java/com/joaquimley/transporteta/presentation/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.joaquimley.transporteta.presentation; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.joaquimley.transporteta.presentation.test", appContext.getPackageName()); + } +} diff --git a/transport-eta-android/presentation/src/main/AndroidManifest.xml b/transport-eta-android/presentation/src/main/AndroidManifest.xml new file mode 100644 index 0000000..1e6da03 --- /dev/null +++ b/transport-eta-android/presentation/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/data/Resource.kt b/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/data/Resource.kt new file mode 100644 index 0000000..6d787fe --- /dev/null +++ b/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/data/Resource.kt @@ -0,0 +1,24 @@ +package com.joaquimley.transporteta.presentation.data + +import com.joaquimley.transporteta.ui.model.data.ResourceState + +open class Resource constructor(val status: ResourceState, val data: T? = null, val message: String? = null) { + + companion object { + fun success(data: T): Resource { + return Resource(ResourceState.SUCCESS, data, null) + } + + fun empty(): Resource { + return Resource(ResourceState.EMPTY, null, null) + } + + fun error(message: String): Resource { + return Resource(ResourceState.ERROR, null, message) + } + + fun loading(): Resource { + return Resource(ResourceState.LOADING, null, null) + } + } +} \ No newline at end of file diff --git a/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/data/ResourceState.kt b/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/data/ResourceState.kt new file mode 100644 index 0000000..ea68ab8 --- /dev/null +++ b/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/data/ResourceState.kt @@ -0,0 +1,8 @@ +package com.joaquimley.transporteta.ui.model.data + +/** + * Represents the state in which a [Resource] is currently in + */ +enum class ResourceState { + LOADING, SUCCESS, EMPTY, ERROR +} \ No newline at end of file diff --git a/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/home/HomeViewModel.kt b/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/home/HomeViewModel.kt new file mode 100644 index 0000000..8bab1d8 --- /dev/null +++ b/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/home/HomeViewModel.kt @@ -0,0 +1,26 @@ +package com.joaquimley.transporteta.presentation.home + +import android.arch.lifecycle.LiveData +import android.arch.lifecycle.MutableLiveData +import android.arch.lifecycle.ViewModel + +/** + * Created by joaquimley on 24/03/2018. + */ +abstract class HomeViewModel : ViewModel() { + + protected val selectedScreenLiveData: MutableLiveData = MutableLiveData() + + abstract fun observeSelectedScreen(): LiveData + + abstract fun setSelectedScreen(navigationType: NavigationType) + + init { + setInitialScreen() + } + + private fun setInitialScreen() { + // Possibly get from shared preferences, A/B testing etc.? + selectedScreenLiveData.postValue(NavigationType.FAVOURITES) + } +} \ No newline at end of file diff --git a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/NavigationType.kt b/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/home/NavigationType.kt similarity index 68% rename from transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/NavigationType.kt rename to transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/home/NavigationType.kt index 4af8f0a..b7a3e0d 100644 --- a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/NavigationType.kt +++ b/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/home/NavigationType.kt @@ -1,4 +1,4 @@ -package com.joaquimley.transporteta.ui.presentation +package com.joaquimley.transporteta.presentation.home /** * Created by joaquimley on 24/03/2018. diff --git a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/home/favorite/FavoritesViewModel.kt b/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/home/favorite/FavoritesViewModel.kt similarity index 51% rename from transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/home/favorite/FavoritesViewModel.kt rename to transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/home/favorite/FavoritesViewModel.kt index b1cadb3..5c56ce1 100644 --- a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/home/favorite/FavoritesViewModel.kt +++ b/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/home/favorite/FavoritesViewModel.kt @@ -1,12 +1,12 @@ -package com.joaquimley.transporteta.ui.presentation.home.favorite +package com.joaquimley.transporteta.presentation.home.favorite import android.arch.lifecycle.LiveData import android.arch.lifecycle.ViewModel +import com.joaquimley.transporteta.presentation.model.FavoriteView import com.joaquimley.transporteta.sms.SmsController -import com.joaquimley.transporteta.ui.model.FavoriteView -import com.joaquimley.transporteta.ui.model.data.Resource +import com.joaquimley.transporteta.presentation.data.Resource -abstract class FavoritesViewModel(protected val smsController: SmsController): ViewModel() { +abstract class FavoritesViewModel(val smsController: SmsController): ViewModel() { abstract fun getFavourites(): LiveData>> diff --git a/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/home/favorite/FavoritesViewModelFactory.kt b/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/home/favorite/FavoritesViewModelFactory.kt new file mode 100644 index 0000000..af3960e --- /dev/null +++ b/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/home/favorite/FavoritesViewModelFactory.kt @@ -0,0 +1,14 @@ +package com.joaquimley.transporteta.presentation.home.favorite + +import android.arch.lifecycle.ViewModel +import android.arch.lifecycle.ViewModelProvider +import com.joaquimley.transporteta.sms.SmsController + +abstract class FavoritesViewModelFactory(private val smsController: SmsController) : ViewModelProvider.Factory { + + override fun create(modelClass: Class): T { + return create(smsController) as T + } + + abstract fun create(smsController: SmsController): FavoritesViewModel +} \ No newline at end of file diff --git a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/FavoriteView.kt b/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/model/FavoriteView.kt similarity index 81% rename from transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/FavoriteView.kt rename to transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/model/FavoriteView.kt index d0ad400..942f66a 100644 --- a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/model/FavoriteView.kt +++ b/transport-eta-android/presentation/src/main/java/com/joaquimley/transporteta/presentation/model/FavoriteView.kt @@ -1,4 +1,4 @@ -package com.joaquimley.transporteta.ui.model +package com.joaquimley.transporteta.presentation.model import android.os.Parcelable import kotlinx.android.parcel.Parcelize diff --git a/transport-eta-android/presentation/src/main/res/values/strings.xml b/transport-eta-android/presentation/src/main/res/values/strings.xml new file mode 100644 index 0000000..598ee60 --- /dev/null +++ b/transport-eta-android/presentation/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Presentation + diff --git a/transport-eta-android/presentation/src/prod/java/com/joaquimley/transporteta/presentation/home/HomeViewModelImpl.kt b/transport-eta-android/presentation/src/prod/java/com/joaquimley/transporteta/presentation/home/HomeViewModelImpl.kt new file mode 100644 index 0000000..d05851a --- /dev/null +++ b/transport-eta-android/presentation/src/prod/java/com/joaquimley/transporteta/presentation/home/HomeViewModelImpl.kt @@ -0,0 +1,20 @@ +package com.joaquimley.transporteta.presentation.home + +import android.arch.lifecycle.LiveData + +/** + * Created by joaquimley on 24/03/2018. + */ +class HomeViewModelImpl : HomeViewModel() { + + override fun observeSelectedScreen(): LiveData { + return selectedScreenLiveData + } + + override fun setSelectedScreen(navigationType: NavigationType) { + if (selectedScreenLiveData.value != navigationType) { + // TODO Track -> e.g. navigationType.name clicked + selectedScreenLiveData.postValue(navigationType) + } + } +} \ No newline at end of file diff --git a/transport-eta-android/presentation/src/prod/java/com/joaquimley/transporteta/presentation/home/favorite/FavoritesViewModelFactoryImpl.kt b/transport-eta-android/presentation/src/prod/java/com/joaquimley/transporteta/presentation/home/favorite/FavoritesViewModelFactoryImpl.kt new file mode 100644 index 0000000..899f2aa --- /dev/null +++ b/transport-eta-android/presentation/src/prod/java/com/joaquimley/transporteta/presentation/home/favorite/FavoritesViewModelFactoryImpl.kt @@ -0,0 +1,10 @@ +package com.joaquimley.transporteta.presentation.home.favorite + +import com.joaquimley.transporteta.sms.SmsController + +class FavoritesViewModelFactoryImpl(smsController: SmsController) : FavoritesViewModelFactory(smsController) { + + override fun create(smsController: SmsController): FavoritesViewModel { + return FavoritesViewModelImpl(smsController) + } +} \ No newline at end of file diff --git a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/home/favorite/FavoritesViewModelImpl.kt b/transport-eta-android/presentation/src/prod/java/com/joaquimley/transporteta/presentation/home/favorite/FavoritesViewModelImpl.kt similarity index 89% rename from transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/home/favorite/FavoritesViewModelImpl.kt rename to transport-eta-android/presentation/src/prod/java/com/joaquimley/transporteta/presentation/home/favorite/FavoritesViewModelImpl.kt index 8f5f76b..3502ac9 100644 --- a/transport-eta-android/mobile-ui/src/main/java/com/joaquimley/transporteta/ui/presentation/home/favorite/FavoritesViewModelImpl.kt +++ b/transport-eta-android/presentation/src/prod/java/com/joaquimley/transporteta/presentation/home/favorite/FavoritesViewModelImpl.kt @@ -1,11 +1,12 @@ -package com.joaquimley.transporteta.ui.presentation.home.favorite +package com.joaquimley.transporteta.presentation.home.favorite import android.arch.lifecycle.LiveData import android.arch.lifecycle.MutableLiveData +import com.joaquimley.transporteta.presentation.model.FavoriteView import com.joaquimley.transporteta.sms.SmsController -import com.joaquimley.transporteta.ui.model.FavoriteView -import com.joaquimley.transporteta.ui.model.data.Resource +import com.joaquimley.transporteta.presentation.data.Resource import com.joaquimley.transporteta.ui.model.data.ResourceState +import java.util.* import javax.inject.Inject /** diff --git a/transport-eta-android/presentation/src/test/java/com/joaquimley/transporteta/presentation/ExampleUnitTest.java b/transport-eta-android/presentation/src/test/java/com/joaquimley/transporteta/presentation/ExampleUnitTest.java new file mode 100644 index 0000000..6cc1653 --- /dev/null +++ b/transport-eta-android/presentation/src/test/java/com/joaquimley/transporteta/presentation/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.joaquimley.transporteta.presentation; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/transport-eta-android/settings.gradle b/transport-eta-android/settings.gradle index 6040340..fe434d9 100644 --- a/transport-eta-android/settings.gradle +++ b/transport-eta-android/settings.gradle @@ -1 +1 @@ -include ':mobile-ui', ':sms' +include ':mobile-ui', ':sms', ':presentation' diff --git a/transport-eta-android/sms/src/prod/java/com/joaquimley/transporteta/sms/SmsBroadcastReceiverImpl.kt b/transport-eta-android/sms/src/prod/com.joaquimley.transporteta.sms/SmsBroadcastReceiverImpl.kt similarity index 100% rename from transport-eta-android/sms/src/prod/java/com/joaquimley/transporteta/sms/SmsBroadcastReceiverImpl.kt rename to transport-eta-android/sms/src/prod/com.joaquimley.transporteta.sms/SmsBroadcastReceiverImpl.kt diff --git a/transport-eta-android/sms/src/prod/java/com/joaquimley/transporteta/sms/SmsControllerImpl.kt b/transport-eta-android/sms/src/prod/com.joaquimley.transporteta.sms/SmsControllerImpl.kt similarity index 100% rename from transport-eta-android/sms/src/prod/java/com/joaquimley/transporteta/sms/SmsControllerImpl.kt rename to transport-eta-android/sms/src/prod/com.joaquimley.transporteta.sms/SmsControllerImpl.kt diff --git a/transport-eta-android/versions.gradle b/transport-eta-android/versions.gradle index 0438d4b..4e3d01d 100644 --- a/transport-eta-android/versions.gradle +++ b/transport-eta-android/versions.gradle @@ -6,7 +6,7 @@ ext.deps = [:] def versions = [:] versions.arch = "1.1.1" versions.arch_room = "1.0.0" -versions.support = "27.1.0" +versions.support = "27.1.1" versions.support_constraint = "1.0.2" versions.dagger = "2.11" versions.javax_inject = "1"