diff --git a/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/EmptyClientListener.kt b/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/EmptyClientListener.kt deleted file mode 100644 index 4ba1330..0000000 --- a/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/EmptyClientListener.kt +++ /dev/null @@ -1,12 +0,0 @@ -package dev.garousi.stockwatcher.feature.watchlist.data - -import com.lightstreamer.client.ClientListener -import com.lightstreamer.client.LightstreamerClient - -object EmptyClientListener : ClientListener { - override fun onListenStart(client: LightstreamerClient) = Unit - override fun onListenEnd(client: LightstreamerClient) = Unit - override fun onServerError(errorCode: Int, errorMessage: String) = Unit - override fun onStatusChange(status: String) = Unit - override fun onPropertyChange(property: String) = Unit -} diff --git a/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/LightStreamerService.kt b/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/LightStreamerService.kt deleted file mode 100644 index aa3d9ba..0000000 --- a/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/LightStreamerService.kt +++ /dev/null @@ -1,12 +0,0 @@ -package dev.garousi.stockwatcher.feature.watchlist.data - -import com.lightstreamer.client.ItemUpdate -import kotlinx.coroutines.flow.StateFlow - -interface LightStreamerService { - val flow: StateFlow - fun subscribe(vararg params: Any): LightStreamerService - fun unsubscribe() - fun observeSubscriptionUpdates() - fun setFieldsToDto(itemUpdate: ItemUpdate) -} diff --git a/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/StockListDto.kt b/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/StockListDto.kt index a1dd754..53de717 100644 --- a/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/StockListDto.kt +++ b/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/StockListDto.kt @@ -16,5 +16,5 @@ data class StockListDto( val min: Double? = null, val max: Double? = null, val ref: Double? = null, - val open: Double? = null, + val open: Double? = null ) diff --git a/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/StockListLightStreamerService.kt b/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/StockListLightStreamerService.kt index e1b702b..8bbe299 100644 --- a/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/StockListLightStreamerService.kt +++ b/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/StockListLightStreamerService.kt @@ -4,9 +4,11 @@ import android.util.Log import com.lightstreamer.client.ItemUpdate import com.lightstreamer.client.Subscription import com.lightstreamer.client.SubscriptionListener +import garousi.dev.lightstreamer.connection.LightStreamerConnection +import garousi.dev.lightstreamer.models.SubscriptionMode +import garousi.dev.lightstreamer.service.LightStreamerService import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -16,15 +18,18 @@ import javax.inject.Inject class StockListLightStreamerService @Inject constructor( private val connection: LightStreamerConnection, + private val externalScope: CoroutineScope ) : LightStreamerService { - private val scope = CoroutineScope(SupervisorJob()) private var dto = StockListDto() - private val _flow: MutableStateFlow = MutableStateFlow(StockListDto()) - override val flow = _flow.asStateFlow() + private val _stockListStream: MutableStateFlow = MutableStateFlow(StockListDto()) + override val stream = _stockListStream.asStateFlow() init { - connection.connect(serverAddress = serverAddress, adapterSet = adapterSet) + connection.connect( + serverAddress = serverAddress, + adapterSet = adapterSet + ) } companion object { @@ -152,13 +157,13 @@ class StockListLightStreamerService @Inject constructor( ref = ref, open = open, ) - scope.launch(Dispatchers.IO) { - _flow.emit(dto) + externalScope.launch(Dispatchers.IO) { + _stockListStream.emit(dto) } } override fun unsubscribe() { connection.unsubscribe() - scope.cancel() + externalScope.cancel() } } diff --git a/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/SubscriptionMode.kt b/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/SubscriptionMode.kt deleted file mode 100644 index ce6e560..0000000 --- a/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/data/SubscriptionMode.kt +++ /dev/null @@ -1,7 +0,0 @@ -@file:Suppress("UnusedPrivateMember") -package dev.garousi.stockwatcher.feature.watchlist.data - -enum class SubscriptionMode { - Merge, - Command, -} diff --git a/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/di/LightStreamerModule.kt b/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/di/LightStreamerModule.kt index 47af65d..b44e9b6 100644 --- a/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/di/LightStreamerModule.kt +++ b/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/di/LightStreamerModule.kt @@ -6,8 +6,8 @@ import dagger.Binds import dagger.Module import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import dev.garousi.stockwatcher.feature.watchlist.data.LightStreamerConnection -import dev.garousi.stockwatcher.feature.watchlist.data.LightStreamerConnectionImpl +import garousi.dev.lightstreamer.connection.DefaultLightStreamerConnection +import garousi.dev.lightstreamer.connection.LightStreamerConnection import javax.inject.Singleton @Module @@ -15,5 +15,5 @@ import javax.inject.Singleton abstract class LightStreamerModule { @Binds @Singleton - abstract fun bindsLightStreamerService(impl: LightStreamerConnectionImpl): LightStreamerConnection + abstract fun bindsLightStreamerService(impl: DefaultLightStreamerConnection): LightStreamerConnection } diff --git a/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/di/WatchlistListModule.kt b/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/di/WatchlistListModule.kt index 5a044b0..5c7831e 100644 --- a/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/di/WatchlistListModule.kt +++ b/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/di/WatchlistListModule.kt @@ -1,37 +1,20 @@ package dev.garousi.stockwatcher.feature.watchlist.di +import dagger.Binds import dagger.Module -import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import dev.garousi.stockwatcher.feature.watchlist.data.LightStreamerConnection -import dev.garousi.stockwatcher.feature.watchlist.data.LightStreamerService import dev.garousi.stockwatcher.feature.watchlist.data.StockListDto import dev.garousi.stockwatcher.feature.watchlist.data.StockListLightStreamerService +import garousi.dev.lightstreamer.service.LightStreamerService import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -object WatchlistListModule { -// @Provides -// fun provideGetStockListUseCase( -// repository: StockRepository -// ): GetStockListUseCase { -// return GetStockListUseCase(repository) -// } -// -// @Provides -// fun provideStockListUseCases( -// getStockListUseCase: GetStockListUseCase -// ): StockListUseCases { -// return StockListUseCases(getStockList = getStockListUseCase) -// } - - @Provides +interface WatchlistListModule { + @Binds @Singleton - fun provideStockListLightStreamerService( - connection: LightStreamerConnection, - ): LightStreamerService { - return StockListLightStreamerService(connection = connection) - } + fun bindsStockListLightStreamerService( + impl: StockListLightStreamerService + ): LightStreamerService } diff --git a/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/presentation/WatchlistViewModel.kt b/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/presentation/WatchlistViewModel.kt index 16adeca..4ab0955 100644 --- a/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/presentation/WatchlistViewModel.kt +++ b/app/src/main/java/dev/garousi/stockwatcher/feature/watchlist/presentation/WatchlistViewModel.kt @@ -1,19 +1,17 @@ @file:Suppress("CyclomaticComplexMethod") + package dev.garousi.stockwatcher.feature.watchlist.presentation -import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import dev.garousi.stockwatcher.feature.watchlist.data.LightStreamerService import dev.garousi.stockwatcher.feature.watchlist.data.StockListDto +import garousi.dev.lightstreamer.service.LightStreamerService import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.catch -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel @@ -30,41 +28,34 @@ class WatchlistViewModel @Inject constructor( } private fun subscribeToDemoAdapterSet() { - stockListLightStreamerService - .subscribe() - .flow - .map { stock -> - _uiState.update { it.copy(isLoading = false) } - stock.itemPos?.let { updatedItemIndex -> - _uiState.update { - it.copy( - stocks = it.stocks.toMutableList().apply { - this[updatedItemIndex - 1] = this[updatedItemIndex - 1].copy( - name = stock.name ?: it.stocks[updatedItemIndex].name, - last = stock.last ?: it.stocks[updatedItemIndex].last, - time = stock.time ?: it.stocks[updatedItemIndex].time, - change = stock.change ?: it.stocks[updatedItemIndex].change, - bidSize = stock.bidSize ?: it.stocks[updatedItemIndex].bidSize, - bid = stock.bid ?: it.stocks[updatedItemIndex].bid, - ask = stock.ask ?: it.stocks[updatedItemIndex].ask, - askSize = stock.askSize ?: it.stocks[updatedItemIndex].askSize, - min = stock.min ?: it.stocks[updatedItemIndex].min, - max = stock.max ?: it.stocks[updatedItemIndex].max, - ref = stock.ref ?: it.stocks[updatedItemIndex].ref, - open = stock.open ?: it.stocks[updatedItemIndex].open, - ) - }, - ) + viewModelScope.launch { + stockListLightStreamerService + .subscribe() + .stream + .collectLatest { stock -> + stock.itemPos?.let { updatedItemIndex -> + _uiState.update { + it.copy( + stocks = it.stocks.toMutableList().apply { + this[updatedItemIndex - 1] = this[updatedItemIndex - 1].copy( + name = stock.name ?: it.stocks[updatedItemIndex].name, + last = stock.last ?: it.stocks[updatedItemIndex].last, + time = stock.time ?: it.stocks[updatedItemIndex].time, + change = stock.change ?: it.stocks[updatedItemIndex].change, + bidSize = stock.bidSize ?: it.stocks[updatedItemIndex].bidSize, + bid = stock.bid ?: it.stocks[updatedItemIndex].bid, + ask = stock.ask ?: it.stocks[updatedItemIndex].ask, + askSize = stock.askSize ?: it.stocks[updatedItemIndex].askSize, + min = stock.min ?: it.stocks[updatedItemIndex].min, + max = stock.max ?: it.stocks[updatedItemIndex].max, + ref = stock.ref ?: it.stocks[updatedItemIndex].ref, + open = stock.open ?: it.stocks[updatedItemIndex].open, + ) + } + ) + } } } - } - .catch { cause: Throwable -> - Log.i("LOGGER", "" + cause.localizedMessage.orEmpty()) - } - .stateIn( - scope = viewModelScope, - initialValue = StockListDto(), - started = SharingStarted.Eagerly, - ) + } } } diff --git a/core/network/light-streamer/src/main/java/garousi/dev/light_streamer/connection/DefaultLightStreamerConnection.kt b/core/network/light-streamer/src/main/java/garousi/dev/lightstreamer/connection/DefaultLightStreamerConnection.kt similarity index 95% rename from core/network/light-streamer/src/main/java/garousi/dev/light_streamer/connection/DefaultLightStreamerConnection.kt rename to core/network/light-streamer/src/main/java/garousi/dev/lightstreamer/connection/DefaultLightStreamerConnection.kt index 782a0a8..fb2edde 100644 --- a/core/network/light-streamer/src/main/java/garousi/dev/light_streamer/connection/DefaultLightStreamerConnection.kt +++ b/core/network/light-streamer/src/main/java/garousi/dev/lightstreamer/connection/DefaultLightStreamerConnection.kt @@ -1,12 +1,12 @@ -package garousi.dev.light_streamer.connection +package garousi.dev.lightstreamer.connection import android.util.Log import com.lightstreamer.client.ClientListener import com.lightstreamer.client.LightstreamerClient import com.lightstreamer.client.Subscription import com.lightstreamer.client.SubscriptionListener -import garousi.dev.light_streamer.listeners.EmptyClientListener -import garousi.dev.light_streamer.models.SubscriptionMode +import garousi.dev.lightstreamer.listeners.EmptyClientListener +import garousi.dev.lightstreamer.models.SubscriptionMode class DefaultLightStreamerConnection : LightStreamerConnection { override var lsClient: LightstreamerClient? = null @@ -117,4 +117,4 @@ class DefaultLightStreamerConnection : LightStreamerConnection { ) { subscription = Subscription(subscriptionMode.name, itemName, fieldNames) } -} \ No newline at end of file +} diff --git a/core/network/light-streamer/src/main/java/garousi/dev/light_streamer/connection/LightStreamerConnection.kt b/core/network/light-streamer/src/main/java/garousi/dev/lightstreamer/connection/LightStreamerConnection.kt similarity index 93% rename from core/network/light-streamer/src/main/java/garousi/dev/light_streamer/connection/LightStreamerConnection.kt rename to core/network/light-streamer/src/main/java/garousi/dev/lightstreamer/connection/LightStreamerConnection.kt index 3323ebb..4bf4c74 100644 --- a/core/network/light-streamer/src/main/java/garousi/dev/light_streamer/connection/LightStreamerConnection.kt +++ b/core/network/light-streamer/src/main/java/garousi/dev/lightstreamer/connection/LightStreamerConnection.kt @@ -1,9 +1,9 @@ -package garousi.dev.light_streamer.connection +package garousi.dev.lightstreamer.connection import com.lightstreamer.client.LightstreamerClient import com.lightstreamer.client.Subscription import com.lightstreamer.client.SubscriptionListener -import garousi.dev.light_streamer.models.SubscriptionMode +import garousi.dev.lightstreamer.models.SubscriptionMode interface LightStreamerConnection { val lsClient: LightstreamerClient? @@ -45,4 +45,4 @@ interface LightStreamerConnection { fun setRequestedSnapshot(requestedSnapshot: String?) fun setRequestedMaxFrequency(requestedMaxFrequency: String?) -} \ No newline at end of file +} diff --git a/core/network/light-streamer/src/main/java/garousi/dev/light_streamer/listeners/EmptyClientListener.kt b/core/network/light-streamer/src/main/java/garousi/dev/lightstreamer/listeners/EmptyClientListener.kt similarity index 91% rename from core/network/light-streamer/src/main/java/garousi/dev/light_streamer/listeners/EmptyClientListener.kt rename to core/network/light-streamer/src/main/java/garousi/dev/lightstreamer/listeners/EmptyClientListener.kt index 20aa2cc..5286463 100644 --- a/core/network/light-streamer/src/main/java/garousi/dev/light_streamer/listeners/EmptyClientListener.kt +++ b/core/network/light-streamer/src/main/java/garousi/dev/lightstreamer/listeners/EmptyClientListener.kt @@ -1,4 +1,4 @@ -package garousi.dev.light_streamer.listeners +package garousi.dev.lightstreamer.listeners import com.lightstreamer.client.ClientListener import com.lightstreamer.client.LightstreamerClient diff --git a/core/network/light-streamer/src/main/java/garousi/dev/light_streamer/models/SubscriptionMode.kt b/core/network/light-streamer/src/main/java/garousi/dev/lightstreamer/models/SubscriptionMode.kt similarity index 57% rename from core/network/light-streamer/src/main/java/garousi/dev/light_streamer/models/SubscriptionMode.kt rename to core/network/light-streamer/src/main/java/garousi/dev/lightstreamer/models/SubscriptionMode.kt index 6f87774..1f2e9da 100644 --- a/core/network/light-streamer/src/main/java/garousi/dev/light_streamer/models/SubscriptionMode.kt +++ b/core/network/light-streamer/src/main/java/garousi/dev/lightstreamer/models/SubscriptionMode.kt @@ -1,4 +1,4 @@ -package garousi.dev.light_streamer.models +package garousi.dev.lightstreamer.models enum class SubscriptionMode { Merge, diff --git a/core/network/light-streamer/src/main/java/garousi/dev/light_streamer/service/LightStreamerService.kt b/core/network/light-streamer/src/main/java/garousi/dev/lightstreamer/service/LightStreamerService.kt similarity index 88% rename from core/network/light-streamer/src/main/java/garousi/dev/light_streamer/service/LightStreamerService.kt rename to core/network/light-streamer/src/main/java/garousi/dev/lightstreamer/service/LightStreamerService.kt index 0db96cf..12743c7 100644 --- a/core/network/light-streamer/src/main/java/garousi/dev/light_streamer/service/LightStreamerService.kt +++ b/core/network/light-streamer/src/main/java/garousi/dev/lightstreamer/service/LightStreamerService.kt @@ -1,4 +1,4 @@ -package garousi.dev.light_streamer.service +package garousi.dev.lightstreamer.service import com.lightstreamer.client.ItemUpdate import kotlinx.coroutines.flow.StateFlow