コード例 #1
0
  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;
    }
  }
コード例 #2
0
  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);
  }
コード例 #3
0
  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);
  }
コード例 #4
0
  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();
  }
コード例 #5
0
 void closeChatSession(String address) {
   ChatSessionManagerAdapter sessionManager =
       (ChatSessionManagerAdapter) mConn.getChatSessionManager();
   ChatSessionAdapter session = (ChatSessionAdapter) sessionManager.getChatSession(address);
   if (session != null) {
     session.leave();
   }
 }
コード例 #6
0
  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;
  }
コード例 #7
0
 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);
 }
コード例 #8
0
  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);
  }
コード例 #9
0
 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);
   }
 }
コード例 #10
0
  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());
    }
  }
コード例 #12
0
  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);
    }
  }
コード例 #13
0
  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;
    }
  }
コード例 #14
0
  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);
 }
コード例 #16
0
  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()};
    }
  }
コード例 #17
0
 private ChatGroupManager getGroupManager() {
   return mConnection.getAdaptee().getChatGroupManager();
 }
コード例 #18
0
  public boolean sendKnock() {

    return mChatSession.sendKnock(mConnection.getLoginUser().getAddress().getAddress());
  }