package com.smartisanos.sidebar.util; 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.provider.BaseColumns; import android.text.TextUtils; import android.view.DragEvent; import com.smartisanos.sidebar.R; import java.util.ArrayList; import java.util.List; public class DingDingContact extends ContactItem { public static final String PKG_NAME = "com.alibaba.android.rimet"; // may be null in old version dingding. public final String sendUserId; public final String encodedUid; public final int systemUid; public DingDingContact(Context context, int systemUid, String sendUserId, String encodedUid, Bitmap avatar, CharSequence displayName) { super(context, avatar, displayName); this.sendUserId = sendUserId; this.encodedUid = encodedUid; this.systemUid = systemUid; } @Override public boolean acceptDragEvent(Context context, DragEvent event) { return event.getClipDescription().getMimeTypeCount() == 1; } @Override public boolean handleDragEvent(Context context, DragEvent event) { Tracker.dragSuccess(2, PKG_NAME); boolean sret = super.handleDragEvent(context, event); if(sret){ return true; } if (event.getClipData().getItemCount() != 1 || event.getClipData().getDescription().getMimeTypeCount() != 1) { return false; } Intent intent = new Intent("com.alibaba.android.rimet.SEND"); intent.putExtra("user_id_string", encodedUid); intent.putExtra("send_user_id", sendUserId); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); String mimeType = event.getClipDescription().getMimeType(0); if (TextUtils.isEmpty(mimeType)) { return false; } if (ClipDescription.MIMETYPE_TEXT_PLAIN.equals(mimeType)) { intent.setType(mimeType); intent.putExtra(Intent.EXTRA_TEXT, event.getClipData().getItemAt(0).getText().toString()); } else if (ClipDescription.compareMimeTypes(mimeType, "image/*")) { intent.setDataAndType(event.getClipData().getItemAt(0).getUri(), mimeType); } else { intent.setDataAndType(event.getClipData().getItemAt(0).getUri(), mimeType); } try { LaunchApp.start(mContext, intent, true, PKG_NAME, systemUid); return true; } catch (ActivityNotFoundException e) { // NA } return false; } @Override public boolean openUI(Context context) { Tracker.onClick(Tracker.EVENT_CLICK_CONTACTS, "contacts_type", "1"); Intent intent = new Intent("com.alibaba.android.rimet.ShortCutChat"); intent.putExtra("user_id_string", encodedUid); intent.putExtra("send_user_id", sendUserId); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); try { LaunchApp.start(mContext, intent, true, PKG_NAME, systemUid); return true; } catch (ActivityNotFoundException e) { // NA } return false; } @Override public void save() { DatabaseHelper.getInstance(mContext).update(this); } @Override public void deleteFromDatabase() { DatabaseHelper.getInstance(mContext).remove(this); } @Override public int getTypeIcon() { return R.drawable.contact_icon_dingding; } @Override public String getPackageName() { return PKG_NAME; } @Override public boolean sameContact(ContactItem ci) { if (!(ci instanceof DingDingContact)) { return false; } DingDingContact ddc = (DingDingContact) ci; return TextUtils.equals(sendUserId, ddc.sendUserId) && TextUtils.equals(encodedUid, ddc.encodedUid); } public static List<ContactItem> getContacts(Context context){ return DatabaseHelper.getInstance(context).getContacts(); } public static final class DatabaseHelper extends SQLiteOpenHelper{ private volatile static DatabaseHelper sInstance; public synchronized static DatabaseHelper getInstance(Context context){ if(sInstance == null){ synchronized(DatabaseHelper.class){ if(sInstance == null){ sInstance = new DatabaseHelper(context); } } } return sInstance; } private static final String TABLE_CONTACTS = "contacts"; private static final String DB_NAME = "ding_contacts"; private static final int DB_VERSION = 1; private Context mContext; private DatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); mContext = context; } private static final String CREATE_SQL = "CREATE TABLE IF NOT EXISTS " + TABLE_CONTACTS + " (" + "_id INTEGER PRIMARY KEY AUTOINCREMENT," + "system_uid INTEGER," + "send_user_id TEXT," + "encoded_uid TEXT," + "avatar BLOB," + "display_name TEXT," + "weight INTEGER);"; @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_SQL); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // NA } public int getId(DingDingContact ddc) { ThreadVerify.verify(false); Cursor cursor = null; try { if (!TextUtils.isEmpty(ddc.encodedUid)) { cursor = getReadableDatabase().query( TABLE_CONTACTS, null, ContactColumns.ENCODED_UID + "=?" + "and " + ContactColumns.SEND_USER_ID + "=?", new String[] { ddc.encodedUid, ddc.sendUserId }, null, null, null); } if (cursor != null && cursor.getCount() > 0 && 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(DingDingContact ddc) { ThreadVerify.verify(false); int id = getId(ddc); // insert ContentValues cv = new ContentValues(); cv.put(ContactColumns.SYS_UID, ddc.systemUid); cv.put(ContactColumns.SEND_USER_ID, ddc.sendUserId); cv.put(ContactColumns.ENCODED_UID, ddc.encodedUid); cv.put(ContactColumns.AVATAR, BitmapUtils.Drawable2Bytes(ddc.getAvatar())); cv.put(ContactColumns.DISPLAY_NAME, ddc.getDisplayName().toString()); cv.put(ContactColumns.WEIGHT, ddc.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(DingDingContact ddc) { ThreadVerify.verify(false); int id = getId(ddc); if (id != 0) { getWritableDatabase().delete(TABLE_CONTACTS, ContactColumns._ID + "=?", new String[] { id + "" }); } } public void remove(String where) { ThreadVerify.verify(false); try { getWritableDatabase().delete(TABLE_CONTACTS, where, null); } catch (Exception e) { e.printStackTrace(); } } public List<ContactItem> getContacts() { ThreadVerify.verify(false); List<ContactItem> ret = new ArrayList<ContactItem>(); Cursor cursor = null; try { cursor = getReadableDatabase().query("contacts", null, null, null, null, null, null); while (cursor.moveToNext()) { int systemUid = cursor.getInt(cursor.getColumnIndex(ContactColumns.SYS_UID)); String sendUserId = cursor.getString(cursor.getColumnIndex(ContactColumns.SEND_USER_ID)); String encodedUid = cursor.getString(cursor.getColumnIndex(ContactColumns.ENCODED_UID)); 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)); DingDingContact ddc = new DingDingContact(mContext, systemUid, sendUserId, encodedUid, avatar, display_name); ddc.setIndex(index); ret.add(ddc); } } catch (Exception e) { e.printStackTrace(); } finally { if (cursor != null) { cursor.close(); } } return ret; } static class ContactColumns implements BaseColumns{ static final String SYS_UID = "system_uid"; static final String SEND_USER_ID = "send_user_id"; static final String ENCODED_UID = "encoded_uid"; static final String AVATAR = "avatar"; static final String DISPLAY_NAME = "display_name"; static final String WEIGHT = "weight"; } } public static void removeDoppelgangerShortcut(Context context) { // String where = DatabaseHelper.ContactColumns.SYS_UID + "=" + UserPackage.USER_DOPPELGANGER; // DatabaseHelper.getInstance(context).remove(where); } }