Use dependency injection for most singletons
This commit is contained in:
@@ -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
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user