package com.steps.geosms.objects;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.text.TextUtils;
import android.util.Log;
import com.ioane.sharvadze.geosms.R;
import com.steps.geosms.utils.Utils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Class Contact
* Created by Ioane on 2/21/2015.
*/
public class Contact implements Serializable{
private int id;
private String name;
private String photoUri;
private String address;
/**
* We don't want to serialize it. :) because we can't serialize it.
*/
private transient Bitmap photo;
private static final String TAG = Contact.class.getSimpleName();
public Contact(String name, String photoUri,String address,Bitmap photo) {
this.name = name;
this.photoUri = photoUri;
this.address = address;
this.photo = photo;
}
public static final String ID = "id";
public static final String NAME = "name";
public static final String PHOTO = "photo";
public static final String PHOTO_URI = "photo_uri";
public static final String ADDRESS = "address";
public Contact(Bundle contactData){
this.id = contactData.getInt(ID);
this.name = contactData.getString(NAME);
this.photoUri = contactData.getString(PHOTO_URI);
this.address = contactData.getString(ADDRESS);
try{
this.photo = contactData.getParcelable(PHOTO);
}catch (ClassCastException e){
e.printStackTrace();
}
}
public Contact(Cursor c){
Log.i(TAG, Arrays.asList(c.getColumnNames()).toString());
}
public Bundle getBundle(){
Bundle bundle = new Bundle();
bundle.putInt(ID,id);
bundle.putString(NAME, name);
bundle.putString(PHOTO_URI,photoUri);
bundle.putString(ADDRESS,address);
bundle.putParcelable(PHOTO, photo);
return bundle;
}
private void initFromAddress(Context context,String address){
setAddress(address);
Uri lookupUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address));
Cursor c = context.getContentResolver().query(lookupUri, null, null, null, null);
if (c.getCount() > 0) {
c.moveToFirst();
String displayName = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String photoURI = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
int id = c.getInt(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID));
setId(id);
setName(displayName);
setPhotoUri(photoURI);
//setPhoto(getPhotoFromURI(photoURI,context));
}
c.close();
}
public Contact(Context context,String address){
if(address != null)
address = Utils.removeWhitespaces(address);
initFromAddress(context, address);
}
public Contact(Context context,int recipientId){
setAddress(null);
setName(null);
setPhotoUri(null);
ContentResolver cr = context.getContentResolver();
Cursor c = cr.query(ContentUris.withAppendedId(Uri.parse("content://mms-sms/canonical-address"), recipientId),
null, null, null, null);
if(c.moveToFirst()){
String address = c.getString(0);
if(address != null)
initFromAddress(context,address);
}
c.close();
}
public String getDisplayName(){
if(!TextUtils.isEmpty(name))
return name;
return address;
}
public void resolveContactImage(Context context, int size){
photo = resolveContactImage(context,size,getDisplayName(),photoUri);
}
public static Bitmap resolveImageFromText(int size,Context context, String displayName){
if(!TextUtils.isEmpty(displayName))
return Utils.createTextBitmap(displayName,size,context);
return null;
}
public static Bitmap resolveContactImage(Context context, int size, String displayName, String uri){
if(TextUtils.isEmpty(uri)){
return resolveImageFromText(size, context, displayName);
}else {
Bitmap bitmap = Utils.getPhotoFromURI(uri, context, size);
if(bitmap == null){
return resolveImageFromText(size,context,displayName);
}else {
return Utils.getCircleBitmap(bitmap);
}
}
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhotoUri() {
return photoUri;
}
public void setPhotoUri(String photoUri) {
this.photoUri = photoUri;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Bitmap getPhoto() {
return photo;
}
public void setPhoto(Bitmap photo) {
this.photo = photo;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Contact contact = (Contact) o;
return id == contact.id && !(address != null && !address.equals(contact.getAddress()));
}
/**
* Contains function that compares contacts
* by it's address.
*
* @param contactList The list where we search this contact.
* @param address contact to find in list.
* @return true if found, false if not.
*/
public static boolean containsByAddress(List<Contact> contactList,String address){
for(Contact cmp : contactList){
if(TextUtils.equals(cmp.getAddress(),address))
return true;
}
return false;
}
/**
* Returns Address list from contact list.
*
* @param contactList contact list
* @return address array list
*/
public static List<String> toAddressArray(ArrayList<Contact> contactList){
ArrayList<String> address = new ArrayList<>(contactList.size());
for(Contact contact : contactList){
address.add(contact.getAddress());
}
return address;
}
@Override
public String toString() {
return "Contact{" +
"id= " + id +
", name='" + name + '\'' +
", photoUri='" + photoUri + '\'' +
", address='" + address + '\'' +
'}';
}
}