Skip to content

Commit

Permalink
Map full transaction providers by interface (#398)
Browse files Browse the repository at this point in the history
  • Loading branch information
tmedetbekov committed Jan 16, 2019
1 parent 200f256 commit 1b51562
Show file tree
Hide file tree
Showing 27 changed files with 734 additions and 656 deletions.
Expand Up @@ -12,6 +12,8 @@ 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 @@ -48,6 +50,7 @@ class App : Application() {
lateinit var transactionStorage: ITransactionRecordStorage
lateinit var rateStorage: IRateStorage
lateinit var transactionInfoFactory: FullTransactionInfoFactory
lateinit var transactionProviderMap: FullTransactionInfoModule.ProvidersMap
lateinit var appCloseManager: AppCloseManager

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

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

authManager.walletManager = walletManager
authManager.pinManager = pinManager
Expand Down
Expand Up @@ -15,5 +15,9 @@ data class FullTransactionSection(
val items: List<FullTransactionItem>
)

data class FullTransactionRecord(val sections: List<FullTransactionSection>)
data class FullTransactionRecord(
val providerName: String,
val sections: List<FullTransactionSection>
)

enum class FullTransactionIcon { HASH, PERSON }
Expand Up @@ -68,17 +68,19 @@ class FullTransactionInfoActivity : BaseActivity(), FullTransactionInfoErrorFrag
}
})

viewModel.showErrorLiveEvent.observe(this, Observer { show ->
if (show == true) {
errorContainer.visibility = View.VISIBLE

val fragment = FullTransactionInfoErrorFragment.newInstance(viewModel.delegate.providerName)
val transaction = supportFragmentManager.beginTransaction()

transaction.replace(R.id.errorContainer, fragment)
transaction.commit()
} else {
errorContainer.visibility = View.INVISIBLE
viewModel.showErrorLiveEvent.observe(this, Observer { error ->
error?.let { (show, providerName) ->
if (show && providerName != null) {
errorContainer.visibility = View.VISIBLE

val fragment = FullTransactionInfoErrorFragment.newInstance(providerName)
val transaction = supportFragmentManager.beginTransaction()

transaction.replace(R.id.errorContainer, fragment)
transaction.commit()
} else {
errorContainer.visibility = View.INVISIBLE
}
}
})

Expand Down
@@ -1,5 +1,6 @@
package io.horizontalsystems.bankwallet.modules.fulltransactioninfo

import com.google.gson.JsonObject
import io.horizontalsystems.bankwallet.R
import io.horizontalsystems.bankwallet.entities.FullTransactionIcon
import io.horizontalsystems.bankwallet.entities.FullTransactionItem
Expand All @@ -9,10 +10,11 @@ import io.horizontalsystems.bankwallet.modules.transactions.CoinCode
import io.horizontalsystems.bankwallet.viewHelpers.DateHelper
import io.horizontalsystems.bankwallet.viewHelpers.ValueFormatter

class FullTransactionBitcoinAdapter(val coinCode: CoinCode) : FullTransactionInfoModule.Adapter {
class FullTransactionBitcoinAdapter(val provider: FullTransactionInfoModule.BitcoinForksProvider, val coinCode: CoinCode)
: FullTransactionInfoModule.Adapter {

override fun convert(response: FullTransactionResponse): FullTransactionRecord? {
val data = response as BitcoinResponse
override fun convert(json: JsonObject): FullTransactionRecord {
val data = provider.convert(json)
val sections = mutableListOf<FullTransactionSection>()

sections.add(FullTransactionSection(items = listOf(
Expand All @@ -37,15 +39,16 @@ class FullTransactionBitcoinAdapter(val coinCode: CoinCode) : FullTransactionInf
FullTransactionItem(R.string.FullInfo_TotalOutput, value = "$totalOutput $coinCode")
)

data.feePerByte?.let { feePerByte ->
transactionItems.add(FullTransactionItem(R.string.FullInfo_FeePerByte, value = ValueFormatter.format(feePerByte), valueUnit = R.string.FullInfo_SatByte))
}

data.size?.let {
transactionItems.add(FullTransactionItem(R.string.FullInfo_Size, value = it.toString(), valueUnit = R.string.FullInfo_Bytes))
}

transactionItems.add(FullTransactionItem(R.string.FullInfo_Fee, value = "${ValueFormatter.format(data.fee)} $coinCode"))

data.feePerByte?.let { feePerByte ->
transactionItems.add(FullTransactionItem(R.string.FullInfo_FeeRate, value = ValueFormatter.format(feePerByte), valueUnit = R.string.FullInfo_SatByte))
}

sections.add(FullTransactionSection(items = transactionItems))

if (data.inputs.isNotEmpty()) {
Expand All @@ -62,14 +65,16 @@ class FullTransactionBitcoinAdapter(val coinCode: CoinCode) : FullTransactionInf
}))
}

return FullTransactionRecord(sections)
return FullTransactionRecord(provider.name, sections)
}

}

class FullTransactionEthereumAdapter(val coinCode: CoinCode) : FullTransactionInfoModule.Adapter {
override fun convert(response: FullTransactionResponse): FullTransactionRecord? {
val data = response as EthereumResponse
class FullTransactionEthereumAdapter(val provider: FullTransactionInfoModule.EthereumForksProvider, val coinCode: CoinCode)
: FullTransactionInfoModule.Adapter {

override fun convert(json: JsonObject): FullTransactionRecord {
val data = provider.convert(json)
val sections = mutableListOf<FullTransactionSection>()

sections.add(FullTransactionSection(items = listOf(
Expand Down Expand Up @@ -107,7 +112,7 @@ class FullTransactionEthereumAdapter(val coinCode: CoinCode) : FullTransactionIn
FullTransactionItem(R.string.FullInfoEth_To, value = data.to, clickable = true, icon = FullTransactionIcon.PERSON)
)))

return FullTransactionRecord(sections)
return FullTransactionRecord(provider.name, sections)
}

}
Expand Up @@ -2,60 +2,53 @@ package io.horizontalsystems.bankwallet.modules.fulltransactioninfo

import io.horizontalsystems.bankwallet.core.IAppConfigProvider
import io.horizontalsystems.bankwallet.core.INetworkManager
import io.horizontalsystems.bankwallet.modules.fulltransactioninfo.providers.*
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)
class FullTransactionInfoFactory(private val networkManager: INetworkManager, private val appConfig: IAppConfigProvider, private val providerMap: FullTransactionInfoModule.ProvidersMap)
: FullTransactionInfoModule.ProviderFactory {

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

val adapter: FullTransactionInfoModule.Adapter
val provider: FullTransactionInfoModule.Provider
val explorer = if (coinCode.contains("ETH"))
"BlockChair.com" else
"HorizontalSystems.xyz"


if (coinCode.contains("BTC")) {

adapter = FullTransactionBitcoinAdapter(coinCode)
provider = if (explorer == "BlockChair.com" && !appConfig.testMode) {
BlockchairBitcoinProvider(explorer, coinCode, networkManager, adapter)
} else if (explorer == "Btc.com" && !appConfig.testMode) {
BtcComProvider(explorer, coinCode, networkManager, adapter)
} else if (explorer == "BlockExplorer.com") {
BlockexplorerBitcoinProvider(explorer, coinCode, networkManager, adapter)
} else {
HorsysBitcoinProvider(explorer, coinCode, networkManager, adapter)
}

} else if (coinCode.contains("BCH")) {

adapter = FullTransactionBitcoinAdapter(coinCode)
provider = if (explorer == "BlockChair.com" && !appConfig.testMode) {
BlockchairBitcoinProvider(explorer, coinCode, networkManager, adapter)
} else if (explorer == "BlockExplorer.com" && !appConfig.testMode) {
BlockexplorerBitcoinProvider(explorer, coinCode, networkManager, adapter)
} else if (explorer == "Btc.com" && !appConfig.testMode) {
BtcComProvider(explorer, coinCode, networkManager, adapter)
} else {
HorsysBitcoinProvider(explorer, coinCode, networkManager, adapter)
}
val adapter: FullTransactionInfoModule.Adapter

} else {
when {
// BTC, BTCt
coinCode.contains("BTC") -> {
val providerBTC = if (appConfig.testMode)
HorsysBitcoinProvider(testMode = true)
else
providerMap.bitcoin(providerName)

adapter = FullTransactionEthereumAdapter(coinCode)
provider = if (explorer == "BlockChair.com" && !appConfig.testMode) {
BlockchairEthProvider(explorer, coinCode, networkManager, adapter)
} else if (explorer == "Etherscan.io") {
EtherscanProvider(explorer, coinCode, networkManager, adapter)
} else {
HorsysEthProvider(explorer, coinCode, networkManager, adapter)
provider = providerBTC
adapter = FullTransactionBitcoinAdapter(providerBTC, coinCode)
}
// BCH, BCHt
coinCode.contains("BCH") -> {
val providerBCH = if (appConfig.testMode)
HorsysBitcoinCashProvider(testMode = true)
else
providerMap.bitcoinCash(providerName)

provider = providerBCH
adapter = FullTransactionBitcoinAdapter(providerBCH, coinCode)
}
// ETH, ETHt
else -> {
val providerETH = if (appConfig.testMode)
HorsysEthereumProvider(testMode = true)
else
providerMap.ethereum(providerName)

provider = providerETH
adapter = FullTransactionEthereumAdapter(providerETH, coinCode)
}

}

return provider
return FullTransactionInfoProvider(networkManager, adapter, provider)
}
}
@@ -1,13 +1,12 @@
package io.horizontalsystems.bankwallet.modules.fulltransactioninfo

import io.horizontalsystems.bankwallet.core.IClipboardManager
import io.horizontalsystems.bankwallet.entities.FullTransactionItem
import io.horizontalsystems.bankwallet.entities.FullTransactionRecord
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.schedulers.Schedulers

class FullTransactionInfoInteractor(private val transactionProvider: FullTransactionInfoModule.Provider, private var clipboardManager: IClipboardManager)
class FullTransactionInfoInteractor(private val transactionProvider: FullTransactionInfoModule.FullProvider, private var clipboardManager: IClipboardManager)
: FullTransactionInfoModule.Interactor, FullTransactionInfoModule.ProviderDelegate {

val disposables = CompositeDisposable()
Expand All @@ -16,6 +15,10 @@ class FullTransactionInfoInteractor(private val transactionProvider: FullTransac
//
// Interactor implementations
//
override fun url(hash: String): String {
return transactionProvider.url(hash)
}

override fun retrieveTransactionInfo(transactionHash: String) {
disposables.clear()
disposables.add(transactionProvider.retrieveTransactionInfo(transactionHash)
Expand All @@ -24,24 +27,13 @@ class FullTransactionInfoInteractor(private val transactionProvider: FullTransac
.subscribe({
delegate?.onReceiveTransactionInfo(it)
}, {
delegate?.onError()
delegate?.onError(transactionProvider.providerName)
})
)
}

override fun retryLoadInfo() {
delegate?.retryLoadInfo()
}

override fun onTapItem(item: FullTransactionItem) {
if (item.clickable) {
if (item.url != null) {
delegate?.onOpenUrl(item.url)
} else if (item.value != null) {
clipboardManager.copyText(item.value)
delegate?.onCopied()
}
}
override fun copyToClipboard(value: String) {
clipboardManager.copyText(value)
}

//
Expand Down

0 comments on commit 1b51562

Please sign in to comment.