public boolean offerData(String offerId, String url, String type) { if (mConnection.getState() == ImConnection.SUSPENDED) { // TODO send later return false; } HashMap<String, String> headers = null; if (type != null) { headers = new HashMap<>(); headers.put("Mime-Type", type); } try { Address localUser = mConnection.getLoginUser().getAddress(); if (mChatSession.getParticipant() instanceof Contact) { Address remoteUser = new XmppAddress(getDefaultOtrChatSession().getRemoteUserId()); mDataHandler.offerData(offerId, localUser, remoteUser, url, headers); } else if (mChatSession.getParticipant() instanceof ChatGroup) { ChatGroup group = (ChatGroup) mChatSession.getParticipant(); for (Contact member : group.getMembers()) { mDataHandler.offerData(offerId, localUser, member.getAddress(), url, headers); } } return true; } catch (Exception ioe) { Log.w(ImApp.LOG_TAG, "unable to offer data", ioe); return false; } }
public void sendMessage(String text, boolean isResend) { if (mConnection.getState() != ImConnection.LOGGED_IN) { // connection has been suspended, save the message without send it long now = System.currentTimeMillis(); insertMessageInDb(null, text, now, Imps.MessageType.POSTPONED); return; } org.awesomeapp.messenger.model.Message msg = new org.awesomeapp.messenger.model.Message(text); msg.setID(nextID()); msg.setFrom(mConnection.getLoginUser().getAddress()); msg.setType(Imps.MessageType.OUTGOING); long sendTime = System.currentTimeMillis(); if (!isResend) { insertMessageInDb(null, text, sendTime, msg.getType(), 0, msg.getID()); insertOrUpdateChat(text); } int newType = mChatSession.sendMessageAsync(msg); if (msg.getDateTime() != null) sendTime = msg.getDateTime().getTime(); updateMessageInDb(msg.getID(), newType, sendTime); }
public ChatSessionAdapter( ChatSession chatSession, ImConnectionAdapter connection, boolean isNewSession) { mChatSession = chatSession; mConnection = connection; service = connection.getContext(); mContentResolver = service.getContentResolver(); mStatusBarNotifier = service.getStatusBarNotifier(); mChatSessionManager = (ChatSessionManagerAdapter) connection.getChatSessionManager(); mListenerAdapter = new ListenerAdapter(); mOtrChatSessions = new HashMap<String, OtrChatSessionAdapter>(); ImEntity participant = mChatSession.getParticipant(); if (participant instanceof ChatGroup) { init((ChatGroup) participant, isNewSession); } else { init((Contact) participant, isNewSession); } initOtrChatSession(participant); }
public ContactListManagerAdapter(ImConnectionAdapter conn) { mAdaptee = conn.getAdaptee().getContactListManager(); mConn = conn; mContext = conn.getContext(); mResolver = mContext.getContentResolver(); mContactListListenerAdapter = new ContactListListenerAdapter(); mSubscriptionListenerAdapter = new SubscriptionRequestListenerAdapter(); mContactLists = new HashMap<Address, ContactListAdapter>(); mTemporaryContacts = new HashMap<String, Contact>(); mValidatedContacts = new HashSet<String>(); mValidatedContactLists = new HashSet<String>(); mValidatedBlockedContacts = new HashSet<String>(); mAdaptee.addContactListListener(mContactListListenerAdapter); mAdaptee.setSubscriptionRequestListener(mSubscriptionListenerAdapter); mAccountId = mConn.getAccountId(); mProviderId = mConn.getProviderId(); Uri.Builder builder = Imps.Avatars.CONTENT_URI_AVATARS_BY.buildUpon(); ContentUris.appendId(builder, mProviderId); ContentUris.appendId(builder, mAccountId); mAvatarUrl = builder.build(); builder = Imps.Contacts.CONTENT_URI_CONTACTS_BY.buildUpon(); ContentUris.appendId(builder, mProviderId); ContentUris.appendId(builder, mAccountId); mContactUrl = builder.build(); }
void closeChatSession(String address) { ChatSessionManagerAdapter sessionManager = (ChatSessionManagerAdapter) mConn.getChatSessionManager(); ChatSessionAdapter session = (ChatSessionAdapter) sessionManager.getChatSession(address); if (session != null) { session.leave(); } }
public boolean sendPushWhitelistToken(@NonNull String token) { if (mConnection.getState() == ImConnection.SUSPENDED) { // TODO Is it possible to postpone a TLV message? e.g: insertMessageInDb with type POSTPONED return false; } // Whitelist tokens are intended for one recipient, for now if (isGroupChatSession()) return false; org.awesomeapp.messenger.model.Message msg = new org.awesomeapp.messenger.model.Message(""); msg.setFrom(mConnection.getLoginUser().getAddress()); msg.setType(Imps.MessageType.OUTGOING); mChatSession.sendPushWhitelistTokenAsync(msg, new String[] {token}); return true; }
public void inviteContact(String contact) { if (!mIsGroupChat) { return; } ContactListManagerAdapter listManager = (ContactListManagerAdapter) mConnection.getContactListManager(); Contact invitee = new Contact(new XmppAddress(contact), contact); getGroupManager().inviteUserAsync((ChatGroup) mChatSession.getParticipant(), invitee); }
public void leave() { if (mIsGroupChat) { getGroupManager().leaveChatGroupAsync((ChatGroup) mChatSession.getParticipant()); } mContentResolver.delete(mMessageURI, null, null); mContentResolver.delete(mChatURI, null, null); mStatusBarNotifier.dismissChatNotification(mConnection.getProviderId(), getAddress()); mChatSessionManager.closeChatSession(this); }
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); } }
private long insertOrUpdateGroupContactInDb(ChatGroup group) { // Insert a record in contacts table ContentValues values = new ContentValues(4); values.put(Imps.Contacts.USERNAME, group.getAddress().getAddress()); values.put(Imps.Contacts.NICKNAME, group.getName()); values.put(Imps.Contacts.CONTACTLIST, ContactListManagerAdapter.LOCAL_GROUP_LIST_ID); values.put(Imps.Contacts.TYPE, Imps.Contacts.TYPE_GROUP); Uri contactUri = ContentUris.withAppendedId( ContentUris.withAppendedId(Imps.Contacts.CONTENT_URI, mConnection.mProviderId), mConnection.mAccountId); ContactListManagerAdapter listManager = (ContactListManagerAdapter) mConnection.getContactListManager(); long id = listManager.queryGroup(group); if (id == -1) { id = ContentUris.parseId(mContentResolver.insert(contactUri, values)); ArrayList<ContentValues> memberValues = new ArrayList<ContentValues>(); Contact self = mConnection.getLoginUser(); for (Contact member : group.getMembers()) { if (!member.equals(self)) { // avoid to insert the user himself ContentValues memberValue = new ContentValues(2); memberValue.put(Imps.GroupMembers.USERNAME, member.getAddress().getAddress()); memberValue.put(Imps.GroupMembers.NICKNAME, member.getName()); memberValues.add(memberValue); } } if (!memberValues.isEmpty()) { ContentValues[] result = new ContentValues[memberValues.size()]; memberValues.toArray(result); Uri memberUri = ContentUris.withAppendedId(Imps.GroupMembers.CONTENT_URI, id); mContentResolver.bulkInsert(memberUri, result); } } return id; }
public ChatSessionManagerAdapter(ImConnectionAdapter connection) { mConnection = connection; ImConnection connAdaptee = connection.getAdaptee(); mSessionManager = connAdaptee.getChatSessionManager(); mActiveSessions = new HashMap<String, ChatSessionAdapter>(); mSessionListenerAdapter = new ChatSessionListenerAdapter(); mSessionManager.addChatSessionListener(mSessionListenerAdapter); if ((connAdaptee.getCapability() & ImConnection.CAPABILITY_GROUP_CHAT) != 0) { mGroupManager = connAdaptee.getChatGroupManager(); mGroupManager.addGroupListener(new ChatGroupListenerAdpater()); } }
private void initOtrChatSession(ImEntity participant) { try { if (mConnection != null) { mDataHandler = new OtrDataHandler(mChatSession); mDataHandlerListener = new DataHandlerListenerImpl(); mDataHandler.setDataListener(mDataHandlerListener); OtrChatManager cm = service.getOtrChatManager(); cm.addOtrEngineListener(mListenerAdapter); mChatSession.setMessageListener(new OtrChatListener(cm, mListenerAdapter)); if (participant instanceof Contact) { String key = participant.getAddress().getAddress(); if (!mOtrChatSessions.containsKey(key)) { OtrChatSessionAdapter adapter = new OtrChatSessionAdapter( mConnection.getLoginUser().getAddress().getAddress(), participant, cm); mOtrChatSessions.put(key, adapter); } } else if (participant instanceof ChatGroup) { ChatGroup group = (ChatGroup) mChatSession.getParticipant(); for (Contact contact : group.getMembers()) { String key = contact.getAddress().getAddress(); if (!mOtrChatSessions.containsKey(key)) { OtrChatSessionAdapter adapter = new OtrChatSessionAdapter( mConnection.getLoginUser().getAddress().getAddress(), contact, cm); mOtrChatSessions.put(key, adapter); } } } mDataHandler.setChatId(getId()); } } catch (NullPointerException npe) { Log.e(ImApp.LOG_TAG, "error init OTR session", npe); } }
public void markAsRead() { if (mHasUnreadMessages) { /** * we want to keep the last message now ContentValues values = new ContentValues(1); * values.put(Imps.Chats.LAST_UNREAD_MESSAGE, (String) null); * mConnection.getContext().getContentResolver().update(mChatURI, values, null, null); */ String baseUsername = mChatSession.getParticipant().getAddress().getBareAddress(); mStatusBarNotifier.dismissChatNotification(mConnection.getProviderId(), baseUsername); mHasUnreadMessages = false; } }
private void init(Contact contact, boolean isNewSession) { mIsGroupChat = false; ContactListManagerAdapter listManager = (ContactListManagerAdapter) mConnection.getContactListManager(); mContactId = listManager.queryOrInsertContact(contact); mChatURI = ContentUris.withAppendedId(Imps.Chats.CONTENT_URI, mContactId); if (isNewSession) insertOrUpdateChat(null); mMessageURI = Imps.Messages.getContentUriByThreadId(mContactId); mContactStatusMap.put(contact.getName(), contact.getPresence().getStatus()); }
public IChatSession createChatSession(String contactAddress) { ContactListManagerAdapter listManager = (ContactListManagerAdapter) mConnection.getContactListManager(); Contact contact = listManager.getContactByAddress(contactAddress); if (contact == null) { try { contact = listManager.createTemporaryContact(contactAddress); } catch (IllegalArgumentException e) { mSessionListenerAdapter.notifyChatSessionCreateFailed( contactAddress, new ImErrorInfo( ImErrorInfo.ILLEGAL_CONTACT_ADDRESS, "Invalid contact address:" + contactAddress)); return null; } } ChatSession session = mSessionManager.createChatSession(contact); return getChatSessionAdapter(session); }
public String[] getParticipants() { if (mIsGroupChat) { Contact self = mConnection.getLoginUser(); ChatGroup group = (ChatGroup) mChatSession.getParticipant(); List<Contact> members = group.getMembers(); String[] result = new String[members.size() - 1]; int index = 0; for (Contact c : members) { if (!c.equals(self)) { result[index++] = c.getAddress().getAddress(); } } return result; } else { return new String[] {mChatSession.getParticipant().getAddress().getAddress()}; } }
private ChatGroupManager getGroupManager() { return mConnection.getAdaptee().getChatGroupManager(); }
public boolean sendKnock() { return mChatSession.sendKnock(mConnection.getLoginUser().getAddress().getAddress()); }