- Gravatars are loaded in Contact List and Contact Selection List
This commit is contained in:
parent
a131037fd1
commit
6c81d74deb
8 changed files with 113 additions and 5 deletions
|
@ -63,4 +63,6 @@ dependencies {
|
||||||
annotationProcessor 'android.arch.lifecycle:compiler:1.0.0'
|
annotationProcessor 'android.arch.lifecycle:compiler:1.0.0'
|
||||||
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'
|
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'
|
||||||
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
|
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
|
||||||
|
|
||||||
|
compile 'com.squareup.picasso:picasso:2.5.2'
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
"formatVersion": 1,
|
"formatVersion": 1,
|
||||||
"database": {
|
"database": {
|
||||||
"version": 2,
|
"version": 2,
|
||||||
"identityHash": "3ec53bc71906b5abcabeaefcd7505bc1",
|
"identityHash": "22cb2a56b28a9f7088ec98d6a72f9f67",
|
||||||
"entities": [
|
"entities": [
|
||||||
{
|
{
|
||||||
"tableName": "account_seed",
|
"tableName": "account_seed",
|
||||||
|
@ -284,6 +284,14 @@
|
||||||
"name"
|
"name"
|
||||||
],
|
],
|
||||||
"createSql": "CREATE UNIQUE INDEX `index_contact_name` ON `${TABLE_NAME}` (`name`)"
|
"createSql": "CREATE UNIQUE INDEX `index_contact_name` ON `${TABLE_NAME}` (`name`)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "index_contact_email",
|
||||||
|
"unique": false,
|
||||||
|
"columnNames": [
|
||||||
|
"email"
|
||||||
|
],
|
||||||
|
"createSql": "CREATE INDEX `index_contact_email` ON `${TABLE_NAME}` (`email`)"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"foreignKeys": []
|
"foreignKeys": []
|
||||||
|
@ -684,7 +692,7 @@
|
||||||
],
|
],
|
||||||
"setupQueries": [
|
"setupQueries": [
|
||||||
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
|
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
|
||||||
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"3ec53bc71906b5abcabeaefcd7505bc1\")"
|
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"22cb2a56b28a9f7088ec98d6a72f9f67\")"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -27,7 +27,7 @@ public interface ContactDao {
|
||||||
@Query("SELECT * FROM contact ORDER BY name ASC")
|
@Query("SELECT * FROM contact ORDER BY name ASC")
|
||||||
LivePagedListProvider<Integer, Contact> contactsByName();
|
LivePagedListProvider<Integer, Contact> contactsByName();
|
||||||
|
|
||||||
@Query("SELECT c.* FROM contact c WHERE c.id IN (SELECT DISTINCT(ca.contact_id) FROM contact_address ca WHERE ca.crypto_net == :cryptoNet) ORDER BY name ASC")
|
@Query("SELECT c.* FROM contact c WHERE c.id IN (SELECT DISTINCT(ca.contact_id) FROM contact_address ca WHERE ca.crypto_net == :cryptoNet) ORDER BY name ASC, email ASC")
|
||||||
LivePagedListProvider<Integer, Contact> contactsByNameAndCryptoNet(String cryptoNet);
|
LivePagedListProvider<Integer, Contact> contactsByNameAndCryptoNet(String cryptoNet);
|
||||||
|
|
||||||
@Query("SELECT * FROM contact WHERE id = :id")
|
@Query("SELECT * FROM contact WHERE id = :id")
|
||||||
|
|
|
@ -22,7 +22,7 @@ import cy.agorise.crystalwallet.enums.CryptoNet;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@Entity(tableName="contact",
|
@Entity(tableName="contact",
|
||||||
indices = {@Index("id"),@Index(value = {"name"}, unique=true)})
|
indices = {@Index("id"),@Index(value = {"name"}, unique=true),@Index("email")})
|
||||||
public class Contact {
|
public class Contact {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -69,7 +69,7 @@ public class Contact {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getEmail() {
|
public String getEmail() {
|
||||||
return mEmail;
|
return this.mEmail;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setEmail(String email) {
|
public void setEmail(String email) {
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
package cy.agorise.crystalwallet.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Henry Varona on 25/2/2018.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapShader;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
|
||||||
|
import com.squareup.picasso.Transformation;
|
||||||
|
|
||||||
|
public class CircleTransformation implements Transformation {
|
||||||
|
@Override
|
||||||
|
public Bitmap transform(Bitmap source) {
|
||||||
|
int size = Math.min(source.getWidth(), source.getHeight());
|
||||||
|
|
||||||
|
int x = (source.getWidth() - size) / 2;
|
||||||
|
int y = (source.getHeight() - size) / 2;
|
||||||
|
|
||||||
|
Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
|
||||||
|
if (squaredBitmap != source) {
|
||||||
|
source.recycle();
|
||||||
|
}
|
||||||
|
|
||||||
|
Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());
|
||||||
|
|
||||||
|
Canvas canvas = new Canvas(bitmap);
|
||||||
|
Paint paint = new Paint();
|
||||||
|
BitmapShader shader = new BitmapShader(squaredBitmap,
|
||||||
|
BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
|
||||||
|
paint.setShader(shader);
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
|
||||||
|
float r = size / 2f;
|
||||||
|
canvas.drawCircle(r, r, r, paint);
|
||||||
|
|
||||||
|
squaredBitmap.recycle();
|
||||||
|
return bitmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String key() {
|
||||||
|
return "CircleTransformation";
|
||||||
|
}
|
||||||
|
}
|
22
app/src/main/java/cy/agorise/crystalwallet/util/MD5Hash.java
Normal file
22
app/src/main/java/cy/agorise/crystalwallet/util/MD5Hash.java
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
package cy.agorise.crystalwallet.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Henry Varona on 24/2/2018.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class MD5Hash {
|
||||||
|
|
||||||
|
static public String hash(String md5) {
|
||||||
|
try {
|
||||||
|
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
|
||||||
|
byte[] array = md.digest(md5.getBytes());
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
for (int i = 0; i < array.length; ++i) {
|
||||||
|
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
} catch (java.security.NoSuchAlgorithmException e) {
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,10 +9,14 @@ import android.view.View;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.squareup.picasso.Picasso;
|
||||||
|
|
||||||
import cy.agorise.crystalwallet.R;
|
import cy.agorise.crystalwallet.R;
|
||||||
import cy.agorise.crystalwallet.activities.CreateContactActivity;
|
import cy.agorise.crystalwallet.activities.CreateContactActivity;
|
||||||
import cy.agorise.crystalwallet.dao.CrystalDatabase;
|
import cy.agorise.crystalwallet.dao.CrystalDatabase;
|
||||||
import cy.agorise.crystalwallet.models.Contact;
|
import cy.agorise.crystalwallet.models.Contact;
|
||||||
|
import cy.agorise.crystalwallet.util.CircleTransformation;
|
||||||
|
import cy.agorise.crystalwallet.util.MD5Hash;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Henry Varona on 2/16/2018.
|
* Created by Henry Varona on 2/16/2018.
|
||||||
|
@ -62,6 +66,16 @@ public class ContactSelectionViewHolder extends RecyclerView.ViewHolder {
|
||||||
tvName.setText(contact.getName());
|
tvName.setText(contact.getName());
|
||||||
tvLastPaid.setText("Paid: 1 Jan, 2001 01:01");
|
tvLastPaid.setText("Paid: 1 Jan, 2001 01:01");
|
||||||
|
|
||||||
|
if (contact.getEmail() != null){
|
||||||
|
String emailHash = MD5Hash.hash(contact.getEmail());
|
||||||
|
String gravatarUrl = "http://www.gravatar.com/avatar/" + emailHash + "?s=204&d=404";
|
||||||
|
|
||||||
|
Picasso.with(this.context)
|
||||||
|
.load(gravatarUrl)
|
||||||
|
.transform(new CircleTransformation())
|
||||||
|
.into(ivThumbnail);
|
||||||
|
}
|
||||||
|
|
||||||
this.itemView.setOnClickListener(new View.OnClickListener() {
|
this.itemView.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
|
|
|
@ -6,14 +6,19 @@ import android.content.Intent;
|
||||||
import android.provider.ContactsContract;
|
import android.provider.ContactsContract;
|
||||||
import android.support.v7.app.AlertDialog;
|
import android.support.v7.app.AlertDialog;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
import android.support.v7.widget.ThemedSpinnerAdapter;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.squareup.picasso.Picasso;
|
||||||
|
|
||||||
import cy.agorise.crystalwallet.R;
|
import cy.agorise.crystalwallet.R;
|
||||||
import cy.agorise.crystalwallet.activities.CreateContactActivity;
|
import cy.agorise.crystalwallet.activities.CreateContactActivity;
|
||||||
import cy.agorise.crystalwallet.dao.CrystalDatabase;
|
import cy.agorise.crystalwallet.dao.CrystalDatabase;
|
||||||
import cy.agorise.crystalwallet.models.Contact;
|
import cy.agorise.crystalwallet.models.Contact;
|
||||||
|
import cy.agorise.crystalwallet.util.CircleTransformation;
|
||||||
|
import cy.agorise.crystalwallet.util.MD5Hash;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Henry Varona on 1/17/2017.
|
* Created by Henry Varona on 1/17/2017.
|
||||||
|
@ -67,6 +72,16 @@ public class ContactViewHolder extends RecyclerView.ViewHolder {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (contact.getEmail() != null){
|
||||||
|
String emailHash = MD5Hash.hash(contact.getEmail());
|
||||||
|
String gravatarUrl = "http://www.gravatar.com/avatar/" + emailHash + "?s=204&d=404";
|
||||||
|
|
||||||
|
Picasso.with(this.context)
|
||||||
|
.load(gravatarUrl)
|
||||||
|
.transform(new CircleTransformation())
|
||||||
|
.into(ivThumbnail);
|
||||||
|
}
|
||||||
|
|
||||||
this.ivDeleteContact.setOnClickListener(new View.OnClickListener() {
|
this.ivDeleteContact.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
|
|
Loading…
Reference in a new issue