Skip to content

Commit

Permalink
Add time periods to WatchList
Browse files Browse the repository at this point in the history
  • Loading branch information
rafaelekol committed Jan 15, 2024
1 parent 3098529 commit fcdeb9f
Show file tree
Hide file tree
Showing 14 changed files with 190 additions and 263 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ dependencies {
implementation 'com.github.horizontalsystems:ethereum-kit-android:3a02f3a'
implementation 'com.github.horizontalsystems:blockchain-fee-rate-kit-android:1d3bd49'
implementation 'com.github.horizontalsystems:binance-chain-kit-android:c1509a2'
implementation 'com.github.horizontalsystems:market-kit-android:1092d9d'
implementation 'com.github.horizontalsystems:market-kit-android:3de7e54'
implementation 'com.github.horizontalsystems:solana-kit-android:34ef394'
implementation 'com.github.horizontalsystems:tron-kit-android:5eb6395'
// Zcash SDK
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,9 @@ import io.horizontalsystems.bankwallet.modules.amount.AmountInputType
import io.horizontalsystems.bankwallet.modules.balance.BalanceSortType
import io.horizontalsystems.bankwallet.modules.balance.BalanceViewType
import io.horizontalsystems.bankwallet.modules.main.MainModule
import io.horizontalsystems.bankwallet.modules.market.MarketField
import io.horizontalsystems.bankwallet.modules.market.MarketModule
import io.horizontalsystems.bankwallet.modules.market.SortingField
import io.horizontalsystems.bankwallet.modules.market.Value
import io.horizontalsystems.bankwallet.modules.market.favorites.MarketFavoritesModule.Period
import io.horizontalsystems.bankwallet.modules.settings.appearance.AppIcon
import io.horizontalsystems.bankwallet.modules.settings.security.autolock.AutoLockInterval
import io.horizontalsystems.bankwallet.modules.settings.security.tor.TorStatus
Expand Down Expand Up @@ -108,8 +107,8 @@ interface ILocalStorage {
var launchPage: LaunchPage?
var appIcon: AppIcon?
var mainTab: MainModule.MainNavigation?
var marketFavoritesSortingField: SortingField?
var marketFavoritesMarketField: MarketField?
var marketFavoritesSortDescending: Boolean
var marketFavoritesPeriod: Period?
var relaunchBySettingChange: Boolean
var marketsTabEnabled: Boolean
val marketsTabEnabledFlow: StateFlow<Boolean>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,8 @@ import io.horizontalsystems.bankwallet.modules.amount.AmountInputType
import io.horizontalsystems.bankwallet.modules.balance.BalanceSortType
import io.horizontalsystems.bankwallet.modules.balance.BalanceViewType
import io.horizontalsystems.bankwallet.modules.main.MainModule
import io.horizontalsystems.bankwallet.modules.market.MarketField
import io.horizontalsystems.bankwallet.modules.market.MarketModule
import io.horizontalsystems.bankwallet.modules.market.SortingField
import io.horizontalsystems.bankwallet.modules.market.favorites.MarketFavoritesModule.Period
import io.horizontalsystems.bankwallet.modules.settings.appearance.AppIcon
import io.horizontalsystems.bankwallet.modules.settings.security.autolock.AutoLockInterval
import io.horizontalsystems.bankwallet.modules.theme.ThemeType
Expand Down Expand Up @@ -70,8 +69,8 @@ class LocalStorageManager(
private val LAUNCH_PAGE = "launch_page"
private val APP_ICON = "app_icon"
private val MAIN_TAB = "main_tab"
private val MARKET_FAVORITES_SORTING_FIELD = "market_favorites_sorting_field"
private val MARKET_FAVORITES_MARKET_FIELD = "market_favorites_market_field"
private val MARKET_FAVORITES_SORT_DESCENDING = "market_favorites_sort_descending"
private val MARKET_FAVORITES_TIME_DURATION = "market_favorites_time_duration"
private val RELAUNCH_BY_SETTING_CHANGE = "relaunch_by_setting_change"
private val MARKETS_TAB_ENABLED = "markets_tab_enabled"
private val BALANCE_AUTO_HIDE_ENABLED = "balance_auto_hide_enabled"
Expand Down Expand Up @@ -429,20 +428,18 @@ class LocalStorageManager(
preferences.edit().putString(MAIN_TAB, value?.name).apply()
}

override var marketFavoritesSortingField: SortingField?
get() = preferences.getString(MARKET_FAVORITES_SORTING_FIELD, null)?.let {
SortingField.fromString(it)
}
override var marketFavoritesSortDescending: Boolean
get() = preferences.getBoolean(MARKET_FAVORITES_SORT_DESCENDING, true)
set(value) {
preferences.edit().putString(MARKET_FAVORITES_SORTING_FIELD, value?.name).apply()
preferences.edit().putBoolean(MARKET_FAVORITES_SORT_DESCENDING, value).apply()
}

override var marketFavoritesMarketField: MarketField?
get() = preferences.getString(MARKET_FAVORITES_MARKET_FIELD, null)?.let {
MarketField.fromString(it)
override var marketFavoritesPeriod: Period?
get() = preferences.getString(MARKET_FAVORITES_TIME_DURATION, null)?.let {
Period.valueOf(it)
}
set(value) {
preferences.edit().putString(MARKET_FAVORITES_MARKET_FIELD, value?.name).apply()
preferences.edit().putString(MARKET_FAVORITES_TIME_DURATION, value?.name).apply()
}

override var relaunchBySettingChange: Boolean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import io.horizontalsystems.bankwallet.R
import io.horizontalsystems.bankwallet.core.App
import io.horizontalsystems.bankwallet.entities.Currency
import io.horizontalsystems.bankwallet.entities.CurrencyValue
import io.horizontalsystems.bankwallet.modules.market.favorites.MarketFavoritesModule.Period
import io.horizontalsystems.bankwallet.modules.market.filters.TimePeriod
import io.horizontalsystems.bankwallet.ui.compose.TranslatableString
import io.horizontalsystems.bankwallet.ui.compose.WithTranslatableTitle
Expand Down Expand Up @@ -67,6 +68,21 @@ data class MarketItem(
val rank: Int?
) {
companion object {
fun createFromCoinMarket(
marketInfo: MarketInfo,
currency: Currency,
period: Period,
): MarketItem {
return MarketItem(
fullCoin = marketInfo.fullCoin,
volume = CurrencyValue(currency, marketInfo.totalVolume ?: BigDecimal.ZERO),
rate = CurrencyValue(currency, marketInfo.price ?: BigDecimal.ZERO),
diff = marketInfo.priceChangeValue(period),
marketCap = CurrencyValue(currency, marketInfo.marketCap ?: BigDecimal.ZERO),
rank = marketInfo.marketCapRank
)
}

fun createFromCoinMarket(
marketInfo: MarketInfo,
currency: Currency,
Expand Down Expand Up @@ -183,6 +199,12 @@ fun MarketInfo.priceChangeValue(period: TimePeriod) = when (period) {
TimePeriod.TimePeriod_1Y -> priceChange1y
}

fun MarketInfo.priceChangeValue(period: Period) = when (period) {
Period.OneDay -> priceChange24h
Period.SevenDay -> priceChange7d
Period.ThirtyDay -> priceChange30d
}

@Parcelize
enum class TimeDuration(val titleResId: Int) : WithTranslatableTitle, Parcelable {
OneDay(R.string.CoinPage_TimeDuration_Day),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,22 @@ data class MarketViewItem(
}

companion object {
fun create(
marketItem: MarketItem,
favorited: Boolean = false
): MarketViewItem {
return MarketViewItem(
marketItem.fullCoin,
App.numberFormatter.formatFiatFull(
marketItem.rate.value,
marketItem.rate.currency.symbol
),
MarketDataValue.Diff(marketItem.diff),
marketItem.rank?.toString(),
favorited
)
}

fun create(
marketItem: MarketItem,
marketField: MarketField,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
package io.horizontalsystems.bankwallet.modules.market.favorites

import io.horizontalsystems.bankwallet.core.ILocalStorage
import io.horizontalsystems.bankwallet.modules.market.MarketField
import io.horizontalsystems.bankwallet.modules.market.SortingField
import io.horizontalsystems.bankwallet.modules.market.favorites.MarketFavoritesModule.Period
import io.horizontalsystems.bankwallet.widgets.MarketWidgetManager

class MarketFavoritesMenuService(
private val localStorage: ILocalStorage,
private val marketWidgetManager: MarketWidgetManager
) {

var sortingField: SortingField
get() = localStorage.marketFavoritesSortingField ?: SortingField.HighestCap
var sortDescending: Boolean
get() = localStorage.marketFavoritesSortDescending
set(value) {
localStorage.marketFavoritesSortingField = value
localStorage.marketFavoritesSortDescending = value
marketWidgetManager.updateWatchListWidgets()
}

var marketField: MarketField
get() = localStorage.marketFavoritesMarketField ?: MarketField.PriceDiff
var period: Period
get() = localStorage.marketFavoritesPeriod ?: Period.OneDay
set(value) {
localStorage.marketFavoritesMarketField = value
localStorage.marketFavoritesPeriod = value
marketWidgetManager.updateWatchListWidgets()
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package io.horizontalsystems.bankwallet.modules.market.favorites

import android.os.Parcelable
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import io.horizontalsystems.bankwallet.R
import io.horizontalsystems.bankwallet.core.App
import io.horizontalsystems.bankwallet.modules.market.MarketField
import io.horizontalsystems.bankwallet.modules.market.MarketViewItem
import io.horizontalsystems.bankwallet.modules.market.SortingField
import io.horizontalsystems.bankwallet.ui.compose.Select
import io.horizontalsystems.bankwallet.ui.compose.TranslatableString
import io.horizontalsystems.bankwallet.ui.compose.WithTranslatableTitle
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
import javax.annotation.concurrent.Immutable

object MarketFavoritesModule {
Expand All @@ -17,19 +21,24 @@ object MarketFavoritesModule {
val repository = MarketFavoritesRepository(App.marketKit, App.marketFavoritesManager)
val menuService = MarketFavoritesMenuService(App.localStorage, App.marketWidgetManager)
val service = MarketFavoritesService(repository, menuService, App.currencyManager, App.backgroundManager)
return MarketFavoritesViewModel(service, menuService) as T
return MarketFavoritesViewModel(service) as T
}
}

@Immutable
data class ViewItem(
val sortingFieldSelect: Select<SortingField>,
val marketFieldSelect: Select<MarketField>,
val sortingDescending: Boolean,
val periodSelect: Select<Period>,
val marketItems: List<MarketViewItem>
)

sealed class SelectorDialogState {
object Closed : SelectorDialogState()
class Opened(val select: Select<SortingField>) : SelectorDialogState()
@Parcelize
enum class Period(val titleResId: Int) : WithTranslatableTitle, Parcelable {
OneDay(R.string.CoinPage_TimeDuration_Day),
SevenDay(R.string.CoinPage_TimeDuration_Week),
ThirtyDay(R.string.CoinPage_TimeDuration_Month);

@IgnoredOnParcel
override val title = TranslatableString.ResString(titleResId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,45 +5,45 @@ import io.horizontalsystems.bankwallet.core.managers.MarketKitWrapper
import io.horizontalsystems.bankwallet.entities.Currency
import io.horizontalsystems.bankwallet.modules.market.MarketItem
import io.horizontalsystems.bankwallet.modules.market.SortingField
import io.horizontalsystems.bankwallet.modules.market.favorites.MarketFavoritesModule.Period
import io.horizontalsystems.bankwallet.modules.market.sort
import io.reactivex.Single

class MarketFavoritesRepository(
private val marketKit: MarketKitWrapper,
private val manager: MarketFavoritesManager
) {
private var cache: List<MarketItem> = listOf()

val dataUpdatedObservable by manager::dataUpdatedAsync

private fun getFavorites(
forceRefresh: Boolean,
currency: Currency
): List<MarketItem> =
if (forceRefresh) {
val favoriteCoins = manager.getAll()
var marketItems = listOf<MarketItem>()
if (favoriteCoins.isNotEmpty()) {
val favoriteCoinUids = favoriteCoins.map { it.coinUid }
marketItems = marketKit.marketInfosSingle(favoriteCoinUids, currency.code, "watchlist").blockingGet()
.map { marketInfo ->
MarketItem.createFromCoinMarket(marketInfo, currency)
}
}
cache = marketItems
marketItems
} else {
cache
currency: Currency,
period: Period
): List<MarketItem> {
val favoriteCoins = manager.getAll()
var marketItems = listOf<MarketItem>()
if (favoriteCoins.isNotEmpty()) {
val favoriteCoinUids = favoriteCoins.map { it.coinUid }
marketItems = marketKit.marketInfosSingle(favoriteCoinUids, currency.code, "watchlist").blockingGet()
.map { marketInfo ->
MarketItem.createFromCoinMarket(
marketInfo = marketInfo,
currency = currency,
period = period
)
}
}
return marketItems
}

fun get(
sortingField: SortingField,
sortDescending: Boolean,
period: Period,
currency: Currency,
forceRefresh: Boolean
): Single<List<MarketItem>> =
Single.create { emitter ->
val sortingField = if (sortDescending) SortingField.TopGainers else SortingField.TopLosers
try {
val marketItems = getFavorites(forceRefresh, currency)
val marketItems = getFavorites(currency, period)
emitter.onSuccess(
marketItems.sort(sortingField)
)
Expand Down
Loading

0 comments on commit fcdeb9f

Please sign in to comment.