package com.smartisanos.sidebar.util;
import java.util.ArrayList;
import java.util.List;
import com.smartisanos.sidebar.R;
import android.content.ActivityNotFoundException;
import android.content.ClipDescription;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.BaseColumns;
import android.text.TextUtils;
import android.view.DragEvent;
public class MailContact extends ContactItem {
public static final String PKG_NAME = "com.android.contacts";
private static final ComponentName COMP_NAME = new ComponentName("com.android.email","com.android.mail.compose.ComposeActivity");
private String mMailAddress;
public MailContact(Context context, CharSequence displayName, String mailAddress) {
this(context, BitmapUtils.getDefaultContactAvatar(context), displayName, mailAddress);
}
public MailContact(Context context, Bitmap avatar, CharSequence displayName, String mailAddress) {
super(context, avatar, displayName);
if (TextUtils.isEmpty(mailAddress)) {
throw new IllegalArgumentException("Addresss is empty !");
}
mMailAddress = mailAddress;
}
public String getAddress(){
return mMailAddress;
}
@Override
public boolean acceptDragEvent(Context context, DragEvent event) {
return event.getClipDescription().getMimeTypeCount() > 0;
}
@Override
public boolean handleDragEvent(Context context, DragEvent event) {
Tracker.dragSuccess(4, PKG_NAME);
boolean sret = super.handleDragEvent(context, event);
if(sret){
return true;
}
if (event.getClipData().getItemCount() <= 0
|| event.getClipDescription().getMimeTypeCount() <= 0
|| event.getClipDescription().getMimeTypeCount() != event.getClipData().getItemCount()) {
return false;
}
String mimeType = MimeUtils.getCommonMimeType(event);
Intent intent = new Intent();
intent.setData(Uri.parse("mailto:" + mMailAddress));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(COMP_NAME);
if (ClipDescription.MIMETYPE_TEXT_PLAIN.equals(mimeType)) {
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, event.getClipData().getItemAt(0).getText().toString());
} else {
if (event.getClipData().getItemCount() > 1) {
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, MimeUtils.getUris(event));
} else {
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, event.getClipData().getItemAt(0).getUri());
}
}
try {
mContext.startActivity(intent);
return true;
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
return false;
}
@Override
public boolean openUI(Context context) {
Tracker.onClick(Tracker.EVENT_CLICK_CONTACTS, "contacts_type", "3");
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setData(Uri.parse("mailto:" + mMailAddress));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(COMP_NAME);
try {
mContext.startActivity(intent);
return true;
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
return false;
}
@Override
public void save() {
MailDatabaseHelper.getInstance(mContext).update(this);
}
@Override
public void deleteFromDatabase() {
MailDatabaseHelper.getInstance(mContext).remove(this);
}
@Override
public int getTypeIcon() {
return R.drawable.contact_icon_mail;
}
@Override
public String getPackageName() {
return PKG_NAME;
}
@Override
public boolean sameContact(ContactItem ci) {
if (ci == null || !(ci instanceof MailContact)) {
return false;
}
MailContact mc = (MailContact) ci;
return mMailAddress.equals(mc.mMailAddress);
}
public static List<ContactItem> getContacts(Context context){
return MailDatabaseHelper.getInstance(context).getContacts();
}
private static final class MailDatabaseHelper extends SQLiteOpenHelper{
private volatile static MailDatabaseHelper sInstance;
public synchronized static MailDatabaseHelper getInstance(Context context){
if(sInstance == null){
synchronized(MailDatabaseHelper.class){
if(sInstance == null){
sInstance = new MailDatabaseHelper(context);
}
}
}
return sInstance;
}
private static final String DB_NAME = "mail_contacts";
private static final int DB_VERSION = 1;
private Context mContext;
private MailDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_CONTACTS + " (_id INTEGER PRIMARY KEY AUTOINCREMENT,"
+ "mail_address TEXT,"
+ "avatar BLOB,"
+ "display_name TEXT,"
+ "weight INTEGER);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//NA
}
public int getId(MailContact contact) {
Cursor cursor = null;
try {
cursor = getReadableDatabase().query(TABLE_CONTACTS, null,
ContactColumns.MAIL_ADDRESS + "=?",
new String[] {contact.mMailAddress }, null, null, null);
if (cursor.moveToFirst()) {
return cursor.getInt(cursor.getColumnIndex(ContactColumns._ID));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
return 0;
}
public void update(MailContact contact) {
int id = getId(contact);
// insert
ContentValues cv = new ContentValues();
cv.put(ContactColumns.MAIL_ADDRESS, contact.mMailAddress);
cv.put(ContactColumns.AVATAR, BitmapUtils.Drawable2Bytes(contact.getAvatar()));
cv.put(ContactColumns.DISPLAY_NAME, contact.getDisplayName().toString());
cv.put(ContactColumns.WEIGHT, contact.getIndex());
if (id != 0) {
// update database;
getWritableDatabase().update(TABLE_CONTACTS, cv,
ContactColumns._ID + "=?", new String[] { id + "" });
} else {
getWritableDatabase().insert(TABLE_CONTACTS, null, cv);
}
}
public void remove(MailContact contact) {
int id = getId(contact);
if (id != 0) {
getWritableDatabase().delete(TABLE_CONTACTS,
ContactColumns._ID + "=?", new String[] { id + "" });
}
}
public List<ContactItem> getContacts(){
List<ContactItem> ret = new ArrayList<ContactItem>();
Cursor cursor = null;
try {
cursor = getReadableDatabase().query(TABLE_CONTACTS, null,
null, null, null, null, null);
while (cursor.moveToNext()) {
String mailAddress = cursor.getString(cursor.getColumnIndex(ContactColumns.MAIL_ADDRESS));
Bitmap avatar = BitmapUtils.Bytes2Bitmap(cursor.getBlob(cursor.getColumnIndex(ContactColumns.AVATAR)));
String display_name = cursor.getString(cursor.getColumnIndex(ContactColumns.DISPLAY_NAME));
int index = cursor.getInt(cursor.getColumnIndex(ContactColumns.WEIGHT));
MailContact mc = new MailContact(mContext, avatar, display_name, mailAddress);
mc.setIndex(index);
ret.add(mc);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
return ret;
}
private static final String TABLE_CONTACTS = "contacts";
static class ContactColumns implements BaseColumns{
static final String MAIL_ADDRESS = "mail_address";
static final String AVATAR = "avatar";
static final String DISPLAY_NAME = "display_name";
static final String WEIGHT = "weight";
}
}
}