Skip to content

Commit

Permalink
refactor: simplify di, normalize strings when filtering (#41)
Browse files Browse the repository at this point in the history
adrielcafe authored Nov 3, 2019
1 parent ba441c9 commit 7190f38
Showing 7 changed files with 72 additions and 75 deletions.
5 changes: 3 additions & 2 deletions data/src/main/java/com/jcaique/dialetus/data/di/injection.kt
Original file line number Diff line number Diff line change
@@ -14,8 +14,9 @@ import org.kodein.di.generic.bind
import org.kodein.di.generic.instance
import org.kodein.di.generic.singleton

private val interceptors =
listOf(HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY })
private val interceptors = listOf(
HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY }
)

val dataModule = Kodein.Module(name = "network") {

Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@ import com.jcaique.dialetus.data.responses.RegionResponse
import com.jcaique.dialetus.domain.models.Region

internal object RegionsMapper {

fun toDomain(response: RegionResponse): Region =
Region(response.name, response.total)
}
Original file line number Diff line number Diff line change
@@ -5,9 +5,8 @@ import com.jcaique.dialetus.presentation.dialects.DialectsViewModel
import com.jcaique.dialetus.presentation.regions.RegionsPresentation
import com.jcaique.dialetus.presentation.regions.RegionsViewModel
import com.jcaique.dialetus.utils.KodeinTags
import com.jcaique.dialetus.utils.dataflow.ConfigChangesAwareStateContainer
import com.jcaique.dialetus.utils.dataflow.StateMachine
import com.jcaique.dialetus.utils.dataflow.TaskExecutor
import com.jcaique.dialetus.utils.extensions.newStateContainer
import com.jcaique.dialetus.utils.extensions.newStateMachine
import org.kodein.di.Kodein
import org.kodein.di.generic.bind
import org.kodein.di.generic.instance
@@ -16,17 +15,8 @@ import org.kodein.di.generic.provider
val presentationModule = Kodein.Module(name = "presentation") {

bind() from provider {
val stateContainer =
ConfigChangesAwareStateContainer<RegionsPresentation>(
host = instance(KodeinTags.hostActivity)
)
val stateMachine = StateMachine(
container = stateContainer,
executor = TaskExecutor.Concurrent(
scope = stateContainer.emissionScope,
dispatcher = instance()
)
)
val stateContainer = newStateContainer<RegionsPresentation>(KodeinTags.hostActivity)
val stateMachine = newStateMachine(stateContainer)

RegionsViewModel(
service = instance(),
@@ -35,17 +25,8 @@ val presentationModule = Kodein.Module(name = "presentation") {
}

bind() from provider {
val stateContainer =
ConfigChangesAwareStateContainer<DialectsPresentation>(
host = instance(KodeinTags.hostActivity)
)
val stateMachine = StateMachine(
container = stateContainer,
executor = TaskExecutor.Concurrent(
scope = stateContainer.emissionScope,
dispatcher = instance()
)
)
val stateContainer = newStateContainer<DialectsPresentation>(KodeinTags.hostActivity)
val stateMachine = newStateMachine(stateContainer)

DialectsViewModel(
machine = stateMachine,
Original file line number Diff line number Diff line change
@@ -6,6 +6,7 @@ import com.jcaique.dialetus.utils.dataflow.StateMachine
import com.jcaique.dialetus.utils.dataflow.StateTransition
import com.jcaique.dialetus.utils.dataflow.UnsupportedUserInteraction
import com.jcaique.dialetus.utils.dataflow.UserInteraction
import com.jcaique.dialetus.utils.extensions.normalize
import kotlinx.coroutines.coroutineScope

internal class DialectsViewModel(
@@ -35,15 +36,13 @@ internal class DialectsViewModel(
else -> throw UnsupportedUserInteraction
}

// TODO get dialects from service
private suspend fun showDialects(
parameters: StateTransition.Parameters
): DialectsPresentation = coroutineScope {
val interaction = parameters as ShowDialects

dialects = service.getDialectsBy(interaction.region.name.toLowerCase())

dialects
service
.getDialectsBy(interaction.region.name.toLowerCase())
.let(::DialectsPresentation)
}

@@ -53,7 +52,14 @@ internal class DialectsViewModel(
val interaction = parameters as FilterDialects

dialects
.filter { it.dialect.contains(interaction.query, ignoreCase = true) }
.filter {
it.dialect
.normalize()
.contains(
other = interaction.query.normalize(),
ignoreCase = true
)
}
.let(::DialectsPresentation)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.jcaique.dialetus.utils.extensions

import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentActivity
import com.jcaique.dialetus.utils.KodeinTags.hostActivity
import com.jcaique.dialetus.utils.dataflow.ConfigChangesAwareStateContainer
import com.jcaique.dialetus.utils.dataflow.StateContainer
import com.jcaique.dialetus.utils.dataflow.StateMachine
import com.jcaique.dialetus.utils.dataflow.TaskExecutor
import org.kodein.di.Kodein
import org.kodein.di.KodeinAware
import org.kodein.di.bindings.NoArgBindingKodein
import org.kodein.di.generic.bind
import org.kodein.di.generic.instance
import org.kodein.di.generic.provider

fun AppCompatActivity.selfInject(bindings: Kodein.MainBuilder.() -> Unit = {}) = Kodein.lazy {

val parentKodein = (applicationContext as KodeinAware).kodein

extend(parentKodein)

bind<FragmentActivity>(tag = hostActivity) with provider {
this@selfInject
}

bindings.invoke(this)
}

fun <T> NoArgBindingKodein<*>.newStateContainer(tag: String) =
ConfigChangesAwareStateContainer<T>(
host = instance(tag)
)

fun <T> NoArgBindingKodein<*>.newStateMachine(stateContainer: StateContainer<T>) =
StateMachine(
container = stateContainer,
executor = TaskExecutor.Concurrent(
scope = stateContainer.emissionScope,
dispatcher = instance()
)
)
Original file line number Diff line number Diff line change
@@ -3,10 +3,18 @@ package com.jcaique.dialetus.utils.extensions
import android.app.Activity
import android.content.ClipDescription
import androidx.core.app.ShareCompat
import java.text.Normalizer

fun String.share(activity: Activity) =
private val REGEX_NORMALIZE = "\\p{InCombiningDiacriticalMarks}+".toRegex()

fun CharSequence.share(activity: Activity) =
ShareCompat.IntentBuilder
.from(activity)
.setText(this)
.setType(ClipDescription.MIMETYPE_TEXT_PLAIN)
.startChooser()

fun CharSequence.normalize(): String {
val temp = Normalizer.normalize(this, Normalizer.Form.NFD)
return REGEX_NORMALIZE.replace(temp, "")
}

0 comments on commit 7190f38

Please sign in to comment.