📄 contactlistmanageradapter.java
字号:
values.put(Im.Contacts.SUBSCRIPTION_TYPE, subscriptionType); values.put(Im.Contacts.SUBSCRIPTION_STATUS, subscriptionStatus); uri = mResolver.insert(mContactUrl, values); } cursor.close(); return uri; } void updateContact(String username, ContentValues values) { String selection = Im.Contacts.USERNAME + "=?"; String[] selectionArgs = { username }; mResolver.update(mContactUrl, values, selection, selectionArgs); } void updatePresenceContent(Contact[] contacts) { ArrayList<String> usernames = new ArrayList<String>(); ArrayList<String> statusArray = new ArrayList<String>(); ArrayList<String> customStatusArray = new ArrayList<String>(); ArrayList<String> clientTypeArray = new ArrayList<String>(); for(Contact c : contacts) { String username = c.getAddress().getFullName(); Presence p = c.getPresence(); int status = getContactStatus(p); String customStatus = p.getStatusText(); int clientType = translateClientType(p); usernames.add(username); statusArray.add(String.valueOf(status)); customStatusArray.add(customStatus); clientTypeArray.add(String.valueOf(clientType)); } ContentValues values = new ContentValues(); values.put(Im.Contacts.ACCOUNT, mAccountId); values.putStringArrayList(Im.Contacts.USERNAME, usernames); values.putStringArrayList(Im.Presence.PRESENCE_STATUS, statusArray); values.putStringArrayList(Im.Presence.PRESENCE_CUSTOM_STATUS, customStatusArray); values.putStringArrayList(Im.Presence.CONTENT_TYPE, clientTypeArray); mResolver.update(Im.Presence.BULK_CONTENT_URI, values, null, null); } void updateAvatarsContent(Contact[] contacts) { ArrayList<ContentValues> avatars = new ArrayList<ContentValues>(); ArrayList<String> usernames = new ArrayList<String>(); for (Contact contact : contacts) { byte[] avatarData = contact.getPresence().getAvatarData(); if (avatarData == null) { continue; } String username = contact.getAddress().getFullName(); ContentValues values = new ContentValues(2); values.put(Im.Avatars.CONTACT, username); values.put(Im.Avatars.DATA, avatarData); avatars.add(values); usernames.add(username); } if (avatars.size() > 0) { // ImProvider will replace the avatar content if it already exist. mResolver.bulkInsert(mAvatarUrl, avatars.toArray( new ContentValues[avatars.size()])); // notify avatar changed Intent i = new Intent(ImServiceConstants.ACTION_AVATAR_CHANGED); i.putExtra(ImServiceConstants.EXTRA_INTENT_FROM_ADDRESS, usernames); i.putExtra(ImServiceConstants.EXTRA_INTENT_PROVIDER_ID, mProviderId); i.putExtra(ImServiceConstants.EXTRA_INTENT_ACCOUNT_ID, mAccountId); mContext.sendBroadcast(i); } } ContactListAdapter removeContactListFromDataBase(String name) { ContactListAdapter listAdapter = getContactListAdapter(name); if (listAdapter == null) { return null; } long id = listAdapter.getDataBaseId(); // delete contacts of this list first mResolver.delete(mContactUrl, Im.Contacts.CONTACTLIST + "=?", new String[]{Long.toString(id)}); mResolver.delete(ContentUris.withAppendedId(Im.ContactList.CONTENT_URI, id), null, null); synchronized (mContactLists) { return mContactLists.remove(listAdapter.getAddress()); } } void addContactListContent(ContactList list) { String selection = Im.ContactList.NAME + "=? AND " + Im.ContactList.PROVIDER + "=? AND " + Im.ContactList.ACCOUNT + "=?"; String[] selectionArgs = { list.getName(), Long.toString(mProviderId), Long.toString(mAccountId) }; Cursor cursor = mResolver.query(Im.ContactList.CONTENT_URI, CONTACT_LIST_ID_PROJECTION, selection, selectionArgs, null); // no sort order long listId = 0; Uri uri = null; try { if (cursor.moveToFirst()) { listId = cursor.getLong(0); uri = ContentUris.withAppendedId(Im.ContactList.CONTENT_URI, listId); //Log.d(TAG,"Found and removing ContactList with name "+list.getName()); } } finally { cursor.close(); } if (uri != null) { // remove existing ContactList and Contacts of that list for replacement by the newly // downloaded list mResolver.delete(mContactUrl, Im.Contacts.CONTACTLIST + "=?", new String[]{Long.toString(listId)}); mResolver.delete(uri, selection, selectionArgs); } ContentValues contactListValues = new ContentValues(3); contactListValues.put(Im.ContactList.NAME, list.getName()); contactListValues.put(Im.ContactList.PROVIDER, mProviderId); contactListValues.put(Im.ContactList.ACCOUNT, mAccountId); //Log.d(TAG, "Adding ContactList name="+list.getName()); mValidatedContactLists.add(list.getName()); uri = mResolver.insert(Im.ContactList.CONTENT_URI, contactListValues); listId = ContentUris.parseId(uri); synchronized (mContactLists) { mContactLists.put(list.getAddress(), new ContactListAdapter(list, listId)); } Collection<Contact> contacts = list.getContacts(); if (contacts == null || contacts.size() == 0) { return; } Iterator<Contact> iter = contacts.iterator(); while(iter.hasNext()) { Contact c = iter.next(); String address = c.getAddress().getFullName(); if(isTemporary(address)) { moveTemporaryContactToList(address, listId); iter.remove(); } mValidatedContacts.add(address); } ArrayList<String> usernames = new ArrayList<String>(); ArrayList<String> nicknames = new ArrayList<String>(); ArrayList<String> contactTypeArray = new ArrayList<String>(); for (Contact c : contacts) { String username = c.getAddress().getFullName(); String nickname = c.getName(); int type = Im.Contacts.TYPE_NORMAL; if(isTemporary(username)) { type = Im.Contacts.TYPE_TEMPORARY; } if (isBlocked(username)) { type = Im.Contacts.TYPE_BLOCKED; } usernames.add(username); nicknames.add(nickname); contactTypeArray.add(String.valueOf(type)); } ContentValues values = new ContentValues(6); values.put(Im.Contacts.PROVIDER, mProviderId); values.put(Im.Contacts.ACCOUNT, mAccountId); values.put(Im.Contacts.CONTACTLIST, listId); values.putStringArrayList(Im.Contacts.USERNAME, usernames); values.putStringArrayList(Im.Contacts.NICKNAME, nicknames); values.putStringArrayList(Im.Contacts.TYPE, contactTypeArray); mResolver.insert(Im.Contacts.BULK_CONTENT_URI, values); } void updateListNameInDataBase(ContactList list) { ContactListAdapter listAdapter = getContactListAdapter(list.getAddress()); Uri uri = ContentUris.withAppendedId(Im.ContactList.CONTENT_URI, listAdapter.getDataBaseId()); ContentValues values = new ContentValues(1); values.put(Im.ContactList.NAME, list.getName()); mResolver.update(uri, values, null, null); } void deleteContactFromDataBase(Contact contact, ContactList list) { String selection = Im.Contacts.USERNAME + "=? AND " + Im.Contacts.CONTACTLIST + "=?"; long listId = getContactListAdapter(list.getAddress()).getDataBaseId(); String username = contact.getAddress().getFullName(); String[] selectionArgs = {username, Long.toString(listId)}; mResolver.delete(mContactUrl, selection, selectionArgs); // clear the history message if the contact doesn't exist in any list // anymore. if(mAdaptee.getContact(contact.getAddress()) == null) { clearHistoryMessages(username); } } Uri insertContactContent(Contact contact, long listId) { ContentValues values = getContactContentValues(contact, listId); Uri uri = mResolver.insert(mContactUrl, values); ContentValues presenceValues = getPresenceValues(ContentUris.parseId(uri), contact.getPresence()); mResolver.insert(Im.Presence.CONTENT_URI, presenceValues); return uri; } private ContentValues getContactContentValues(Contact contact, long listId) { final String username = contact.getAddress().getFullName(); final String nickname = contact.getName(); int type = Im.Contacts.TYPE_NORMAL; if(isTemporary(username)) { type = Im.Contacts.TYPE_TEMPORARY; } if (isBlocked(username)) { type = Im.Contacts.TYPE_BLOCKED; } ContentValues values = new ContentValues(4); values.put(Im.Contacts.USERNAME, username); values.put(Im.Contacts.NICKNAME, nickname); values.put(Im.Contacts.CONTACTLIST, listId); values.put(Im.Contacts.TYPE, type); return values; } void clearHistoryMessages(String contact) { Uri uri = Im.Messages.getContentUriByContact(mProviderId, mAccountId, contact); mResolver.delete(uri, null, null); } private ContentValues getPresenceValues(long contactId, Presence p) { ContentValues values = new ContentValues(3); values.put(Im.Presence.CONTACT_ID, contactId); values.put(Im.Contacts.PRESENCE_STATUS, getContactStatus(p)); values.put(Im.Contacts.PRESENCE_CUSTOM_STATUS, p.getStatusText()); values.put(Im.Presence.CLIENT_TYPE, translateClientType(p)); return values; } private int translateClientType(Presence presence) { int clientType = presence.getClientType(); switch (clientType) { case Presence.CLIENT_TYPE_MOBILE: return Im.Presence.CLIENT_TYPE_MOBILE; default: return Im.Presence.CLIENT_TYPE_DEFAULT; } } private int getContactStatus(Presence presence) { switch (presence.getStatus()) { case Presence.AVAILABLE: return Im.Presence.AVAILABLE; case Presence.IDLE: return Im.Presence.IDLE; case Presence.AWAY: return Im.Presence.AWAY; case Presence.DO_NOT_DISTURB: return Im.Presence.DO_NOT_DISTURB; case Presence.OFFLINE: return Im.Presence.OFFLINE; } // impossible... Log.e(TAG, "Illegal presence status value " + presence.getStatus()); return Im.Presence.AVAILABLE; } public void clearOnLogout() { clearValidatedContactsAndLists(); clearTemporaryContacts(); clearPresence(); } /** * Clears the list of validated contacts and contact lists. * As contacts and contacts lists are added after login, contacts and contact lists are * stored as "validated contacts". After initial download of contacts is complete, any contacts * and contact lists that remain in the database, but are not in the validated list, are * obsolete and should be removed. This function resets that list for use upon login. */ private void clearValidatedContactsAndLists() { // clear the list of validated contacts, contact lists, and blocked contacts mValidatedContacts.clear(); mValidatedContactLists.clear(); mValidatedBlockedContacts.clear(); } /** * Clear the temporary contacts in the database. As contacts are persist between * IM sessions, the temporary contacts need to be cleared after logout. */ private void clearTemporaryContacts() { String selection = Im.Contacts.CONTACTLIST + "=" + FAKE_TEMPORARY_LIST_ID; mResolver.delete(mContactUrl, selection, null); } /** * Clears the presence of the all contacts. As contacts are persist between * IM sessions, the presence need to be cleared after logout. */ void clearPresence() { StringBuilder where = new StringBuilder(); where.append(Im.Presence.CONTACT_ID); where.append(" in (select _id from contacts where "); where.append(Im.Contacts.ACCOUNT); where.append("="); where.append(mAccountId); where.append(")"); mResolver.delete(Im.Presence.CONTENT_URI, where.toString(), null); } void closeChatSession(String address) { ChatSessionManagerAdapter sessionManager = (ChatSessionManagerAdapter) mConn.getChatSessionManager(); ChatSessionAdapter session = (ChatSessionAdapter) sessionManager.getChatSession(address); if(session != null) { session.leave(); } } void updateChatPresence(String address, String nickname, Presence p) { ChatSessionManagerAdapter sessionManager = (ChatSessionManagerAdapter) mConn.getChatSessionManager(); // TODO: This only find single chat sessions, we need to go through all // active chat sessions and find if the contact is a participant of the // session. ChatSessionAdapter session = (ChatSessionAdapter) sessionManager.getChatSession(address); if(session != null) { session.insertPresenceUpdatesMsg(nickname, p); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -