Use dependency injection for most singletons

This commit is contained in:
MM20
2021-10-10 12:15:54 +02:00
parent 023bb2cbb1
commit 087d4fd455
144 changed files with 1789 additions and 1277 deletions
@@ -1,13 +1,16 @@
package de.mm20.launcher2.search
import kotlinx.coroutines.*
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
abstract class BaseSearchableRepository {
abstract class BaseSearchableRepository: KoinComponent {
private val scope = CoroutineScope(Job() + Dispatchers.Main)
private val searchQuery = SearchRepository.getInstance().currentQuery
val searchRepository: SearchRepository by inject()
private val searchQuery = searchRepository.currentQuery
init {
searchQuery.observeForever {
@@ -33,10 +36,10 @@ abstract class BaseSearchableRepository {
onCancel()
searchJob?.takeIf { !it.isCompleted || !it.isCancelled }?.cancelAndJoin()
searchJob = scope.launch {
SearchRepository.getInstance().startSearch()
searchRepository.startSearch()
search(query)
}.also {
it.invokeOnCompletion { SearchRepository.getInstance().endSearch() }
it.invokeOnCompletion { searchRepository.endSearch() }
}
}
}
@@ -0,0 +1,12 @@
package de.mm20.launcher2.search
import org.koin.android.ext.koin.androidContext
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module
val searchModule = module {
single { SearchRepository() }
viewModel { SearchViewModel(get()) }
single { WebsearchRepository(androidContext()) }
viewModel { WebsearchViewModel(get()) }
}
@@ -2,7 +2,7 @@ package de.mm20.launcher2.search
import androidx.lifecycle.MutableLiveData
class SearchRepository private constructor() {
class SearchRepository {
val isSearching = MutableLiveData<Boolean>(false)
val currentQuery = MutableLiveData<String>()
@@ -27,12 +27,4 @@ class SearchRepository private constructor() {
runningSearches--
}
}
companion object {
private lateinit var instance: SearchRepository
fun getInstance(): SearchRepository {
if (!::instance.isInitialized) instance = SearchRepository()
return instance
}
}
}
@@ -1,16 +1,16 @@
package de.mm20.launcher2.search
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
class SearchViewModel(app: Application) : AndroidViewModel(app) {
private val repository = SearchRepository.getInstance()
class SearchViewModel(
private val searchRepository: SearchRepository
) : ViewModel() {
val isSearching: LiveData<Boolean> = repository.isSearching
val isSearching: LiveData<Boolean> = searchRepository.isSearching
fun search(query: String) {
repository.currentQuery.value = query
searchRepository.currentQuery.value = query
}
}
@@ -0,0 +1,14 @@
package de.mm20.launcher2.search
import de.mm20.launcher2.search.data.Searchable
interface SearchableDeserializer {
fun deserialize(serialized: String): Searchable?
}
class NullDeserializer: SearchableDeserializer {
override fun deserialize(serialized: String): Searchable? {
return null
}
}
@@ -0,0 +1,8 @@
package de.mm20.launcher2.search
import de.mm20.launcher2.search.data.Searchable
interface SearchableSerializer {
fun serialize(searchable: Searchable): String
val typePrefix: String
}
@@ -11,7 +11,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.withContext
class WebsearchRepository private constructor(val context: Context) : BaseSearchableRepository() {
class WebsearchRepository(val context: Context) : BaseSearchableRepository() {
val websearches = MutableLiveData<List<Websearch>>(emptyList())
@@ -52,13 +52,4 @@ class WebsearchRepository private constructor(val context: Context) : BaseSearch
}
}
}
companion object {
private lateinit var instance: WebsearchRepository
fun getInstance(context: Context): WebsearchRepository {
if (!::instance.isInitialized) instance = WebsearchRepository(context.applicationContext)
return instance
}
}
}
@@ -1,22 +1,22 @@
package de.mm20.launcher2.search
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.ViewModel
import de.mm20.launcher2.search.data.Websearch
class WebsearchViewModel(app:Application): AndroidViewModel(app) {
class WebsearchViewModel(
private val websearchRepository: WebsearchRepository
): ViewModel() {
private val repository = WebsearchRepository.getInstance(app)
fun insertWebsearch(websearch: Websearch) {
return repository.insertWebsearch(websearch)
return websearchRepository.insertWebsearch(websearch)
}
fun deleteWebsearch(websearch: Websearch) {
repository.deleteWebsearch(websearch)
websearchRepository.deleteWebsearch(websearch)
}
val websearches = repository.websearches
val allWebsearches = repository.allWebsearches
val websearches = websearchRepository.websearches
val allWebsearches = websearchRepository.allWebsearches
}