Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
134 changes: 134 additions & 0 deletions src/main/java/eu/siacs/conversations/entities/KnownConference.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
package eu.siacs.conversations.entities;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import eu.siacs.conversations.utils.UIHelper;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.jid.Jid;

public class KnownConference extends Element implements ListItem {

private Conversation mJoinedConversation;

public KnownConference(final Jid jid) {
super("conference");
this.setAttribute("jid", jid.toString());
}

@Override
public int compareTo(final ListItem another) {
return this.getDisplayName().compareToIgnoreCase(
another.getDisplayName());
}

@Override
public String getDisplayName() {
if (this.mJoinedConversation != null
&& (this.mJoinedConversation.getMucOptions().getSubject() != null)) {
return this.mJoinedConversation.getMucOptions().getSubject();
} else if (getName() != null) {
return getName();
} else {
return this.getJid().getLocalpart();
}
}

@Override
public Jid getJid() {
return this.getAttributeAsJid("jid");
}

@Override
public List<Tag> getTags() {
ArrayList<Tag> tags = new ArrayList<Tag>();
for (Element element : getChildren()) {
if (element.getName().equals("group") && element.getContent() != null) {
String group = element.getContent();
tags.add(new Tag(group, UIHelper.getColorForName(group)));
}
}
return tags;
}

public String getNick() {
return this.findChildContent("nick");
}

public void setNick(String nick) {
Element element = this.findChild("nick");
if (element == null) {
element = this.addChild("nick");
}
element.setContent(nick);
}

public boolean autojoin() {
return this.getAttributeAsBoolean("autojoin");
}

public String getPassword() {
return this.findChildContent("password");
}

public void setPassword(String password) {
Element element = this.findChild("password");
if (element != null) {
element.setContent(password);
}
}

public boolean match(String needle) {
if (needle == null) {
return true;
}
needle = needle.toLowerCase(Locale.US);
final Jid jid = getJid();
return (jid != null && jid.toString().contains(needle)) ||
getDisplayName().toLowerCase(Locale.US).contains(needle) ||
matchInTag(needle);
}

private boolean matchInTag(String needle) {
needle = needle.toLowerCase(Locale.US);
for (Tag tag : getTags()) {
if (tag.getName().toLowerCase(Locale.US).contains(needle)) {
return true;
}
}
return false;
}

public Conversation getConversation() {
return this.mJoinedConversation;
}

public void setConversation(Conversation conversation) {
this.mJoinedConversation = conversation;
}

public String getName() {
return this.getAttribute("name");
}

public void setName(String name) {
this.name = name;
}

public void unregisterConversation() {
if (this.mJoinedConversation != null) {
this.mJoinedConversation.deregisterWithBookmark();
}
}

@Override
public boolean equals(Object o) {
if (o instanceof KnownConference) {
if (getJid().toString().equals(((KnownConference) o).getJid().toString())) {
return true;
}
}
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import android.provider.ContactsContract;
import android.util.Log;
import android.util.LruCache;
import android.widget.ArrayAdapter;

import net.java.otr4j.OtrException;
import net.java.otr4j.session.Session;
Expand Down Expand Up @@ -90,6 +91,7 @@
import eu.siacs.conversations.xmpp.OnPresencePacketReceived;
import eu.siacs.conversations.xmpp.OnStatusChanged;
import eu.siacs.conversations.xmpp.OnUpdateBlocklist;
import eu.siacs.conversations.xmpp.OnUpdateFoundConferences;
import eu.siacs.conversations.xmpp.XmppConnection;
import eu.siacs.conversations.xmpp.chatstate.ChatState;
import eu.siacs.conversations.xmpp.forms.Data;
Expand All @@ -105,7 +107,7 @@
import eu.siacs.conversations.xmpp.stanzas.PresencePacket;
import me.leolin.shortcutbadger.ShortcutBadger;

public class XmppConnectionService extends Service implements OnPhoneContactsLoadedListener {
public class XmppConnectionService extends Service implements OnPhoneContactsLoadedListener, OnUpdateFoundConferences {

public static final String ACTION_CLEAR_NOTIFICATION = "clear_notification";
public static final String ACTION_DISABLE_FOREGROUND = "disable_foreground";
Expand Down Expand Up @@ -313,7 +315,7 @@ public void onStatusChanged(Account account) {
private PowerManager pm;
private LruCache<String, Bitmap> mBitmapCache;
private Thread mPhoneContactMergerThread;

private OnUpdateFoundConferences mOnUpdateFoundConferencesListener = null;
private boolean mRestoredFromDatabase = false;
public boolean areMessagesInitialized() {
return this.mRestoredFromDatabase;
Expand Down Expand Up @@ -662,6 +664,7 @@ public XmppConnection createConnection(final Account account) {
connection.setOnJinglePacketReceivedListener(this.jingleListener);
connection.setOnBindListener(this.mOnBindListener);
connection.setOnMessageAcknowledgeListener(this.mOnMessageAcknowledgedListener);
connection.setOnKnownConferenceNamesUpdatedListener(this);
connection.addOnAdvancedStreamFeaturesAvailableListener(this.mMessageArchiveService);
return connection;
}
Expand Down Expand Up @@ -1121,6 +1124,15 @@ public Conversation findOrCreateConversation(final Account account, final Jid ji

public Conversation findOrCreateConversation(final Account account, final Jid jid, final boolean muc, final MessageArchiveService.Query query) {
synchronized (this.conversations) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
String roomDiscoverySettingAllServers = getResources().getString(R.string.pref_muc_discovery_all_servers);
String roomDiscoverySettingConnectedMucServers = getResources().getString(R.string.pref_muc_discovery_connected_muc_servers);
String roomDiscoverySetting = preferences.getString("room_discovery", roomDiscoverySettingConnectedMucServers);
if ( muc && (roomDiscoverySetting.equals(roomDiscoverySettingConnectedMucServers) || roomDiscoverySetting.equals(roomDiscoverySettingAllServers) ) && account.getJid().getDomainpartAsJid() != jid.getDomainpartAsJid() ) {
account.getXmppConnection().sendSverviceDiscoveryToAlienServer(jid.getDomainpartAsJid(), true);
} else if (!muc && roomDiscoverySetting.equals(roomDiscoverySettingAllServers) && account.getJid().getDomainpartAsJid() != jid.getDomainpartAsJid()) {
account.getXmppConnection().sendSverviceDiscoveryToAlienServer(jid.getDomainpartAsJid(), true);
}
Conversation conversation = find(account, jid);
if (conversation != null) {
return conversation;
Expand Down Expand Up @@ -1366,6 +1378,10 @@ public void setOnUpdateBlocklistListener(final OnUpdateBlocklist listener) {
}
}

public void setOnUpdateFoundConferencesListener(final OnUpdateFoundConferences listener) {
this.mOnUpdateFoundConferencesListener = listener;
}

public void removeOnUpdateBlocklistListener() {
synchronized (this) {
this.updateBlocklistListenerCount--;
Expand Down Expand Up @@ -1403,7 +1419,6 @@ public void removeOnNewKeysAvailableListener() {
}
}
}

public void setOnMucRosterUpdateListener(OnMucRosterUpdate listener) {
synchronized (this) {
if (checkListeners()) {
Expand Down Expand Up @@ -1477,6 +1492,11 @@ private void connectMultiModeConversations(Account account) {
}
}

public CopyOnWriteArrayList<String> getConferenceNames(Jid jid, Jid serverJid) {
Account account = findAccountByJid(jid);
CopyOnWriteArrayList<String> knownConferences = account.getXmppConnection().getKnownConferenceNames(serverJid);
return knownConferences;
}

public void joinMuc(Conversation conversation) {
Account account = conversation.getAccount();
Expand Down Expand Up @@ -2440,9 +2460,11 @@ public List<String> getKnownConferenceHosts() {
final ArrayList<String> mucServers = new ArrayList<>();
for (final Account account : accounts) {
if (account.getXmppConnection() != null) {
final String server = account.getXmppConnection().getMucServer();
if (server != null && !mucServers.contains(server)) {
mucServers.add(server);
final List<String> servers = account.getXmppConnection().getMucServers();
for (String server : servers) {
if (server != null && !mucServers.contains(server)) {
mucServers.add(server);
}
}
}
}
Expand Down Expand Up @@ -2584,6 +2606,22 @@ public void onIqPacketReceived(final Account account, final IqPacket packet) {
}
}

@Override
public void onUpdateFoundConferences() {
if (mOnUpdateFoundConferencesListener != null) {
mOnUpdateFoundConferencesListener.onUpdateFoundConferences();
}
}

public void searchForConferenceRoomsOnAlienServer(Jid server) {
for (Account acc : accounts) {
if (acc.isOnlineAndConnected()) {
acc.getXmppConnection().sendSverviceDiscoveryToAlienServer(server, true);
return;
}
}
}

public interface OnMoreMessagesLoaded {
public void onMoreMessagesLoaded(int count, Conversation conversation);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,21 @@ protected void onCreate(final Bundle savedInstanceState) {
public void onItemClick(AdapterView<?> arg0, View clickedView,
int position, long arg3) {
if (getSelectedConversation() != conversationList.get(position)) {
setSelectedConversation(conversationList.get(position));
Conversation conversationToShow = conversationList.get(position);
Jid ownServer = conversationToShow.getAccount().getJid().getDomainpartAsJid();
Jid remoteServer = conversationToShow.getJid().getDomainpartAsJid();
if (!ownServer.equals(remoteServer)) {
conversationToShow.getAccount().getXmppConnection().sendSverviceDiscoveryToAlienServer(remoteServer, false);
if (!remoteServer.getDomainpart().toString().startsWith("conference")) {
try {
Jid remoteConferenceServerGuess = Jid.fromString("conference." + remoteServer.getDomainpart());
conversationToShow.getAccount().getXmppConnection().sendSverviceDiscoveryToAlienServer(remoteConferenceServerGuess, false);
} catch (InvalidJidException e) {
//bad guess, ignore
}
}
}
setSelectedConversation(conversationToShow);
ConversationActivity.this.mConversationFragment.reInit(getSelectedConversation());
conversationWasSelectedByKeyboard = false;
}
Expand Down
Loading