Skip to content

Commit

Permalink
Intermediate Full transaction data provider selector (#398)
Browse files Browse the repository at this point in the history
  • Loading branch information
tmedetbekov committed Jan 18, 2019
1 parent f5f509e commit 4fa655b
Show file tree
Hide file tree
Showing 28 changed files with 714 additions and 157 deletions.
6 changes: 5 additions & 1 deletion app/src/main/AndroidManifest.xml
Expand Up @@ -45,6 +45,10 @@
android:name="io.horizontalsystems.bankwallet.modules.fulltransactioninfo.FullTransactionInfoActivity"
android:screenOrientation="portrait"/>

<activity
android:name="io.horizontalsystems.bankwallet.modules.fulltransactioninfo.dataprovider.DataProviderSettingsActivity"
android:screenOrientation="portrait"/>

<activity
android:name="io.horizontalsystems.bankwallet.modules.settings.language.LanguageSettingsActivity"
android:screenOrientation="portrait"/>
Expand Down Expand Up @@ -73,4 +77,4 @@

</application>

</manifest>
</manifest>
8 changes: 3 additions & 5 deletions app/src/main/java/io/horizontalsystems/bankwallet/core/App.kt
Expand Up @@ -12,8 +12,6 @@ import io.horizontalsystems.bankwallet.core.storage.AppDatabase
import io.horizontalsystems.bankwallet.core.storage.RatesRepository
import io.horizontalsystems.bankwallet.core.storage.TransactionRepository
import io.horizontalsystems.bankwallet.modules.fulltransactioninfo.FullTransactionInfoFactory
import io.horizontalsystems.bankwallet.modules.fulltransactioninfo.FullTransactionInfoModule
import io.horizontalsystems.bankwallet.modules.fulltransactioninfo.providers.ProvidersMap
import io.horizontalsystems.bitcoinkit.BitcoinKit
import io.horizontalsystems.ethereumkit.EthereumKit
import java.util.*
Expand Down Expand Up @@ -50,7 +48,7 @@ class App : Application() {
lateinit var transactionStorage: ITransactionRecordStorage
lateinit var rateStorage: IRateStorage
lateinit var transactionInfoFactory: FullTransactionInfoFactory
lateinit var transactionProviderMap: FullTransactionInfoModule.ProvidersMap
lateinit var transactionDataProviderManager: TransactionDataProviderManager
lateinit var appCloseManager: AppCloseManager

val testMode = true
Expand Down Expand Up @@ -112,8 +110,8 @@ class App : Application() {

transactionRateSyncer = TransactionRateSyncer(transactionStorage, networkManager)
transactionManager = TransactionManager(transactionStorage, transactionRateSyncer, walletManager, currencyManager, wordsManager, networkAvailabilityManager)
transactionProviderMap = ProvidersMap()
transactionInfoFactory = FullTransactionInfoFactory(networkManager, appConfigProvider, transactionProviderMap)
transactionDataProviderManager = TransactionDataProviderManager(localStorage)
transactionInfoFactory = FullTransactionInfoFactory(networkManager, appConfigProvider, transactionDataProviderManager)

authManager.walletManager = walletManager
authManager.pinManager = pinManager
Expand Down
Expand Up @@ -4,6 +4,7 @@ import android.support.v4.hardware.fingerprint.FingerprintManagerCompat
import com.google.gson.JsonObject
import io.horizontalsystems.bankwallet.entities.*
import io.horizontalsystems.bankwallet.entities.Currency
import io.horizontalsystems.bankwallet.modules.fulltransactioninfo.FullTransactionInfoModule
import io.horizontalsystems.bankwallet.modules.transactions.CoinCode
import io.reactivex.Flowable
import io.reactivex.Maybe
Expand All @@ -29,10 +30,13 @@ interface ILocalStorage {
var iUnderstand: Boolean
var baseCurrencyCode: String?
var blockTillDate: Long?
fun clearAll()
var isNewWallet: Boolean
var failedAttempts: Int?
var lockoutUptime: Long?
var baseBitcoinProvider: String?
var baseEthereumProvider: String?

fun clearAll()
}

interface ISecuredStorage {
Expand Down Expand Up @@ -73,6 +77,18 @@ interface ICurrencyManager {
fun setBaseCurrency(code: String)
}

interface ITransactionDataProviderManager {
val baseProviderUpdatedSignal: Observable<Unit>

fun providers(coinCode: CoinCode): List<FullTransactionInfoModule.Provider>
fun baseProvider(coinCode: CoinCode): FullTransactionInfoModule.Provider
fun setBaseProvider(name: String, coinCode: CoinCode)

fun bitcoin(name: String): FullTransactionInfoModule.BitcoinForksProvider
fun bitcoinCash(name: String): FullTransactionInfoModule.BitcoinForksProvider
fun ethereum(name: String): FullTransactionInfoModule.EthereumForksProvider
}

interface IKeyStoreSafeExecute {
fun safeExecute(action: Runnable, onSuccess: Runnable? = null, onFailure: Runnable? = null)
}
Expand Down
Expand Up @@ -16,7 +16,8 @@ class LocalStorageManager : ILocalStorage {
private val NEW_WALLET = "new_wallet"
private val FAILED_ATTEMPTS = "failed_attempts"
private val LOCKOUT_TIMESTAMP = "lockout_timestamp"

private val BASE_BITCOIN_PROVIDER = "base_bitcoin_provider"
private val BASE_ETHEREUM_PROVIDER = "base_ethereum_provider"

override var currentLanguage: String?
get() = App.preferences.getString(CURRENT_LANGUAGE, null)
Expand Down Expand Up @@ -67,10 +68,6 @@ class LocalStorageManager : ILocalStorage {
}
}

override fun clearAll() {
App.preferences.edit().clear().apply()
}

override var isNewWallet: Boolean
get() = App.preferences.getBoolean(NEW_WALLET, false)
set(value) {
Expand Down Expand Up @@ -104,4 +101,21 @@ class LocalStorageManager : ILocalStorage {
App.preferences.edit().putLong(LOCKOUT_TIMESTAMP, it).apply()
} ?: App.preferences.edit().remove(LOCKOUT_TIMESTAMP).apply()
}

override var baseBitcoinProvider: String?
get() = App.preferences.getString(BASE_BITCOIN_PROVIDER, null)
set(value) {
App.preferences.edit().putString(BASE_BITCOIN_PROVIDER, value).apply()
}

override var baseEthereumProvider: String?
get() = App.preferences.getString(BASE_ETHEREUM_PROVIDER, null)
set(value) {
App.preferences.edit().putString(BASE_ETHEREUM_PROVIDER, value).apply()
}

override fun clearAll() {
App.preferences.edit().clear().apply()
}

}
@@ -0,0 +1,82 @@
package io.horizontalsystems.bankwallet.core.managers

import io.horizontalsystems.bankwallet.core.ILocalStorage
import io.horizontalsystems.bankwallet.core.ITransactionDataProviderManager
import io.horizontalsystems.bankwallet.modules.fulltransactioninfo.FullTransactionInfoModule
import io.horizontalsystems.bankwallet.modules.fulltransactioninfo.providers.*
import io.horizontalsystems.bankwallet.modules.transactions.CoinCode
import io.reactivex.subjects.PublishSubject

class TransactionDataProviderManager(val localStorage: ILocalStorage) : ITransactionDataProviderManager {

override val baseProviderUpdatedSignal = PublishSubject.create<Unit>()

//
// For interactor
//
override fun providers(coinCode: CoinCode): List<FullTransactionInfoModule.Provider> {
return when {
coinCode.contains("BTC") -> bitcoinProviders
coinCode.contains("BCH") -> bitcoinCashProviders
else -> ethereumProviders
}
}

override fun baseProvider(coinCode: CoinCode): FullTransactionInfoModule.Provider {
if (coinCode.contains("ETH")) {
return ethereum(localStorage.baseEthereumProvider ?: ethereumProviders[0].name)
}

return bitcoin(localStorage.baseBitcoinProvider ?: bitcoinProviders[0].name)
}

override fun setBaseProvider(name: String, coinCode: CoinCode) {
if (coinCode.contains("ETH")) {
localStorage.baseEthereumProvider = name
} else {
localStorage.baseBitcoinProvider = name
}

baseProviderUpdatedSignal.onNext(Unit)
}

//
// Providers
//
override fun bitcoin(name: String): FullTransactionInfoModule.BitcoinForksProvider {
return bitcoinProviders.find { it.name == name }
?: HorsysBitcoinProvider(testMode = false)
}

override fun bitcoinCash(name: String): FullTransactionInfoModule.BitcoinForksProvider {
return bitcoinCashProviders.find { it.name == name }
?: HorsysBitcoinCashProvider(testMode = false)
}

override fun ethereum(name: String): FullTransactionInfoModule.EthereumForksProvider {
return ethereumProviders.find { it.name == name }
?: HorsysEthereumProvider(testMode = false)
}

companion object {
val bitcoinProviders = arrayListOf(
HorsysBitcoinProvider(testMode = false),
BlockChairBitcoinProvider(),
BlockExplorerBitcoinProvider(),
BtcComBitcoinProvider()
)

val bitcoinCashProviders = arrayListOf(
HorsysBitcoinCashProvider(testMode = false),
BlockChairBitcoinCashProvider(),
BlockExplorerBitcoinCashProvider(),
BtcComBitcoinCashProvider()
)

val ethereumProviders = arrayListOf(
HorsysEthereumProvider(testMode = false),
EtherscanEthereumProvider(),
BlockChairEthereumProvider()
)
}
}
Expand Up @@ -14,8 +14,10 @@ import android.view.ViewGroup
import io.horizontalsystems.bankwallet.BaseActivity
import io.horizontalsystems.bankwallet.R
import io.horizontalsystems.bankwallet.entities.FullTransactionItem
import io.horizontalsystems.bankwallet.modules.fulltransactioninfo.dataprovider.DataProviderSettingsModule
import io.horizontalsystems.bankwallet.modules.transactions.CoinCode
import io.horizontalsystems.bankwallet.viewHelpers.HudHelper
import io.horizontalsystems.bankwallet.viewHelpers.LayoutHelper
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.activity_full_transaction_info.*
import kotlinx.android.synthetic.main.view_holder_full_transaction.*
Expand All @@ -31,10 +33,10 @@ class FullTransactionInfoActivity : BaseActivity(), FullTransactionInfoErrorFrag
super.onCreate(savedInstanceState)

val transactionHash = intent.extras.getString(transactionHashKey)
val coinCode = intent.extras.getString(coinCodeKey)
val coinCodeString = intent.extras.getString(coinCodeKey)

viewModel = ViewModelProviders.of(this).get(FullTransactionInfoViewModel::class.java)
viewModel.init(transactionHash, coinCode)
viewModel.init(transactionHash, coinCodeString)

setContentView(R.layout.activity_full_transaction_info)

Expand All @@ -52,22 +54,34 @@ class FullTransactionInfoActivity : BaseActivity(), FullTransactionInfoErrorFrag
transactionRecordAdapter.notifyDataSetChanged()
})

viewModel.loadingLiveData.observe(this, Observer { show ->
progressLoading.visibility = if (show == true) View.VISIBLE else View.INVISIBLE
viewModel.loadingLiveData.observe(this, Observer { coinCode ->
if (coinCode == true) {
progressLoading.visibility = View.VISIBLE
recyclerTransactionInfo.visibility = View.INVISIBLE
transactionRecordAdapter.notifyDataSetChanged()
} else {
progressLoading.visibility = View.INVISIBLE
}
})

viewModel.showCopiedLiveEvent.observe(this, Observer {
HudHelper.showSuccessMessage(R.string.Hud_Text_Copied)
})

viewModel.openLinkLiveEvent.observe(this, Observer { url ->
url?.let {
viewModel.openLinkLiveEvent.observe(this, Observer { coinCode ->
coinCode?.let {
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse(url)
intent.data = Uri.parse(coinCode)
startActivity(intent)
}
})

viewModel.openProviderSettingsEvent.observe(this, Observer { coinCode ->
coinCode?.let {
DataProviderSettingsModule.start(this, coinCode)
}
})

viewModel.showErrorLiveEvent.observe(this, Observer { error ->
error?.let { (show, providerName) ->
if (show && providerName != null) {
Expand Down Expand Up @@ -153,7 +167,9 @@ class SectionViewAdapter(val context: Context) : RecyclerView.Adapter<RecyclerVi
viewModel.delegate.getSection(position)?.let { section ->
if (section.translationId == null) {
holder.sectionLabel.setPadding(0, 0, 0, 0)
holder.sectionLabel.text = null
} else {
holder.sectionLabel.setPadding(LayoutHelper.dp(16f, context), LayoutHelper.dp(16f, context), LayoutHelper.dp(16f, context), LayoutHelper.dp(5f, context))
holder.sectionLabel.text = context.getString(section.translationId)
}

Expand All @@ -168,7 +184,7 @@ class SectionViewAdapter(val context: Context) : RecyclerView.Adapter<RecyclerVi
is SectionProviderViewHolder -> {
holder.sectionProvider.bind(title = viewModel.delegate.providerName)
holder.sectionProvider.setOnClickListener {
viewModel.delegate.onTapResource()
viewModel.delegate.onTapProvider()
}
}
}
Expand Down
Expand Up @@ -2,16 +2,17 @@ package io.horizontalsystems.bankwallet.modules.fulltransactioninfo

import io.horizontalsystems.bankwallet.core.IAppConfigProvider
import io.horizontalsystems.bankwallet.core.INetworkManager
import io.horizontalsystems.bankwallet.core.ITransactionDataProviderManager
import io.horizontalsystems.bankwallet.modules.fulltransactioninfo.providers.HorsysBitcoinCashProvider
import io.horizontalsystems.bankwallet.modules.fulltransactioninfo.providers.HorsysBitcoinProvider
import io.horizontalsystems.bankwallet.modules.fulltransactioninfo.providers.HorsysEthereumProvider
import io.horizontalsystems.bankwallet.modules.transactions.CoinCode

class FullTransactionInfoFactory(private val networkManager: INetworkManager, private val appConfig: IAppConfigProvider, private val providerMap: FullTransactionInfoModule.ProvidersMap)
class FullTransactionInfoFactory(private val networkManager: INetworkManager, private val appConfig: IAppConfigProvider, private val dataProviderManager: ITransactionDataProviderManager)
: FullTransactionInfoModule.ProviderFactory {

override fun providerFor(coinCode: CoinCode): FullTransactionInfoModule.FullProvider {
val providerName = "HorizontalSystems.xyz"
val providerName = dataProviderManager.baseProvider(coinCode).name

val provider: FullTransactionInfoModule.Provider
val adapter: FullTransactionInfoModule.Adapter
Expand All @@ -22,7 +23,7 @@ class FullTransactionInfoFactory(private val networkManager: INetworkManager, pr
val providerBTC = if (appConfig.testMode)
HorsysBitcoinProvider(testMode = true)
else
providerMap.bitcoin(providerName)
dataProviderManager.bitcoin(providerName)

provider = providerBTC
adapter = FullTransactionBitcoinAdapter(providerBTC, coinCode)
Expand All @@ -32,7 +33,7 @@ class FullTransactionInfoFactory(private val networkManager: INetworkManager, pr
val providerBCH = if (appConfig.testMode)
HorsysBitcoinCashProvider(testMode = true)
else
providerMap.bitcoinCash(providerName)
dataProviderManager.bitcoinCash(providerName)

provider = providerBCH
adapter = FullTransactionBitcoinAdapter(providerBCH, coinCode)
Expand All @@ -42,7 +43,7 @@ class FullTransactionInfoFactory(private val networkManager: INetworkManager, pr
val providerETH = if (appConfig.testMode)
HorsysEthereumProvider(testMode = true)
else
providerMap.ethereum(providerName)
dataProviderManager.ethereum(providerName)

provider = providerETH
adapter = FullTransactionEthereumAdapter(providerETH, coinCode)
Expand Down

0 comments on commit 4fa655b

Please sign in to comment.