diff --git a/app/build.gradle b/app/build.gradle index 02d6b5c..751be7d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -58,7 +58,9 @@ dependencies { implementation libs.arrow implementation libs.constraint implementation libs.design - implementation libs.floating_search + implementation(libs.floating_search) { + exclude module: 'support-v4' + } implementation libs.okhttp implementation libs.okhttp_logging implementation libs.koin diff --git a/app/src/main/java/es/ffgiraldez/comicsearch/comics/di/comicModule.kt b/app/src/main/java/es/ffgiraldez/comicsearch/comics/di/comicModule.kt index db20e1e..0890341 100644 --- a/app/src/main/java/es/ffgiraldez/comicsearch/comics/di/comicModule.kt +++ b/app/src/main/java/es/ffgiraldez/comicsearch/comics/di/comicModule.kt @@ -1,19 +1,17 @@ package es.ffgiraldez.comicsearch.comics.di import android.arch.persistence.room.Room +import android.content.Context import es.ffgiraldez.comicsearch.comics.data.network.ComicVineApi import es.ffgiraldez.comicsearch.comics.data.storage.ComicDatabase import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor -import org.koin.dsl.context.ParameterProvider -import org.koin.dsl.module.applicationContext +import org.koin.dsl.module.module import retrofit2.Retrofit import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory import retrofit2.converter.gson.GsonConverterFactory -const val CONTEXT_PARAM: String = "context" - -val comicModule = applicationContext { +val comicModule = module { factory { val okHttp = OkHttpClient.Builder() .addInterceptor(HttpLoggingInterceptor() @@ -28,5 +26,5 @@ val comicModule = applicationContext { .build() .create(ComicVineApi::class.java) } - bean { params: ParameterProvider -> Room.databaseBuilder(params[CONTEXT_PARAM], ComicDatabase::class.java, "comics").build() } + single { (context: Context) -> Room.databaseBuilder(context, ComicDatabase::class.java, "comics").build() } } \ No newline at end of file diff --git a/app/src/main/java/es/ffgiraldez/comicsearch/navigation/di/androidModule.kt b/app/src/main/java/es/ffgiraldez/comicsearch/navigation/di/androidModule.kt index 9a8b77f..175c66f 100644 --- a/app/src/main/java/es/ffgiraldez/comicsearch/navigation/di/androidModule.kt +++ b/app/src/main/java/es/ffgiraldez/comicsearch/navigation/di/androidModule.kt @@ -1,10 +1,9 @@ package es.ffgiraldez.comicsearch.navigation.di +import android.app.Activity import es.ffgiraldez.comicsearch.navigation.Navigator -import org.koin.dsl.module.applicationContext +import org.koin.dsl.module.module -const val ACTIVITY_PARAM: String = "activity" - -val navigationModule = applicationContext { - factory { params -> Navigator(params[ACTIVITY_PARAM]) } +val navigationModule = module { + factory { (activity: Activity) -> Navigator(activity) } } \ No newline at end of file diff --git a/app/src/main/java/es/ffgiraldez/comicsearch/query/base/ui/QueryActivity.kt b/app/src/main/java/es/ffgiraldez/comicsearch/query/base/ui/QueryActivity.kt index 94dc84d..106a32e 100644 --- a/app/src/main/java/es/ffgiraldez/comicsearch/query/base/ui/QueryActivity.kt +++ b/app/src/main/java/es/ffgiraldez/comicsearch/query/base/ui/QueryActivity.kt @@ -4,20 +4,19 @@ import android.databinding.DataBindingUtil import android.os.Bundle import android.support.v7.app.AppCompatActivity import es.ffgiraldez.comicsearch.R -import es.ffgiraldez.comicsearch.comics.di.CONTEXT_PARAM import es.ffgiraldez.comicsearch.databinding.QueryActivityBinding import es.ffgiraldez.comicsearch.navigation.Navigator -import es.ffgiraldez.comicsearch.navigation.di.ACTIVITY_PARAM import es.ffgiraldez.comicsearch.query.search.presentation.SearchViewModel import es.ffgiraldez.comicsearch.query.sugestion.presentation.SuggestionViewModel -import org.koin.android.architecture.ext.viewModel import org.koin.android.ext.android.inject +import org.koin.android.viewmodel.ext.android.viewModel +import org.koin.core.parameter.parametersOf class QueryActivity : AppCompatActivity() { - private val suggestionViewModel by viewModel(parameters = { mapOf(CONTEXT_PARAM to this.applicationContext) }) - private val searchViewModel by viewModel(parameters = { mapOf(CONTEXT_PARAM to this.applicationContext) }) - private val navigator by inject(parameters = { mapOf(ACTIVITY_PARAM to this) }) + private val navigator by inject { parametersOf(this) } + private val suggestionViewModel by viewModel { parametersOf(this.applicationContext) } + private val searchViewModel by viewModel { parametersOf(this.applicationContext) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/es/ffgiraldez/comicsearch/query/search/di/SearchModule.kt b/app/src/main/java/es/ffgiraldez/comicsearch/query/search/di/SearchModule.kt index a30e31d..3c77809 100644 --- a/app/src/main/java/es/ffgiraldez/comicsearch/query/search/di/SearchModule.kt +++ b/app/src/main/java/es/ffgiraldez/comicsearch/query/search/di/SearchModule.kt @@ -4,11 +4,11 @@ import es.ffgiraldez.comicsearch.query.search.data.SearchLocalDataSource import es.ffgiraldez.comicsearch.query.search.data.SearchRemoteDataSource import es.ffgiraldez.comicsearch.query.search.data.SearchRepository import es.ffgiraldez.comicsearch.query.search.presentation.SearchViewModel -import org.koin.dsl.module.applicationContext +import org.koin.dsl.module.module -val searchModule = applicationContext { - factory { SearchLocalDataSource(get({ it.values })) } +val searchModule = module { + factory { SearchLocalDataSource(get(parameters = { it })) } factory { SearchRemoteDataSource(get()) } - factory { SearchRepository(get({ it.values }), get()) } - factory { SearchViewModel(get()) } + factory { SearchRepository(get(parameters = { it }), get()) } + factory { SearchViewModel(get(parameters = { it })) } } \ No newline at end of file diff --git a/app/src/main/java/es/ffgiraldez/comicsearch/query/sugestion/di/SuggestionModule.kt b/app/src/main/java/es/ffgiraldez/comicsearch/query/sugestion/di/SuggestionModule.kt index 189290a..5c453ac 100644 --- a/app/src/main/java/es/ffgiraldez/comicsearch/query/sugestion/di/SuggestionModule.kt +++ b/app/src/main/java/es/ffgiraldez/comicsearch/query/sugestion/di/SuggestionModule.kt @@ -4,11 +4,11 @@ import es.ffgiraldez.comicsearch.query.sugestion.data.SuggestionLocalDataSource import es.ffgiraldez.comicsearch.query.sugestion.data.SuggestionRemoteDataSource import es.ffgiraldez.comicsearch.query.sugestion.data.SuggestionRepository import es.ffgiraldez.comicsearch.query.sugestion.presentation.SuggestionViewModel -import org.koin.dsl.module.applicationContext +import org.koin.dsl.module.module -val suggestionModule = applicationContext { - factory { SuggestionLocalDataSource(get({ it.values })) } +val suggestionModule = module { + factory { SuggestionLocalDataSource(get(parameters = { it })) } factory { SuggestionRemoteDataSource(get()) } - factory { SuggestionRepository(get({ it.values }), get()) } - factory { SuggestionViewModel(get({ it.values })) } + factory { SuggestionRepository(get(parameters = { it }), get()) } + factory { SuggestionViewModel(get(parameters = { it })) } } \ No newline at end of file diff --git a/app/src/test/java/es/ffgiraldez/comicsearch/di/TestContextResolution.kt b/app/src/test/java/es/ffgiraldez/comicsearch/di/TestContextResolution.kt index 6f1e952..5417e07 100644 --- a/app/src/test/java/es/ffgiraldez/comicsearch/di/TestContextResolution.kt +++ b/app/src/test/java/es/ffgiraldez/comicsearch/di/TestContextResolution.kt @@ -1,21 +1,15 @@ package es.ffgiraldez.comicsearch.di -import android.app.Activity import android.arch.core.executor.testing.InstantTaskExecutorRule -import android.content.Context -import com.nhaarman.mockito_kotlin.mock -import es.ffgiraldez.comicsearch.comics.di.CONTEXT_PARAM import es.ffgiraldez.comicsearch.comics.di.comicModule -import es.ffgiraldez.comicsearch.navigation.di.ACTIVITY_PARAM import es.ffgiraldez.comicsearch.navigation.di.navigationModule import es.ffgiraldez.comicsearch.query.search.di.searchModule import es.ffgiraldez.comicsearch.query.sugestion.di.suggestionModule import org.junit.Rule import org.junit.Test import org.junit.rules.TestRule -import org.koin.standalone.StandAloneContext.startKoin import org.koin.test.KoinTest -import org.koin.test.dryRun +import org.koin.test.checkModules class TestContextResolution : KoinTest { @@ -25,18 +19,11 @@ class TestContextResolution : KoinTest { @Test fun `dry run`() { // start Koin - startKoin(listOf( + checkModules(listOf( navigationModule, comicModule, searchModule, suggestionModule )) - // dry run of given module list - dryRun(defaultParameters = { - mapOf( - ACTIVITY_PARAM to mock(), - CONTEXT_PARAM to mock() - ) - }) } } \ No newline at end of file diff --git a/dependencies.gradle b/dependencies.gradle index 4812265..65ef227 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -2,19 +2,18 @@ * Please keep them organized in alphabetic order. */ ext { - compile_sdk = 27 + compile_sdk = 28 min_sdk = 21 - target_sdk = 27 + target_sdk = 28 versions = [ - arch_comp_lifecycle : '1.1.1', - arch_comp_persistence: '1.0.0', + architecture_components : '1.1.1', android_plugin : '3.1.2', - koin : '0.9.1', - kotlin : '1.2.41', - okhttp : '3.9.1', + koin : '1.0.2', + kotlin : '1.3.10', + okhttp : '3.11.0', retrofit : '2.4.0', - support : '27.1.0', + support : '28.0.0', ] build_plugins = [ @@ -23,14 +22,14 @@ ext { ] libs = [ - arch_comp_livedata : [group: 'android.arch.lifecycle', name: 'livedata', version: versions.arch_comp_lifecycle], - arch_comp_viewmodel : [group: 'android.arch.lifecycle', name: 'viewmodel', version: versions.arch_comp_lifecycle], - arch_comp_room : [group: 'android.arch.persistence.room', name: 'runtime', version: versions.arch_comp_persistence], - arch_comp_room_compiler: [group: 'android.arch.persistence.room', name: 'compiler', version: versions.arch_comp_persistence], - arch_comp_room_rxjava : [group: 'android.arch.persistence.room', name: 'rxjava2', version: versions.arch_comp_persistence], - arch_comp_room_test : [group: 'android.arch.persistence.room', name: 'testing', version: versions.arch_comp_persistence], - arch_comp_test : [group: 'android.arch.core', name: 'core-testing', version: versions.arch_comp_lifecycle], - arrow : [group: 'io.arrow-kt', name: 'arrow-core', version: '0.7.1'], + arch_comp_livedata : [group: 'android.arch.lifecycle', name: 'livedata', version: versions.architecture_components], + arch_comp_viewmodel : [group: 'android.arch.lifecycle', name: 'viewmodel', version: versions.architecture_components], + arch_comp_room : [group: 'android.arch.persistence.room', name: 'runtime', version: versions.architecture_components], + arch_comp_room_compiler: [group: 'android.arch.persistence.room', name: 'compiler', version: versions.architecture_components], + arch_comp_room_rxjava : [group: 'android.arch.persistence.room', name: 'rxjava2', version: versions.architecture_components], + arch_comp_room_test : [group: 'android.arch.persistence.room', name: 'testing', version: versions.architecture_components], + arch_comp_test : [group: 'android.arch.core', name: 'core-testing', version: versions.architecture_components], + arrow : [group: 'io.arrow-kt', name: 'arrow-core', version: '0.8.1'], constraint : [group: 'com.android.support.constraint', name: 'constraint-layout', version: '1.0.2'], databinding_compiler : [group: 'com.android.databinding', name: 'compiler', version: versions.android_plugin], design : [group: 'com.android.support', name: 'design', version: versions.support], @@ -40,16 +39,16 @@ ext { okhttp_logging : [group: 'com.squareup.okhttp3', name: 'logging-interceptor', version: versions.okhttp], koin : [group: 'org.koin', name: 'koin-core', version: versions.koin], koin_android : [group: 'org.koin', name: 'koin-android', version: versions.koin], - koin_architecture : [group: 'org.koin', name: 'koin-android-architecture', version: versions.koin], + koin_architecture : [group: 'org.koin', name: 'koin-android-viewmodel', version: versions.koin], koin_test : [group: 'org.koin', name: 'koin-test', version: versions.koin], kotlin_stdlib : [group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib-jdk7', version: versions.kotlin], - mockito_kotlin : [group: 'com.nhaarman', name: 'mockito-kotlin', version: '1.5.0'], + mockito_kotlin : [group: 'com.nhaarman.mockitokotlin2', name: 'mockito-kotlin', version: '2.0.0'], picasso : [group: 'com.squareup.picasso', name: 'picasso', version: '2.5.2'], retrofit : [group: 'com.squareup.retrofit2', name: 'retrofit', version: versions.retrofit], retrofit_gson : [group: 'com.squareup.retrofit2', name: 'converter-gson', version: versions.retrofit], retrofit_rx_java : [group: 'com.squareup.retrofit2', name: 'adapter-rxjava2', version: versions.retrofit], - rx_java : [group: 'io.reactivex.rxjava2', name: 'rxjava', version: '2.1.10'], - rx_android : [group: 'io.reactivex.rxjava2', name: 'rxandroid', version: '2.0.2'], + rx_java : [group: 'io.reactivex.rxjava2', name: 'rxjava', version: '2.2.3'], + rx_android : [group: 'io.reactivex.rxjava2', name: 'rxandroid', version: '2.1.0'], steho : [group: 'com.facebook.stetho', name: 'stetho', version: '1.5.0'] ] diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 8c0fb64..91ca28c 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index cb4f22f..d76b502 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Sun Mar 11 15:45:04 CET 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip diff --git a/gradlew b/gradlew index 91a7e26..cccdd3d 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh ############################################################################## ## @@ -6,20 +6,38 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -30,6 +48,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,31 +59,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -90,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -114,6 +113,7 @@ fi if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` @@ -154,11 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index aec9973..e95643d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +46,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line