Skip to content
Snippets Groups Projects
Commit af8565ad authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Improved performance of Backlog loading, Improved init performance significantly.

parent 1ecc31e4
Branches
Tags
No related merge requests found
Showing
with 251 additions and 90 deletions
...@@ -23,6 +23,7 @@ package de.kuschku.libquassel.client; ...@@ -23,6 +23,7 @@ package de.kuschku.libquassel.client;
import android.support.annotation.IntRange; import android.support.annotation.IntRange;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.util.Log;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
...@@ -30,11 +31,13 @@ import java.util.List; ...@@ -30,11 +31,13 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import de.kuschku.libquassel.events.BacklogInitEvent;
import de.kuschku.libquassel.localtypes.buffers.Buffer; import de.kuschku.libquassel.localtypes.buffers.Buffer;
import de.kuschku.libquassel.localtypes.buffers.Buffers; import de.kuschku.libquassel.localtypes.buffers.Buffers;
import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer; import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer;
import de.kuschku.libquassel.localtypes.buffers.QueryBuffer; import de.kuschku.libquassel.localtypes.buffers.QueryBuffer;
import de.kuschku.libquassel.primitives.types.BufferInfo; import de.kuschku.libquassel.primitives.types.BufferInfo;
import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig;
import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel;
import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser;
import de.kuschku.util.observables.lists.ObservableSet; import de.kuschku.util.observables.lists.ObservableSet;
...@@ -156,9 +159,17 @@ public class BufferManager { ...@@ -156,9 +159,17 @@ public class BufferManager {
} }
public void doBacklogInit(int amount) { public void doBacklogInit(int amount) {
Set<Integer> visibleBuffers = new HashSet<>();
for (QBufferViewConfig bufferConfig : client.bufferViewManager().bufferViewConfigs()) {
visibleBuffers.addAll(bufferConfig.bufferIds());
}
laterRequests.retainAll(visibleBuffers);
for (int id : laterRequests) { for (int id : laterRequests) {
client.backlogManager().requestBacklogInitial(id, amount); client.backlogManager().requestBacklogInitial(id, amount);
} }
laterRequests.clear(); laterRequests.clear();
int waitingMax = client.backlogManager().waitingMax();
int waitingCurrently = client.backlogManager().waiting().size();
client.provider().sendEvent(new BacklogInitEvent(waitingMax-waitingCurrently, waitingMax));
} }
} }
...@@ -192,7 +192,9 @@ public class Client extends AClient { ...@@ -192,7 +192,9 @@ public class Client extends AClient {
this.connectionStatus = connectionStatus; this.connectionStatus = connectionStatus;
if (connectionStatus == ConnectionChangeEvent.Status.LOADING_BACKLOG) { if (connectionStatus == ConnectionChangeEvent.Status.LOADING_BACKLOG) {
Log.e("libquassel", "test1");
bufferManager().doBacklogInit(20); bufferManager().doBacklogInit(20);
Log.e("libquassel", "test2");
} else if (connectionStatus == ConnectionChangeEvent.Status.CONNECTED) { } else if (connectionStatus == ConnectionChangeEvent.Status.CONNECTED) {
// FIXME: Init buffer activity state and highlightss // FIXME: Init buffer activity state and highlightss
} }
...@@ -456,4 +458,8 @@ public class Client extends AClient { ...@@ -456,4 +458,8 @@ public class Client extends AClient {
Log.d("libquassel", "Un-Queueing buffer: " + info.id()); Log.d("libquassel", "Un-Queueing buffer: " + info.id());
} }
} }
public BusProvider provider() {
return provider;
}
} }
/*
* QuasselDroid - Quassel client for Android
* Copyright (C) 2016 Janne Koschinski
* Copyright (C) 2016 Ken Børge Viktil
* Copyright (C) 2016 Magnus Fjell
* Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org>
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.kuschku.libquassel.events;
import java.util.Locale;
public class BacklogInitEvent {
public final int loaded;
public final int waitingMax;
public BacklogInitEvent(int loaded, int waitingMax) {
this.loaded = loaded;
this.waitingMax = waitingMax;
}
@Override
public String toString() {
return String.format(Locale.US, "LOADING_BACKLOG: %d/%d", loaded, waitingMax);
}
}
...@@ -30,6 +30,7 @@ import org.joda.time.DateTimeUtils; ...@@ -30,6 +30,7 @@ import org.joda.time.DateTimeUtils;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import de.greenrobot.event.EventBus;
import de.kuschku.libquassel.client.Client; import de.kuschku.libquassel.client.Client;
import de.kuschku.libquassel.message.Message; import de.kuschku.libquassel.message.Message;
import de.kuschku.libquassel.primitives.types.BufferInfo; import de.kuschku.libquassel.primitives.types.BufferInfo;
...@@ -52,25 +53,26 @@ public class BacklogFilter implements UICallback { ...@@ -52,25 +53,26 @@ public class BacklogFilter implements UICallback {
@Nullable @Nullable
private DateTime earliestMessage; private DateTime earliestMessage;
private EventBus bus = new EventBus();
public BacklogFilter(@NonNull Client client, int bufferId, @NonNull ObservableComparableSortedList<Message> unfiltered, @NonNull ObservableComparableSortedList<Message> filtered) { public BacklogFilter(@NonNull Client client, int bufferId, @NonNull ObservableComparableSortedList<Message> unfiltered, @NonNull ObservableComparableSortedList<Message> filtered) {
this.client = client; this.client = client;
this.bufferId = bufferId; this.bufferId = bufferId;
this.unfiltered = unfiltered; this.unfiltered = unfiltered;
this.filtered = filtered; this.filtered = filtered;
this.bus.register(this);
} }
@Override @Override
public void notifyItemInserted(int position) { public void notifyItemInserted(int position) {
Message message = unfiltered.get(position); Message message = unfiltered.get(position);
if (!filterItem(message)) filtered.add(message); bus.post(new MessageFilterEvent(message));
if (message.time.isBefore(earliestMessage)) earliestMessage = message.time;
updateDayChangeMessages();
} }
private void updateDayChangeMessages() { private void updateDayChangeMessages() {
DateTime now = DateTime.now().withMillisOfDay(0); DateTime now = DateTime.now().withMillisOfDay(0);
while (now.isAfter(earliestMessage)) { while (now.isAfter(earliestMessage)) {
filtered.add(new Message( bus.post(new MessageInsertEvent(new Message(
(int) DateTimeUtils.toJulianDay(now.getMillis()), (int) DateTimeUtils.toJulianDay(now.getMillis()),
now, now,
Message.Type.DayChange, Message.Type.DayChange,
...@@ -84,7 +86,7 @@ public class BacklogFilter implements UICallback { ...@@ -84,7 +86,7 @@ public class BacklogFilter implements UICallback {
), ),
"", "",
"" ""
)); )));
now = now.minusDays(1); now = now.minusDays(1);
} }
} }
...@@ -96,33 +98,47 @@ public class BacklogFilter implements UICallback { ...@@ -96,33 +98,47 @@ public class BacklogFilter implements UICallback {
public void addFilter(Message.Type type) { public void addFilter(Message.Type type) {
filteredTypes.add(type); filteredTypes.add(type);
updateRemove(); bus.post(new UpdateRemoveEvent());
} }
public void removeFilter(Message.Type type) { public void removeFilter(Message.Type type) {
filteredTypes.remove(type); filteredTypes.remove(type);
updateAdd(); bus.post(new UpdateAddEvent());
} }
public void update() { public void update() {
updateAdd(); bus.post(new UpdateAddEvent());
updateRemove(); bus.post(new UpdateRemoveEvent());
} }
public void updateRemove() { public void onEventAsync(UpdateAddEvent event) {
for (Message message : unfiltered) { for (Message message : unfiltered) {
if (filterItem(message)) { if (!filterItem(message)) {
filtered.remove(message); bus.post(new MessageInsertEvent(message));
} }
} }
} }
public void updateAdd() { public void onEventAsync(UpdateRemoveEvent event) {
for (Message message : unfiltered) { for (Message message : unfiltered) {
if (!filterItem(message)) { if (filterItem(message)) {
filtered.add(message); bus.post(new MessageRemoveEvent(message));
}
} }
} }
public void onEventAsync(MessageFilterEvent event) {
if (!filterItem(event.msg)) bus.post(new MessageInsertEvent(event.msg));
if (event.msg.time.isBefore(earliestMessage)) earliestMessage = event.msg.time;
updateDayChangeMessages();
}
public void onEventMainThread(MessageInsertEvent event) {
filtered.add(event.msg);
}
public void onEventMainThread(MessageRemoveEvent event) {
filtered.remove(event.msg);
} }
@Override @Override
...@@ -185,4 +201,31 @@ public class BacklogFilter implements UICallback { ...@@ -185,4 +201,31 @@ public class BacklogFilter implements UICallback {
} }
} }
} }
private class MessageInsertEvent {
public final Message msg;
public MessageInsertEvent(Message msg) {
this.msg = msg;
}
}
private class MessageRemoveEvent {
public final Message msg;
public MessageRemoveEvent(Message msg) {
this.msg = msg;
}
}
private class MessageFilterEvent {
public final Message msg;
public MessageFilterEvent(Message msg) {
this.msg = msg;
}
}
private class UpdateAddEvent {
}
private class UpdateRemoveEvent {
}
} }
...@@ -32,6 +32,7 @@ import java.util.Set; ...@@ -32,6 +32,7 @@ import java.util.Set;
import de.kuschku.libquassel.BusProvider; import de.kuschku.libquassel.BusProvider;
import de.kuschku.libquassel.client.Client; import de.kuschku.libquassel.client.Client;
import de.kuschku.libquassel.events.BacklogInitEvent;
import de.kuschku.libquassel.events.BacklogReceivedEvent; import de.kuschku.libquassel.events.BacklogReceivedEvent;
import de.kuschku.libquassel.events.ConnectionChangeEvent; import de.kuschku.libquassel.events.ConnectionChangeEvent;
import de.kuschku.libquassel.localtypes.BacklogFilter; import de.kuschku.libquassel.localtypes.BacklogFilter;
...@@ -47,7 +48,9 @@ public class BacklogManager extends ABacklogManager<BacklogManager> { ...@@ -47,7 +48,9 @@ public class BacklogManager extends ABacklogManager<BacklogManager> {
private final Client client; private final Client client;
private final BacklogStorage storage; private final BacklogStorage storage;
private final Set<Integer> initialized = new HashSet<>(); private final Set<Integer> initialized = new HashSet<>();
@NonNull
private final Set<Integer> waiting = new HashSet<>(); private final Set<Integer> waiting = new HashSet<>();
private int waitingMax = 0;
@IntRange(from = -1) @IntRange(from = -1)
private int openBuffer; private int openBuffer;
...@@ -72,6 +75,7 @@ public class BacklogManager extends ABacklogManager<BacklogManager> { ...@@ -72,6 +75,7 @@ public class BacklogManager extends ABacklogManager<BacklogManager> {
return; return;
waiting.add(id); waiting.add(id);
waitingMax++;
requestBacklog(id, -1, -1, amount, 0); requestBacklog(id, -1, -1, amount, 0);
} }
...@@ -100,11 +104,15 @@ public class BacklogManager extends ABacklogManager<BacklogManager> { ...@@ -100,11 +104,15 @@ public class BacklogManager extends ABacklogManager<BacklogManager> {
} }
private void checkWaiting() { private void checkWaiting() {
Log.d("libquassel", "Backlog Requests: " + waiting.size() + "; " + waiting); assertNotNull(provider);
if (waiting.isEmpty()) if (client.connectionStatus() == ConnectionChangeEvent.Status.LOADING_BACKLOG) {
provider.sendEvent(new BacklogInitEvent(waitingMax-waiting.size(), waitingMax));
if (waiting.isEmpty()) {
client.setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED); client.setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED);
} }
}
}
@Override @Override
public void _requestBacklogAll(int first, int last, int limit, int additional) { public void _requestBacklogAll(int first, int last, int limit, int additional) {
...@@ -162,6 +170,16 @@ public class BacklogManager extends ABacklogManager<BacklogManager> { ...@@ -162,6 +170,16 @@ public class BacklogManager extends ABacklogManager<BacklogManager> {
client.bufferSyncer().requestMarkBufferAsRead(openBuffer); client.bufferSyncer().requestMarkBufferAsRead(openBuffer);
} }
@Override
public int waitingMax() {
return waitingMax;
}
@Override
public Set<Integer> waiting() {
return waiting;
}
@Override @Override
public void _update(Map<String, QVariant> from) { public void _update(Map<String, QVariant> from) {
......
...@@ -58,7 +58,8 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> { ...@@ -58,7 +58,8 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> {
this.temporarilyRemovedBuffers = new ObservableSet<>(temporarilyRemovedBuffers); this.temporarilyRemovedBuffers = new ObservableSet<>(temporarilyRemovedBuffers);
this.hideInactiveNetworks = hideInactiveNetworks; this.hideInactiveNetworks = hideInactiveNetworks;
this.buffers = new ObservableList<>(buffers); this.buffers = new ObservableList<>(buffers);
this.buffersIds = new ObservableSet<>(buffers); this.buffersIds = new ObservableSet<>();
bufferIds().addAll(buffers);
this.allowedBufferTypes = allowedBufferTypes; this.allowedBufferTypes = allowedBufferTypes;
this.sortAlphabetically = sortAlphabetically; this.sortAlphabetically = sortAlphabetically;
this.disableDecoration = disableDecoration; this.disableDecoration = disableDecoration;
......
...@@ -50,8 +50,8 @@ import static de.kuschku.util.AndroidAssert.assertEquals; ...@@ -50,8 +50,8 @@ import static de.kuschku.util.AndroidAssert.assertEquals;
public class IrcChannel extends AIrcChannel<IrcChannel> { public class IrcChannel extends AIrcChannel<IrcChannel> {
private final String name; private final String name;
@NonNull @NonNull
private final Map<QIrcUser, Set<Character>> userModes = new HashMap<>(); private final Map<String, Set<Character>> userModes = new HashMap<>();
private final ObservableSet<QIrcUser> users = new ObservableSet<>(); private final ObservableSet<String> users = new ObservableSet<>();
private String topic; private String topic;
private String password; private String password;
private boolean encrypted; private boolean encrypted;
...@@ -131,21 +131,21 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { ...@@ -131,21 +131,21 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
@NonNull @NonNull
@Override @Override
public List<QIrcUser> ircUsers() { public List<String> ircUsers() {
return new ArrayList<>(userModes.keySet()); return new ArrayList<>(userModes.keySet());
} }
@Override @Override
public String userModes(QIrcUser ircuser) { public String userModes(String nick) {
if (userModes.containsKey(ircuser)) if (userModes.containsKey(nick))
return Joiner.on("").join(userModes.get(ircuser)); return Joiner.on("").join(userModes.get(nick));
else else
return ""; return "";
} }
@Override @Override
public String userModes(String nick) { public String userModes(QIrcUser ircuser) {
return userModes(network().ircUser(nick)); return userModes(ircuser.nick());
} }
@Override @Override
...@@ -286,8 +286,8 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { ...@@ -286,8 +286,8 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
if (ircuser == null || userModes.containsKey(ircuser)) { if (ircuser == null || userModes.containsKey(ircuser)) {
_addUserMode(ircuser, mode); _addUserMode(ircuser, mode);
} else { } else {
userModes.put(ircuser, ModeUtils.toModes(mode)); userModes.put(ircuser.nick(), ModeUtils.toModes(mode));
users.add(ircuser); users.add(ircuser.nick());
ircuser._joinChannel(this, true); ircuser._joinChannel(this, true);
_update(); _update();
} }
...@@ -296,16 +296,16 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { ...@@ -296,16 +296,16 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
@Override @Override
public void _part(@NonNull QIrcUser ircuser) { public void _part(@NonNull QIrcUser ircuser) {
if (isKnownUser(ircuser)) { if (isKnownUser(ircuser)) {
userModes.remove(ircuser); userModes.remove(ircuser.nick());
users.remove(ircuser); users.remove(ircuser.nick());
ircuser._partChannel(this); ircuser._partChannel(this);
if (network().isMe(ircuser) || userModes.isEmpty()) { if (network().isMe(ircuser) || userModes.isEmpty()) {
Set<QIrcUser> users = userModes.keySet(); Set<String> users = userModes.keySet();
userModes.clear(); userModes.clear();
users.clear(); users.clear();
for (QIrcUser user : users) { for (String user : users) {
user._partChannel(this, true); network().ircUser(user)._partChannel(this, true);
} }
network()._removeIrcChannel(this); network()._removeIrcChannel(this);
} }
...@@ -322,8 +322,8 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { ...@@ -322,8 +322,8 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
public void _setUserModes(QIrcUser ircuser, String modes) { public void _setUserModes(QIrcUser ircuser, String modes) {
if (isKnownUser(ircuser)) { if (isKnownUser(ircuser)) {
userModes.put(ircuser, ModeUtils.toModes(modes)); userModes.put(ircuser.nick(), ModeUtils.toModes(modes));
users.add(ircuser); users.add(ircuser.nick());
_update(); _update();
} }
} }
...@@ -338,9 +338,9 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { ...@@ -338,9 +338,9 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
if (!isKnownUser(ircuser) || !isValidChannelUserMode(mode)) if (!isKnownUser(ircuser) || !isValidChannelUserMode(mode))
return; return;
if (!userModes.get(ircuser).contains(ModeUtils.toMode(mode))) { if (!userModes.get(ircuser.nick()).contains(ModeUtils.toMode(mode))) {
userModes.get(ircuser).add(ModeUtils.toMode(mode)); userModes.get(ircuser.nick()).add(ModeUtils.toMode(mode));
users.notifyItemChanged(ircuser); users.notifyItemChanged(ircuser.nick());
_update(); _update();
} }
} }
...@@ -433,8 +433,8 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { ...@@ -433,8 +433,8 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
for (String username : cachedUserModes.keySet()) { for (String username : cachedUserModes.keySet()) {
QIrcUser ircUser = network().ircUser(username); QIrcUser ircUser = network().ircUser(username);
if (ircUser != null) { if (ircUser != null) {
userModes.put(ircUser, ModeUtils.toModes(cachedUserModes.get(username))); userModes.put(ircUser.nick(), ModeUtils.toModes(cachedUserModes.get(username)));
users.add(ircUser); users.add(ircUser.nick());
} }
} }
} }
...@@ -472,8 +472,8 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { ...@@ -472,8 +472,8 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
@NonNull @NonNull
public Map<String, String> userModes() { public Map<String, String> userModes() {
Map<String, String> result = new HashMap<>(); Map<String, String> result = new HashMap<>();
for (QIrcUser user : userModes.keySet()) { for (String nick : userModes.keySet()) {
result.put(user.nick(), userModes(user)); result.put(nick, userModes(nick));
} }
return result; return result;
} }
...@@ -496,7 +496,14 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { ...@@ -496,7 +496,14 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
init(client.networkManager().network(Integer.parseInt(split[0])), client); init(client.networkManager().network(Integer.parseInt(split[0])), client);
} }
public ObservableSet<QIrcUser> users() { public ObservableSet<String> users() {
return users; return users;
} }
@Override
public void _ircUserNickChanged(String oldNick, String newNick) {
users.remove(oldNick);
users.add(newNick);
userModes.put(newNick, userModes.get(oldNick));
}
} }
...@@ -677,14 +677,17 @@ public class Network extends ANetwork<Network> implements Observer { ...@@ -677,14 +677,17 @@ public class Network extends ANetwork<Network> implements Observer {
} }
@Override @Override
public void _ircUserNickChanged(@NonNull String oldNick, @NonNull String newnick) { public void _ircUserNickChanged(@NonNull String oldNick, @NonNull String newNick) {
if (IrcCaseMapper.equalsIgnoreCase(oldNick, newnick)) { if (!IrcCaseMapper.equalsIgnoreCase(oldNick, newNick)) {
nicks.put(newnick, nicks.remove(oldNick)); nicks.put(newNick, nicks.remove(oldNick));
for (QIrcChannel channel : channels.values()) {
channel._ircUserNickChanged(oldNick, newNick);
}
_update(); _update();
} }
if (IrcCaseMapper.equalsIgnoreCase(myNick(), oldNick)) if (IrcCaseMapper.equalsIgnoreCase(myNick(), oldNick))
_setMyNick(newnick); _setMyNick(newNick);
} }
@Override @Override
...@@ -762,11 +765,11 @@ public class Network extends ANetwork<Network> implements Observer { ...@@ -762,11 +765,11 @@ public class Network extends ANetwork<Network> implements Observer {
super.init(objectName, provider, client); super.init(objectName, provider, client);
networkInfo._setNetworkId(Integer.parseInt(objectName)); networkInfo._setNetworkId(Integer.parseInt(objectName));
client.networkManager().createNetwork(this); client.networkManager().createNetwork(this);
for (QIrcChannel name : ircChannels()) { for (QIrcChannel channel : channels.values()) {
client.requestInitObject("IrcChannel", networkId() + "/" + name.name()); ((IrcChannel) channel).init(networkId()+"/"+channel.name(), provider, client);
} }
for (QIrcUser name : ircUsers()) { for (QIrcUser user : nicks.values()) {
client.requestInitObject("IrcUser", networkId() + "/" + name.nick()); ((IrcUser) user).init(networkId()+"/"+user.nick(), provider, client);
} }
} }
......
...@@ -23,7 +23,9 @@ package de.kuschku.libquassel.syncables.types.interfaces; ...@@ -23,7 +23,9 @@ package de.kuschku.libquassel.syncables.types.interfaces;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import java.util.BitSet;
import java.util.List; import java.util.List;
import java.util.Set;
import de.kuschku.libquassel.localtypes.BacklogFilter; import de.kuschku.libquassel.localtypes.BacklogFilter;
import de.kuschku.libquassel.message.Message; import de.kuschku.libquassel.message.Message;
...@@ -67,4 +69,8 @@ public interface QBacklogManager<T extends QSyncableObject<T>> extends QSyncable ...@@ -67,4 +69,8 @@ public interface QBacklogManager<T extends QSyncableObject<T>> extends QSyncable
void open(int bufferId); void open(int bufferId);
void receiveBacklog(Message msg); void receiveBacklog(Message msg);
int waitingMax();
Set<Integer> waiting();
} }
...@@ -45,7 +45,7 @@ public interface QIrcChannel extends QObservable { ...@@ -45,7 +45,7 @@ public interface QIrcChannel extends QObservable {
QNetwork network(); QNetwork network();
@NonNull @NonNull
List<QIrcUser> ircUsers(); List<String> ircUsers();
String userModes(QIrcUser ircuser); String userModes(QIrcUser ircuser);
...@@ -150,5 +150,7 @@ public interface QIrcChannel extends QObservable { ...@@ -150,5 +150,7 @@ public interface QIrcChannel extends QObservable {
String getObjectName(); String getObjectName();
ObservableSet<QIrcUser> users(); ObservableSet<String> users();
void _ircUserNickChanged(String oldNick, String newNick);
} }
...@@ -77,6 +77,7 @@ import aspm.annotations.StringPreference; ...@@ -77,6 +77,7 @@ import aspm.annotations.StringPreference;
import butterknife.Bind; import butterknife.Bind;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import de.kuschku.libquassel.BusProvider; import de.kuschku.libquassel.BusProvider;
import de.kuschku.libquassel.events.BacklogInitEvent;
import de.kuschku.libquassel.events.BacklogReceivedEvent; import de.kuschku.libquassel.events.BacklogReceivedEvent;
import de.kuschku.libquassel.events.ConnectionChangeEvent; import de.kuschku.libquassel.events.ConnectionChangeEvent;
import de.kuschku.libquassel.events.GeneralErrorEvent; import de.kuschku.libquassel.events.GeneralErrorEvent;
...@@ -174,6 +175,7 @@ public class ChatActivity extends AppCompatActivity { ...@@ -174,6 +175,7 @@ public class ChatActivity extends AppCompatActivity {
context.setClient(backgroundThread.client().client); context.setClient(backgroundThread.client().client);
context.provider().event.register(ChatActivity.this); context.provider().event.register(ChatActivity.this);
updateSubTitle(); updateSubTitle();
if (context.client().connectionStatus() == ConnectionChangeEvent.Status.CONNECTED) { if (context.client().connectionStatus() == ConnectionChangeEvent.Status.CONNECTED) {
updateBufferViewConfigs(); updateBufferViewConfigs();
...@@ -189,6 +191,27 @@ public class ChatActivity extends AppCompatActivity { ...@@ -189,6 +191,27 @@ public class ChatActivity extends AppCompatActivity {
} }
}; };
private void updateSubTitle() {
if (context.client() != null) {
if (context.client().connectionStatus() == ConnectionChangeEvent.Status.CONNECTED) {
if (status.bufferId > 0) {
Buffer buffer = context.client().bufferManager().buffer(status.bufferId);
if (buffer != null && buffer instanceof ChannelBuffer) {
QIrcChannel channel = ((ChannelBuffer) buffer).getChannel();
if (channel != null) {
updateSubTitle(channel.topic());
return;
}
}
}
} else {
updateSubTitle(context.client().connectionStatus().name());
return;
}
}
updateSubTitle("");
}
private static void updateNoColor(Buffer buffer, @NonNull Menu menu) { private static void updateNoColor(Buffer buffer, @NonNull Menu menu) {
boolean isNoColor = isNoColor(buffer); boolean isNoColor = isNoColor(buffer);
menu.findItem(R.id.format_bold).setEnabled(!isNoColor); menu.findItem(R.id.format_bold).setEnabled(!isNoColor);
...@@ -663,6 +686,10 @@ public class ChatActivity extends AppCompatActivity { ...@@ -663,6 +686,10 @@ public class ChatActivity extends AppCompatActivity {
} }
} }
public void onEventMainThread(@NonNull BacklogInitEvent event) {
updateSubTitle(event.toString());
}
private void updateBufferViewConfigs() { private void updateBufferViewConfigs() {
assertNotNull(context.client().bufferViewManager()); assertNotNull(context.client().bufferViewManager());
List<QBufferViewConfig> bufferViews = context.client().bufferViewManager().bufferViewConfigs(); List<QBufferViewConfig> bufferViews = context.client().bufferViewManager().bufferViewConfigs();
...@@ -775,42 +802,9 @@ public class ChatActivity extends AppCompatActivity { ...@@ -775,42 +802,9 @@ public class ChatActivity extends AppCompatActivity {
updateSubTitle(); updateSubTitle();
} }
private void updateSubTitle() { private void updateSubTitle(CharSequence text) {
if (context.client() != null) { if (context.client() != null) {
CharSequence subtitle; toolbar.setSubtitle(text);
if (context.client().connectionStatus() == ConnectionChangeEvent.Status.CONNECTED) {
if (status.bufferId >= 0) {
Buffer buffer = context.client().bufferManager().buffer(status.bufferId);
if (buffer != null) {
if (buffer instanceof QueryBuffer) {
QIrcUser user = ((QueryBuffer) buffer).getUser();
if (user != null)
subtitle = user.realName();
else
subtitle = "";
} else if (buffer instanceof ChannelBuffer) {
QIrcChannel channel = ((ChannelBuffer) buffer).getChannel();
if (channel != null)
subtitle = MessageUtil.parseStyleCodes(
context.themeUtil(),
channel.topic(),
context.settings().mircColors.or(true)
);
else
subtitle = "";
}
else
subtitle = "";
} else {
subtitle = "";
}
} else {
subtitle = "";
}
} else {
subtitle = String.valueOf(context.client().connectionStatus());
}
toolbar.setSubtitle(subtitle);
} else { } else {
toolbar.setSubtitle(""); toolbar.setSubtitle("");
} }
......
...@@ -29,6 +29,9 @@ import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; ...@@ -29,6 +29,9 @@ import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel;
import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser;
import de.kuschku.util.backports.Objects; import de.kuschku.util.backports.Objects;
import de.kuschku.util.irc.IrcCaseMapper;
import de.kuschku.util.irc.IrcUserUtils;
import de.kuschku.util.observables.callbacks.ElementCallback;
import de.kuschku.util.observables.callbacks.UICallback; import de.kuschku.util.observables.callbacks.UICallback;
import de.kuschku.util.observables.lists.ObservableSortedList; import de.kuschku.util.observables.lists.ObservableSortedList;
...@@ -60,7 +63,35 @@ public class NickListWrapper { ...@@ -60,7 +63,35 @@ public class NickListWrapper {
public NickListWrapper(Drawer drawerRight, QIrcChannel channel) { public NickListWrapper(Drawer drawerRight, QIrcChannel channel) {
drawerRight.removeAllItems(); drawerRight.removeAllItems();
this.channel = channel; this.channel = channel;
this.list.addAll(channel.users()); for (String nick : channel.users()) {
list.add(channel.network().ircUser(nick));
}
channel.users().addCallback(new ElementCallback<String>() {
@Override
public void notifyItemInserted(String element) {
list.add(channel.network().ircUser(element));
}
@Override
public void notifyItemRemoved(String element) {
for (QIrcUser user : list) {
if (IrcCaseMapper.equalsIgnoreCase(user.nick(), element)) {
list.remove(user);
return;
}
}
}
@Override
public void notifyItemChanged(String element) {
for (int i = 0; i < list.size(); i++) {
if (IrcCaseMapper.equalsIgnoreCase(list.get(i).nick(), element)) {
list.notifyItemChanged(i);
return;
}
}
}
});
this.list.addCallback(new UICallback() { this.list.addCallback(new UICallback() {
@Override @Override
public void notifyItemInserted(int position) { public void notifyItemInserted(int position) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment