- Started work on letter based avatars.

This commit is contained in:
Juha Heinanen
2019-11-18 14:46:05 +02:00
parent 955c8752d1
commit e72c587fa7
15 changed files with 184 additions and 83 deletions

View File

@ -3,6 +3,7 @@ package com.tutpro.baresip
import android.content.Context
import android.graphics.Color
import android.graphics.Typeface
import android.graphics.drawable.GradientDrawable
import android.support.v4.content.ContextCompat
import android.text.format.DateUtils.isToday
import android.view.LayoutInflater
@ -10,6 +11,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.LinearLayout
import android.widget.RelativeLayout
import android.widget.TextView
import java.text.SimpleDateFormat
@ -21,40 +23,43 @@ class ChatListAdapter(private val cxt: Context, private var rows: ArrayList<Mess
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val message = rows[position]
val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val chatView = inflater.inflate(R.layout.chat, parent, false)
val layout = chatView.findViewById(R.id.chat) as LinearLayout
val lp = layout.layoutParams as LinearLayout.LayoutParams
val rowView = inflater.inflate(R.layout.chat_row, parent, false)
val avatarView = rowView.findViewById(R.id.avatar) as TextView
val avatarBackground = avatarView.background as GradientDrawable
val layout = rowView.findViewById(R.id.chat) as LinearLayout
val lp = layout.layoutParams as RelativeLayout.LayoutParams
lp.setMargins(10, 10, 10, 10)
val peer: String
val sender: String
val contactName = ContactsActivity.contactName(message.peerUri)
if (contactName.startsWith("sip:") &&
(Utils.uriHostPart(message.peerUri) == Utils.uriHostPart(message.aor)))
peer = Utils.uriUserPart(message.peerUri)
else
peer = contactName
if (message.direction == R.drawable.arrow_down_green) {
layout.setBackgroundResource(R.drawable.peer_bg)
sender = peer
val contact = ContactsActivity.findContact(message.peerUri)
if (contact != null) {
peer = contact.name
avatarBackground.setColor(contact.color)
} else {
layout.setBackgroundResource(R.drawable.you_bg)
sender = cxt.getString(R.string.you)
if (Utils.uriHostPart(message.peerUri) == Utils.uriHostPart(message.aor))
peer = Utils.uriUserPart(message.peerUri)
else
peer = Utils.uriAor(message.peerUri)
avatarBackground.setColor(Color.RED)
}
val peerView = chatView.findViewById(R.id.peer) as TextView
avatarView.text = "${peer[0]}"
if (message.direction == R.drawable.arrow_down_green) {
layout.setBackgroundResource(R.drawable.message_in_bg)
} else {
layout.setBackgroundResource(R.drawable.message_out_bg)
}
val peerView = rowView.findViewById(R.id.peer) as TextView
peerView.setText(peer)
val infoView = chatView.findViewById(R.id.info) as TextView
val infoView = rowView.findViewById(R.id.info) as TextView
var info: String
val cal = GregorianCalendar()
cal.timeInMillis = message.timeStamp
val fmt: SimpleDateFormat
if (isToday(message.timeStamp)) {
val fmt = SimpleDateFormat("HH:mm")
info = fmt.format(cal.time)
fmt = SimpleDateFormat("HH:mm")
} else {
val fmt = SimpleDateFormat("dd/MM, HH:mm")
info = fmt.format(cal.time)
fmt = SimpleDateFormat("dd/MM, HH:mm")
}
if (info.length < 6) info = "${cxt.getString(R.string.today)} $info"
infoView.text = "$info - $sender"
infoView.text = fmt.format(cal.time)
if (message.direction == R.drawable.arrow_up_red) {
if (message.responseCode != 0)
infoView.text = "${infoView.text} - ${cxt.getString(R.string.message_failed)}: " +
@ -63,11 +68,11 @@ class ChatListAdapter(private val cxt: Context, private var rows: ArrayList<Mess
infoView.text = "${infoView.text} - ${cxt.getString(R.string.sending_failed)}"
infoView.setTextColor(ContextCompat.getColor(cxt, R.color.colorAccent))
}
val textView = chatView.findViewById(R.id.text) as TextView
val textView = rowView.findViewById(R.id.text) as TextView
textView.text = message.message
if (message.new)
textView.setTypeface(null, Typeface.BOLD)
return chatView
return rowView
}
}

View File

@ -3,7 +3,7 @@ package com.tutpro.baresip
import java.nio.charset.StandardCharsets
import java.util.ArrayList
class Contact(var name: String, var uri: String) {
class Contact(var name: String, var uri: String, var color: Int) {
companion object {
@ -35,7 +35,7 @@ class Contact(var name: String, var uri: String) {
uri = uri.substringAfter("<").substringBefore(">")
// Currently no need to make baresip aware of the contact
// Api.contact_add("\"$name\" $uri")
BaresipService.contacts.add(Contact(name, uri))
BaresipService.contacts.add(Contact(name, uri, Utils.randomColor()))
}
}
return true

View File

@ -2,6 +2,9 @@ package com.tutpro.baresip
import android.app.Activity
import android.content.Intent
import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable
import android.graphics.drawable.ShapeDrawable
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.view.Menu
@ -10,17 +13,21 @@ import android.widget.*
class ContactActivity : AppCompatActivity() {
lateinit var avatarView: TextView
lateinit var nameView: EditText
lateinit var uriView: EditText
internal var index = 0
internal var new = false
private var index = 0
private var color = Utils.randomColor()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_contact)
avatarView = findViewById(R.id.Avatar) as TextView
nameView = findViewById(R.id.Name) as EditText
uriView = findViewById(R.id.Uri) as EditText
@ -28,7 +35,9 @@ class ContactActivity : AppCompatActivity() {
val uOrI: String
if (new) {
setTitle(getString(R.string.new_contact))
title = getString(R.string.new_contact)
val background = avatarView.background as GradientDrawable
background.setColor(color)
nameView.setText("")
nameView.hint = getString(R.string.contact_name)
nameView.setSelection(nameView.text.length)
@ -43,6 +52,10 @@ class ContactActivity : AppCompatActivity() {
} else {
index = intent.getIntExtra("index", 0)
val name = Contact.contacts()[index].name
val background = avatarView.background as GradientDrawable
background.setColor(Contact.contacts()[index].color)
if (name.length > 0)
avatarView.text = "${name[0]}"
setTitle(name)
nameView.setText(name)
uriView.setText(Contact.contacts()[index].uri)
@ -114,7 +127,7 @@ class ContactActivity : AppCompatActivity() {
BaresipService.activities.removeAt(0)
return true
} else {
Contact.contacts().add(Contact(newName, newUri))
Contact.contacts().add(Contact(newName, newUri, color))
}
} else {
Contact.contacts()[index].uri = newUri

View File

@ -4,6 +4,7 @@ import android.app.Activity
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.graphics.drawable.GradientDrawable
import android.os.Bundle
import android.support.v7.app.AlertDialog
import android.view.LayoutInflater
@ -23,6 +24,11 @@ class ContactListAdapter(private val cxt: Context, private val rows: ArrayList<C
val row = rows[pos]
val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val rowView = inflater.inflate(R.layout.contact_row, parent, false)
val avatarView = rowView.findViewById(R.id.avatar) as TextView
val background = avatarView.background as GradientDrawable
background.setColor(row.color)
if (row.name.length > 0)
avatarView.text = "${row.name[0]}"
val nameView = rowView.findViewById(R.id.contactName) as TextView
nameView.text = row.name
nameView.textSize = 20f

View File

@ -87,6 +87,14 @@ class ContactsActivity : AppCompatActivity() {
return name
}
fun findContact(uri: String): Contact? {
for (c in Contact.contacts())
if ((Utils.uriUserPart(c.uri) == Utils.uriUserPart(uri)) &&
(Utils.uriHostPart(c.uri) == Utils.uriHostPart(uri)))
return c
return null
}
fun nameExists(name: String, ignoreCase: Boolean): Boolean {
for (c in Contact.contacts())
if (c.name.equals(name, ignoreCase = ignoreCase)) return true

View File

@ -27,11 +27,11 @@ class MessageListAdapter(private val cxt: Context, private val rows: ArrayList<M
val peer: String
if (up) {
lp.setMargins(75, 10, 0, 10)
layout.setBackgroundResource(R.drawable.you_bg)
layout.setBackgroundResource(R.drawable.message_out_bg)
peer = cxt.getString(R.string.you)
} else {
lp.setMargins(0, 10, 75, 10)
layout.setBackgroundResource(R.drawable.peer_bg)
layout.setBackgroundResource(R.drawable.message_in_bg)
val contactName = ContactsActivity.contactName(message.peerUri)
if (contactName.startsWith("sip:") &&
(Utils.uriHostPart(message.peerUri) == Utils.uriHostPart(message.aor)))

View File

@ -6,6 +6,7 @@ import android.content.Context
import android.support.v7.app.AlertDialog
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Color
import android.net.LinkAddress
import android.os.Bundle
import android.support.v4.app.ActivityCompat
@ -66,6 +67,10 @@ object Utils {
return uri.substringAfter(":").substringBefore("@")
}
fun uriAor(uri: String): String {
return uriUserPart(uri) + "@" + uriHostPart(uri)
}
fun friendlyUri(uri: String, domain: String): String {
var u = uri
if (uri.startsWith("<") && (uri.endsWith(">")))
@ -510,4 +515,8 @@ object Utils {
Log.d("Baresip", "Dumping intent finish")
}
fun randomColor(): Int {
val rnd = Random()
return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256))
}
}

View File

@ -0,0 +1,3 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:color="#48b3ff"/>
</shape>

View File

@ -4,7 +4,7 @@
<item>
<shape android:shape="rectangle">
<solid android:color="@color/colorGrayLight"/>
<corners android:radius="10dp"/>
<corners android:bottomLeftRadius="5dp" android:radius="15dp" />
</shape>
</item>

View File

@ -4,7 +4,7 @@
<item>
<shape android:shape="rectangle">
<solid android:color="@color/colorPrimaryLight"/>
<corners android:radius="10dp"/>
<corners android:topRightRadius="5dp" android:radius="15dp" />
</shape>
</item>

View File

@ -8,7 +8,20 @@
android:paddingRight="16dp"
android:paddingTop="16dp"
android:paddingBottom="24dp"
android:orientation="vertical">
android:orientation="vertical" >
<TextView
android:id="@+id/Avatar"
android:scaleType="centerInside"
android:background="@drawable/circle"
android:layout_width="36dp"
android:layout_height="36dp"
android:textSize="24sp"
android:textStyle="bold"
android:textAllCaps="true"
android:textColor="@android:color/white"
android:gravity="center" >
</TextView>
<TextView
android:id="@+id/NameTitle"
@ -16,6 +29,7 @@
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="@android:color/black"
android:paddingTop="10dp"
android:text="@string/contact_name" >
</TextView>

View File

@ -13,7 +13,9 @@
android:id="@+id/contacts"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_above="@id/plusButton" >
android:layout_above="@id/plusButton"
android:divider="#00000000"
android:dividerHeight="10dp" >
</ListView>
<ImageButton

View File

@ -1,47 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/chat"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/peer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginStart="5dp"
android:textSize="16sp"
android:textStyle="bold"
android:text="" >
</TextView>
<TextView
android:id="@+id/info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginStart="5dp"
android:textSize="12sp"
android:text="" >
</TextView>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:layout_marginBottom="5dp"
android:textSize="16sp"
android:text="" >
</TextView>
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/chats_row"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/avatar"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_centerVertical="true"
android:scaleType="centerInside"
android:background="@drawable/circle"
android:textSize="24sp"
android:textStyle="bold"
android:textAllCaps="true"
android:textColor="@android:color/white"
android:gravity="center" >
</TextView>
<LinearLayout
android:id="@+id/chat"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/avatar" >
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/peer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginStart="5dp"
android:textSize="16sp"
android:textStyle="bold"
android:text="" >
</TextView>
<TextView
android:id="@+id/info"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:gravity="end"
android:textSize="12sp"
android:text="" >
</TextView>
</LinearLayout>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:layout_marginBottom="5dp"
android:textSize="16sp"
android:text="" >
</TextView>
</LinearLayout>
</RelativeLayout>

View File

@ -5,11 +5,27 @@
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/avatar"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_centerVertical="true"
android:scaleType="centerInside"
android:background="@drawable/circle"
android:textSize="24sp"
android:textStyle="bold"
android:textAllCaps="true"
android:textColor="@android:color/white"
android:gravity="center" >
</TextView>
<TextView
android:id="@+id/contactName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toEndOf="@id/avatar"
android:layout_marginStart="10dp"
android:textSize="20sp"
android:layout_marginBottom="6dp">
</TextView>