Browse Source

Merge pull request #66 from N1CK145/chat

Chat
chat v0.6.0-beta0
Duke Leto 4 years ago
committed by GitHub
parent
commit
9195d17536
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 44
      app/src/main/java/org/myhush/silentdragon/Addressbook.kt
  2. 2
      app/src/main/java/org/myhush/silentdragon/DataModel.kt
  3. 89
      app/src/main/java/org/myhush/silentdragon/MainActivity.kt
  4. 2
      app/src/main/java/org/myhush/silentdragon/SendActivity.kt
  5. 4
      app/src/main/java/org/myhush/silentdragon/chat/AddContactActivity.kt
  6. 27
      app/src/main/java/org/myhush/silentdragon/chat/Addressbook.kt
  7. 19
      app/src/main/java/org/myhush/silentdragon/chat/ChatActivity.kt
  8. 4
      app/src/main/java/org/myhush/silentdragon/chat/ChatItemFragment.kt
  9. 28
      app/src/main/java/org/myhush/silentdragon/chat/ConversationActivity.kt
  10. 4
      app/src/main/java/org/myhush/silentdragon/chat/Message.kt
  11. 3
      app/src/main/java/org/myhush/silentdragon/conversation_item_recive.kt
  12. 3
      app/src/main/java/org/myhush/silentdragon/conversation_item_send.kt
  13. 17
      app/src/main/res/layout/activity_conversation.xml
  14. 1
      app/src/main/res/layout/fragment_chat_item.xml
  15. 2
      app/src/main/res/layout/fragment_conversation_item_recive.xml

44
app/src/main/java/org/myhush/silentdragon/Addressbook.kt

@ -0,0 +1,44 @@
package org.myhush.silentdragon
import org.myhush.silentdragon.chat.Message
object Addressbook {
class Contact {
var nickname = ""
var addressIn = ""
var addressOut = ""
val messageList = ArrayList<Message>()
constructor(nickname: String, addressIn: String, addressOut: String) {
this.nickname = nickname
this.addressIn = addressIn
this.addressOut = addressOut
}
}
val contactList = ArrayList<Contact>()
fun addContact(nickname: String, addressIn: String, addressOut: String) {
contactList.add(Contact(nickname, addressIn, addressOut))
}
fun findContactByInAddress(address: String): Contact? {
contactList.forEach {
if(it.addressIn == address)
return it
}
return null
}
fun findContactByOutAddress(address: String): Contact? {
contactList.forEach {
if (it.addressOut == address)
return it
}
return null
}
fun clear() {
contactList.clear()
}
}

2
app/src/main/java/org/myhush/silentdragon/DataModel.kt

@ -10,6 +10,7 @@ import com.beust.klaxon.json
import okhttp3.WebSocket
import org.libsodium.jni.NaCl
import org.libsodium.jni.Sodium
import org.myhush.silentdragon.chat.Message
import java.math.BigInteger
object DataModel {
@ -20,6 +21,7 @@ object DataModel {
class TransactionItem(val type: String, val datetime: Long, val amount: String, val memo: String?,
val addr: String, val txid: String?, val confirmations: Long)
var mainResponseData : MainResponse? = null
var transactions : List<TransactionItem>? = null

89
app/src/main/java/org/myhush/silentdragon/MainActivity.kt

@ -25,6 +25,8 @@ import kotlinx.android.synthetic.main.content_main.*
import org.myhush.silentdragon.DataModel.ConnectionStatus
import org.myhush.silentdragon.DataModel.connStatus
import org.myhush.silentdragon.chat.ChatActivity
import org.myhush.silentdragon.chat.Message
import org.myhush.silentdragon.chat.MessageType
import java.text.DecimalFormat
@ -75,10 +77,10 @@ class MainActivity : AppCompatActivity(),
if(DataModel.selectedCurrency == "BTC")
Toast.makeText(applicationContext, "1 HUSH = ${DataModel.currencySymbols[DataModel.selectedCurrency]}${DecimalFormat(" #,##0.00000000")
.format(DataModel.currencyValues[DataModel.selectedCurrency])}", Toast.LENGTH_LONG).show()
else(
else
Toast.makeText(applicationContext, "1 HUSH = ${DataModel.currencySymbols[DataModel.selectedCurrency]}${DecimalFormat("#,##0.00")
.format(DataModel.currencyValues[DataModel.selectedCurrency])}", Toast.LENGTH_LONG).show()
)
.format(DataModel.currencyValues[DataModel.selectedCurrency])}", Toast.LENGTH_LONG).show()
}
bottomNav.setOnNavigationItemSelectedListener {
@ -108,6 +110,18 @@ class MainActivity : AppCompatActivity(),
loadSharedPref()
updateUI(false)
/*///////////////////////////
// CREATE SAMPLE CONTACTS //
Addressbook.clear()
Addressbook.addContact("", "N1CK145", "zN1CK145")
Addressbook.addContact("", "Denio", "zDenio")
Addressbook.addContact("", "Max Mustermann", "zMaxMust")
// //
/////////////////////////// */
}
private fun loadSharedPref() {
@ -214,6 +228,11 @@ class MainActivity : AppCompatActivity(),
runOnUiThread {
val fragTx = supportFragmentManager.beginTransaction()
// clear past messages
txns?.forEach {
Addressbook.findContactByInAddress(it.addr)?.messageList?.clear()
}
for (fr in supportFragmentManager.fragments) {
fragTx.remove(fr)
}
@ -226,19 +245,37 @@ class MainActivity : AppCompatActivity(),
return@runOnUiThread
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
val fixAdd= "zs12ehfu3pzj23z88up5wefn2psl5akc3m3ctpnmxmyxm4qx3vghlnq98dnu7sv0hdqgn3e20jq2rr"
val fixName = "Netterdon"
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Split all the transactions into confirmations = 0 and confirmations > 0
// Unconfirmed first
val unconfirmed = txns.filter { t -> t.confirmations == 0L }
if (unconfirmed.isNotEmpty()) {
for (tx in unconfirmed) {
fragTx.add(
txList.id ,
UnconfirmedTxItemFragment.newInstance(
Klaxon().toJsonString(tx),
""
),
"tag1"
)
if(tx.memo?.length == 0){
fragTx.add(
txList.id ,
UnconfirmedTxItemFragment.newInstance(
Klaxon().toJsonString(tx),
""
),
"tag1"
)
} else {
// test if contact exists
if(Addressbook.findContactByInAddress(tx.addr) == null)
Addressbook.addContact(fixName, tx.addr, fixAdd)
// add message
if(tx.type == "send")
Addressbook.findContactByInAddress(tx.addr)!!.messageList.add(Message(tx.addr, tx, MessageType.SEND))
else
Addressbook.findContactByInAddress(tx.addr)!!.messageList.add(Message(tx.addr, tx, MessageType.RECIEVE))
}
}
}
@ -247,15 +284,27 @@ class MainActivity : AppCompatActivity(),
if (confirmed.isNotEmpty()) {
var oddeven = "odd"
for (tx in confirmed) {
fragTx.add(
txList.id,
TransactionItemFragment.newInstance(
Klaxon().toJsonString(tx),
oddeven
),
"tag1"
)
oddeven = if (oddeven == "odd") "even" else "odd"
if(tx.memo?.length == 0){
fragTx.add(
txList.id,
TransactionItemFragment.newInstance(
Klaxon().toJsonString(tx),
oddeven
),
"tag1"
)
oddeven = if (oddeven == "odd") "even" else "odd"
} else {
// test if contact exists
if(Addressbook.findContactByInAddress(tx.addr) == null)
Addressbook.addContact(fixName, tx.addr, fixAdd)
// add message
if(tx.type == "send")
Addressbook.findContactByInAddress(tx.addr)!!.messageList.add(Message(tx.addr, tx, MessageType.SEND))
else
Addressbook.findContactByInAddress(tx.addr)!!.messageList.add(Message(tx.addr, tx, MessageType.RECIEVE))
}
}
}
fragTx.commitAllowingStateLoss()

2
app/src/main/java/org/myhush/silentdragon/SendActivity.kt

@ -67,9 +67,7 @@ class SendActivity : AppCompatActivity() {
if (DataModel.selectedCurrency == "BTC")
amountUSD.text = "${DataModel.currencySymbols[DataModel.selectedCurrency]} " + DecimalFormat("0.00000000").format(0)
else
{
amountUSD.text = "${DataModel.currencySymbols[DataModel.selectedCurrency]} " + DecimalFormat("0.00").format(0)
}
textViewFee.text = DecimalFormat("0.0000").format(0.0001) + " HUSH"

4
app/src/main/java/org/myhush/silentdragon/chat/AddContactActivity.kt

@ -4,6 +4,7 @@ import android.app.AlertDialog
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_add_contact.*
import org.myhush.silentdragon.Addressbook
import org.myhush.silentdragon.R
class AddContactActivity : AppCompatActivity() {
@ -18,7 +19,8 @@ class AddContactActivity : AppCompatActivity() {
var fullname = editText_FullName.text.toString()
var zAddr = editTextZAddress.text.toString()
Addressbook.contactList.add(Addressbook.Contact(fullname, nickName, zAddr))
Addressbook.addContact(fullname, nickName, zAddr)
this.finish()
}
}

27
app/src/main/java/org/myhush/silentdragon/chat/Addressbook.kt

@ -1,27 +0,0 @@
package org.myhush.silentdragon.chat
object Addressbook {
class Contact {
var addressList: ArrayList<String> = ArrayList()
val messageList: ArrayList<Message> = ArrayList()
var fullname = ""
var nickname = ""
constructor(fullname: String, nickname: String){
this.fullname = fullname
this.nickname = nickname
}
constructor(fullname: String, nickname: String, address: String){
this.fullname = fullname
this.nickname = nickname
this.addressList.add(address)
}
constructor(fullname: String, nickname: String, addressList: ArrayList<String>){
this.fullname = fullname
this.nickname = nickname
this.addressList = addressList
}
}
val contactList = ArrayList<Contact>()
}

19
app/src/main/java/org/myhush/silentdragon/chat/ChatActivity.kt

@ -6,11 +6,8 @@ import android.support.v4.app.FragmentTransaction
import android.support.v7.app.AppCompatActivity
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.LinearLayout
import android.widget.TableLayout
import kotlinx.android.synthetic.main.activity_chat.*
import kotlinx.android.synthetic.main.content_chat_list.view.*
import org.myhush.silentdragon.*
class ChatActivity : AppCompatActivity() {
@ -19,7 +16,7 @@ class ChatActivity : AppCompatActivity() {
setContentView(R.layout.activity_chat)
initListener()
restoreLastChats()
refresh()
swiperefreshChat.setOnRefreshListener {
refresh()
@ -27,15 +24,6 @@ class ChatActivity : AppCompatActivity() {
}
}
private fun restoreLastChats() {
DataModel.transactions?.forEach { tx ->
if (!tx.memo.isNullOrEmpty()){
// ADD CHAT BY ADDRESS
}
}
refresh()
}
private fun initListener(){
nav_view.setOnNavigationItemSelectedListener {
when(it.itemId) {
@ -62,7 +50,7 @@ class ChatActivity : AppCompatActivity() {
}
}
fun refresh(){
private fun refresh(){
findViewById<LinearLayout>(R.id.ChatTable).removeAllViews()
Addressbook.contactList.forEach {
@ -74,9 +62,8 @@ class ChatActivity : AppCompatActivity() {
val fragment = ChatItemFragment()
val fragTx: FragmentTransaction = supportFragmentManager.beginTransaction()
fragment.fullname = contact.fullname
fragment.nickname = contact.nickname
fragment.lastMessage = contact.addressList[0]
fragment.contactAddress = contact.addressIn
fragTx.add(R.id.ChatTable, fragment)
fragTx.commit()

4
app/src/main/java/org/myhush/silentdragon/chat/ChatItemFragment.kt

@ -7,12 +7,13 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import kotlinx.android.synthetic.main.content_receive.*
import org.myhush.silentdragon.R
class ChatItemFragment : Fragment() {
var fullname: String = ""
var nickname: String = ""
var lastMessage: String = ""
var contactAddress: String = ""
var v: View? = null
override fun onCreateView (inflater: LayoutInflater, container: ViewGroup?,
@ -30,6 +31,7 @@ class ChatItemFragment : Fragment() {
val intent = Intent(activity, ConversationActivity::class.java)
intent.putExtra("displayName", nickname) // Send some information
intent.putExtra("contactAddress", contactAddress)
startActivity(intent)
}

28
app/src/main/java/org/myhush/silentdragon/chat/ConversationActivity.kt

@ -1,15 +1,13 @@
package org.myhush.silentdragon.chat
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v4.app.FragmentTransaction
import android.widget.EditText
import android.widget.ImageButton
import android.widget.TextView
import kotlinx.android.synthetic.main.activity_conversation.*
import org.myhush.silentdragon.*
class ConversationActivity : AppCompatActivity() {
var displayName = ""
var contact: Addressbook.Contact? = null
@ -17,32 +15,32 @@ class ConversationActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_conversation)
val address = intent.extras.getString("contactAddress")
displayName = intent.extras.getString("displayName")
contact = Addressbook.findContactByInAddress(address)
findViewById<TextView>(R.id.textViewContactName2).text = displayName
findViewById<TextView>(R.id.textView_zAddress).text = contact?.addressIn
buttonSend.setOnClickListener{
sendMessage()
}
contact = Addressbook.contactList[0] // FOR TESTING!!!
restoreChat()
}
private fun sendMessage(){
// FOR TESTING!!!
val memo = findViewById<EditText>(R.id.userInput).text.toString()
findViewById<EditText>(R.id.userInput).text.clear()
var tx = DataModel.TransactionItem("send", 99, "0.00", memo, contact!!.addressList[0], "asdasdasd", 0)
val m = Message("addr", tx)
attachMessage(m)
m.messageType = MessageType.RECIEVE
attachMessage(m)
private fun sendMessage() {
val memo = findViewById<TextView>(R.id.userInput).text.toString()
val tx = DataModel.TransactionItem("", 0, "0", memo, contact!!.addressOut, "0", 0)
DataModel.sendTx(tx)
findViewById<TextView>(R.id.userInput).text = ""
}
private fun restoreChat() {
contact?.messageList?.forEach {
contact?.messageList?.asReversed()?.forEach {
attachMessage(it)
}
}

4
app/src/main/java/org/myhush/silentdragon/chat/Message.kt

@ -11,12 +11,12 @@ class Message {
var txID = ""
var txHeight: Int = -1
constructor(fromAddress: String, tx: DataModel.TransactionItem){
constructor(fromAddress: String, tx: DataModel.TransactionItem, messageType: MessageType){
this.memo = tx.memo.toString()
this.txID = tx.txid.toString()
this.dateTime = tx.datetime
this.toAddress = tx.addr
this.fromAddress = fromAddress
this.messageType = messageType
}
}

3
app/src/main/java/org/myhush/silentdragon/conversation_item_recive.kt

@ -7,6 +7,8 @@ import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import org.myhush.silentdragon.chat.Message
import java.text.SimpleDateFormat
import java.util.*
class conversation_item_recive : Fragment() {
var msg: Message? = null
@ -17,6 +19,7 @@ class conversation_item_recive : Fragment() {
var v: View = inflater.inflate(R.layout.fragment_conversation_item_recive, container, false)
v.findViewById<TextView>(R.id.message).text = msg?.memo
v.findViewById<TextView>(R.id.Time2).text = SimpleDateFormat("MM-dd, HH:mm").format(Date(msg!!.dateTime))
return v
}
}

3
app/src/main/java/org/myhush/silentdragon/conversation_item_send.kt

@ -7,6 +7,8 @@ import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import org.myhush.silentdragon.chat.Message
import java.text.SimpleDateFormat
import java.util.*
class conversation_item_send : Fragment() {
var msg: Message? = null
@ -16,6 +18,7 @@ class conversation_item_send : Fragment() {
// Inflate the layout for this fragment
var v: View = inflater.inflate(R.layout.fragment_conversation_item_send, container, false)
v.findViewById<TextView>(R.id.message).text = msg?.memo
v.findViewById<TextView>(R.id.Time).text = SimpleDateFormat("MM-dd, HH:mm").format(Date(msg!!.dateTime))
return v
}
}

17
app/src/main/res/layout/activity_conversation.xml

@ -40,9 +40,11 @@
app:layout_constraintTop_toTopOf="parent"
tools:src="@mipmap/ic_launcher_dragon_foreground"
tools:visibility="visible" />
</android.support.constraint.ConstraintLayout>
<ScrollView
android:id="@+id/scrollView3"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/constraintLayout3"
@ -54,7 +56,7 @@
android:id="@+id/MessageList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"/>
android:orientation="vertical" />
</ScrollView>
<android.support.constraint.ConstraintLayout
@ -88,6 +90,19 @@
app:layout_constraintEnd_toStartOf="@+id/buttonSend"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
<TextView
android:id="@+id/textView_zAddress"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="#0AFFFFFF"
android:text="zAddress"
android:textAlignment="center"
android:textSize="8sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout4" />
</android.support.constraint.ConstraintLayout>

1
app/src/main/res/layout/fragment_chat_item.xml

@ -76,6 +76,7 @@
android:text="10min"
android:textColor="#fff"
android:textSize="10sp"
android:visibility="invisible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />

2
app/src/main/res/layout/fragment_conversation_item_recive.xml

@ -25,7 +25,7 @@
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/time2"
android:id="@+id/Time2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10sp"

Loading…
Cancel
Save