diff --git a/app/src/main/java/com/adityapk/zcash/zqwandroid/MainActivity.kt b/app/src/main/java/com/adityapk/zcash/zqwandroid/MainActivity.kt index 82fb0f3..5fbd5f8 100644 --- a/app/src/main/java/com/adityapk/zcash/zqwandroid/MainActivity.kt +++ b/app/src/main/java/com/adityapk/zcash/zqwandroid/MainActivity.kt @@ -2,12 +2,16 @@ package com.adityapk.zcash.zqwandroid import android.annotation.SuppressLint import android.content.Intent +import android.graphics.Typeface import android.net.Uri import android.os.Bundle 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.Toast import com.beust.klaxon.Klaxon import com.beust.klaxon.json @@ -16,9 +20,12 @@ import kotlinx.android.synthetic.main.content_main.* import okhttp3.* import okio.ByteString import java.text.DecimalFormat +import android.widget.TextView -class MainActivity : AppCompatActivity(), TransactionItemFragment.OnFragmentInteractionListener { + + +class MainActivity : AppCompatActivity(), TransactionItemFragment.OnFragmentInteractionListener , UnconfirmedTxItemFragment.OnFragmentInteractionListener{ override fun onFragmentInteraction(uri: Uri) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } @@ -111,10 +118,55 @@ class MainActivity : AppCompatActivity(), TransactionItemFragment.OnFragmentInte balanceSmall.text = balText.substring(balText.length - 4, balText.length) balanceUSD.text = "$ " + DecimalFormat("#,##0.00").format(bal * zPrice) - txList.removeAllViewsInLayout() + addPastTransactions(DataModel.transactions) + } + } + + private fun addPastTransactions(txns: List?) { + txList.removeAllViewsInLayout() + + // If there are no transactions, just return (don't add any headers either) + if (txns.isNullOrEmpty()) + return + + val addTitle = fun(title: String) { + // Add the "Past Transactions" TextView + val tv = TextView(this) + tv.text = title + val params = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT) + params.setMargins(16, 16, 16, 16) + tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f) + tv.layoutParams = params + tv.setTypeface(null, Typeface.BOLD) + txList.addView(tv) + } + + // Split all the transactions into confirmations = 0 and confirmations > 0 + // Unconfirmed first + val unconfirmed = txns.filter { t -> t.confirmations == 0L } + if (unconfirmed.isNotEmpty()) { + //addTitle("Recent Transactions") + val fragTx = supportFragmentManager.beginTransaction() + + for (tx in unconfirmed) { + fragTx.add( + txList.id , + UnconfirmedTxItemFragment.newInstance(Klaxon().toJsonString(tx), ""), + "tag1" + ) + } + fragTx.commit() + } + + // Add all confirmed transactions + val confirmed = txns.filter { t -> t.confirmations > 0L } + if (confirmed.isNotEmpty()) { + addTitle("Recent Transactions") val fragTx = supportFragmentManager.beginTransaction() + var oddeven = "odd" - for (tx in DataModel.transactions.orEmpty()) { + for (tx in confirmed) { fragTx.add( txList.id , TransactionItemFragment.newInstance(Klaxon().toJsonString(tx), oddeven), diff --git a/app/src/main/java/com/adityapk/zcash/zqwandroid/SendActivity.kt b/app/src/main/java/com/adityapk/zcash/zqwandroid/SendActivity.kt index 44acd95..33e3f7d 100644 --- a/app/src/main/java/com/adityapk/zcash/zqwandroid/SendActivity.kt +++ b/app/src/main/java/com/adityapk/zcash/zqwandroid/SendActivity.kt @@ -9,6 +9,7 @@ import android.os.Bundle import android.support.v4.content.ContextCompat import android.support.v7.app.AppCompatActivity import android.text.Editable +import android.text.InputType import android.text.TextWatcher import android.view.inputmethod.InputMethodManager import android.widget.TextView @@ -16,9 +17,6 @@ import com.beust.klaxon.Klaxon import kotlinx.android.synthetic.main.activity_send.* import kotlinx.android.synthetic.main.content_send.* import java.text.DecimalFormat -import android.content.DialogInterface -import android.content.DialogInterface.BUTTON_NEUTRAL -import android.text.InputType class SendActivity : AppCompatActivity() { diff --git a/app/src/main/java/com/adityapk/zcash/zqwandroid/TransactionItemFragment.kt b/app/src/main/java/com/adityapk/zcash/zqwandroid/TransactionItemFragment.kt index 8d5fd2e..9e59ca0 100644 --- a/app/src/main/java/com/adityapk/zcash/zqwandroid/TransactionItemFragment.kt +++ b/app/src/main/java/com/adityapk/zcash/zqwandroid/TransactionItemFragment.kt @@ -79,11 +79,6 @@ class TransactionItemFragment : Fragment() { return view } - // TODO: Rename method, update argument and hook method into UI event - fun onButtonPressed(uri: Uri) { - listener?.onFragmentInteraction(uri) - } - override fun onAttach(context: Context) { super.onAttach(context) if (context is OnFragmentInteractionListener) { diff --git a/app/src/main/java/com/adityapk/zcash/zqwandroid/TxDetailsActivity.kt b/app/src/main/java/com/adityapk/zcash/zqwandroid/TxDetailsActivity.kt index b201eaa..14bb69c 100644 --- a/app/src/main/java/com/adityapk/zcash/zqwandroid/TxDetailsActivity.kt +++ b/app/src/main/java/com/adityapk/zcash/zqwandroid/TxDetailsActivity.kt @@ -40,7 +40,7 @@ class TxDetailsActivity : AppCompatActivity() { txtDateTime.text = "" btnExternal.text = "Confirm and Send" } else { - txtType.text = tx?.type?.capitalize() + 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)) } diff --git a/app/src/main/java/com/adityapk/zcash/zqwandroid/UnconfirmedTxItemFragment.kt b/app/src/main/java/com/adityapk/zcash/zqwandroid/UnconfirmedTxItemFragment.kt new file mode 100644 index 0000000..7b50aa4 --- /dev/null +++ b/app/src/main/java/com/adityapk/zcash/zqwandroid/UnconfirmedTxItemFragment.kt @@ -0,0 +1,120 @@ +package com.adityapk.zcash.zqwandroid + +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.support.constraint.ConstraintLayout +import android.support.v4.app.Fragment +import android.support.v4.content.ContextCompat +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import com.beust.klaxon.Klaxon +import java.text.DateFormat +import java.text.DecimalFormat +import java.util.* + + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Activities that contain this fragment must implement the + * [UnconfirmedTxItemFragment.OnFragmentInteractionListener] interface + * to handle interaction events. + * Use the [UnconfirmedTxItemFragment.newInstance] factory method to + * create an instance of this fragment. + * + */ +class UnconfirmedTxItemFragment : Fragment() { + // TODO: Rename and change types of parameters + private var tx: DataModel.TransactionItem? = null + private var param2: String? = null + private var listener: OnFragmentInteractionListener? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + tx = Klaxon().parse(it.getString(ARG_PARAM1)) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + val view = inflater.inflate(R.layout.fragment_unconfirmed_tx_item, container, false) + + view.findViewById(R.id.layoutUnconfirmedItem).setOnClickListener { v -> + val intent = Intent(activity, TxDetailsActivity::class.java) + intent.putExtra("EXTRA_TXDETAILS", Klaxon().toJsonString(tx)) + startActivity(intent) + } + + val txt = view.findViewById(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) + + return view + } + + + override fun onAttach(context: Context) { + super.onAttach(context) + if (context is OnFragmentInteractionListener) { + listener = context + } else { + throw RuntimeException(context.toString() + " must implement OnFragmentInteractionListener") + } + } + + override fun onDetach() { + super.onDetach() + listener = null + } + + /** + * This interface must be implemented by activities that contain this + * fragment to allow an interaction in this fragment to be communicated + * to the activity and potentially other fragments contained in that + * activity. + * + * + * See the Android Training lesson [Communicating with Other Fragments] + * (http://developer.android.com/training/basics/fragments/communicating.html) + * for more information. + */ + interface OnFragmentInteractionListener { + // TODO: Update argument type and name + fun onFragmentInteraction(uri: Uri) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment UnconfirmedTxItemFragment. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + UnconfirmedTxItemFragment().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml index 2c79433..2eb9408 100644 --- a/app/src/main/res/layout/content_main.xml +++ b/app/src/main/res/layout/content_main.xml @@ -15,8 +15,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:id="@+id/imageView2" app:layout_constraintHorizontal_bias="0.524" - app:layout_constraintBottom_toTopOf="@id/pastTransactionsLayout" - android:layout_marginBottom="8dp" app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintTop_toTopOf="parent"/> - - - - + android:fillViewport="true" android:clipToPadding="false" + android:layout_marginTop="8dp" app:layout_constraintTop_toBottomOf="@+id/imageView3"> diff --git a/app/src/main/res/layout/fragment_unconfirmed_tx_item.xml b/app/src/main/res/layout/fragment_unconfirmed_tx_item.xml new file mode 100644 index 0000000..0a48731 --- /dev/null +++ b/app/src/main/res/layout/fragment_unconfirmed_tx_item.xml @@ -0,0 +1,41 @@ + + + + + + + + + \ No newline at end of file