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.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 MmsContact extends ContactItem {
public static final String PKG_NAME = "com.android.contacts";
private Context context;
private int mContactId;
private String mPhoneNumber;
public MmsContact(Context context, int contactId, String number, CharSequence displayName) {
this(context, contactId, number, BitmapUtils.getDefaultContactAvatar(context), displayName);
}
public MmsContact(Context context, int contactId, String number, Bitmap avatar, CharSequence displayName) {
super(context, avatar, displayName);
if(contactId <= 0 || TextUtils.isEmpty(number)){
throw new IllegalArgumentException("contactId <= 0 or num is empty !");
}
this.context = context;
this.mContactId = contactId;
this.mPhoneNumber = number;
}
@Override
public boolean acceptDragEvent(Context context, DragEvent event) {
if (event.getClipDescription().getMimeTypeCount() != 1) {
return false;
}
String mimeType = event.getClipDescription().getMimeType(0);
if (TextUtils.isEmpty(mimeType)) {
return false;
}
if (ClipDescription.MIMETYPE_TEXT_PLAIN.equals(mimeType)
|| ClipDescription.compareMimeTypes(mimeType, "image/*")) {
return true;
}
return false;
}
@Override
public boolean handleDragEvent(Context context, DragEvent event) {
Tracker.dragSuccess(3, PKG_NAME);
boolean sret = super.handleDragEvent(context, event);
if(sret){
return true;
}
if (event.getClipData().getItemCount() != 1) {
return false;
}
Intent intent = null;
String mimeType = event.getClipDescription().getMimeType(0);
if (ClipDescription.MIMETYPE_TEXT_PLAIN.equals(mimeType)) {
intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + mPhoneNumber));
intent.putExtra("sms_body", event.getClipData().getItemAt(0).getText().toString());
} else if (ClipDescription.compareMimeTypes(mimeType, "image/*")) {
intent = new Intent(Intent.ACTION_SEND);
intent.putExtra("address", mPhoneNumber);
intent.putExtra(Intent.EXTRA_STREAM, event.getClipData().getItemAt(0).getUri());
intent.setType("image/*");
intent.setClassName("com.android.mms", "com.android.mms.ui.ComposeMessageActivity");
}
if (intent != null) {
try {
intent.putExtra("need_finish", true);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
return true;
} catch (ActivityNotFoundException e) {
// NA
}
}
return false;
}
@Override
public boolean openUI(Context context) {
Tracker.onClick(Tracker.EVENT_CLICK_CONTACTS, "contacts_type", "2");
try {
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + mPhoneNumber));
intent.putExtra("need_finish", true);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
return true;
} catch (ActivityNotFoundException e) {
// NA
}
return false;
}
@Override
public void save() {
MmsDatabaseHelper.getInstance(context).update(this);
}
@Override
public void deleteFromDatabase() {
MmsDatabaseHelper.getInstance(context).delete(this);
}
@Override
public int getTypeIcon() {
return R.drawable.contact_icon_mms;
}
@Override
public String getPackageName() {
return PKG_NAME;
}
@Override
public boolean sameContact(ContactItem ci) {
if (ci == null) {
return false;
}
if (ci instanceof MmsContact) {
MmsContact o = (MmsContact) ci;
if (mContactId == o.mContactId
&& mPhoneNumber.equals(o.mPhoneNumber)) {
return true;
}
}
return false;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("MmsContact(");
sb.append("id -> " + mContactId + ",");
sb.append("phoneNumber -> " + mPhoneNumber + ",");
sb.append("displayName -> " + mDisplayName);
sb.append(")");
return sb.toString();
}
public static List<ContactItem> getContacts(Context context){
return MmsDatabaseHelper.getInstance(context).getContacts();
}
private static final class MmsDatabaseHelper extends SQLiteOpenHelper{
private volatile static MmsDatabaseHelper sInstance;
public synchronized static MmsDatabaseHelper getInstance(Context context){
if(sInstance == null){
synchronized(MmsDatabaseHelper.class){
if(sInstance == null){
sInstance = new MmsDatabaseHelper(context);
}
}
}
return sInstance;
}
private static final String DB_NAME = "mms_contacts";
private static final int DB_VERSION = 1;
private Context mContext;
private MmsDatabaseHelper(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,"
+ "contact_id INTEGER,"
+ "phone_number TEXT,"
+ "avatar BLOB,"
+ "display_name TEXT,"
+ "weight INTEGER);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//NA
}
public int getId(MmsContact contact) {
Cursor cursor = null;
try {
cursor = getReadableDatabase().query(TABLE_CONTACTS, null,
ContactColumns.CONTACT_ID + "=?" + " and " + ContactColumns.PHONE_NUMBER + "=?",
new String[] { contact.mContactId + "", contact.mPhoneNumber }, null, null, null);
if (cursor != null && 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(MmsContact contact) {
int id = getId(contact);
// insert
ContentValues cv = new ContentValues();
cv.put(ContactColumns.CONTACT_ID, contact.mContactId + "");
cv.put(ContactColumns.PHONE_NUMBER, contact.mPhoneNumber);
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 delete(MmsContact 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()) {
int contactId = cursor.getInt(cursor.getColumnIndex(ContactColumns.CONTACT_ID));
String phoneNumber = cursor.getString(cursor.getColumnIndex(ContactColumns.PHONE_NUMBER));
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));
MmsContact ddc = new MmsContact(mContext, contactId, phoneNumber, avatar, display_name);
ddc.setIndex(index);
ret.add(ddc);
}
} 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 CONTACT_ID = "contact_id";
static final String PHONE_NUMBER = "phone_number";
static final String AVATAR = "avatar";
static final String DISPLAY_NAME = "display_name";
static final String WEIGHT = "weight";
}
}
}