Browse Source

Reply To Address

chat
adityapk00 5 years ago
parent
commit
ffc4a74a84
  1. 8
      app/src/main/java/com/adityapk/zcash/zqwandroid/DataModel.kt
  2. 36
      app/src/main/java/com/adityapk/zcash/zqwandroid/SendActivity.kt
  3. 70
      app/src/main/java/com/adityapk/zcash/zqwandroid/TxDetailsActivity.kt
  4. 10
      app/src/main/res/menu/menu_txdetails.xml
  5. 2
      build.gradle

8
app/src/main/java/com/adityapk/zcash/zqwandroid/DataModel.kt

@ -153,7 +153,10 @@ object DataModel {
}
}
fun isValidAddress(a: String) : Boolean {
fun isValidAddress(a: String?) : Boolean {
if (a == null)
return false
return if (isTestnet()) {
Regex("^ztestsapling[a-z0-9]{76}", RegexOption.IGNORE_CASE).matches(a) ||
Regex("^tm[a-z0-9]{33}$", RegexOption.IGNORE_CASE).matches(a)
@ -161,7 +164,10 @@ object DataModel {
Regex("^z[a-z0-9]{77}$", RegexOption.IGNORE_CASE).matches(a) ||
Regex("^t[a-z0-9]{34}$", RegexOption.IGNORE_CASE).matches(a)
}
}
fun isSaplingAddress(a: String?) : Boolean {
return a?.startsWith("zs") ?: false || a?.startsWith("ztestsapling") ?: false
}
private fun decrypt(nonceHex: String, encHex: String) : String {

36
app/src/main/java/com/adityapk/zcash/zqwandroid/SendActivity.kt

@ -37,6 +37,12 @@ class SendActivity : AppCompatActivity() {
txtValidAddress.text = ""
txtSendCurrencySymbol.text = ""
if (intent.getStringExtra("address") != null)
sendAddress.setText(intent.getStringExtra("address"), TextView.BufferType.EDITABLE)
if (intent.getDoubleExtra("amount", -1.0) > 0)
setAmountUSD(intent.getDoubleExtra("amount", 0.0))
imageButton.setOnClickListener { view ->
val intent = Intent(this, QrReaderActivity::class.java)
intent.putExtra("REQUEST_CODE", QrReaderActivity.REQUEST_ADDRESS)
@ -91,8 +97,8 @@ class SendActivity : AppCompatActivity() {
}
})
txtSendMemo.setImeOptions(EditorInfo.IME_ACTION_DONE);
txtSendMemo.setRawInputType(InputType.TYPE_CLASS_TEXT);
txtSendMemo.imeOptions = EditorInfo.IME_ACTION_DONE
txtSendMemo.setRawInputType(InputType.TYPE_CLASS_TEXT)
txtSendMemo.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
@ -194,6 +200,28 @@ class SendActivity : AppCompatActivity() {
private fun Double.format(digits: Int): String? = java.lang.String.format("%.${digits}f", this)
private fun setAmountUSD(amt: Double) {
amountUSD.setText(amt.format(2))
setAmount(amt / (DataModel.mainResponseData?.zecprice ?: 0.0))
}
private fun setAmount(amt: Double?) {
val zprice = DataModel.mainResponseData?.zecprice
if (amt == null) {
txtSendCurrencySymbol.text = "" // Let the placeholder show the "$" sign
} else {
txtSendCurrencySymbol.text = "$"
}
if (amt == null || zprice == null)
amountZEC.text = "${DataModel.mainResponseData?.tokenName} 0.0"
else
amountZEC.text =
"${DataModel.mainResponseData?.tokenName} " + DecimalFormat("#.########").format(amt)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when (requestCode) {
QrReaderActivity.REQUEST_ADDRESS -> {
@ -204,9 +232,7 @@ class SendActivity : AppCompatActivity() {
val amt = data.data?.getQueryParameter("amt") ?:
data.data?.getQueryParameter("amount")
if (amt != null) {
val amtUsd = amt.toDouble() * (DataModel.mainResponseData?.zecprice ?: 0.0)
amountUSD.setText(amtUsd.format(2))
amountZEC.text = "${DataModel.mainResponseData?.tokenName} $amt"
setAmountUSD(amt.toDouble())
}
val memo = data.data?.getQueryParameter("memo")

70
app/src/main/java/com/adityapk/zcash/zqwandroid/TxDetailsActivity.kt

@ -14,6 +14,12 @@ import java.util.*
import android.content.Intent
import android.net.Uri
import android.support.constraint.ConstraintLayout
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.R.attr.right
class TxDetailsActivity : AppCompatActivity() {
@ -43,6 +49,13 @@ class TxDetailsActivity : AppCompatActivity() {
txtType.text = tx?.type?.capitalize() + if (tx?.confirmations == 0L) " (Unconfirmed Tx)" else ""
txtDateTime.text = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM)
.format(Date((tx?.datetime ?: 0) * 1000))
// Check if there is a reply-to address
if (getReplyToAddress(tx?.memo) != null) {
btnExternal.text = "Reply"
} else {
btnExternal.visibility = View.GONE
}
}
txtAddress.text = if (tx?.addr.isNullOrBlank()) "(Shielded Address)" else tx?.addr
@ -64,21 +77,56 @@ class TxDetailsActivity : AppCompatActivity() {
if (tx?.type == "confirm") {
val data = Intent()
data.data = Uri.parse(Klaxon().toJsonString(tx))
setResult(Activity.RESULT_OK, data);
setResult(Activity.RESULT_OK, data)
finish()
} else {
val uri = if (DataModel.isTestnet()) {
"https://explorer.testnet.z.cash/tx/"
} else {
"https://explorer.zcha.in/transactions/"
} + tx?.txid
val browserIntent = Intent(
Intent.ACTION_VIEW,
Uri.parse(uri)
)
startActivity(browserIntent)
val intent = Intent(this, SendActivity::class.java)
intent.putExtra("address", getReplyToAddress(tx?.memo))
intent.putExtra("amount", 0.01)
startActivity(intent)
}
}
}
private fun getReplyToAddress(memo: String?): String? {
if (memo == null)
return null
val lastPost = memo.trim().lastIndexOfAny("\r\n".toCharArray())
val lastWord = memo.substring(lastPost + 1)
return if (DataModel.isValidAddress(lastWord) && DataModel.isSaplingAddress(lastWord))
lastWord
else
null
}
private fun viewOnExplorer(txid: String?) {
val uri = if (DataModel.isTestnet()) {
"https://explorer.testnet.z.cash/tx/"
} else {
"https://explorer.zcha.in/transactions/"
} + txid
val browserIntent = Intent(
Intent.ACTION_VIEW,
Uri.parse(uri)
)
startActivity(browserIntent)
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_txdetails, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
return when (item?.itemId) {
R.id.action_view -> {
viewOnExplorer(tx?.txid)
return true
}
else -> super.onOptionsItemSelected(item)
}
}

10
app/src/main/res/menu/menu_txdetails.xml

@ -0,0 +1,10 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:compat="http://schemas.android.com/apk/res-auto"
tools:context="com.adityapk.zcash.zqwandroid.TxDetailsActivity">
<item android:id="@+id/action_view"
android:title="View"
android:orderInCategory="100"
app:showAsAction="ifRoom" android:icon="@android:drawable/ic_menu_view"/>
</menu>

2
build.gradle

@ -7,7 +7,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.1'
classpath 'com.android.tools.build:gradle:3.3.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong

Loading…
Cancel
Save