Compare commits

...

37 Commits
master ... chat

Author SHA1 Message Date
Duke Leto 9195d17536
Merge pull request #66 from N1CK145/chat 4 years ago
N1CK145 5058257fbe
Update MainActivity.kt 4 years ago
N1CK145 8e636145a3
Update build.gradle 4 years ago
N1CK145 54920eb1ab Commit 4 years ago
N1CK145 8590981908 Show past tx with memo in chat 4 years ago
N1CK145 6f8961b70b Modified contacts and addressbook 4 years ago
Jonathan "Duke" Leto 2928ef7f73 verbump 5 years ago
Duke Leto 9312da8f21
Merge pull request #58 from N1CK145/chat 5 years ago
N1CK145 ec089a3314 Fix validation check 5 years ago
Jonathan "Duke" Leto fa37cb0ded bump version 5 years ago
Duke Leto 75c1d53833
Merge pull request #56 from N1CK145/chat 5 years ago
N1CK145 a160d8a33b Send button send message 5 years ago
N1CK145 644ce67804 Create ChatActivity added 5 years ago
Jonathan "Duke" Leto d741306fe2 Merge branch 'duke' into chat 5 years ago
Duke Leto 09da932ce3
Merge pull request #54 from N1CK145/chat 5 years ago
N1CK145 fb7d69fa41 The changes of comments in pull 54 5 years ago
N1CK145 bd0e7486dc You can add Messages and chats now 5 years ago
N1CK145 fd05db9ef1 Fixed crash on create message 5 years ago
N1CK145 89bdd7ee16 commit 5 years ago
Jonathan "Duke" Leto 6af0c3345e Merge branch 'dev' into chat 5 years ago
Jonathan "Duke" Leto 67e6c4b690 bump 5 years ago
Jonathan "Duke" Leto fc06dde62c Merge branch 'chat' of https://github.com/MyHush/SilentDragonAndroid into chat 5 years ago
Jonathan "Duke" Leto 88341b2307 bump version 5 years ago
Duke Leto f42481a74f
Merge pull request #49 from N1CK145/chat 5 years ago
N1CK145 bfae9e77b2 Working gui 5 years ago
N1CK145 df99f9a866 Added menu and Addressbook 5 years ago
N1CK145 6ac5336949 Revert "Added some bugs to fix later: chatitems will not create yet..." 5 years ago
N1CK145 006555d4fd Added some bugs to fix later: chatitems will not create yet... 5 years ago
N1CK145 19ab271a2b Changed sample chat icon to SD logo 5 years ago
N1CK145 9e3053ca80 Removed icon in main Activity; Changed text colors of Chat and fix the gui 5 years ago
N1CK145 1e855ca72f Add addressbook 5 years ago
N1CK145 5382d8ade7 Remove actionbar in conversation final 5 years ago
N1CK145 b6eb5fbf44 Remove actionbar in conversation 5 years ago
N1CK145 96cce88664 Add chat gui 5 years ago
N1CK145 1ebd2a6666 Merge branch 'master' of https://github.com/N1CK145/SilentDragonAndroid 5 years ago
N1CK145 d410a39af1 Create Chatactivity with sample chats 5 years ago
N1CK145 dedace6719 Create chat item 5 years ago
  1. 5
      app/build.gradle
  2. 40
      app/src/main/AndroidManifest.xml
  3. 44
      app/src/main/java/org/myhush/silentdragon/Addressbook.kt
  4. 2
      app/src/main/java/org/myhush/silentdragon/DataModel.kt
  5. 99
      app/src/main/java/org/myhush/silentdragon/MainActivity.kt
  6. 4
      app/src/main/java/org/myhush/silentdragon/SendActivity.kt
  7. 56
      app/src/main/java/org/myhush/silentdragon/chat/AddContactActivity.kt
  8. 88
      app/src/main/java/org/myhush/silentdragon/chat/ChatActivity.kt
  9. 46
      app/src/main/java/org/myhush/silentdragon/chat/ChatItemFragment.kt
  10. 66
      app/src/main/java/org/myhush/silentdragon/chat/ConversationActivity.kt
  11. 22
      app/src/main/java/org/myhush/silentdragon/chat/Message.kt
  12. 6
      app/src/main/java/org/myhush/silentdragon/chat/MessageType.kt
  13. 25
      app/src/main/java/org/myhush/silentdragon/conversation_item_recive.kt
  14. 24
      app/src/main/java/org/myhush/silentdragon/conversation_item_send.kt
  15. 10
      app/src/main/res/drawable/chat_background_recive.xml
  16. 10
      app/src/main/res/drawable/chat_background_send.xml
  17. BIN
      app/src/main/res/drawable/ic_delivery_status_delivered.webp
  18. BIN
      app/src/main/res/drawable/ic_delivery_status_read.webp
  19. BIN
      app/src/main/res/drawable/ic_delivery_status_sending.webp
  20. BIN
      app/src/main/res/drawable/ic_delivery_status_sent.webp
  21. 10
      app/src/main/res/drawable/profile_image.xml
  22. 10
      app/src/main/res/drawable/rounded_corner.xml
  23. 117
      app/src/main/res/layout/activity_add_contact.xml
  24. 41
      app/src/main/res/layout/activity_chat.xml
  25. 108
      app/src/main/res/layout/activity_conversation.xml
  26. 21
      app/src/main/res/layout/content_chat_list.xml
  27. 153
      app/src/main/res/layout/content_main.xml
  28. 106
      app/src/main/res/layout/fragment_chat_item.xml
  29. 38
      app/src/main/res/layout/fragment_conversation_item_recive.xml
  30. 38
      app/src/main/res/layout/fragment_conversation_item_send.xml
  31. 7
      app/src/main/res/menu/menu_chat.xml
  32. 33
      app/src/main/res/menu/menu_nav.xml
  33. 5
      app/src/main/res/values/colors.xml
  34. 8
      app/src/main/res/values/strings.xml
  35. 7
      app/src/main/res/values/styles.xml

5
app/build.gradle

@ -1,4 +1,5 @@
// Copyright 2019 The Hush developers
// Released under the GPLv3
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
@ -17,8 +18,8 @@ android {
applicationId "org.myhush.silentdragon"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "0.5.11"
versionCode 2
versionName "0.6.0-alpha6"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
}

40
app/src/main/AndroidManifest.xml

@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="org.myhush.silentdragon">
@ -19,34 +17,38 @@
android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning"
tools:replace="android:allowBackup">
<activity android:name=".chat.AddContactActivity"></activity>
<activity
android:name=".chat.ConversationActivity"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="org.myhush.silentdragon.SettingsActivity"
android:name=".chat.ChatActivity"
android:label="@string/title_activity_chat" />
<activity
android:name=".SettingsActivity"
android:label="@string/title_activity_settings"
android:parentActivityName="org.myhush.silentdragon.SendActivity"
android:parentActivityName=".SendActivity"
android:screenOrientation="portrait">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".SendActivity" />
</activity>
<activity
android:name="org.myhush.silentdragon.AboutActivity"
android:name=".AboutActivity"
android:label="@string/title_activity_about"
android:parentActivityName="org.myhush.silentdragon.SendActivity"
android:parentActivityName=".SendActivity"
android:screenOrientation="portrait">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".SendActivity" />
</activity>
<activity
android:name="org.myhush.silentdragon.QrReaderActivity"
android:screenOrientation="portrait"/>
android:name=".QrReaderActivity"
android:screenOrientation="portrait" />
<activity
android:name="org.myhush.silentdragon.TxDetailsActivity"
android:name=".TxDetailsActivity"
android:label="@string/title_activity_tx_details"
android:parentActivityName="org.myhush.silentdragon.MainActivity"
android:parentActivityName=".MainActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
@ -54,7 +56,7 @@
android:value=".MainActivity" />
</activity>
<activity
android:name="org.myhush.silentdragon.MainActivity"
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTop"
android:screenOrientation="portrait"
@ -66,9 +68,9 @@
</intent-filter>
</activity>
<activity
android:name="org.myhush.silentdragon.ReceiveActivity"
android:name=".ReceiveActivity"
android:label="@string/title_activity_receive"
android:parentActivityName="org.myhush.silentdragon.MainActivity"
android:parentActivityName=".MainActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
@ -76,10 +78,10 @@
android:value=".MainActivity" />
</activity>
<activity
android:name="org.myhush.silentdragon.SendActivity"
android:name=".SendActivity"
android:label="@string/title_activity_send"
android:launchMode="singleTop"
android:parentActivityName="org.myhush.silentdragon.MainActivity"
android:parentActivityName=".MainActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar">
<meta-data

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

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

@ -3,6 +3,7 @@ package org.myhush.silentdragon
import android.annotation.SuppressLint
import android.app.Activity
import android.app.AlertDialog
import android.content.*
import android.net.Uri
import android.os.Bundle
@ -23,6 +24,9 @@ import kotlinx.android.synthetic.main.activity_main.*
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
@ -73,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 {
@ -87,6 +91,11 @@ class MainActivity : AppCompatActivity(),
return@setOnNavigationItemSelectedListener true
}
R.id.action_bal -> true
R.id.action_chat -> {
val intent = Intent(this, ChatActivity::class.java)
startActivity(intent)
return@setOnNavigationItemSelectedListener true
}
R.id.action_recieve -> {
val intent = Intent(this, ReceiveActivity::class.java)
startActivity(intent)
@ -99,13 +108,26 @@ 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() {
var ref: SharedPreferences = getSharedPreferences("MainFile", 0)
DataModel.selectedCurrency = ref.getString("currency", "USD")
DataModel.selectedCurrency = ref.getString("currency", "USD")!!
}
private fun setMainStatus(status: String) {
@ -206,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)
}
@ -218,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))
}
}
}
@ -239,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()

4
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"
@ -241,7 +239,7 @@ class SendActivity : AppCompatActivity() {
}
}
fun showErrorDialog(msg: String) {
private fun showErrorDialog(msg: String) {
val alertDialog = AlertDialog.Builder(this@SendActivity).create()
alertDialog.setTitle("Error Sending Transaction!")
alertDialog.setMessage(msg)

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

@ -0,0 +1,56 @@
package org.myhush.silentdragon.chat
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() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_add_contact)
buttonAddContact.setOnClickListener {
if (checkValueValidation()) {
var nickName = editText_NickName.text.toString()
var fullname = editText_FullName.text.toString()
var zAddr = editTextZAddress.text.toString()
Addressbook.addContact(fullname, nickName, zAddr)
this.finish()
}
}
}
private fun sendErrorDialog(msg: String) {
val alertDialog = AlertDialog.Builder(this@AddContactActivity).create()
alertDialog.setTitle("Error by add a new Contact!")
alertDialog.setMessage(msg)
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK") {
dialog, _ -> dialog.dismiss() }
alertDialog.show()
}
private fun checkValueValidation(): Boolean{
if (editText_FullName.text.length <= 1) {
sendErrorDialog("Pleas insert a name!")
return false
}
if (editText_NickName.text.length <= 1) {
sendErrorDialog("Pleas insert a nickname!")
return false
}
if (editTextZAddress.text.length <= 1) {
if(!editTextZAddress.text.startsWith('z', true)) {
sendErrorDialog("Pleas insert a z-address!")
return false
}
}
return true
}
}

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

@ -0,0 +1,88 @@
package org.myhush.silentdragon.chat
import android.content.Intent
import android.os.Bundle
import android.support.v4.app.FragmentTransaction
import android.support.v7.app.AppCompatActivity
import android.view.Menu
import android.view.MenuItem
import android.widget.LinearLayout
import kotlinx.android.synthetic.main.activity_chat.*
import org.myhush.silentdragon.*
class ChatActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_chat)
initListener()
refresh()
swiperefreshChat.setOnRefreshListener {
refresh()
swiperefreshChat.isRefreshing = false
}
}
private fun initListener(){
nav_view.setOnNavigationItemSelectedListener {
when(it.itemId) {
R.id.action_send -> {
val intent = Intent(this, SendActivity::class.java)
startActivity(intent)
return@setOnNavigationItemSelectedListener true
}
R.id.action_bal -> {
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
return@setOnNavigationItemSelectedListener true
}
R.id.action_chat -> true
R.id.action_recieve -> {
val intent = Intent(this, ReceiveActivity::class.java)
startActivity(intent)
return@setOnNavigationItemSelectedListener true
}
else -> {
return@setOnNavigationItemSelectedListener false
}
}
}
}
private fun refresh(){
findViewById<LinearLayout>(R.id.ChatTable).removeAllViews()
Addressbook.contactList.forEach {
addChat(it)
}
}
private fun addChat(contact: Addressbook.Contact){
val fragment = ChatItemFragment()
val fragTx: FragmentTransaction = supportFragmentManager.beginTransaction()
fragment.nickname = contact.nickname
fragment.contactAddress = contact.addressIn
fragTx.add(R.id.ChatTable, fragment)
fragTx.commit()
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.menu_chat, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_addChat -> {
val intent = Intent(this, AddContactActivity::class.java)
startActivity(intent)
return true
}
else -> super.onOptionsItemSelected(item)
}
}
}

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

@ -0,0 +1,46 @@
package org.myhush.silentdragon.chat
import android.content.Intent
import android.os.Bundle
import android.support.v4.app.Fragment
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 nickname: String = ""
var lastMessage: String = ""
var contactAddress: String = ""
var v: View? = null
override fun onCreateView (inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View {
v = inflater.inflate(R.layout.fragment_chat_item, container, false)
updateData()
initListener()
return v!!
}
private fun initListener() {
v?.setOnClickListener {
val intent = Intent(activity, ConversationActivity::class.java)
intent.putExtra("displayName", nickname) // Send some information
intent.putExtra("contactAddress", contactAddress)
startActivity(intent)
}
}
fun updateData(){
v!!.findViewById<TextView>(R.id.textViewContactName).text = nickname
v!!.findViewById<TextView>(R.id.textViewLastMessage).text = lastMessage
}
}

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

@ -0,0 +1,66 @@
package org.myhush.silentdragon.chat
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v4.app.FragmentTransaction
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
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()
}
restoreChat()
}
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?.asReversed()?.forEach {
attachMessage(it)
}
}
fun attachMessage(message: Message){
val fragTx: FragmentTransaction = supportFragmentManager.beginTransaction()
when (message.messageType){
MessageType.SEND -> {
val fragment = conversation_item_send()
fragment.msg = message
fragTx.add(R.id.MessageList, fragment)
}
MessageType.RECIEVE -> {
val fragment = conversation_item_recive()
fragment.msg = message
fragTx.add(R.id.MessageList, fragment)
}
}
fragTx.commit()
}
}

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

@ -0,0 +1,22 @@
package org.myhush.silentdragon.chat
import org.myhush.silentdragon.DataModel
class Message {
var memo = ""
var fromAddress = ""
var toAddress = ""
var messageType = MessageType.SEND
var dateTime: Long = 0
var txID = ""
var txHeight: Int = -1
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
}
}

6
app/src/main/java/org/myhush/silentdragon/chat/MessageType.kt

@ -0,0 +1,6 @@
package org.myhush.silentdragon.chat
enum class MessageType {
SEND,
RECIEVE
}

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

@ -0,0 +1,25 @@
package org.myhush.silentdragon
import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
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
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate the layout for this 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
}
}

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

@ -0,0 +1,24 @@
package org.myhush.silentdragon
import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
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
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// 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
}
}

10
app/src/main/res/drawable/chat_background_recive.xml

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" android:padding="10dp">
<solid android:color="@color/message_recive"/>
<corners
android:bottomRightRadius="15dp"
android:bottomLeftRadius="15dp"
android:topLeftRadius="15dp"
android:topRightRadius="15dp"/>
</shape>

10
app/src/main/res/drawable/chat_background_send.xml

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" android:padding="10dp">
<solid android:color="@color/message_send"/>
<corners
android:bottomRightRadius="15dp"
android:bottomLeftRadius="15dp"
android:topLeftRadius="15dp"
android:topRightRadius="15dp"/>
</shape>

BIN
app/src/main/res/drawable/ic_delivery_status_delivered.webp

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

BIN
app/src/main/res/drawable/ic_delivery_status_read.webp

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

BIN
app/src/main/res/drawable/ic_delivery_status_sending.webp

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 B

BIN
app/src/main/res/drawable/ic_delivery_status_sent.webp

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 B

10
app/src/main/res/drawable/profile_image.xml

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" android:padding="10dp">
<solid android:color="#ffaaaaaa"/>
<corners
android:bottomRightRadius="30dp"
android:bottomLeftRadius="30dp"
android:topLeftRadius="30dp"
android:topRightRadius="30dp"/>
</shape>

10
app/src/main/res/drawable/rounded_corner.xml

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" android:padding="10dp">
<solid android:color="@color/charcole"/>
<corners
android:bottomRightRadius="15dp"
android:bottomLeftRadius="15dp"
android:topLeftRadius="15dp"
android:topRightRadius="15dp"/>
</shape>

117
app/src/main/res/layout/activity_add_contact.xml

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".chat.AddContactActivity">
<EditText
android:id="@+id/editTextZAddress"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:ems="10"
android:gravity="start|top"
android:hint="Addresses"
android:inputType="textMultiLine"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/divider7" />
<View
android:id="@+id/divider5"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="16dp"
android:background="?android:attr/listDivider"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView15" />
<View
android:id="@+id/divider8"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="16dp"
android:background="?android:attr/listDivider"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editTextZAddress" />
<View
android:id="@+id/divider7"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="16dp"
android:background="?android:attr/listDivider"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editText_NickName" />
<EditText
android:id="@+id/editText_FullName"
android:layout_width="0sp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
android:ems="10"
android:hint="Fullname"
android:inputType="textPersonName"
app:layout_constraintEnd_toStartOf="@+id/divider9"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/divider5" />
<EditText
android:id="@+id/editText_NickName"
android:layout_width="0sp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:ems="10"
android:hint="Nickname"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/divider9"
app:layout_constraintTop_toBottomOf="@+id/divider5" />
<Button
android:id="@+id/buttonAddContact"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Create Contact"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/divider8" />
<TextView
android:id="@+id/textView15"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Add a new Contact"
android:textSize="24sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/divider9"
android:layout_width="1dp"
android:layout_height="0dp"
android:background="?android:attr/listDivider"
android:visibility="invisible"
app:layout_constraintBottom_toTopOf="@+id/divider7"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/divider5" />
</android.support.constraint.ConstraintLayout>

41
app/src/main/res/layout/activity_chat.xml

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swiperefreshChat"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/nav_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<include
android:id="@+id/include"
layout="@layout/content_chat_list"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/nav_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.v4.widget.SwipeRefreshLayout>
<android.support.design.widget.BottomNavigationView
android:id="@+id/nav_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?android:attr/windowBackground"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/menu_nav" />
</android.support.constraint.ConstraintLayout>

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

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".conversation_item_recive" >
<android.support.constraint.ConstraintLayout
android:id="@+id/constraintLayout4"
android:layout_width="0dp"
android:layout_height="76dp"
android:background="#2d2d2d"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/textViewContactName2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="18dp"
android:text="Peter Parker"
android:textColor="#ffffff"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/imageProfilePicture2"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/imageProfilePicture2"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_marginStart="16dp"
android:background="@drawable/profile_image"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
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"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout4">
<LinearLayout
android:id="@+id/MessageList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</ScrollView>
<android.support.constraint.ConstraintLayout
android:id="@+id/constraintLayout3"
android:layout_width="0dp"
android:layout_height="50dp"
android:background="@drawable/rounded_corner"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<ImageButton
android:id="@+id/buttonSend"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginEnd="5dp"
android:src="@drawable/send_selector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/userInput"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="10dp"
android:ems="10"
android:hint="Click to send a message..."
android:inputType="textPersonName"
app:layout_constraintBottom_toBottomOf="parent"
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>

21
app/src/main/res/layout/content_chat_list.xml

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nestedScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:id="@+id/ChatTable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"/>
</ScrollView>
</android.support.constraint.ConstraintLayout>

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

@ -52,86 +52,109 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtMainBalance" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="wrap_content"
android:layout_height="80dp"
android:layout_marginTop="107dp"
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swiperefresh"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/bottomNav"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@mipmap/ic_launcher_dragon_foreground" />
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swiperefresh"
android:layout_width="match_parent"
app:layout_constraintTop_toBottomOf="@+id/imageView2">
<ScrollView
android:id="@+id/scrollViewTxns"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp"
android:clipToPadding="false"
android:fillViewport="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView3" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@+id/bottomNav">
app:layout_constraintTop_toBottomOf="parent">
<LinearLayout
android:id="@+id/txList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ScrollView
android:layout_width="0dp"
android:layout_height="0dp" app:layout_constraintEnd_toEndOf="parent"
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="parent">
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/txList" android:orientation="vertical">
<TextView
android:text="Past Transactions"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:id="@+id/textView2" android:textStyle="bold"
android:textSize="18sp" android:padding="16dp"/>
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:text="Past Transactions"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>
</ScrollView>
</android.support.v4.widget.SwipeRefreshLayout>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="364dp" 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">
android:id="@+id/layoutConnect"
android:layout_width="match_parent"
android:layout_height="364dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="32dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView2">
<ImageView
android:layout_width="72dp"
android:layout_height="72dp"
android:src="@mipmap/ic_silent_dragon_round"
android:id="@+id/imageView5" app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintVertical_bias="0.22000003" app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="8dp"/>
android:id="@+id/imageView5"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:src="@mipmap/ic_silent_dragon_round"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.22000003" />
<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:id="@+id/btnConnect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:text="Scan QR Code"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView5" />
<TextView
android:text="OR"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/lblConnectionOr" android:layout_marginTop="8dp"
app:layout_constraintTop_toBottomOf="@+id/btnConnect" app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="8dp" app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="8dp" android:textAlignment="center"/>
android:id="@+id/lblConnectionOr"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:text="OR"
android:textAlignment="center"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnConnect" />
<Button
android:text="Reconnect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnReconnect" android:layout_marginTop="8dp"
app:layout_constraintTop_toBottomOf="@+id/lblConnectionOr" app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="8dp" app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="8dp"/>
android:id="@+id/btnReconnect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:text="Reconnect"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/lblConnectionOr" />
</android.support.constraint.ConstraintLayout>
<android.support.design.widget.BottomNavigationView
android:layout_width="match_parent"

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

@ -0,0 +1,106 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="76dp"
android:background="#2d2d2d">
<ImageView
android:id="@+id/imageProfilePicture"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_marginStart="16dp"
android:background="@drawable/profile_image"
android:visibility="visible"
app:layout_constraintBottom_toTopOf="@+id/divider6"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible" />
<TextView
android:id="@+id/unread_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|top"
android:layout_marginTop="1dp"
android:layout_marginEnd="1dp"
android:height="20dp"
android:background="@drawable/rounded_corner"
android:fontFamily="sans-serif-medium"
android:gravity="center"
android:minWidth="20dp"
android:textColor="#fff"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="@+id/imageProfilePicture"
app:layout_constraintTop_toTopOf="@+id/imageProfilePicture"
app:lineHeight="1dp"
tools:text="1"
tools:visibility="invisible" />
<TextView
android:id="@+id/textViewContactName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="Peter Parker"
android:textColor="#ffffff"
android:textSize="17sp"
android:textStyle="bold"
app:layout_constraintStart_toEndOf="@+id/imageProfilePicture"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textViewLastMessage"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="35dp"
android:maxWidth="300dp"
android:maxLines="2"
android:text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod"
android:textColor="#aaffffff"
android:textSize="13sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/imageProfilePicture"
app:layout_constraintTop_toBottomOf="@+id/textViewContactName"
tools:text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod" />
<TextView
android:id="@+id/textViewTime"
android:layout_width="28dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:text="10min"
android:textColor="#fff"
android:textSize="10sp"
android:visibility="invisible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/read_indicator"
android:layout_width="20dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:paddingStart="2dp"
android:src="@drawable/ic_delivery_status_read"
android:tint="#77ffffff"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:visibility="visible" />
<View
android:id="@+id/divider6"
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="@color/charcole"
app:layout_constraintBottom_toBottomOf="parent"
tools:layout_editor_absoluteX="0dp" />
</android.support.constraint.ConstraintLayout>

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

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".conversation_item_send" >
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="9dp"
android:layout_marginTop="10dp"
android:background="@drawable/chat_background_recive"
android:maxWidth="260sp"
android:minWidth="80sp"
android:paddingLeft="10sp"
android:paddingTop="10sp"
android:paddingRight="10sp"
android:paddingBottom="25sp"
android:text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr"
android:textColor="@color/message_text"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/Time2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10sp"
android:layout_marginBottom="5dp"
android:text="10:15 AM"
android:textColor="@color/message_text"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="@+id/message"
app:layout_constraintEnd_toEndOf="@+id/message" />
</android.support.constraint.ConstraintLayout>

38
app/src/main/res/layout/fragment_conversation_item_send.xml

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".conversation_item_send" >
<TextView
android:id="@+id/message"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginEnd="9dp"
android:background="@drawable/chat_background_send"
android:maxWidth="260sp"
android:minWidth="80sp"
android:paddingLeft="10sp"
android:paddingTop="10sp"
android:paddingRight="5sp"
android:paddingBottom="25sp"
android:text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."
android:textColor="@color/message_text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/Time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginBottom="5dp"
android:text="10:15 AM"
android:textColor="@color/message_text"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="@+id/message"
app:layout_constraintStart_toStartOf="@+id/message" />
</android.support.constraint.ConstraintLayout>

7
app/src/main/res/menu/menu_chat.xml

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_addChat"
android:title="AddChat" />
</menu>

33
app/src/main/res/menu/menu_nav.xml

@ -1,13 +1,28 @@
<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"
tools:context="org.myhush.silentdragon.MainActivity">
<item android:id="@+id/action_send"
android:title="Send"
android:orderInCategory="300"
app:showAsAction="never" android:icon="@drawable/send_selector"/>
<item android:title="Balance" android:id="@+id/action_bal" android:icon="@drawable/balance_selector"
android:orderInCategory="200"/>
<item android:title="Receive" android:id="@+id/action_recieve" android:icon="@drawable/receive_selector"
android:orderInCategory="100"/>
<item android:title="Send"
android:id="@+id/action_send"
android:icon="@drawable/send_selector"
android:tint="@color/white_unselected"
android:orderInCategory="300"/>
<item android:title="Balance"
android:id="@+id/action_bal"
android:icon="@drawable/balance_selector"
android:tint="@color/white_unselected"
android:orderInCategory="200"/>
<item android:title="Receive"
android:id="@+id/action_recieve"
android:icon="@drawable/receive_selector"
android:tint="@color/white_unselected"
android:orderInCategory="100"/>
<item android:title="Chat"
android:id="@+id/action_chat"
android:icon="@drawable/ic_keyboard_icon"
android:tint="@color/white_unselected"
android:orderInCategory="100"/>
</menu>

5
app/src/main/res/values/colors.xml

@ -8,4 +8,9 @@
<color name="white_selected">#E0FFFFFF</color>
<color name="white_unselected">#66FFFFFF</color>
<color name="charcole">#36454f</color>
<color name="message_send">#aa007878</color>
<color name="message_recive">#aa00bbbb</color>
<color name="message_text">#cccccc</color>
</resources>

8
app/src/main/res/values/strings.xml

@ -72,7 +72,7 @@
<item>3</item>
</string-array>
<string-array name="multi_select_list_preference_default_value"/>
<string-array name="multi_select_list_preference_default_value" />
<string name="pref_title_system_sync_settings">System sync settings</string>
@ -85,8 +85,6 @@
<string name="pref_ringtone_silent">Silent</string>
<string name="pref_title_vibrate">Vibrate</string>
<string name="title_activity_main2">Main2Activity</string>
<string name="title_home">Home</string>
<string name="title_dashboard">Dashboard</string>
<string name="title_notifications">Notifications</string>
<string name="title_activity_chat_list">Chat List</string>
<string name="title_activity_chat">Hush Chat</string>
</resources>

7
app/src/main/res/values/styles.xml

@ -7,11 +7,14 @@
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark"/>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark" />
</resources>

Loading…
Cancel
Save