Browse Source

Add connection logic

connman
adityapk00 6 years ago
parent
commit
5c4cfa8d26
  1. 6
      app/src/main/java/com/adityapk/zcash/zqwandroid/DataModel.kt
  2. 177
      app/src/main/java/com/adityapk/zcash/zqwandroid/MainActivity.kt
  3. 2
      app/src/main/java/com/adityapk/zcash/zqwandroid/UnconfirmedTxItemFragment.kt
  4. 61
      app/src/main/res/layout/content_main.xml

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

@ -12,6 +12,11 @@ object DataModel {
var mainResponseData : MainResponse? = null
var transactions : List<TransactionItem> ?= null
fun clear() {
mainResponseData = null
transactions = null
}
fun parseResponse(response: String) {
val json = Parser.default().parse(StringBuilder(response)) as JsonObject
when (json.string("command")) {
@ -31,4 +36,5 @@ object DataModel {
}
}
var connectionURL: String? = null
}

177
app/src/main/java/com/adityapk/zcash/zqwandroid/MainActivity.kt

@ -5,13 +5,14 @@ import android.content.Intent
import android.graphics.Typeface
import android.net.Uri
import android.os.Bundle
import android.support.constraint.ConstraintLayout
import android.support.v7.app.AppCompatActivity
import android.util.Log
import android.util.TypedValue
import android.view.Menu
import android.view.MenuItem
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.ScrollView
import android.widget.Toast
import com.beust.klaxon.Klaxon
import com.beust.klaxon.json
@ -30,95 +31,123 @@ class MainActivity : AppCompatActivity(), TransactionItemFragment.OnFragmentInte
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
private inner class EchoWebSocketListener : WebSocketListener() {
private val NORMAL_CLOSURE_STATUS = 1000
private val TAG = "MainActivity";
override fun onOpen(webSocket: WebSocket, response: Response) {
Log.d(TAG, "Opened Websocket")
}
override fun onMessage(webSocket: WebSocket?, text: String?) {
DataModel.parseResponse(text!!)
updateUI()
Log.i(TAG, "Recieving $text")
}
override fun onMessage(webSocket: WebSocket?, bytes: ByteString) {
Log.i(TAG, "Receiving bytes : " + bytes.hex())
}
override fun onClosing(webSocket: WebSocket, code: Int, reason: String?) {
webSocket.close(NORMAL_CLOSURE_STATUS, null)
Log.i(TAG,"Closing : $code / $reason")
}
override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
Log.e(TAG,"Failed $t")
}
}
var client: OkHttpClient? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
title = "Zec QT Wallet - Connected"
title = "Zec QT Wallet"
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
// When creating, clear all the data first
setMainStatus("")
fab1.setOnClickListener {view ->
val intent = Intent(this, ReceiveActivity::class.java)
startActivity(intent)
closeFABMenu()
}
fab2.setOnClickListener {view ->
fab2.setOnClickListener {
val intent = Intent(this, SendActivity::class.java)
startActivity(intent)
closeFABMenu()
}
fab.setOnClickListener { view ->
if(!isFABOpen){
showFABMenu()
} else {
closeFABMenu()
}
fab.setOnClickListener {
if(!isFABOpen){ showFABMenu() } else { closeFABMenu() }
}
btnConnect.setOnClickListener {
DataModel.connectionURL = "ws://10.0.2.2:8237"
makeConnection()
makeAPICalls()
}
client = OkHttpClient()
makeConnection()
makeAPICalls()
balanceUSD.setOnClickListener { view ->
Toast.makeText(applicationContext, "1 ZEC = $${DecimalFormat("#.##").format(DataModel.mainResponseData?.zecprice)}", Toast.LENGTH_LONG).show()
txtMainBalanceUSD.setOnClickListener {
Toast.makeText(applicationContext, "1 ZEC = $${DecimalFormat("#.##")
.format(DataModel.mainResponseData?.zecprice)}", Toast.LENGTH_LONG).show()
}
updateUI()
}
private fun makeAPICalls() {
val request = Request.Builder().url("ws://10.0.2.2:8237").build()
private var ws : WebSocket? = null
enum class ConnectionStatus(val status: Int) {
DISCONNECTED(1),
CONNECTING(2),
CONNECTED(3)
}
private var connStatus: ConnectionStatus = ConnectionStatus.DISCONNECTED
// Attempt a connection to the server. If there is no saved connection, we'll set the connection status
// to None
private fun makeConnection() {
if (connStatus == ConnectionStatus.CONNECTED || connStatus == ConnectionStatus.CONNECTING) {
return
}
if (DataModel.connectionURL.isNullOrBlank()) {
return
}
val client = OkHttpClient()
val request = Request.Builder().url(DataModel.connectionURL).build()
val listener = EchoWebSocketListener()
val ws = client?.newWebSocket(request, listener)
ws = client.newWebSocket(request, listener)
}
private fun makeAPICalls() {
ws?.send(json { obj("command" to "getInfo") }.toJsonString())
ws?.send(json { obj("command" to "getTransactions")}.toJsonString())
}
private fun setMainStatus(status: String) {
lblBalance.text = ""
txtMainBalanceUSD.text = ""
txtMainBalance.text = status
balanceSmall.text = ""
}
@SuppressLint("SetTextI18n")
private fun updateUI() {
runOnUiThread {
val bal = DataModel.mainResponseData?.balance ?: 0.0
val zPrice = DataModel.mainResponseData?.zecprice ?: 0.0
val balText = DecimalFormat("#0.00000000").format(bal)
balance.text = "ZEC " + balText.substring(0, balText.length - 4)
balanceSmall.text = balText.substring(balText.length - 4, balText.length)
balanceUSD.text = "$ " + DecimalFormat("#,##0.00").format(bal * zPrice)
addPastTransactions(DataModel.transactions)
when (connStatus) {
ConnectionStatus.DISCONNECTED -> {
setMainStatus("No Connection")
scrollViewTxns.visibility = ScrollView.GONE
layoutConnect.visibility = ConstraintLayout.VISIBLE
}
ConnectionStatus.CONNECTING -> {
setMainStatus("Connecting...")
scrollViewTxns.visibility = ScrollView.VISIBLE
layoutConnect.visibility = ConstraintLayout.GONE
}
ConnectionStatus.CONNECTED -> {
scrollViewTxns.visibility = ScrollView.VISIBLE
layoutConnect.visibility = ConstraintLayout.GONE
if (DataModel.mainResponseData == null) {
setMainStatus("Loading...")
} else {
val bal = DataModel.mainResponseData?.balance ?: 0.0
val zPrice = DataModel.mainResponseData?.zecprice ?: 0.0
val balText = DecimalFormat("#0.00000000").format(bal)
lblBalance.text = "Balance"
txtMainBalance.text = "ZEC " + balText.substring(0, balText.length - 4)
balanceSmall.text = balText.substring(balText.length - 4, balText.length)
txtMainBalanceUSD.text = "$ " + DecimalFormat("#,##0.00").format(bal * zPrice)
addPastTransactions(DataModel.transactions)
}
}
}
}
}
@ -209,4 +238,42 @@ class MainActivity : AppCompatActivity(), TransactionItemFragment.OnFragmentInte
else -> super.onOptionsItemSelected(item)
}
}
private fun disconnected() {
connStatus = ConnectionStatus.DISCONNECTED
DataModel.clear()
updateUI()
}
private inner class EchoWebSocketListener : WebSocketListener() {
private val NORMAL_CLOSURE_STATUS = 1000
private val TAG = "MainActivity"
override fun onOpen(webSocket: WebSocket, response: Response) {
Log.d(TAG, "Opened Websocket")
connStatus = ConnectionStatus.CONNECTED
}
override fun onMessage(webSocket: WebSocket?, text: String?) {
DataModel.parseResponse(text!!)
updateUI()
Log.i(TAG, "Recieving $text")
}
override fun onMessage(webSocket: WebSocket?, bytes: ByteString) {
Log.i(TAG, "Receiving bytes : " + bytes.hex())
}
override fun onClosing(webSocket: WebSocket, code: Int, reason: String?) {
webSocket.close(NORMAL_CLOSURE_STATUS, null)
Log.i(TAG,"Closing : $code / $reason")
disconnected()
}
override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
Log.e(TAG,"Failed $t")
disconnected()
}
}
}

2
app/src/main/java/com/adityapk/zcash/zqwandroid/UnconfirmedTxItemFragment.kt

@ -62,7 +62,7 @@ class UnconfirmedTxItemFragment : Fragment() {
val txt = view.findViewById<TextView>(R.id.txtUnconfirmedTx)
txt.text = (if (tx?.type == "send") "Sending" else "Receiving") +
" ZEC " + (if (tx?.type == "send") "" else "+") +
DecimalFormat("#0.00########").format(tx?.amount?.toDoubleOrNull() ?: 0.0)
DecimalFormat("#0.00########").format(kotlin.math.abs(tx?.amount?.toDoubleOrNull() ?: 0.0))
return view
}

61
app/src/main/res/layout/content_main.xml

@ -20,28 +20,37 @@
android:text="Balance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView" android:layout_marginTop="24dp"
android:id="@+id/lblBalance" android:layout_marginTop="24dp"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="16dp" app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="16dp"
app:layout_constraintBottom_toTopOf="@+id/balance" android:textColor="@color/light_grey"/>
app:layout_constraintBottom_toTopOf="@+id/txtMainBalance" android:textColor="@color/light_grey"/>
<TextView
android:text="ZEC 0.0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"
android:id="@+id/balance"
app:layout_constraintBottom_toTopOf="@+id/balanceUSD"
android:id="@+id/txtMainBalance"
app:layout_constraintBottom_toTopOf="@+id/txtMainBalanceUSD"
android:textSize="30sp"
app:layout_constraintTop_toBottomOf="@+id/textView" android:textColor="@android:color/white"/>
app:layout_constraintTop_toBottomOf="@+id/lblBalance" android:textColor="@android:color/white"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="21dp"
android:id="@+id/balanceSmall"
android:text="0000"
android:textSize="14sp" android:textColor="@android:color/white"
app:layout_constraintBaseline_toBaselineOf="@+id/txtMainBalance"
app:layout_constraintStart_toEndOf="@+id/txtMainBalance"
android:layout_marginStart="2dp"/>
<TextView
android:text="$ 0.0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/balanceUSD"
android:id="@+id/txtMainBalanceUSD"
app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="154dp"
app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="154dp"
app:layout_constraintTop_toBottomOf="@+id/balance"
app:layout_constraintTop_toBottomOf="@+id/txtMainBalance"
android:textColor="@color/light_grey" app:layout_constraintBottom_toBottomOf="@+id/imageView2"
android:layout_marginBottom="32dp"/>
<ImageView
@ -54,7 +63,7 @@
<ScrollView
android:layout_width="0dp"
android:layout_height="0dp" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" android:id="@+id/scrollView3"
app:layout_constraintStart_toStartOf="parent" android:id="@+id/scrollViewTxns"
app:layout_constraintBottom_toBottomOf="parent" android:layout_marginBottom="16dp"
android:fillViewport="true" android:clipToPadding="false"
android:layout_marginTop="8dp" app:layout_constraintTop_toBottomOf="@+id/imageView3">
@ -62,12 +71,32 @@
android:layout_height="wrap_content"
android:id="@+id/txList" android:orientation="vertical"/>
</ScrollView>
<TextView
android:layout_width="wrap_content"
android:layout_height="21dp"
android:id="@+id/balanceSmall"
android:text="0000"
android:textSize="14sp" android:textColor="@android:color/white"
app:layout_constraintBaseline_toBaselineOf="@+id/balance" app:layout_constraintStart_toEndOf="@+id/balance"
android:layout_marginStart="2dp"/>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@+id/imageView3"
android:layout_marginBottom="32dp" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="32dp" android:layout_marginStart="8dp" android:layout_marginEnd="8dp"
android:id="@+id/layoutConnect">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content" app:srcCompat="@mipmap/ic_launcher"
android:id="@+id/imageView5" app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="8dp" app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintVertical_bias="0.35000002"/>
<Button
android:text="Scan QR Code"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnConnect" app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="8dp" app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp"
app:layout_constraintTop_toBottomOf="@+id/imageView5"/>
</android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>
Loading…
Cancel
Save