From 655ef2c65c4097207de120cff10deb606f3ecae0 Mon Sep 17 00:00:00 2001 From: Rowdy Mitchell Chotkan Date: Mon, 19 Feb 2024 13:55:04 +0100 Subject: [PATCH] Add Ktlint to `common-bitcoin`, `common-ethereum`, `debug`, and `eurotoken` --- common-bitcoin/build.gradle | 9 ++ .../common/bitcoin/BitcoinMultiSigWallet.kt | 13 +- common-ethereum/build.gradle | 9 ++ .../ethereum/EthereumGethMultiSigWallet.kt | 13 +- .../common/ethereum/EthereumGethWallet.kt | 47 ++++--- .../common/ethereum/EthereumWalletService.kt | 21 ++- .../ethereum/EthereumWeb3jMultiSigWallet.kt | 20 ++- .../common/ethereum/EthereumWeb3jWallet.kt | 43 ++++--- .../ethereum/utils/WalletPasswordUtils.kt | 9 +- .../ethereum/WalletPasswordUtilsTest.kt | 4 +- debug/build.gradle | 9 ++ .../tudelft/trustchain/debug/DebugFragment.kt | 121 ++++++++++-------- .../trustchain/debug/PunctureFragment.kt | 23 +++- .../trustchain/debug/WanLogFragment.kt | 13 +- eurotoken/build.gradle | 10 +- .../eurotoken/EuroTokenMainActivity.kt | 1 - .../eurotoken/community/EuroTokenCommunity.kt | 114 ++++++++++------- .../eurotoken/community/MessagePayload.kt | 5 +- .../community/TransactionsPayload.kt | 10 +- .../trustchain/eurotoken/db/TrustStore.kt | 16 ++- .../eurotoken/entity/Transaction.kt | 10 -- .../trustchain/eurotoken/entity/TrustScore.kt | 6 +- .../eurotoken/ui/EurotokenBaseFragment.kt | 36 +++++- .../ui/exchange/CreateMoneyFragment.kt | 28 ++-- .../ui/exchange/DestroyMoneyFragment.kt | 31 ++--- .../eurotoken/ui/exchange/ExchangeFragment.kt | 15 ++- .../ui/settings/GatewayItemRenderer.kt | 9 +- .../eurotoken/ui/settings/GatewaysFragment.kt | 23 ++-- .../transactions/TransactionItemRenderer.kt | 65 ++++++---- .../ui/transactions/TransactionsFragment.kt | 98 +++++++------- .../ui/transfer/RequestMoneyFragment.kt | 12 +- .../ui/transfer/SendMoneyFragment.kt | 66 +++++++--- .../eurotoken/ui/transfer/TransferFragment.kt | 112 +++++++++------- .../ui/trustscores/TrustScoreItem.kt | 6 +- .../ui/trustscores/TrustScoreItemRenderer.kt | 6 +- .../ui/trustscores/TrustScoresFragment.kt | 10 +- 36 files changed, 647 insertions(+), 396 deletions(-) diff --git a/common-bitcoin/build.gradle b/common-bitcoin/build.gradle index 14fb6b790..3bd1cc903 100644 --- a/common-bitcoin/build.gradle +++ b/common-bitcoin/build.gradle @@ -1,6 +1,15 @@ plugins { id 'com.android.library' id 'org.jetbrains.kotlin.android' + id 'org.jlleitschuh.gradle.ktlint' +} + +ktlint { + version = "$ktlint_version" + android = true + outputToConsole = true + ignoreFailures = false + verbose = true } android { diff --git a/common-bitcoin/src/main/java/nl/tudelft/trustchain/common/bitcoin/BitcoinMultiSigWallet.kt b/common-bitcoin/src/main/java/nl/tudelft/trustchain/common/bitcoin/BitcoinMultiSigWallet.kt index fce497a9b..2e66db9c3 100644 --- a/common-bitcoin/src/main/java/nl/tudelft/trustchain/common/bitcoin/BitcoinMultiSigWallet.kt +++ b/common-bitcoin/src/main/java/nl/tudelft/trustchain/common/bitcoin/BitcoinMultiSigWallet.kt @@ -31,7 +31,10 @@ class BitcoinMultiSigWallet( return transaction } - fun startWithdraw(value: Coin, receiveAddress: Address): Transaction { + fun startWithdraw( + value: Coin, + receiveAddress: Address + ): Transaction { val transaction = Transaction(params) val relayValue = Coin.valueOf(1000) @@ -60,7 +63,10 @@ class BitcoinMultiSigWallet( return transaction } - fun endWithdraw(transaction: Transaction, signatures: List): Transaction { + fun endWithdraw( + transaction: Transaction, + signatures: List + ): Transaction { for (transactionInput in transaction.inputs) { transactionInput.scriptSig = ScriptBuilder.createMultiSigInputScript(signatures) } @@ -71,7 +77,8 @@ class BitcoinMultiSigWallet( fun hash(transaction: Transaction): List { val transactionHashes = mutableListOf() transaction.inputs.forEachIndexed { index, _ -> - val transactionHash = transaction.hashForSignature(index, outputScript, Transaction.SigHash.ALL, false) + val transactionHash = + transaction.hashForSignature(index, outputScript, Transaction.SigHash.ALL, false) transactionHashes.add(transactionHash) } return transactionHashes diff --git a/common-ethereum/build.gradle b/common-ethereum/build.gradle index 00a15ef26..d75d5168d 100644 --- a/common-ethereum/build.gradle +++ b/common-ethereum/build.gradle @@ -1,6 +1,15 @@ plugins { id 'com.android.library' id 'org.jetbrains.kotlin.android' + id 'org.jlleitschuh.gradle.ktlint' +} + +ktlint { + version = "$ktlint_version" + android = true + outputToConsole = true + ignoreFailures = false + verbose = true } android { diff --git a/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumGethMultiSigWallet.kt b/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumGethMultiSigWallet.kt index c8a175e03..31459a3b5 100644 --- a/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumGethMultiSigWallet.kt +++ b/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumGethMultiSigWallet.kt @@ -1,7 +1,6 @@ package nl.tudelft.trustchain.common.ethereum import kotlinx.coroutines.delay -import nl.tudelft.trustchain.common.ethereum.BuildConfig import nl.tudelft.trustchain.common.ethereum.contracts.geth.MultiSigWallet import org.ethereum.geth.* @@ -38,8 +37,16 @@ class EthereumGethMultiSigWallet(gethWallet: EthereumGethWallet) { return gethNode.peersInfo.size() > 0L } - class MySigner(private val account: Account?, private val keyStore: KeyStore?, private val password: String?, private val chainId: BigInt?) : Signer { - override fun sign(address: Address?, transaction: Transaction?): Transaction { + class MySigner( + private val account: Account?, + private val keyStore: KeyStore?, + private val password: String?, + private val chainId: BigInt? + ) : Signer { + override fun sign( + address: Address?, + transaction: Transaction? + ): Transaction { return keyStore!!.signTxPassphrase(account, password, transaction, chainId) } } diff --git a/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumGethWallet.kt b/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumGethWallet.kt index 12bdc8a5a..5433e1dec 100644 --- a/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumGethWallet.kt +++ b/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumGethWallet.kt @@ -2,7 +2,13 @@ package nl.tudelft.trustchain.common.ethereum import org.ethereum.geth.* -class EthereumGethWallet(val nodeConfig: NodeConfig, keyFile: String, nodeDirectory: String, keyStoreDirectory: String, val password: String) { +class EthereumGethWallet( + val nodeConfig: NodeConfig, + keyFile: String, + nodeDirectory: String, + keyStoreDirectory: String, + val password: String +) { val context: Context = Geth.newContext() val node: Node val keyStore: KeyStore @@ -13,11 +19,12 @@ class EthereumGethWallet(val nodeConfig: NodeConfig, keyFile: String, nodeDirect node.start() // Initialize the keystore. - keyStore = KeyStore( - keyStoreDirectory, - Geth.LightScryptN, - Geth.LightScryptP - ) + keyStore = + KeyStore( + keyStoreDirectory, + Geth.LightScryptN, + Geth.LightScryptP + ) // Remove all existing accounts. for (i in keyStore.accounts.size() - 1 downTo 0) { @@ -37,15 +44,25 @@ class EthereumGethWallet(val nodeConfig: NodeConfig, keyFile: String, nodeDirect return node.ethereumClient.getBalanceAt(context, getAddress(), -1) } - fun sendTo(address: Address, amount: BigInt) { - val transaction = Transaction( - node.ethereumClient.getPendingNonceAt(context, getAddress()), // Nonce. - address, // Receive address. - amount, // Amount. - 10000000, // Gas limit. - BigInt(1), // Gas price. - ByteArray(0) - ) // Data. + fun sendTo( + address: Address, + amount: BigInt + ) { + val transaction = + // Data. + Transaction( + // Nonce. + node.ethereumClient.getPendingNonceAt(context, getAddress()), + // Receive address. + address, + // Amount. + amount, + // Gas limit. + 10000000, + BigInt(1), + // Gas price. + ByteArray(0) + ) val signedTransaction = sign(transaction) send(signedTransaction) } diff --git a/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumWalletService.kt b/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumWalletService.kt index 9cbe31631..7b5d820f3 100644 --- a/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumWalletService.kt +++ b/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumWalletService.kt @@ -11,9 +11,7 @@ import java.math.BigInteger import java.security.SecureRandom class EthereumWalletService { - companion object { - private var globalWeb3jWallet: EthereumWeb3jWallet? = null private var lastDir: File? = null @@ -50,12 +48,13 @@ class EthereumWalletService { ) // Create wallet - globalWeb3jWallet = EthereumWeb3jWallet( - web3j, - context.cacheDir, - getWalletKeys(context), - getWalletPassword(context) - ) + globalWeb3jWallet = + EthereumWeb3jWallet( + web3j, + context.cacheDir, + getWalletKeys(context), + getWalletPassword(context) + ) return globalWeb3jWallet!! } @@ -65,7 +64,7 @@ class EthereumWalletService { private const val SHARED_PREF_KEY_PUBLIC_KEY = "web3j_wallet_public_key" private fun getWalletPassword(context: Context): String { - val preferences = context.getSharedPreferences("web3j_wallet", Context.MODE_PRIVATE); + val preferences = context.getSharedPreferences("web3j_wallet", Context.MODE_PRIVATE) var password = preferences.getString(SHARED_PREF_KEY_WALLET_PASSWORD, null) if (password == null) { @@ -84,7 +83,7 @@ class EthereumWalletService { } private fun getWalletKeys(context: Context): ECKeyPair { - val preferences = context.getSharedPreferences("web3j_wallet", Context.MODE_PRIVATE); + val preferences = context.getSharedPreferences("web3j_wallet", Context.MODE_PRIVATE) val privateKey = preferences.getString(SHARED_PREF_KEY_PRIVATE_KEY, null) val publicKey = preferences.getString(SHARED_PREF_KEY_PUBLIC_KEY, null) @@ -106,7 +105,5 @@ class EthereumWalletService { ECKeyPair(BigInteger(privateKey), BigInteger(publicKey)) } } - } - } diff --git a/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumWeb3jMultiSigWallet.kt b/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumWeb3jMultiSigWallet.kt index 0426b35d7..6444167bf 100644 --- a/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumWeb3jMultiSigWallet.kt +++ b/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumWeb3jMultiSigWallet.kt @@ -6,7 +6,11 @@ import org.web3j.protocol.core.DefaultBlockParameter import org.web3j.tx.gas.StaticGasProvider import java.math.BigInteger -class EthereumWeb3jMultiSigWallet(val web3j: Web3j, val address: String, wallet: EthereumWeb3jWallet) { +class EthereumWeb3jMultiSigWallet( + val web3j: Web3j, + val address: String, + wallet: EthereumWeb3jWallet +) { var credentials = wallet.credentials var contractGasProvider = StaticGasProvider(BigInteger.valueOf(4), BigInteger.valueOf(8000000)) private var contractBound: Boolean = false @@ -18,12 +22,20 @@ class EthereumWeb3jMultiSigWallet(val web3j: Web3j, val address: String, wallet: suspend fun balance(): BigInteger { ensureContractBound() - return web3j.ethGetBalance(boundMultiSigWallet.contractAddress, DefaultBlockParameter.valueOf("latest")).sendAsync().get().balance + return web3j.ethGetBalance( + boundMultiSigWallet.contractAddress, + DefaultBlockParameter.valueOf("latest") + ).sendAsync().get().balance } - suspend fun withdraw(destination: String, value: BigInteger): String { + suspend fun withdraw( + destination: String, + value: BigInteger + ): String { if (value > balance()) return "" - val receipt = boundMultiSigWallet.submitTransaction(destination, value, byteArrayOf()).sendAsync().get() + val receipt = + boundMultiSigWallet.submitTransaction(destination, value, byteArrayOf()).sendAsync() + .get() return receipt.transactionHash } diff --git a/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumWeb3jWallet.kt b/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumWeb3jWallet.kt index 6a3720b91..485316f0e 100644 --- a/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumWeb3jWallet.kt +++ b/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/EthereumWeb3jWallet.kt @@ -14,7 +14,6 @@ class EthereumWeb3jWallet( keyPair: ECKeyPair, password: String ) { - val credentials: Credentials init { @@ -28,30 +27,38 @@ class EthereumWeb3jWallet( } fun balance(): BigInteger { - return web3j.ethGetBalance(credentials.address, DefaultBlockParameter.valueOf("latest")).sendAsync().get().balance + return web3j.ethGetBalance(credentials.address, DefaultBlockParameter.valueOf("latest")) + .sendAsync().get().balance } fun nonce(): BigInteger { - val ethGetTransactionCount = web3j.ethGetTransactionCount( - address(), DefaultBlockParameterName.LATEST - ).sendAsync().get() + val ethGetTransactionCount = + web3j.ethGetTransactionCount( + address(), + DefaultBlockParameterName.LATEST + ).sendAsync().get() return ethGetTransactionCount.transactionCount } - fun send(receiveAddress: String, value: BigInteger) { - val rawTransaction = RawTransaction.createEtherTransaction( - nonce(), - BigInteger.valueOf(4), - BigInteger.valueOf(8000000), - receiveAddress, - value - ) - val signedMessage = Numeric.toHexString( - TransactionEncoder.signMessage( - rawTransaction, - credentials + fun send( + receiveAddress: String, + value: BigInteger + ) { + val rawTransaction = + RawTransaction.createEtherTransaction( + nonce(), + BigInteger.valueOf(4), + BigInteger.valueOf(8000000), + receiveAddress, + value + ) + val signedMessage = + Numeric.toHexString( + TransactionEncoder.signMessage( + rawTransaction, + credentials + ) ) - ) web3j.ethSendRawTransaction(signedMessage).sendAsync().get() } } diff --git a/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/utils/WalletPasswordUtils.kt b/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/utils/WalletPasswordUtils.kt index c325d02d9..bb25da460 100644 --- a/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/utils/WalletPasswordUtils.kt +++ b/common-ethereum/src/main/java/nl/tudelft/trustchain/common/ethereum/utils/WalletPasswordUtils.kt @@ -5,7 +5,8 @@ import java.util.* private const val PASSWORD_LENGTH = 31 private val PASSWORD_CHAR_POOL: List = ('a'..'z') + ('A'..'Z') + ('0'..'9') + '!' -fun generateWalletPassword(random: Random) = (1..PASSWORD_LENGTH) - .map { random.nextInt(PASSWORD_CHAR_POOL.size) } - .map(PASSWORD_CHAR_POOL::get) - .joinToString("") +fun generateWalletPassword(random: Random) = + (1..PASSWORD_LENGTH) + .map { random.nextInt(PASSWORD_CHAR_POOL.size) } + .map(PASSWORD_CHAR_POOL::get) + .joinToString("") diff --git a/common-ethereum/src/test/java/nl/tudelft/trustchain/common/ethereum/WalletPasswordUtilsTest.kt b/common-ethereum/src/test/java/nl/tudelft/trustchain/common/ethereum/WalletPasswordUtilsTest.kt index 1c28f1012..c446edcd4 100644 --- a/common-ethereum/src/test/java/nl/tudelft/trustchain/common/ethereum/WalletPasswordUtilsTest.kt +++ b/common-ethereum/src/test/java/nl/tudelft/trustchain/common/ethereum/WalletPasswordUtilsTest.kt @@ -4,10 +4,9 @@ import nl.tudelft.trustchain.common.ethereum.utils.generateWalletPassword import org.junit.Test import java.security.SecureRandom -private const val PASSWORD_REGEX = "[a-zA-Z0-9!]+"; +private const val PASSWORD_REGEX = "[a-zA-Z0-9!]+" class WalletPasswordUtilsTest { - @Test fun generatedWalletPassword_isCorrect() { // given @@ -19,5 +18,4 @@ class WalletPasswordUtilsTest { // then assert(password.matches(Regex(PASSWORD_REGEX))) } - } diff --git a/debug/build.gradle b/debug/build.gradle index 30fdf53fa..eb2056cb7 100644 --- a/debug/build.gradle +++ b/debug/build.gradle @@ -1,5 +1,14 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' +apply plugin: 'org.jlleitschuh.gradle.ktlint' + +ktlint { + version = "$ktlint_version" + android = true + outputToConsole = true + ignoreFailures = false + verbose = true +} android { defaultConfig { diff --git a/debug/src/main/java/nl/tudelft/trustchain/debug/DebugFragment.kt b/debug/src/main/java/nl/tudelft/trustchain/debug/DebugFragment.kt index 5aa359642..2c24bcbe6 100644 --- a/debug/src/main/java/nl/tudelft/trustchain/debug/DebugFragment.kt +++ b/debug/src/main/java/nl/tudelft/trustchain/debug/DebugFragment.kt @@ -30,7 +30,6 @@ import nl.tudelft.trustchain.common.util.viewBinding import nl.tudelft.trustchain.debug.databinding.FragmentDebugBinding import java.util.* - class DebugFragment : BaseFragment(R.layout.fragment_debug) { private val binding by viewBinding(FragmentDebugBinding::bind) @@ -42,7 +41,10 @@ class DebugFragment : BaseFragment(R.layout.fragment_debug) { } @Deprecated("Deprecated in Java") - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + override fun onCreateOptionsMenu( + menu: Menu, + inflater: MenuInflater + ) { inflater.inflate(R.menu.debug_options, menu) } @@ -54,15 +56,20 @@ class DebugFragment : BaseFragment(R.layout.fragment_debug) { findNavController().navigate(R.id.wanLogFragment) true } + R.id.multiPunch -> { findNavController().navigate(R.id.punctureFragment) true } + else -> super.onOptionsItemSelected(item) } } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle? + ) { super.onViewCreated(view, savedInstanceState) lifecycleScope.launchWhenStarted { @@ -82,69 +89,76 @@ class DebugFragment : BaseFragment(R.layout.fragment_debug) { binding.txtWanAddress.text = demo.myEstimatedWan.toString() binding.txtPeerId.text = ipv8.myPeer.mid binding.txtPublicKey.text = ipv8.myPeer.publicKey.keyToBin().toHex() - binding.txtOverlays.text = ipv8.overlays.values.toList().joinToString("\n") { - it.javaClass.simpleName + " (" + it.getPeers().size + " peers)" - } + binding.txtOverlays.text = + ipv8.overlays.values.toList().joinToString("\n") { + it.javaClass.simpleName + " (" + it.getPeers().size + " peers)" + } - binding.txtOverlays.text = buildSpannedString { - ipv8.overlays.values.forEachIndexed { index, overlay -> - if (index > 0) append("\n") - append(overlay.javaClass.simpleName) - append(" (") - val textColorResId = - if (overlay.getPeers().isNotEmpty()) R.color.green else R.color.red + binding.txtOverlays.text = + buildSpannedString { + ipv8.overlays.values.forEachIndexed { index, overlay -> + if (index > 0) append("\n") + append(overlay.javaClass.simpleName) + append(" (") + val textColorResId = + if (overlay.getPeers().isNotEmpty()) R.color.green else R.color.red + val textColor = ResourcesCompat.getColor(resources, textColorResId, null) + inSpans(ForegroundColorSpan(textColor)) { + val peers = overlay.getPeers() + val peersCountStr = + resources.getQuantityString( + R.plurals.x_peers, + peers.size, + peers.size + ) + append(peersCountStr) + } + append(")") + } + + append("\n") + bold { + append("Total: ") + } + val totalPeersCount = ipv8.network.verifiedPeers.size + val textColorResId = if (totalPeersCount > 0) R.color.green else R.color.red val textColor = ResourcesCompat.getColor(resources, textColorResId, null) inSpans(ForegroundColorSpan(textColor)) { - val peers = overlay.getPeers() - val peersCountStr = resources.getQuantityString( - R.plurals.x_peers, peers.size, - peers.size + append( + resources.getQuantityString( + R.plurals.x_peers, + totalPeersCount, + totalPeersCount + ) ) - append(peersCountStr) } - append(")") - } - - append("\n") - bold { - append("Total: ") } - val totalPeersCount = ipv8.network.verifiedPeers.size - val textColorResId = if (totalPeersCount > 0) R.color.green else R.color.red - val textColor = ResourcesCompat.getColor(resources, textColorResId, null) - inSpans(ForegroundColorSpan(textColor)) { - append( - resources.getQuantityString( - R.plurals.x_peers, - totalPeersCount, - totalPeersCount - ) - ) - } - } updateBootstrapList() lifecycleScope.launchWhenCreated { - val blockCount = withContext(Dispatchers.IO) { - getTrustChainCommunity().database.getBlockCount(null) - } + val blockCount = + withContext(Dispatchers.IO) { + getTrustChainCommunity().database.getBlockCount(null) + } if (view != null) { binding.txtBlockCount.text = blockCount.toString() } } lifecycleScope.launchWhenCreated { - val chainLength = withContext(Dispatchers.IO) { - getTrustChainCommunity().getChainLength() - } + val chainLength = + withContext(Dispatchers.IO) { + getTrustChainCommunity().getChainLength() + } if (view != null) { binding.txtChainLength.text = chainLength.toString() } } - binding.txtConnectionType.text = getDemoCommunity().network.wanLog - .estimateConnectionType().value + binding.txtConnectionType.text = + getDemoCommunity().network.wanLog + .estimateConnectionType().value try { val pInfo: PackageInfo = @@ -163,14 +177,19 @@ class DebugFragment : BaseFragment(R.layout.fragment_debug) { val lastResponse = demo.lastTrackerResponses[address] val isAlive = lastResponse != null && Date().time - lastResponse.time < 120_000 val view = TextView(requireContext()) - val layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, - LinearLayout.LayoutParams.WRAP_CONTENT - ) + val layoutParams = + LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ) view.layoutParams = layoutParams view.text = address.toString() - val resId = if (isAlive) R.drawable.indicator_online else - R.drawable.indicator_offline + val resId = + if (isAlive) { + R.drawable.indicator_online + } else { + R.drawable.indicator_offline + } val drawable = resources.getDrawable(resId, null) view.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null) view.compoundDrawablePadding = diff --git a/debug/src/main/java/nl/tudelft/trustchain/debug/PunctureFragment.kt b/debug/src/main/java/nl/tudelft/trustchain/debug/PunctureFragment.kt index 4496adaee..0ed4f22a4 100644 --- a/debug/src/main/java/nl/tudelft/trustchain/debug/PunctureFragment.kt +++ b/debug/src/main/java/nl/tudelft/trustchain/debug/PunctureFragment.kt @@ -24,7 +24,10 @@ class PunctureFragment : BaseFragment(R.layout.fragment_puncture) { private val firstMessageTimestamps = mutableMapOf() private var firstSentMessageTimestamp: Date? = null - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle? + ) { super.onViewCreated(view, savedInstanceState) lifecycleScope.launchWhenCreated { @@ -37,7 +40,7 @@ class PunctureFragment : BaseFragment(R.layout.fragment_puncture) { getDemoCommunity().punctureChannel.collect { (peer, payload) -> Log.i( "PunctureFragment", - "Received puncture from ${peer} on port ${payload.identifier}" + "Received puncture from $peer on port ${payload.identifier}" ) received++ receivedMap[peer.toString()] = (receivedMap[peer.toString()] ?: 0) + 1 @@ -83,9 +86,12 @@ class PunctureFragment : BaseFragment(R.layout.fragment_puncture) { } } } - */ + */ - private suspend fun punctureAll(ip: String, slow: Boolean) = with(Dispatchers.Default) { + private suspend fun punctureAll( + ip: String, + slow: Boolean + ) = with(Dispatchers.Default) { for (i in MIN_PORT..MAX_PORT) { val ipv4 = IPv4Address(ip, i) getDemoCommunity().sendPuncture(ipv4, i) @@ -97,8 +103,10 @@ class PunctureFragment : BaseFragment(R.layout.fragment_puncture) { } } - - private suspend fun punctureSingle(ip: String, port: Int) { + private suspend fun punctureSingle( + ip: String, + port: Int + ) { while (true) { val ipv4 = IPv4Address(ip, port) getDemoCommunity().sendPuncture(ipv4, port) @@ -111,7 +119,8 @@ class PunctureFragment : BaseFragment(R.layout.fragment_puncture) { private fun updateView() { val df = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM) binding.txtResult.text = - "Sent: $sent\nFirst Sent: $firstSentMessageTimestamp\nReceived: $received\n\n" + receivedMap.map { + "Sent: $sent\nFirst Sent: $firstSentMessageTimestamp\nReceived: $received\n\n" + + receivedMap.map { val date = firstMessageTimestamps[it.key] val time = if (date != null) df.format(date) else null it.key + " (" + time + ") -> " + it.value diff --git a/debug/src/main/java/nl/tudelft/trustchain/debug/WanLogFragment.kt b/debug/src/main/java/nl/tudelft/trustchain/debug/WanLogFragment.kt index fc2e7a224..c4c81316e 100644 --- a/debug/src/main/java/nl/tudelft/trustchain/debug/WanLogFragment.kt +++ b/debug/src/main/java/nl/tudelft/trustchain/debug/WanLogFragment.kt @@ -13,7 +13,10 @@ import java.text.SimpleDateFormat class WanLogFragment : BaseFragment(R.layout.fragment_wan_log) { private val binding by viewBinding(FragmentWanLogBinding::bind) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle? + ) { super.onViewCreated(view, savedInstanceState) lifecycleScope.launchWhenStarted { @@ -21,10 +24,12 @@ class WanLogFragment : BaseFragment(R.layout.fragment_wan_log) { val discovery = getIpv8().getOverlay()!! val df = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM) binding.txtLog.text = - "Time Sender My WAN\n" + discovery.network.wanLog.getLog() + "Time Sender My WAN\n" + + discovery.network.wanLog.getLog() .map { - "" + df.format(it.timestamp) + ": " + it.sender.toString() - .padEnd(20) + " " + it.wan + "" + df.format(it.timestamp) + ": " + + it.sender.toString() + .padEnd(20) + " " + it.wan }.joinToString("\n") delay(1000) } diff --git a/eurotoken/build.gradle b/eurotoken/build.gradle index 3b6e9ccef..9dfcc3a60 100644 --- a/eurotoken/build.gradle +++ b/eurotoken/build.gradle @@ -1,7 +1,15 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'app.cash.sqldelight' - +apply plugin: 'org.jlleitschuh.gradle.ktlint' + +ktlint { + version = "$ktlint_version" + android = true + outputToConsole = true + ignoreFailures = false + verbose = true +} sqldelight { databases { diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/EuroTokenMainActivity.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/EuroTokenMainActivity.kt index 5a02a07f1..d41a768ec 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/EuroTokenMainActivity.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/EuroTokenMainActivity.kt @@ -3,7 +3,6 @@ package nl.tudelft.trustchain.eurotoken import nl.tudelft.trustchain.common.BaseActivity class EuroTokenMainActivity : BaseActivity() { - override val navigationGraph = R.navigation.nav_graph_eurotoken override val bottomNavigationMenu = R.menu.eurotoken_navigation_menu diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/community/EuroTokenCommunity.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/community/EuroTokenCommunity.kt index 834677d21..a5d82bde7 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/community/EuroTokenCommunity.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/community/EuroTokenCommunity.kt @@ -1,10 +1,8 @@ package nl.tudelft.trustchain.eurotoken.community import android.content.Context -import android.os.Build import androidx.annotation.RequiresApi import kotlin.random.Random -import mu.KotlinLogging import nl.tudelft.ipv8.Community import nl.tudelft.ipv8.IPv4Address import nl.tudelft.ipv8.Overlay @@ -22,10 +20,9 @@ import nl.tudelft.trustchain.eurotoken.EuroTokenMainActivity.EurotokenPreference import nl.tudelft.trustchain.eurotoken.db.TrustStore import nl.tudelft.trustchain.eurotoken.ui.settings.DefaultGateway - class EuroTokenCommunity( store: GatewayStore, - trustStore : TrustStore, + trustStore: TrustStore, context: Context, ) : Community() { override val serviceId = "f0eb36102436bd55c7a3cdca93dcaefb08df0750" @@ -35,13 +32,12 @@ class EuroTokenCommunity( /** * The [TrustStore] used to fetch and update trust scores from peers. */ - private var myTrustStore : TrustStore + private var myTrustStore: TrustStore /** * The context used to access the shared preferences. */ - private var myContext : Context - + private var myContext: Context init { messageHandlers[MessageId.ROLLBACK_REQUEST] = ::onRollbackRequestPacket @@ -73,44 +69,58 @@ class EuroTokenCommunity( * @param packet : the corresponding packet that contains the right payload. */ private fun onLastAddressPacket(packet: Packet) { - val (_, payload) = packet.getDecryptedAuthPayload( - TransactionsPayload.Deserializer, myPeer.key as PrivateKey - ) + val (_, payload) = + packet.getDecryptedAuthPayload( + TransactionsPayload.Deserializer, + myPeer.key as PrivateKey + ) - val addresses : List = String(payload.data).split(",").map { it.toByteArray() } + val addresses: List = String(payload.data).split(",").map { it.toByteArray() } for (i in addresses.indices) { myTrustStore.incrementTrust(addresses[i]) } } - - private fun onRollbackRequest(peer: Peer, payload: RollbackRequestPayload) { + private fun onRollbackRequest( + peer: Peer, + payload: RollbackRequestPayload + ) { transactionRepository.attemptRollback(peer, payload.transactionHash) } @RequiresApi(Build.VERSION_CODES.O) - fun connectToGateway(public_key: String, ip: String, port: Int, payment_id: String) { + fun connectToGateway( + public_key: String, + ip: String, + port: Int, + payment_id: String + ) { val key = defaultCryptoProvider.keyFromPublicBin(public_key.hexToBytes()) val address = IPv4Address(ip, port) val peer = Peer(key, address) val payload = MessagePayload(payment_id) - val packet = serializePacket( - MessageId.GATEWAY_CONNECT, - payload - ) + val packet = + serializePacket( + MessageId.GATEWAY_CONNECT, + payload + ) send(peer, packet) } - fun requestRollback(transactionHash: ByteArray, peer: Peer) { + fun requestRollback( + transactionHash: ByteArray, + peer: Peer + ) { val payload = RollbackRequestPayload(transactionHash) - val packet = serializePacket( - MessageId.ROLLBACK_REQUEST, - payload - ) + val packet = + serializePacket( + MessageId.ROLLBACK_REQUEST, + payload + ) send(peer, packet) } @@ -123,8 +133,8 @@ class EuroTokenCommunity( class Factory( private val store: GatewayStore, - private val trustStore : TrustStore, - private val context : Context, + private val trustStore: TrustStore, + private val context: Context, ) : Overlay.Factory(EuroTokenCommunity::class.java) { override fun create(): EuroTokenCommunity { return EuroTokenCommunity(store, trustStore, context) @@ -135,7 +145,7 @@ class EuroTokenCommunity( * Generate a public key based on the [seed]. * @param seed : the seed used to generate the public key. */ - private fun generatePublicKey(seed : Long) : String { + private fun generatePublicKey(seed: Long): String { // Initialize Random with seed val random = Random(seed) @@ -149,7 +159,10 @@ class EuroTokenCommunity( * @param numberOfKeys : the number of keys to generate. * @param seed : the seed used to generate the public keys. */ - private fun generatePublicKeys(numberOfKeys: Int, seed : Long = 1337) : List { + private fun generatePublicKeys( + numberOfKeys: Int, + seed: Long = 1337 + ): List { val publicKeys = mutableListOf() for (i in 0 until numberOfKeys) { publicKeys.add(generatePublicKey(seed + i)) @@ -157,7 +170,6 @@ class EuroTokenCommunity( return publicKeys } - /** * Called after the user has finished a transaction with the other party. * Sends the [num] public keys of latest transaction counterparties to the receiver. @@ -165,11 +177,14 @@ class EuroTokenCommunity( * @param peer : the peer to send the keys to. * @param num : the number of keys to send. */ - fun sendAddressesOfLastTransactions(peer: Peer, num: Int = 50) { + fun sendAddressesOfLastTransactions( + peer: Peer, + num: Int = 50 + ) { val pref = myContext.getSharedPreferences(EUROTOKEN_SHARED_PREF_NAME, Context.MODE_PRIVATE) val demoModeEnabled = pref.getBoolean(DEMO_MODE_ENABLED, false) - val addresses : ArrayList = ArrayList() + val addresses: ArrayList = ArrayList() // Add own public key to list of addresses. addresses.add(myPeer.publicKey.keyToBin().toHex()) if (demoModeEnabled) { @@ -177,31 +192,36 @@ class EuroTokenCommunity( addresses.addAll(generatePublicKeys(num)) } else { // Get all addresses of the last [num] incoming transactions - addresses.addAll(transactionRepository.getTransactions(num).map { transaction: Transaction -> - transaction.sender.toString() - }) + addresses.addAll( + transactionRepository.getTransactions(num).map { transaction: Transaction -> + transaction.sender.toString() + } + ) } val payload = TransactionsPayload(EVAId.EVA_LAST_ADDRESSES, addresses.joinToString(separator = ",").toByteArray()) - val packet = serializePacket( - MessageId.ATTACHMENT, - payload, - encrypt = true, - recipient = peer - ) + val packet = + serializePacket( + MessageId.ATTACHMENT, + payload, + encrypt = true, + recipient = peer + ) // Send the list of addresses to the peer using EVA - if (evaProtocolEnabled) evaSendBinary( - peer, - EVAId.EVA_LAST_ADDRESSES, - payload.id, - packet - ) else send(peer, packet) + if (evaProtocolEnabled) { + evaSendBinary( + peer, + EVAId.EVA_LAST_ADDRESSES, + payload.id, + packet + ) + } else { + send(peer, packet) + } } - - /** * Every community initializes a different version of the EVA protocol (if enabled). * To distinguish the incoming packets/requests an ID must be used to hold/let through the diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/community/MessagePayload.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/community/MessagePayload.kt index ba8400f71..967e77043 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/community/MessagePayload.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/community/MessagePayload.kt @@ -11,7 +11,10 @@ class MessagePayload constructor(val id: String) : Serializable { } companion object Deserializer : Deserializable { - override fun deserialize(buffer: ByteArray, offset: Int): Pair { + override fun deserialize( + buffer: ByteArray, + offset: Int + ): Pair { var localOffset = offset val (id, idSize) = deserializeVarLen(buffer, localOffset) localOffset += idSize diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/community/TransactionsPayload.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/community/TransactionsPayload.kt index 05a8249e9..55e024893 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/community/TransactionsPayload.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/community/TransactionsPayload.kt @@ -11,15 +11,19 @@ import nl.tudelft.ipv8.messaging.serializeVarLen * encodes public keys such that trust scores can be updated. * Used by EuroTokenCommunity */ -class TransactionsPayload ( val id: String, - val data: ByteArray +class TransactionsPayload( + val id: String, + val data: ByteArray ) : Serializable { override fun serialize(): ByteArray { return serializeVarLen(id.toByteArray()) + serializeVarLen(data) } companion object Deserializer : Deserializable { - override fun deserialize(buffer: ByteArray, offset: Int): Pair { + override fun deserialize( + buffer: ByteArray, + offset: Int + ): Pair { var localOffset = offset val (id, idSize) = deserializeVarLen(buffer, localOffset) localOffset += idSize diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/db/TrustStore.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/db/TrustStore.kt index 7b35838c7..adbbcfe36 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/db/TrustStore.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/db/TrustStore.kt @@ -1,4 +1,5 @@ package nl.tudelft.trustchain.eurotoken.db + import android.content.Context import app.cash.sqldelight.driver.android.AndroidSqliteDriver import nl.tudelft.eurotoken.sqldelight.Database @@ -10,7 +11,7 @@ import nl.tudelft.trustchain.eurotoken.entity.TrustScore * 50 public keys of transactions he/she made. For every public key, * a trust score is maintained in order to build the web of trust. */ -class TrustStore (context: Context) { +class TrustStore(context: Context) { private val driver = AndroidSqliteDriver(Database.Schema, context, "eurotoken.db") private val database = Database(driver) @@ -18,8 +19,8 @@ class TrustStore (context: Context) { * Maps the keys and accompanying trust scores out of the database into a kotlin [TrustScore] object. */ private val messageMapper = { - public_key : ByteArray, - score : Long + public_key: ByteArray, + score: Long -> TrustScore( public_key, @@ -30,14 +31,14 @@ class TrustStore (context: Context) { /** * Retrieve all [TrustScore]s from the database. */ - fun getAllScores() : List { + fun getAllScores(): List { return database.dbTrustScoreQueries.getAll(messageMapper).executeAsList() } /** * Retrieve the [TrustScore]s of a specific public key. */ - fun getScore(publicKey: ByteArray) : Long? { + fun getScore(publicKey: ByteArray): Long? { return database.dbTrustScoreQueries.getScore(publicKey).executeAsOneOrNull() } @@ -46,11 +47,11 @@ class TrustStore (context: Context) { * If the score already exists, it will be incremented by 1. */ fun incrementTrust(publicKey: ByteArray) { - val score : Long? = getScore(publicKey) + val score: Long? = getScore(publicKey) if (score != null) { // Limit score to 100 - if(score.toInt() >= 100) { + if (score.toInt() >= 100) { return } database.dbTrustScoreQueries.incrementScore(publicKey) @@ -68,6 +69,7 @@ class TrustStore (context: Context) { companion object { private lateinit var instance: TrustStore + fun getInstance(context: Context): TrustStore { if (!::instance.isInitialized) { instance = TrustStore(context) diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/entity/Transaction.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/entity/Transaction.kt index 75a7fed96..57c1861a4 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/entity/Transaction.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/entity/Transaction.kt @@ -8,50 +8,40 @@ data class Transaction( * The unique transaction ID. */ val id: String, - /** * The transaction amount in cent. */ val amount: Int, - /** * The public key of the transaction sender. */ val sender: PublicKey, - /** * The public key of the transaction recipient. */ val recipient: PublicKey, - /** * True if we are the sender, false otherwise. */ val outgoing: Boolean, - /** * The timestamp when the transaction was sent/received. */ val timestamp: Date, - /** * True if the transaction has been confirmed. */ val confirmed: Boolean, - /** * True if the transaction has been delivered to the network. */ val sent: Boolean, - /** * True if the transaction has been received. */ val received: Boolean, - /** * True if the transaction has been seen. */ val read: Boolean - ) diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/entity/TrustScore.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/entity/TrustScore.kt index 99f937c0d..3c2bdbe08 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/entity/TrustScore.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/entity/TrustScore.kt @@ -3,9 +3,9 @@ package nl.tudelft.trustchain.eurotoken.entity /** * The [TrustScore] of a peer by public key. */ -data class TrustScore ( - val pubKey : ByteArray, - val trust : Int +data class TrustScore( + val pubKey: ByteArray, + val trust: Int ) { override fun equals(other: Any?): Boolean { if (this === other) return true diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/EurotokenBaseFragment.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/EurotokenBaseFragment.kt index bc3c3f8d7..92ad975bc 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/EurotokenBaseFragment.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/EurotokenBaseFragment.kt @@ -74,7 +74,7 @@ open class EurotokenBaseFragment(contentLayoutId: Int = 0) : BaseFragment(conten } } - fun makeMoneyToast() { + fun makeMoneyToast() { Toast.makeText(requireContext(), "Money received!", Toast.LENGTH_LONG).show() } @@ -87,14 +87,26 @@ open class EurotokenBaseFragment(contentLayoutId: Int = 0) : BaseFragment(conten } override fun onResume() { - transactionRepository.trustChainCommunity.addListener(TransactionRepository.BLOCK_TYPE_TRANSFER, onReceiveListener) - transactionRepository.trustChainCommunity.addListener(TransactionRepository.BLOCK_TYPE_CREATE, onReceiveListener) + transactionRepository.trustChainCommunity.addListener( + TransactionRepository.BLOCK_TYPE_TRANSFER, + onReceiveListener + ) + transactionRepository.trustChainCommunity.addListener( + TransactionRepository.BLOCK_TYPE_CREATE, + onReceiveListener + ) super.onResume() } override fun onPause() { - transactionRepository.trustChainCommunity.removeListener(onReceiveListener, TransactionRepository.BLOCK_TYPE_TRANSFER) - transactionRepository.trustChainCommunity.removeListener(onReceiveListener, TransactionRepository.BLOCK_TYPE_CREATE) + transactionRepository.trustChainCommunity.removeListener( + onReceiveListener, + TransactionRepository.BLOCK_TYPE_TRANSFER + ) + transactionRepository.trustChainCommunity.removeListener( + onReceiveListener, + TransactionRepository.BLOCK_TYPE_CREATE + ) super.onPause() } @@ -115,7 +127,8 @@ open class EurotokenBaseFragment(contentLayoutId: Int = 0) : BaseFragment(conten EuroTokenMainActivity.EurotokenPreferences.EUROTOKEN_SHARED_PREF_NAME, Context.MODE_PRIVATE ) - val demoModeEnabled = pref.getBoolean(EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, false) + val demoModeEnabled = + pref.getBoolean(EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, false) if (demoModeEnabled) { TransactionRepository.initialBalance = 1000 } else { @@ -139,6 +152,7 @@ open class EurotokenBaseFragment(contentLayoutId: Int = 0) : BaseFragment(conten } true } + R.id.copyKey -> { val clipboard = ContextCompat.getSystemService(requireContext(), ClipboardManager::class.java) @@ -147,14 +161,17 @@ open class EurotokenBaseFragment(contentLayoutId: Int = 0) : BaseFragment(conten Toast.makeText(requireContext(), "Copied to clipboard", Toast.LENGTH_SHORT).show() true } + R.id.renameSelf -> { renameSelf() true } + R.id.gateways -> { findNavController().navigate(R.id.gatewaysFragment) true } + R.id.toggleDemoMode -> { val sharedPreferences = requireContext().getSharedPreferences( @@ -164,17 +181,22 @@ open class EurotokenBaseFragment(contentLayoutId: Int = 0) : BaseFragment(conten val edit = sharedPreferences.edit() edit.putBoolean( EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, - !sharedPreferences.getBoolean(EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, false) + !sharedPreferences.getBoolean( + EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, + false + ) ) edit.commit() item.setTitle(getDemoModeMenuItemText()) true } + R.id.trustScoresMenuItem -> { findNavController().navigate(R.id.trustScoresFragment) true } + else -> super.onOptionsItemSelected(item) } } diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/exchange/CreateMoneyFragment.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/exchange/CreateMoneyFragment.kt index 544a76220..8594ad300 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/exchange/CreateMoneyFragment.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/exchange/CreateMoneyFragment.kt @@ -1,7 +1,6 @@ package nl.tudelft.trustchain.eurotoken.ui.exchange import android.content.Context -import android.os.Build import android.os.Bundle import android.view.View import androidx.annotation.RequiresApi @@ -19,7 +18,6 @@ import nl.tudelft.trustchain.eurotoken.databinding.FragmentCreateMoneyBinding import nl.tudelft.trustchain.eurotoken.ui.EurotokenBaseFragment class CreateMoneyFragment : EurotokenBaseFragment(R.layout.fragment_create_money) { - private var addGateway = false private var setPreferred = false @@ -43,12 +41,15 @@ class CreateMoneyFragment : EurotokenBaseFragment(R.layout.fragment_create_money @RequiresApi(Build.VERSION_CODES.O) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle? + ) { super.onViewCreated(view, savedInstanceState) val publicKey = requireArguments().getString(ARG_PUBLIC_KEY)!! val name = requireArguments().getString(ARG_NAME)!! - val payment_id = requireArguments().getString(ARG_PAYMENT_ID)!! + val paymentId = requireArguments().getString(ARG_PAYMENT_ID)!! val ip = requireArguments().getString(ARG_IP)!! val port = requireArguments().getInt(ARG_PORT) @@ -98,12 +99,16 @@ class CreateMoneyFragment : EurotokenBaseFragment(R.layout.fragment_create_money } } - val pref = requireContext().getSharedPreferences( - EuroTokenMainActivity.EurotokenPreferences.EUROTOKEN_SHARED_PREF_NAME, - Context.MODE_PRIVATE - ) - val demoModeEnabled = pref.getBoolean( - EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, false) + val pref = + requireContext().getSharedPreferences( + EuroTokenMainActivity.EurotokenPreferences.EUROTOKEN_SHARED_PREF_NAME, + Context.MODE_PRIVATE + ) + val demoModeEnabled = + pref.getBoolean( + EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, + false + ) if (demoModeEnabled) { binding.txtBalance.text = @@ -124,10 +129,9 @@ class CreateMoneyFragment : EurotokenBaseFragment(R.layout.fragment_create_money } else if (setPreferred && gateway != null) { GatewayStore.getInstance(requireContext()).setPreferred(gateway) } - getEuroTokenCommunity().connectToGateway(publicKey, ip, port, payment_id) + getEuroTokenCommunity().connectToGateway(publicKey, ip, port, paymentId) findNavController().navigate(R.id.action_createMoneyFragment_to_transactionsFragment) } - } override fun onSaveInstanceState(outState: Bundle) { diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/exchange/DestroyMoneyFragment.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/exchange/DestroyMoneyFragment.kt index f1ce55a31..de7bfccd5 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/exchange/DestroyMoneyFragment.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/exchange/DestroyMoneyFragment.kt @@ -16,7 +16,6 @@ import nl.tudelft.trustchain.eurotoken.databinding.FragmentDestroyMoneyBinding import nl.tudelft.trustchain.eurotoken.ui.EurotokenBaseFragment class DestroyMoneyFragment : EurotokenBaseFragment(R.layout.fragment_destroy_money) { - private var addGateway = false private var setPreferred = false @@ -33,13 +32,16 @@ class DestroyMoneyFragment : EurotokenBaseFragment(R.layout.fragment_destroy_mon ) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle? + ) { super.onViewCreated(view, savedInstanceState) val publicKey = requireArguments().getString(ARG_PUBLIC_KEY)!! val amount = requireArguments().getLong(ARG_AMOUNT) val name = requireArguments().getString(ARG_NAME)!! - val payment_id = requireArguments().getString(ARG_PAYMENT_ID)!! + val paymentId = requireArguments().getString(ARG_PAYMENT_ID)!! val ip = requireArguments().getString(ARG_IP)!! val port = requireArguments().getInt(ARG_PORT) @@ -89,12 +91,16 @@ class DestroyMoneyFragment : EurotokenBaseFragment(R.layout.fragment_destroy_mon } } - val pref = requireContext().getSharedPreferences( - EuroTokenMainActivity.EurotokenPreferences.EUROTOKEN_SHARED_PREF_NAME, - Context.MODE_PRIVATE - ) - val demoModeEnabled = pref.getBoolean( - EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, false) + val pref = + requireContext().getSharedPreferences( + EuroTokenMainActivity.EurotokenPreferences.EUROTOKEN_SHARED_PREF_NAME, + Context.MODE_PRIVATE + ) + val demoModeEnabled = + pref.getBoolean( + EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, + false + ) if (demoModeEnabled) { binding.txtBalance.text = @@ -119,16 +125,11 @@ class DestroyMoneyFragment : EurotokenBaseFragment(R.layout.fragment_destroy_mon publicKey.hexToBytes(), ip, port, - payment_id, + paymentId, amount ) findNavController().navigate(R.id.action_destroyMoneyFragment_to_transactionsFragment) } - - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) } companion object { diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/exchange/ExchangeFragment.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/exchange/ExchangeFragment.kt index 1c63fee30..0868d6373 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/exchange/ExchangeFragment.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/exchange/ExchangeFragment.kt @@ -73,8 +73,8 @@ class ExchangeFragment : EurotokenBaseFragment() { data: Intent? ) { class ConnectionData(json: String) : JSONObject(json) { - val payment_id = this.optString("payment_id") - val public_key = this.optString("public_key") + val paymentId = this.optString("payment_id") + val publicKey = this.optString("public_key") val ip = this.optString("ip") val name = this.optString("name") val port = this.optInt("port") @@ -87,23 +87,23 @@ class ExchangeFragment : EurotokenBaseFragment() { Toast.makeText(requireContext(), connectionData.ip, Toast.LENGTH_LONG).show() if (connectionData.type == "destruction") { val args = Bundle() - args.putString(DestroyMoneyFragment.ARG_PUBLIC_KEY, connectionData.public_key) + args.putString(DestroyMoneyFragment.ARG_PUBLIC_KEY, connectionData.publicKey) args.putString(DestroyMoneyFragment.ARG_NAME, connectionData.name) args.putLong(DestroyMoneyFragment.ARG_AMOUNT, connectionData.amount) args.putInt(DestroyMoneyFragment.ARG_PORT, connectionData.port) args.putString(DestroyMoneyFragment.ARG_IP, connectionData.ip) - args.putString(DestroyMoneyFragment.ARG_PAYMENT_ID, connectionData.payment_id) + args.putString(DestroyMoneyFragment.ARG_PAYMENT_ID, connectionData.paymentId) findNavController().navigate( R.id.action_exchangeFragment_to_destroyMoneyFragment, args ) } else if (connectionData.type == "creation") { val args = Bundle() - args.putString(CreateMoneyFragment.ARG_PUBLIC_KEY, connectionData.public_key) + args.putString(CreateMoneyFragment.ARG_PUBLIC_KEY, connectionData.publicKey) args.putString(CreateMoneyFragment.ARG_NAME, connectionData.name) args.putInt(CreateMoneyFragment.ARG_PORT, connectionData.port) args.putString(CreateMoneyFragment.ARG_IP, connectionData.ip) - args.putString(CreateMoneyFragment.ARG_PAYMENT_ID, connectionData.payment_id) + args.putString(CreateMoneyFragment.ARG_PAYMENT_ID, connectionData.paymentId) findNavController().navigate( R.id.action_exchangeFragment_to_createMoneyFragment, args @@ -241,7 +241,8 @@ class ExchangeFragment : EurotokenBaseFragment() { start: Int, before: Int, count: Int - ) {} + ) { + } } ) } diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/settings/GatewayItemRenderer.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/settings/GatewayItemRenderer.kt index 09bdd97dc..a6c23a554 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/settings/GatewayItemRenderer.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/settings/GatewayItemRenderer.kt @@ -9,9 +9,12 @@ import nl.tudelft.trustchain.eurotoken.databinding.ItemGatewayBinding class GatewayItemRenderer( private val onItemLongClick: (Gateway) -> Unit ) : ItemLayoutRenderer( - GatewayItem::class.java -) { - override fun bindView(item: GatewayItem, view: View) = with(view) { + GatewayItem::class.java + ) { + override fun bindView( + item: GatewayItem, + view: View + ) = with(view) { val binding = ItemGatewayBinding.bind(view) binding.txtName.text = item.gateway.name diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/settings/GatewaysFragment.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/settings/GatewaysFragment.kt index 065d77052..e71d2550a 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/settings/GatewaysFragment.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/settings/GatewaysFragment.kt @@ -23,7 +23,6 @@ import nl.tudelft.trustchain.eurotoken.R import nl.tudelft.trustchain.eurotoken.databinding.FragmentGatewaysBinding import nl.tudelft.trustchain.eurotoken.ui.EurotokenBaseFragment - class GatewaysFragment : EurotokenBaseFragment(R.layout.fragment_gateways) { private val binding by viewBinding(FragmentGatewaysBinding::bind) @@ -40,9 +39,11 @@ class GatewaysFragment : EurotokenBaseFragment(R.layout.fragment_gateways) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - adapter.registerRenderer(GatewayItemRenderer({ - showOptions(it) - })) + adapter.registerRenderer( + GatewayItemRenderer({ + showOptions(it) + }) + ) lifecycleScope.launchWhenResumed { while (isActive) { @@ -54,7 +55,10 @@ class GatewaysFragment : EurotokenBaseFragment(R.layout.fragment_gateways) { } } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle? + ) { super.onViewCreated(view, savedInstanceState) binding.recyclerView.adapter = adapter @@ -66,9 +70,12 @@ class GatewaysFragment : EurotokenBaseFragment(R.layout.fragment_gateways) { ) ) - items.observe(viewLifecycleOwner, Observer { - adapter.updateItems(it) - }) + items.observe( + viewLifecycleOwner, + Observer { + adapter.updateItems(it) + } + ) } private fun showOptions(gateway: Gateway) { diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transactions/TransactionItemRenderer.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transactions/TransactionItemRenderer.kt index ca9917027..f7bda08db 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transactions/TransactionItemRenderer.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transactions/TransactionItemRenderer.kt @@ -21,19 +21,23 @@ class TransactionItemRenderer( private val transactionRepository: TransactionRepository, private val onItemLongClick: (Transaction) -> Unit ) : ItemLayoutRenderer( - TransactionItem::class.java -) { + TransactionItem::class.java + ) { private val dateFormat = SimpleDateFormat.getDateTimeInstance() - override fun bindView(item: TransactionItem, view: View) = with(view) { + override fun bindView( + item: TransactionItem, + view: View + ) = with(view) { val binding = ItemTransactionBinding.bind(view) if (item.transaction.type == TransactionRepository.BLOCK_TYPE_CHECKPOINT) { - binding.txtAmount.text = TransactionRepository.prettyAmount( - getBalanceForBlock( - item.transaction.block, - transactionRepository.trustChainCommunity.database - )!! - ) + binding.txtAmount.text = + TransactionRepository.prettyAmount( + getBalanceForBlock( + item.transaction.block, + transactionRepository.trustChainCommunity.database + )!! + ) binding.imageInOut.setImageResource(R.drawable.ic_baseline_check_circle_outline_24) binding.imageInOut.setColorFilter(ContextCompat.getColor(getContext(), R.color.blue)) } else if (item.transaction.type == TransactionRepository.BLOCK_TYPE_ROLLBACK) { @@ -47,7 +51,12 @@ class TransactionItemRenderer( binding.imageInOut.setColorFilter(ContextCompat.getColor(getContext(), R.color.red)) } else { binding.imageInOut.setImageResource(R.drawable.ic_baseline_incoming_24) - binding.imageInOut.setColorFilter(ContextCompat.getColor(getContext(), R.color.green)) + binding.imageInOut.setColorFilter( + ContextCompat.getColor( + getContext(), + R.color.green + ) + ) } } val peer: PublicKey @@ -58,10 +67,12 @@ class TransactionItemRenderer( TransactionRepository.BLOCK_TYPE_CHECKPOINT ).contains(item.transaction.type) ) { - val gateway: Gateway? = GatewayStore.getInstance(view.context).getGatewayFromPublicKey(peer) + val gateway: Gateway? = + GatewayStore.getInstance(view.context).getGatewayFromPublicKey(peer) binding.txtName.text = gateway?.name ?: "" } else { - val contact: Contact? = ContactStore.getInstance(view.context).getContactFromPublicKey(peer) + val contact: Contact? = + ContactStore.getInstance(view.context).getContactFromPublicKey(peer) binding.txtName.text = contact?.name ?: "" } @@ -74,20 +85,24 @@ class TransactionItemRenderer( if (item.transaction.block.type == TransactionRepository.BLOCK_TYPE_ROLLBACK) { binding.txtType.text = "Rollback of seq: " binding.txtProp.text = - "(${transactionRepository.trustChainCommunity.database.getBlockWithHash((item.transaction.block.transaction[TransactionRepository.KEY_TRANSACTION_HASH] as String).hexToBytes())!!.sequenceNumber})" + "(${transactionRepository.trustChainCommunity.database.getBlockWithHash( + (item.transaction.block.transaction[TransactionRepository.KEY_TRANSACTION_HASH] as String).hexToBytes() + )!!.sequenceNumber})" } else if (item.transaction.block.isProposal) { - val linkedBlock = transactionRepository.trustChainCommunity.database.getLinked( - item.transaction.block) + val linkedBlock = + transactionRepository.trustChainCommunity.database.getLinked( + item.transaction.block + ) if (linkedBlock != null) { binding.txtProp.text = "P+A" - binding.txtProp.setTextColor(ContextCompat.getColor(getContext(), R.color.green)); + binding.txtProp.setTextColor(ContextCompat.getColor(getContext(), R.color.green)) } else { binding.txtProp.text = "P-A" - binding.txtProp.setTextColor(ContextCompat.getColor(getContext(), R.color.red)); + binding.txtProp.setTextColor(ContextCompat.getColor(getContext(), R.color.red)) } } else { binding.txtProp.text = "A" - binding.txtProp.setTextColor(ContextCompat.getColor(getContext(), R.color.green)); + binding.txtProp.setTextColor(ContextCompat.getColor(getContext(), R.color.green)) } setOnLongClickListener { @@ -95,17 +110,17 @@ class TransactionItemRenderer( true } - binding.txtBalance.text = "Balance: " + TransactionRepository.prettyAmount( - getBalanceForBlock( - item.transaction.block, - transactionRepository.trustChainCommunity.database - )!! - ) + binding.txtBalance.text = "Balance: " + + TransactionRepository.prettyAmount( + getBalanceForBlock( + item.transaction.block, + transactionRepository.trustChainCommunity.database + )!! + ) // txtVBalance.text = TransactionRepository.prettyAmount(transactionRepository.getVerifiedBalanceForBlock(item.transaction.block, transactionRepository.trustChainCommunity.database)!!) } override fun getLayoutResourceId(): Int { return R.layout.item_transaction } - } diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transactions/TransactionsFragment.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transactions/TransactionsFragment.kt index cbe579cbb..155aa95a2 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transactions/TransactionsFragment.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transactions/TransactionsFragment.kt @@ -58,17 +58,18 @@ class TransactionsFragment : EurotokenBaseFragment(R.layout.fragment_transaction } fun payBack(transaction: Transaction) { - val success: Boolean = if (transaction.block.isAgreement) { - transactionRepository.sendTransferProposal( - recipient = transaction.block.linkPublicKey, - amount = transaction.amount - ) - } else { - transactionRepository.sendTransferProposal( - recipient = transaction.block.publicKey, - amount = transaction.amount - ) - } + val success: Boolean = + if (transaction.block.isAgreement) { + transactionRepository.sendTransferProposal( + recipient = transaction.block.linkPublicKey, + amount = transaction.amount + ) + } else { + transactionRepository.sendTransferProposal( + recipient = transaction.block.publicKey, + amount = transaction.amount + ) + } if (!success) { return Toast.makeText(requireContext(), "Insufficient balance", Toast.LENGTH_LONG) .show() @@ -118,26 +119,29 @@ class TransactionsFragment : EurotokenBaseFragment(R.layout.fragment_transaction lifecycleScope.launchWhenResumed { while (isActive) { - val ownKey = transactionRepository.trustChainCommunity.myPeer.publicKey val ownContact = ContactStore.getInstance(requireContext()).getContactFromPublicKey(ownKey) // Refresh transactions periodically - val items = transactionRepository.getTransactions().map { block: Transaction -> - TransactionItem( - block - ) - } + val items = + transactionRepository.getTransactions().map { block: Transaction -> + TransactionItem( + block + ) + } adapter.updateItems(items) adapter.notifyDataSetChanged() - val pref = requireContext().getSharedPreferences( - EuroTokenMainActivity.EurotokenPreferences.EUROTOKEN_SHARED_PREF_NAME, - Context.MODE_PRIVATE - ) - val demoModeEnabled = pref.getBoolean( - EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, false - ) + val pref = + requireContext().getSharedPreferences( + EuroTokenMainActivity.EurotokenPreferences.EUROTOKEN_SHARED_PREF_NAME, + Context.MODE_PRIVATE + ) + val demoModeEnabled = + pref.getBoolean( + EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, + false + ) if (demoModeEnabled) { binding.txtBalance.text = @@ -154,32 +158,40 @@ class TransactionsFragment : EurotokenBaseFragment(R.layout.fragment_transaction } } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle? + ) { super.onViewCreated(view, savedInstanceState) - binding.list.adapter = adapter binding.list.layoutManager = LinearLayoutManager(context) binding.list.addItemDecoration(DividerItemDecoration(context, LinearLayout.VERTICAL)) binding.txtOwnPublicKey.text = getTrustChainCommunity().myPeer.publicKey.keyToHash().toHex() - items.observe(viewLifecycleOwner, Observer { - adapter.updateItems(it) - val pref = requireContext().getSharedPreferences( - EuroTokenMainActivity.EurotokenPreferences.EUROTOKEN_SHARED_PREF_NAME, - Context.MODE_PRIVATE - ) - val demoModeEnabled = pref.getBoolean( - EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, false - ) - - if (demoModeEnabled) { - binding.txtBalance.text = - TransactionRepository.prettyAmount(transactionRepository.getMyBalance()) - } else { - binding.txtBalance.text = - TransactionRepository.prettyAmount(transactionRepository.getMyVerifiedBalance()) + items.observe( + viewLifecycleOwner, + Observer { + adapter.updateItems(it) + val pref = + requireContext().getSharedPreferences( + EuroTokenMainActivity.EurotokenPreferences.EUROTOKEN_SHARED_PREF_NAME, + Context.MODE_PRIVATE + ) + val demoModeEnabled = + pref.getBoolean( + EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, + false + ) + + if (demoModeEnabled) { + binding.txtBalance.text = + TransactionRepository.prettyAmount(transactionRepository.getMyBalance()) + } else { + binding.txtBalance.text = + TransactionRepository.prettyAmount(transactionRepository.getMyVerifiedBalance()) + } } - }) + ) } } diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transfer/RequestMoneyFragment.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transfer/RequestMoneyFragment.kt index 9d70945eb..92c0a774d 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transfer/RequestMoneyFragment.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transfer/RequestMoneyFragment.kt @@ -20,16 +20,20 @@ class RequestMoneyFragment : EurotokenBaseFragment(R.layout.fragment_request_mon QRCodeUtils(requireContext()) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle? + ) { super.onViewCreated(view, savedInstanceState) val json = requireArguments().getString(ARG_DATA)!! binding.txtRequestData.text = json lifecycleScope.launch { - val bitmap = withContext(Dispatchers.Default) { - qrCodeUtils.createQR(json) - } + val bitmap = + withContext(Dispatchers.Default) { + qrCodeUtils.createQR(json) + } binding.qr.setImageBitmap(bitmap) } diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transfer/SendMoneyFragment.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transfer/SendMoneyFragment.kt index d92d312ba..16b6e83c1 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transfer/SendMoneyFragment.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transfer/SendMoneyFragment.kt @@ -15,11 +15,9 @@ import nl.tudelft.trustchain.common.util.viewBinding import nl.tudelft.trustchain.eurotoken.EuroTokenMainActivity import nl.tudelft.trustchain.eurotoken.R import nl.tudelft.trustchain.eurotoken.databinding.FragmentSendMoneyBinding -import nl.tudelft.trustchain.eurotoken.db.TrustStore import nl.tudelft.trustchain.eurotoken.ui.EurotokenBaseFragment class SendMoneyFragment : EurotokenBaseFragment(R.layout.fragment_send_money) { - private var addContact = false private val binding by viewBinding(FragmentSendMoneyBinding::bind) @@ -31,7 +29,10 @@ class SendMoneyFragment : EurotokenBaseFragment(R.layout.fragment_send_money) { ) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle? + ) { super.onViewCreated(view, savedInstanceState) val publicKey = requireArguments().getString(ARG_PUBLIC_KEY)!! @@ -67,12 +68,16 @@ class SendMoneyFragment : EurotokenBaseFragment(R.layout.fragment_send_money) { } } - val pref = requireContext().getSharedPreferences( - EuroTokenMainActivity.EurotokenPreferences.EUROTOKEN_SHARED_PREF_NAME, - Context.MODE_PRIVATE - ) - val demoModeEnabled = pref.getBoolean( - EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, false) + val pref = + requireContext().getSharedPreferences( + EuroTokenMainActivity.EurotokenPreferences.EUROTOKEN_SHARED_PREF_NAME, + Context.MODE_PRIVATE + ) + val demoModeEnabled = + pref.getBoolean( + EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, + false + ) if (demoModeEnabled) { binding.txtBalance.text = @@ -90,18 +95,42 @@ class SendMoneyFragment : EurotokenBaseFragment(R.layout.fragment_send_money) { if (trustScore != null) { if (trustScore >= TRUSTSCORE_AVERAGE_BOUNDARY) { - binding.trustScoreWarning.text = getString(R.string.send_money_trustscore_warning_high, trustScore) - binding.trustScoreWarning.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.android_green)) + binding.trustScoreWarning.text = + getString(R.string.send_money_trustscore_warning_high, trustScore) + binding.trustScoreWarning.setBackgroundColor( + ContextCompat.getColor( + requireContext(), + R.color.android_green + ) + ) } else if (trustScore > TRUSTSCORE_LOW_BOUNDARY) { - binding.trustScoreWarning.text = getString(R.string.send_money_trustscore_warning_average, trustScore) - binding.trustScoreWarning.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.metallic_gold)) + binding.trustScoreWarning.text = + getString(R.string.send_money_trustscore_warning_average, trustScore) + binding.trustScoreWarning.setBackgroundColor( + ContextCompat.getColor( + requireContext(), + R.color.metallic_gold + ) + ) } else { - binding.trustScoreWarning.text = getString(R.string.send_money_trustscore_warning_low, trustScore) - binding.trustScoreWarning.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.red)) + binding.trustScoreWarning.text = + getString(R.string.send_money_trustscore_warning_low, trustScore) + binding.trustScoreWarning.setBackgroundColor( + ContextCompat.getColor( + requireContext(), + R.color.red + ) + ) } } else { - binding.trustScoreWarning.text = getString(R.string.send_money_trustscore_warning_no_score) - binding.trustScoreWarning.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.metallic_gold)) + binding.trustScoreWarning.text = + getString(R.string.send_money_trustscore_warning_no_score) + binding.trustScoreWarning.setBackgroundColor( + ContextCompat.getColor( + requireContext(), + R.color.metallic_gold + ) + ) binding.trustScoreWarning.visibility = View.VISIBLE } @@ -113,7 +142,7 @@ class SendMoneyFragment : EurotokenBaseFragment(R.layout.fragment_send_money) { .addContact(key, newName) } val success = transactionRepository.sendTransferProposal(publicKey.hexToBytes(), amount) - if(!success) { + if (!success) { return@setOnClickListener Toast.makeText( requireContext(), "Insufficient balance", @@ -122,7 +151,6 @@ class SendMoneyFragment : EurotokenBaseFragment(R.layout.fragment_send_money) { } findNavController().navigate(R.id.action_sendMoneyFragment_to_transactionsFragment) } - } companion object { diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transfer/TransferFragment.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transfer/TransferFragment.kt index 4f03f3d56..4ff3f5b7d 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transfer/TransferFragment.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/transfer/TransferFragment.kt @@ -47,13 +47,16 @@ class TransferFragment : EurotokenBaseFragment(R.layout.fragment_transfer_euro) val ownKey = transactionRepository.trustChainCommunity.myPeer.publicKey val ownContact = ContactStore.getInstance(requireContext()).getContactFromPublicKey(ownKey) - val pref = requireContext().getSharedPreferences( - EuroTokenMainActivity.EurotokenPreferences.EUROTOKEN_SHARED_PREF_NAME, - Context.MODE_PRIVATE - ) - val demoModeEnabled = pref.getBoolean( - EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, false - ) + val pref = + requireContext().getSharedPreferences( + EuroTokenMainActivity.EurotokenPreferences.EUROTOKEN_SHARED_PREF_NAME, + Context.MODE_PRIVATE + ) + val demoModeEnabled = + pref.getBoolean( + EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, + false + ) if (demoModeEnabled) { binding.txtBalance.text = @@ -74,19 +77,25 @@ class TransferFragment : EurotokenBaseFragment(R.layout.fragment_transfer_euro) } } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle? + ) { super.onViewCreated(view, savedInstanceState) val ownKey = transactionRepository.trustChainCommunity.myPeer.publicKey val ownContact = ContactStore.getInstance(view.context).getContactFromPublicKey(ownKey) - val pref = requireContext().getSharedPreferences( - EuroTokenMainActivity.EurotokenPreferences.EUROTOKEN_SHARED_PREF_NAME, - Context.MODE_PRIVATE - ) - val demoModeEnabled = pref.getBoolean( - EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, false - ) + val pref = + requireContext().getSharedPreferences( + EuroTokenMainActivity.EurotokenPreferences.EUROTOKEN_SHARED_PREF_NAME, + Context.MODE_PRIVATE + ) + val demoModeEnabled = + pref.getBoolean( + EuroTokenMainActivity.EurotokenPreferences.DEMO_MODE_ENABLED, + false + ) if (demoModeEnabled) { binding.txtBalance.text = @@ -173,24 +182,29 @@ class TransferFragment : EurotokenBaseFragment(R.layout.fragment_transfer_euro) return null } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + override fun onActivityResult( + requestCode: Int, + resultCode: Int, + data: Intent? + ) { qrCodeUtils.parseActivityResult(requestCode, resultCode, data)?.let { try { val connectionData = ConnectionData(it) val args = Bundle() - args.putString(SendMoneyFragment.ARG_PUBLIC_KEY, connectionData.public_key) + args.putString(SendMoneyFragment.ARG_PUBLIC_KEY, connectionData.publicKey) args.putLong(SendMoneyFragment.ARG_AMOUNT, connectionData.amount) args.putString(SendMoneyFragment.ARG_NAME, connectionData.name) // Try to send the addresses of the last X transactions to the peer we have just scanned. try { - val peer = findPeer( - defaultCryptoProvider.keyFromPublicBin(connectionData.public_key.hexToBytes()) - .toString() - ) + val peer = + findPeer( + defaultCryptoProvider.keyFromPublicBin(connectionData.publicKey.hexToBytes()) + .toString() + ) if (peer == null) { - logger.warn { "Could not find peer from QR code by public key " + connectionData.public_key } + logger.warn { "Could not find peer from QR code by public key " + connectionData.publicKey } Toast.makeText( requireContext(), "Could not find peer from QR code", @@ -246,12 +260,11 @@ class TransferFragment : EurotokenBaseFragment(R.layout.fragment_transfer_euro) } true - } } class ConnectionData(json: String) : JSONObject(json) { - var public_key = this.optString("public_key") + var publicKey = this.optString("public_key") var amount = this.optLong("amount", -1L) var name = this.optString("name") var type = this.optString("type") @@ -272,44 +285,47 @@ class TransferFragment : EurotokenBaseFragment(R.layout.fragment_transfer_euro) } fun EditText.decimalLimiter(string: String): String { - var amount = getAmount(string) if (amount == 0L) { return "" } - //val amount = string.replace("[^\\d]", "").toLong() + // val amount = string.replace("[^\\d]", "").toLong() return (amount / 100).toString() + "." + (amount % 100).toString().padStart(2, '0') } fun EditText.addDecimalLimiter() { + this.addTextChangedListener( + object : TextWatcher { + override fun afterTextChanged(s: Editable?) { + val str = this@addDecimalLimiter.text!!.toString() + if (str.isEmpty()) return + val str2 = decimalLimiter(str) + + if (str2 != str) { + this@addDecimalLimiter.setText(str2) + val pos = this@addDecimalLimiter.text!!.length + this@addDecimalLimiter.setSelection(pos) + } + } - this.addTextChangedListener(object : TextWatcher { - - override fun afterTextChanged(s: Editable?) { - val str = this@addDecimalLimiter.text!!.toString() - if (str.isEmpty()) return - val str2 = decimalLimiter(str) - - if (str2 != str) { - this@addDecimalLimiter.setText(str2) - val pos = this@addDecimalLimiter.text!!.length - this@addDecimalLimiter.setSelection(pos) + override fun beforeTextChanged( + s: CharSequence?, + start: Int, + count: Int, + after: Int + ) { } - } - override fun beforeTextChanged( - s: CharSequence?, - start: Int, - count: Int, - after: Int - ) { + override fun onTextChanged( + s: CharSequence?, + start: Int, + before: Int, + count: Int + ) {} } - - override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} - }) + ) } } } - diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/trustscores/TrustScoreItem.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/trustscores/TrustScoreItem.kt index 4cf550f4e..0c1af40c8 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/trustscores/TrustScoreItem.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/trustscores/TrustScoreItem.kt @@ -8,8 +8,8 @@ import nl.tudelft.trustchain.eurotoken.entity.TrustScore */ class TrustScoreItem(val trustScore: TrustScore) : Item() { override fun areItemsTheSame(other: Item): Boolean { - return other is TrustScoreItem - && trustScore.pubKey.contentEquals(other.trustScore.pubKey) - && trustScore.trust == other.trustScore.trust + return other is TrustScoreItem && + trustScore.pubKey.contentEquals(other.trustScore.pubKey) && + trustScore.trust == other.trustScore.trust } } diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/trustscores/TrustScoreItemRenderer.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/trustscores/TrustScoreItemRenderer.kt index 50dd64e0b..7a21ac33c 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/trustscores/TrustScoreItemRenderer.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/trustscores/TrustScoreItemRenderer.kt @@ -13,8 +13,10 @@ import nl.tudelft.trustchain.eurotoken.entity.TrustScore class TrustScoreItemRenderer : ItemLayoutRenderer( TrustScoreItem::class.java ) { - - override fun bindView(item: TrustScoreItem, view: View) = with(view) { + override fun bindView( + item: TrustScoreItem, + view: View + ) = with(view) { val binding = ItemTrustscoreBinding.bind(view) binding.txtPubKey.text = item.trustScore.pubKey.toHex() binding.txtTrustScore.text = item.trustScore.trust.toString() + "%" diff --git a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/trustscores/TrustScoresFragment.kt b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/trustscores/TrustScoresFragment.kt index e6ca255a5..b7ade305e 100644 --- a/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/trustscores/TrustScoresFragment.kt +++ b/eurotoken/src/main/java/nl/tudelft/trustchain/eurotoken/ui/trustscores/TrustScoresFragment.kt @@ -16,7 +16,6 @@ import nl.tudelft.trustchain.common.util.viewBinding import nl.tudelft.trustchain.eurotoken.R import nl.tudelft.trustchain.eurotoken.ui.EurotokenBaseFragment import nl.tudelft.trustchain.eurotoken.databinding.FragmentTrustScoresBinding -import nl.tudelft.trustchain.eurotoken.db.TrustStore import nl.tudelft.trustchain.eurotoken.entity.TrustScore /** @@ -39,14 +38,19 @@ class TrustScoresFragment : EurotokenBaseFragment(R.layout.fragment_trust_scores adapter.registerRenderer(TrustScoreItemRenderer()) lifecycleScope.launchWhenResumed { - val items = trustStore.getAllScores().map { trustScore: TrustScore -> TrustScoreItem(trustScore) } + val items = + trustStore.getAllScores() + .map { trustScore: TrustScore -> TrustScoreItem(trustScore) } adapter.updateItems(items) adapter.notifyDataSetChanged() delay(1000L) } } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated( + view: View, + savedInstanceState: Bundle? + ) { super.onViewCreated(view, savedInstanceState) binding.trustScoresRecyclerView.adapter = adapter