📄 impscontactlistmanager.java
字号:
} Primitive request = buildSubscribePresenceRequest(addresses); return request; } @Override protected void doCreateContactListAsync(final String name, Collection<Contact> contacts, final boolean isDefault) { ImpsAddress selfAddress = mConnection.getSession().getLoginUserAddress(); ImpsAddress listAddress = new ImpsContactListAddress(selfAddress, name); final ContactList list = new ContactList(listAddress, name, isDefault, contacts, this); Primitive createListRequest = buildCreateListReq(name, contacts, isDefault, listAddress); AsyncTransaction tx = new AsyncTransaction(mTransactionManager) { @Override public void onResponseError(ImpsErrorInfo error) { notifyContactError(ContactListListener.ERROR_CREATING_LIST, error, name, null); } @Override public void onResponseOk(Primitive response) { subscribeToListAsync(list, new AsyncCompletion () { public void onComplete() { notifyContactListCreated(list); } public void onError(ImErrorInfo error) { ImpsLog.log("Error subscribing to newly created list: " + error.getDescription() + "; ignored"); onComplete(); } }); } }; tx.sendRequest(createListRequest); } private Primitive buildCreateListReq(String name, Collection<Contact> contacts, boolean isDefault, ImpsAddress listAddress) { Primitive createListRequest = new Primitive(ImpsTags.CreateList_Request); createListRequest.addElement(listAddress.toPrimitiveElement()); // add initial contacts, if any if (null != contacts && !contacts.isEmpty()) { PrimitiveElement nickList = createListRequest.addElement(ImpsTags.NickList); for (Contact contact : contacts) { nickList.addChild(buildNickNameElem(contact)); } } PrimitiveElement contactListProp = createListRequest.addElement( ImpsTags.ContactListProperties); contactListProp.addPropertyChild(ImpsConstants.DisplayName, name); contactListProp.addPropertyChild(ImpsConstants.Default, ImpsUtils.toImpsBool(isDefault)); return createListRequest; } /** * Delete a specified contact list asyncLoginWrapper. * * @param list the contact list to be deleted */ @Override public void doDeleteContactListAsync(final ContactList list) { Primitive delListRequest = buildDelListReq(list); AsyncTransaction tx = new AsyncTransaction(mTransactionManager) { @Override public void onResponseError(ImpsErrorInfo error) { notifyContactError(ContactListListener.ERROR_DELETING_LIST, error, list.getName(), null); } @Override public void onResponseOk(Primitive response) { notifyContactListDeleted(list); if (!mAllowAutoSubscribe) { unsubscribeToListAsync(list, new AsyncCompletion(){ public void onComplete() {} public void onError(ImErrorInfo error) { // don't bother to alert this error since the // list has already been removed. ImpsLog.log("Warning: unsubscribing list presence failed"); } }); } } }; tx.sendRequest(delListRequest); } private Primitive buildDelListReq(final ContactList list) { Primitive delListRequest = new Primitive(ImpsTags.DeleteList_Request); delListRequest.addElement(((ImpsAddress)list.getAddress()) .toPrimitiveElement()); return delListRequest; } private Primitive buildListManageRequest(ContactList list, Collection<Contact> contactsToAdd, Collection<Contact> contactsToRemove, String listName) { // Create ListManage request Primitive req = new Primitive(ImpsTags.ListManage_Request); req.addElement(((ImpsAddress)list.getAddress()).toPrimitiveElement()); req.addElement(ImpsTags.ReceiveList, false); // If there are any pending added contacts, add them to the addNickList if (contactsToAdd != null && !contactsToAdd.isEmpty()) { PrimitiveElement addList = req.addElement(ImpsTags.AddNickList); for (Contact c : contactsToAdd) { PrimitiveElement nickNameElem = addList.addChild(ImpsTags.NickName); nickNameElem.addChild(ImpsTags.Name, c.getName()); nickNameElem.addChild(ImpsTags.UserID, c.getAddress().getFullName()); } } // If there are any pending removed contacts, add them to the removeNickList if (contactsToRemove != null && !contactsToRemove.isEmpty()) { PrimitiveElement removeList = req.addElement(ImpsTags.RemoveNickList); for (Contact c : contactsToRemove) { removeList.addChild(ImpsTags.UserID, c.getAddress().getFullName()); } } // Add the list properties if (listName != null) { PrimitiveElement requestProps = req.addElement(ImpsTags.ContactListProperties); requestProps.addPropertyChild(ImpsConstants.DisplayName, listName); } return req; } private Primitive buildSubscribeToListsRequest(Collection<ContactList> lists) { ArrayList<ImpsAddress> addresses = new ArrayList<ImpsAddress>(); for (ContactList list : lists) { addresses.add((ImpsAddress)list.getAddress()); } Primitive subscribePresenceRequest = buildSubscribePresenceRequest(addresses); subscribePresenceRequest.addElement(ImpsTags.AutoSubscribe, true); return subscribePresenceRequest; } private Primitive buildSubscribePresenceRequest(ArrayList<ImpsAddress> addresses) { Primitive request = new Primitive(ImpsTags.SubscribePresence_Request); // XXX: Workaround on OZ IMPS GTalk server which only supports a few // basic presence attributes. The PresenceSubList is optional and an // empty List or missing list indicates all available presence // attributes are desired but the OZ server doens't quite follow the // spec here. It won't send any PresenceNotification either when we // don't send PresenceSubList or we request more PA than it supports. if(mConnection.getConfig().supportBasicPresenceOnly()){ PrimitiveElement presenceList = request.addElement(ImpsTags.PresenceSubList); presenceList.setAttribute(ImpsTags.XMLNS, mConnection.getConfig().getPresenceNs()); for(String pa : ImpsClientCapability.getBasicPresenceAttributes()) { presenceList.addChild(pa); } } for (ImpsAddress address : addresses) { request.addElement(address.toPrimitiveElement()); } return request; } public void notifyServerTransaction(ServerTransaction tx) { Primitive request = tx.getRequest(); String type = request.getType(); if (ImpsTags.PresenceNotification_Request.equals(type)) { tx.sendStatusResponse(ImpsConstants.SUCCESS_CODE); ArrayList<Contact> updated = new ArrayList<Contact>(); PresenceMapping presenceMapping = mConnection.getConfig().getPresenceMapping(); for (PrimitiveElement presenceElem : request.getContentElement().getChildren()) { String userId = presenceElem.getChildContents(ImpsTags.UserID); if (userId == null) { continue; } PrimitiveElement presenceSubList = presenceElem.getChild(ImpsTags.PresenceSubList); Presence presence = ImpsPresenceUtils.extractPresence(presenceSubList, presenceMapping); // Find out the contact in all lists and update their presence for(ContactList list : mContactLists) { Contact contact = list.getContact(userId); if (contact != null) { contact.setPresence(presence); updated.add(contact); } } } if (updated.size() > 0) { notifyContactsPresenceUpdated(updated.toArray(new Contact[updated.size()])); } } else if (ImpsTags.PresenceAuth_Request.equals(type)) { tx.sendStatusResponse(ImpsConstants.SUCCESS_CODE); String userId = request.getElementContents(ImpsTags.UserID); Contact contact = getContact(userId); if (contact == null) { ImpsAddress address = new ImpsUserAddress(userId); contact = new Contact(address, address.getScreenName()); } if (getState() < LISTS_LOADED) { if (mSubscriptionRequests == null) { mSubscriptionRequests = new ArrayList<Contact>(); } mSubscriptionRequests.add(contact); } else { SubscriptionRequestListener listener = getSubscriptionRequestListener(); if (listener != null) { listener.onSubScriptionRequest(contact); } } } } void loadContactsOfListAsync(final ImpsAddress address, final AsyncCompletion completion) { Primitive listManageRequest = new Primitive(ImpsTags.ListManage_Request); listManageRequest.addElement(address.toPrimitiveElement()); listManageRequest.addElement(ImpsTags.ReceiveList, true); AsyncTransaction tx = new AsyncTransaction(mTransactionManager) { @Override public void onResponseError(ImpsErrorInfo error) { completion.onError(error); } @Override public void onResponseOk(Primitive response) { final ContactList list = extractContactList(response, address); mContactLists.add(list); if (list.isDefault()) { mDefaultContactList = list; } subscribeToListAsync(list, completion); } }; tx.sendRequest(listManageRequest); } private Primitive buildBlockContactReq(String address, boolean block) { Primitive request = new Primitive(ImpsTags.BlockEntity_Request); ImpsVersion version = mConnection.getConfig().getImpsVersion(); if (version == ImpsVersion.IMPS_VERSION_13) { request.addElement(ImpsTags.BlockListInUse, true); request.addElement(ImpsTags.GrantListInUse, false); } PrimitiveElement blockList = request.addElement(ImpsTags.BlockList); if (version != ImpsVersion.IMPS_VERSION_13) { blockList.addChild(ImpsTags.InUse, true); } PrimitiveElement entityList = blockList.addChild(block ? ImpsTags.AddList : ImpsTags.RemoveList); entityList.addChild(ImpsTags.UserID, address); return request; } @Override protected void doBlockContactAsync(String address, final boolean block) { Primitive request = buildBlockContactReq(address, block); final Address contactAddress = new ImpsUserAddress(address); AsyncTransaction tx = new AsyncTransaction(mTransactionManager) { @Override public void onResponseError(ImpsErrorInfo error) { Contact c = getContact(contactAddress); if(c == null) { c = new Contact(contactAddress, contactAddress.getScreenName()); } notifyContactError( block ? ContactListListener.ERROR_BLOCKING_CONTACT : ContactListListener.ERROR_UNBLOCKING_CONTACT, error, null, c); } @Override public void onResponseOk(Primitive response) { Contact c = getContact(contactAddress); if(c == null) { c = new Contact(contactAddress, contactAddress.getScreenName()); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -