diff --git a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java index dcffa36f7d25dcd4da4993b2be8a49c4381d72bf..c6026667c27094b190ca1b9623029fc5f3a1df69 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java +++ b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java @@ -23,7 +23,7 @@ package de.kuschku.libquassel.client; import android.support.annotation.IntRange; import android.support.annotation.NonNull; -import android.util.Log; +import android.support.annotation.Nullable; import java.util.HashMap; import java.util.HashSet; @@ -53,7 +53,7 @@ public class BufferManager { private final Map<String, Integer> buffersByChannel = new HashMap<>(); private final Map<Integer, ObservableSet<Integer>> buffersByNetwork = new HashMap<>(); private final ObservableSet<Integer> bufferIds = new ObservableSet<>(); - private Set<Integer> laterRequests = new HashSet<>(); + private final Set<Integer> laterRequests = new HashSet<>(); public BufferManager(Client client) { this.client = client; @@ -88,35 +88,36 @@ public class BufferManager { buffer.setInfo(bufferInfo); } - public void init(List<BufferInfo> bufferInfos) { + public void init(@NonNull List<BufferInfo> bufferInfos) { for (BufferInfo info : bufferInfos) { createBuffer(info); laterRequests.add(info.id()); } } + @NonNull public Map<Integer, Buffer> buffers() { return buffers; } - public void createBuffer(BufferInfo info) { + public void createBuffer(@NonNull BufferInfo info) { Buffer buffer = Buffers.fromType(info, client); assertNotNull(buffer); createBuffer(buffer); } - public boolean exists(BufferInfo info) { + public boolean exists(@NonNull BufferInfo info) { return buffers.containsKey(info.id()); } - public void renameBuffer(int bufferId, String newName) { + public void renameBuffer(int bufferId, @NonNull String newName) { Buffer buffer = buffer(bufferId); if (buffer != null) { buffer.renameBuffer(newName); } } - private void updateBufferMapEntries(Buffer buffer, String name) { + private void updateBufferMapEntries(@NonNull Buffer buffer, String name) { buffersByNick.remove(buffer.objectName()); buffersByChannel.remove(buffer.objectName()); if (buffer instanceof ChannelBuffer) { @@ -126,7 +127,8 @@ public class BufferManager { } } - public ChannelBuffer channel(QIrcChannel channel) { + @Nullable + public ChannelBuffer channel(@Nullable QIrcChannel channel) { if (channel == null) return null; if (!buffersByChannel.containsKey(channel.getObjectName())) @@ -137,7 +139,8 @@ public class BufferManager { return (ChannelBuffer) buffer; } - public QueryBuffer user(QIrcUser user) { + @Nullable + public QueryBuffer user(@Nullable QIrcUser user) { if (user == null) return null; if (!buffersByNick.containsKey(user.getObjectName())) @@ -154,6 +157,7 @@ public class BufferManager { return buffersByNetwork.get(networkId); } + @NonNull public ObservableSet<Integer> bufferIds() { return bufferIds; } @@ -170,6 +174,6 @@ public class BufferManager { laterRequests.clear(); int waitingMax = client.backlogManager().waitingMax(); int waitingCurrently = client.backlogManager().waiting().size(); - client.provider().sendEvent(new BacklogInitEvent(waitingMax-waitingCurrently, waitingMax)); + client.provider().sendEvent(new BacklogInitEvent(waitingMax - waitingCurrently, waitingMax)); } } diff --git a/app/src/main/java/de/kuschku/libquassel/client/Client.java b/app/src/main/java/de/kuschku/libquassel/client/Client.java index fa1bb4613151a07e9372cd0269df9de959ca89ac..1b3597e9b49c7a204697dd2b528399d1482c45ad 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/Client.java +++ b/app/src/main/java/de/kuschku/libquassel/client/Client.java @@ -82,6 +82,7 @@ public class Client extends AClient { @NonNull private final NotificationManager notificationManager; private final List<String> initRequests = new LinkedList<>(); + @NonNull private final QBacklogManager<? extends QBacklogManager> backlogManager; private final Map<String, List<SyncFunction>> bufferedSyncs = new HashMap<>(); private final Map<Integer, Pair<QBufferViewConfig, Integer>> bufferedBuffers = new HashMap<>(); @@ -122,6 +123,7 @@ public class Client extends AClient { return aliasManager; } + @NonNull public QBacklogManager<? extends QBacklogManager> backlogManager() { return backlogManager; } @@ -147,12 +149,12 @@ public class Client extends AClient { } @Override - public void _bufferInfoUpdated(BufferInfo bufferInfo) { + public void _bufferInfoUpdated(@NonNull BufferInfo bufferInfo) { bufferManager.updateBufferInfo(bufferInfo); } @Override - public void _identityCreated(Identity identity) { + public void _identityCreated(@NonNull Identity identity) { identityManager.createIdentity(identity); } @@ -194,9 +196,7 @@ public class Client extends AClient { this.connectionStatus = connectionStatus; if (connectionStatus == ConnectionChangeEvent.Status.LOADING_BACKLOG) { - Log.e("libquassel", "test1"); bufferManager().doBacklogInit(20); - Log.e("libquassel", "test2"); } else if (connectionStatus == ConnectionChangeEvent.Status.CONNECTED) { // FIXME: Init buffer activity state and highlightss } @@ -452,7 +452,7 @@ public class Client extends AClient { Log.d("libquassel", "Queued buffers: " + bufferedBuffers.keySet()); } - public void unbufferBuffer(BufferInfo info) { + public void unbufferBuffer(@NonNull BufferInfo info) { if (!bufferManager().exists(info)) { bufferManager().createBuffer(info); Log.d("libquassel", "Creating buffer from message info: " + info.id()); @@ -464,6 +464,7 @@ public class Client extends AClient { } } + @Nullable public BusProvider provider() { return provider; } diff --git a/app/src/main/java/de/kuschku/libquassel/client/IdentityManager.java b/app/src/main/java/de/kuschku/libquassel/client/IdentityManager.java index 04d417aba54650ae9c76b991df32de08d683d11a..9a1fe8ef6102943c8eae514bd14e8ffd5ae3cf2b 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/IdentityManager.java +++ b/app/src/main/java/de/kuschku/libquassel/client/IdentityManager.java @@ -23,6 +23,7 @@ package de.kuschku.libquassel.client; import android.support.annotation.IntRange; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import java.util.HashMap; import java.util.List; @@ -47,6 +48,7 @@ public class IdentityManager { identities.remove(id); } + @Nullable public QIdentity identity(@IntRange(from = 0) int id) { return identities.get(id); } diff --git a/app/src/main/java/de/kuschku/libquassel/client/NetworkManager.java b/app/src/main/java/de/kuschku/libquassel/client/NetworkManager.java index 58f6d9bf106ee4a1d5fef9ab9482210bbd25d007..27ca0a8169793feaf199845d91875facba726b0f 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/NetworkManager.java +++ b/app/src/main/java/de/kuschku/libquassel/client/NetworkManager.java @@ -37,10 +37,12 @@ import de.kuschku.util.observables.lists.ObservableSet; public class NetworkManager extends Observable { @NonNull private final Map<Integer, QNetwork> networks = new HashMap<>(); + @NonNull private final ObservableSet<QNetwork> list = new ObservableSet<>(); + @NonNull private final Client client; - public NetworkManager(Client client) { + public NetworkManager(@NonNull Client client) { this.client = client; } @@ -71,10 +73,12 @@ public class NetworkManager extends Observable { } } + @NonNull public ObservableSet<QNetwork> list() { return list; } + @NonNull public List<QNetwork> networks() { return new ArrayList<>(networks.values()); } diff --git a/app/src/main/java/de/kuschku/libquassel/events/GeneralErrorEvent.java b/app/src/main/java/de/kuschku/libquassel/events/GeneralErrorEvent.java index afa47520ae1c685ffc110ebd97bbc60eb48f7140..00534a76ee28813779f6f5d2ec2ae56a305d9513 100644 --- a/app/src/main/java/de/kuschku/libquassel/events/GeneralErrorEvent.java +++ b/app/src/main/java/de/kuschku/libquassel/events/GeneralErrorEvent.java @@ -21,6 +21,8 @@ package de.kuschku.libquassel.events; +import android.support.annotation.NonNull; + @SuppressWarnings("WeakerAccess") public class GeneralErrorEvent { public String debugInfo; @@ -40,6 +42,7 @@ public class GeneralErrorEvent { } @Override + @NonNull public String toString() { if (debugInfo == null) return String.format("%s: %s", exception.getClass().getSimpleName(), exception.getLocalizedMessage()); diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/HeartbeatReply.java b/app/src/main/java/de/kuschku/libquassel/functions/types/HeartbeatReply.java index b673b822544da2776f3105a37ca494a00168a632..8ae2cb05f6230a1d39dc5d98d0883e2c8ef7abdb 100644 --- a/app/src/main/java/de/kuschku/libquassel/functions/types/HeartbeatReply.java +++ b/app/src/main/java/de/kuschku/libquassel/functions/types/HeartbeatReply.java @@ -36,7 +36,7 @@ public class HeartbeatReply { this(DateTime.now().toDateTimeISO()); } - public HeartbeatReply(Heartbeat heartbeat) { + public HeartbeatReply(@NonNull Heartbeat heartbeat) { this(heartbeat.dateTime); } diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/RpcCallFunction.java b/app/src/main/java/de/kuschku/libquassel/functions/types/RpcCallFunction.java index 09e8c5e57bff19d5c8f47af670104fcd38872e0e..4f9dffe9fd65d6edae365a5cebb196d3d69e6234 100644 --- a/app/src/main/java/de/kuschku/libquassel/functions/types/RpcCallFunction.java +++ b/app/src/main/java/de/kuschku/libquassel/functions/types/RpcCallFunction.java @@ -30,7 +30,7 @@ public class RpcCallFunction { @NonNull public final String functionName; @NonNull - public final List<Object> params; + public final List params; public RpcCallFunction(@NonNull String functionName, @NonNull List params) { this.functionName = functionName; diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java index 64458965e279ad40fada4297ca61e3ff85caf474..83c60019cbe65f6866895fbaf9f2474b97c7e87f 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java @@ -49,12 +49,10 @@ public class BacklogFilter implements UICallback { @NonNull private final Set<Message.Type> filteredTypes = new HashSet<>(); - + private final EventBus bus = new EventBus(); @Nullable private DateTime earliestMessage; - private EventBus bus = new EventBus(); - public BacklogFilter(@NonNull Client client, int bufferId, @NonNull ObservableComparableSortedList<Message> unfiltered, @NonNull ObservableComparableSortedList<Message> filtered) { this.client = client; this.bufferId = bufferId; @@ -127,17 +125,17 @@ public class BacklogFilter implements UICallback { } } - public void onEventAsync(MessageFilterEvent event) { + public void onEventAsync(@NonNull 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) { + public void onEventMainThread(@NonNull MessageInsertEvent event) { filtered.add(event.msg); } - public void onEventMainThread(MessageRemoveEvent event) { + public void onEventMainThread(@NonNull MessageRemoveEvent event) { filtered.remove(event.msg); } @@ -204,6 +202,7 @@ public class BacklogFilter implements UICallback { private class MessageInsertEvent { public final Message msg; + public MessageInsertEvent(Message msg) { this.msg = msg; } @@ -211,6 +210,7 @@ public class BacklogFilter implements UICallback { private class MessageRemoveEvent { public final Message msg; + public MessageRemoveEvent(Message msg) { this.msg = msg; } @@ -218,6 +218,7 @@ public class BacklogFilter implements UICallback { private class MessageFilterEvent { public final Message msg; + public MessageFilterEvent(Message msg) { this.msg = msg; } diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java index 491c09db51aee0a4c753fea8b05a6fd3ae5ce5e7..c887d11adf89ea8316c97fc99f7ee64db648df6f 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java @@ -80,7 +80,7 @@ public class MemoryBacklogStorage implements BacklogStorage { } } - public void updateLatest(Message message) { + public void updateLatest(@NonNull Message message) { if (message.messageId > getLatest(message.bufferInfo.id())) { latestMessage.put(message.bufferInfo.id(), message.messageId); } diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffer.java index ce73300dc1f70b1d871cd5a80f8ed63c8f84dcb5..849f5d13d75286773890a46419dc68f65063ec57 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffer.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffer.java @@ -40,7 +40,9 @@ public interface Buffer { void renameBuffer(@NonNull String newName); + @NonNull String objectName(); + @NonNull String objectName(String name); } diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java index 8fb9f4ca0bf2dffb5058606e1462615115be6171..fada32de074e459b068fc85f4358f75857db7cdc 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java @@ -67,11 +67,13 @@ public class ChannelBuffer implements Buffer { info.setName(newName); } + @NonNull @Override public String objectName() { return objectName(info.name()); } + @NonNull @Override public String objectName(String name) { return info.networkId() + "/" + name; diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java index a87ddc8fda116f2ae4ca35706e2360f297e631ba..e373eade1eaaadeff10590951eb41031d4d4c867 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java @@ -69,11 +69,13 @@ public class QueryBuffer implements Buffer { info.setName(newName); } + @NonNull @Override public String objectName() { return objectName(info.name()); } + @NonNull @Override public String objectName(String name) { return info.networkId() + "/" + name; diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java index 4bab97e2fd0ec163ca59b3e5845e3ccc8933ad66..ec75adde3ca84bb57ff4f201ee5889dc85b12f6c 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java @@ -66,11 +66,13 @@ public class StatusBuffer implements Buffer { return getNetwork().isConnected() ? BufferInfo.BufferStatus.ONLINE : BufferInfo.BufferStatus.OFFLINE; } + @NonNull @Override public String objectName() { return objectName(info.name()); } + @NonNull @Override public String objectName(String name) { return info.networkId() + "/" + name; diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABacklogManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABacklogManager.java index 09b4c6e23e42a783a181b9253ac50adef5164d67..b8eb23ba937778113fa75e303786fa82b11a1897 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABacklogManager.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABacklogManager.java @@ -29,7 +29,7 @@ import de.kuschku.libquassel.syncables.types.SyncableObject; import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager; public abstract class ABacklogManager<T extends ABacklogManager<T>> extends SyncableObject<T> implements QBacklogManager<T> { - static String intName = QMetaType.Type.Int.getSerializableName(); + static final String intName = QMetaType.Type.Int.getSerializableName(); @Override public void requestBacklog(int id, int first, int last, int limit, int additional) { diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcChannel.java index af5bf64374b35568e52e7ba3863c9b3c90275dd9..44c91289df3fe07b9e6fcc5f6fd8a6e8a5bd7f64 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcChannel.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcChannel.java @@ -21,6 +21,8 @@ package de.kuschku.libquassel.syncables.types.abstracts; +import android.support.annotation.NonNull; + import java.util.List; import de.kuschku.libquassel.syncables.types.SyncableObject; @@ -53,13 +55,13 @@ public abstract class AIrcChannel<T extends AIrcChannel<T>> extends SyncableObje } @Override - public void joinIrcUser(QIrcUser ircuser) { + public void joinIrcUser(@NonNull QIrcUser ircuser) { _joinIrcUser(ircuser); syncVar("joinIrcUser", ircuser.nick()); } @Override - public void part(QIrcUser ircuser) { + public void part(@NonNull QIrcUser ircuser) { _part(ircuser); syncVar("part", ircuser.nick()); } @@ -71,7 +73,7 @@ public abstract class AIrcChannel<T extends AIrcChannel<T>> extends SyncableObje } @Override - public void setUserModes(QIrcUser ircuser, String modes) { + public void setUserModes(@NonNull QIrcUser ircuser, String modes) { _setUserModes(ircuser, modes); syncVar("setUserModes", ircuser.nick(), modes); } @@ -83,7 +85,7 @@ public abstract class AIrcChannel<T extends AIrcChannel<T>> extends SyncableObje } @Override - public void addUserMode(QIrcUser ircuser, String mode) { + public void addUserMode(@NonNull QIrcUser ircuser, String mode) { _addUserMode(ircuser, mode); syncVar("addUserMode", ircuser.nick(), mode); } @@ -95,7 +97,7 @@ public abstract class AIrcChannel<T extends AIrcChannel<T>> extends SyncableObje } @Override - public void removeUserMode(QIrcUser ircuser, String mode) { + public void removeUserMode(@NonNull QIrcUser ircuser, String mode) { _removeUserMode(ircuser, mode); syncVar("removeUserMode", ircuser.nick(), mode); } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java index 300175bcab3085903fe783e2b6f29271fa82729d..f6dfb61007566268ebdbe5481564f5e9b665e889 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java @@ -21,6 +21,8 @@ package de.kuschku.libquassel.syncables.types.abstracts; +import android.support.annotation.NonNull; + import org.joda.time.DateTime; import de.kuschku.libquassel.syncables.types.SyncableObject; @@ -125,13 +127,13 @@ public abstract class AIrcUser<T extends AIrcUser<T>> extends SyncableObject<T> } @Override - public void joinChannel(QIrcChannel channel) { + public void joinChannel(@NonNull QIrcChannel channel) { _joinChannel(channel); syncVar("joinChannel", channel.name()); } @Override - public void joinChannel(QIrcChannel channel, boolean skip_channel_join) { + public void joinChannel(@NonNull QIrcChannel channel, boolean skip_channel_join) { _joinChannel(channel, skip_channel_join); syncVar("joinChannel", channel.name(), skip_channel_join); } @@ -143,7 +145,7 @@ public abstract class AIrcUser<T extends AIrcUser<T>> extends SyncableObject<T> } @Override - public void partChannel(QIrcChannel channel) { + public void partChannel(@NonNull QIrcChannel channel) { _partChannel(channel); syncVar("partChannel", channel.name()); } @@ -173,7 +175,7 @@ public abstract class AIrcUser<T extends AIrcUser<T>> extends SyncableObject<T> } @Override - public void partChannel(QIrcChannel channel, boolean skip_channel_part) { + public void partChannel(@NonNull QIrcChannel channel, boolean skip_channel_part) { _partChannel(channel, skip_channel_part); syncVar("partChannel", channel.name(), skip_channel_part); } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java index f7f196f362dbfa1623a5ba9bbf063ecca67ce652..1b87a2323ac067c3b14960d368dc71cc6f99e757 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java @@ -21,6 +21,8 @@ package de.kuschku.libquassel.syncables.types.abstracts; +import android.support.annotation.NonNull; + import java.util.List; import de.kuschku.libquassel.objects.types.NetworkServer; @@ -249,13 +251,13 @@ public abstract class ANetwork<T extends ANetwork<T>> extends SyncableObject<T> } @Override - public void removeIrcChannel(QIrcChannel ircChannel) { + public void removeIrcChannel(@NonNull QIrcChannel ircChannel) { _removeIrcChannel(ircChannel); syncVar("removeIrcChannel", ircChannel.name()); } @Override - public void removeIrcUser(QIrcUser ircuser) { + public void removeIrcUser(@NonNull QIrcUser ircuser) { _removeIrcUser(ircuser); syncVar("removeIrcUser", ircuser.nick()); } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java index 73bdef72b4c2658405d670ea2c24c870ee050b29..f64af79214bd1e22e4b78750feb217f3483eb448 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java @@ -23,7 +23,6 @@ package de.kuschku.libquassel.syncables.types.impl; import android.support.annotation.IntRange; import android.support.annotation.NonNull; -import android.util.Log; import java.util.HashSet; import java.util.List; @@ -107,7 +106,7 @@ public class BacklogManager extends ABacklogManager<BacklogManager> { assertNotNull(provider); if (client.connectionStatus() == ConnectionChangeEvent.Status.LOADING_BACKLOG) { - provider.sendEvent(new BacklogInitEvent(waitingMax-waiting.size(), waitingMax)); + provider.sendEvent(new BacklogInitEvent(waitingMax - waiting.size(), waitingMax)); if (waiting.isEmpty()) { client.setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED); } @@ -164,7 +163,7 @@ public class BacklogManager extends ABacklogManager<BacklogManager> { } @Override - public void receiveBacklog(Message msg) { + public void receiveBacklog(@NonNull Message msg) { storage.insertMessages(msg); if (msg.bufferInfo.id() == openBuffer && openBuffer != -1) client.bufferSyncer().requestMarkBufferAsRead(openBuffer); @@ -175,6 +174,7 @@ public class BacklogManager extends ABacklogManager<BacklogManager> { return waitingMax; } + @NonNull @Override public Set<Integer> waiting() { return waiting; diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java index 967cb5bb0e4a91f330c01d231211f097a70d86b9..14414e07205974fb8dfe1590638e1428e8061754 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java @@ -25,9 +25,7 @@ import android.support.annotation.NonNull; import android.util.Log; import android.util.SparseIntArray; -import java.util.HashSet; import java.util.Map; -import java.util.Set; import de.kuschku.libquassel.BusProvider; import de.kuschku.libquassel.client.Client; @@ -35,24 +33,30 @@ import de.kuschku.libquassel.message.Message; import de.kuschku.libquassel.primitives.types.QVariant; import de.kuschku.libquassel.syncables.serializers.BufferSyncerSerializer; import de.kuschku.libquassel.syncables.types.abstracts.ABufferSyncer; +import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager; import de.kuschku.util.observables.lists.ObservableComparableSortedList; import de.kuschku.util.observables.lists.ObservableSortedList; +import static de.kuschku.util.AndroidAssert.assertNotNull; + public class BufferSyncer extends ABufferSyncer<BufferSyncer> { + @NonNull + private final SparseIntArray activities = new SparseIntArray(); + @NonNull private SparseIntArray lastSeenMsgs = new SparseIntArray(); + @NonNull private SparseIntArray markerLines = new SparseIntArray(); - private SparseIntArray activities = new SparseIntArray(); - private Set<Integer> bufferIds = new HashSet<>(); public BufferSyncer(@NonNull Map<Integer, Integer> lastSeenMsgs, @NonNull Map<Integer, Integer> markerLines) { + assertNotNull(lastSeenMsgs); + assertNotNull(markerLines); + for (int bufferId : lastSeenMsgs.keySet()) { this.lastSeenMsgs.put(bufferId, lastSeenMsgs.get(bufferId)); - this.bufferIds.add(bufferId); } for (int bufferId : markerLines.keySet()) { this.markerLines.put(bufferId, markerLines.get(bufferId)); - this.bufferIds.add(bufferId); } } @@ -68,6 +72,10 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> { @Override public void _setLastSeenMsg(int buffer, int msgId) { + assertNotNull(client); + QBacklogManager<? extends QBacklogManager> backlogManager = client.backlogManager(); + assertNotNull(backlogManager); + if (msgId < 0) return; @@ -76,7 +84,7 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> { lastSeenMsgs.put(buffer, msgId); } setActivity(buffer, 0); - ObservableComparableSortedList<Message> filtered = client.backlogManager().filtered(buffer); + ObservableComparableSortedList<Message> filtered = backlogManager.filtered(buffer); for (Message m : filtered) { addActivity(m); } @@ -112,9 +120,10 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> { @Override public void _removeBuffer(int buffer) { + assertNotNull(client); + markerLines.removeAt(markerLines.indexOfKey(buffer)); lastSeenMsgs.removeAt(lastSeenMsgs.indexOfKey(buffer)); - bufferIds.remove(buffer); client.bufferManager().removeBuffer(buffer); _update(); } @@ -126,6 +135,8 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> { @Override public void _renameBuffer(int bufferId, @NonNull String newName) { + assertNotNull(client); + client.bufferManager().renameBuffer(bufferId, newName); _update(); } @@ -147,6 +158,8 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> { @Override public void _requestMarkBufferAsRead(int buffer) { + assertNotNull(client); + int lastMessage = client.backlogStorage().getLatest(buffer); if (lastMessage != -1) { requestSetLastSeenMsg(buffer, lastMessage); @@ -156,6 +169,8 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> { @Override public void _markBufferAsRead(int buffer) { + assertNotNull(client); + ObservableSortedList<Message> messages = client.backlogStorage().getUnfiltered(buffer); Message lastMessage = messages.last(); if (messages.isEmpty() || lastMessage == null) { @@ -186,22 +201,28 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> { } public int activity(int bufferid) { + assertNotNull(activities); + return activities.get(bufferid, 0); } public void setActivity(int bufferid, int activity) { + assertNotNull(activities); + activities.put(bufferid, activity); } public void addActivity(int bufferid, int activity) { + assertNotNull(activities); + activities.put(bufferid, activities.get(bufferid) | activity); } - public void addActivity(int bufferid, Message.Type type) { + public void addActivity(int bufferid, @NonNull Message.Type type) { addActivity(bufferid, type.value); } - public void addActivity(Message message) { + public void addActivity(@NonNull Message message) { int lastSeenMsg = lastSeenMsg(message.bufferInfo.id()); if (message.messageId > lastSeenMsg) { addActivity(message.bufferInfo.id(), message.type); diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java index 8a00d256eecd9d1edd8e5f7faff7ad6b3312e1ac..5cf65c0a3c1d08939a616734d2ecb4de451208a7 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java @@ -38,6 +38,14 @@ import de.kuschku.util.observables.lists.ObservableSet; import static de.kuschku.libquassel.primitives.types.BufferInfo.Type; public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> { + @NonNull + private final ObservableList<Integer> buffers; + @NonNull + private final ObservableSet<Integer> buffersIds; + @NonNull + private final ObservableSet<Integer> removedBuffers; + @NonNull + private final ObservableSet<Integer> temporarilyRemovedBuffers; private int bufferViewId; private String bufferViewName; private int networkId; @@ -48,10 +56,6 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> { private int minimumActivity; private boolean hideInactiveBuffers; private boolean hideInactiveNetworks; - private ObservableList<Integer> buffers; - private ObservableSet<Integer> buffersIds; - private ObservableSet<Integer> removedBuffers; - private ObservableSet<Integer> temporarilyRemovedBuffers; public BufferViewConfig(String bufferViewName, @NonNull List<Integer> temporarilyRemovedBuffers, boolean hideInactiveNetworks, @NonNull List<Integer> buffers, int allowedBufferTypes, boolean sortAlphabetically, boolean disableDecoration, boolean addNewBuffersAutomatically, int networkId, int minimumActivity, boolean hideInactiveBuffers, @NonNull List<Integer> removedBuffers) { this.bufferViewName = bufferViewName; @@ -199,21 +203,25 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> { // Do nothing, we’re on the client – the server will receive the sync just as expected } + @NonNull @Override public ObservableList<Integer> bufferList() { return buffers; } + @NonNull @Override public ObservableSet<Integer> bufferIds() { return buffersIds; } + @NonNull @Override public ObservableSet<Integer> removedBuffers() { return removedBuffers; } + @NonNull @Override public ObservableSet<Integer> temporarilyRemovedBuffers() { return temporarilyRemovedBuffers; diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Identity.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Identity.java index 27c067aef7582b9b45379c8557abc1706e679168..72e83eac2cec5ed8cead77f859fbfc9686939ab8 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Identity.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Identity.java @@ -33,7 +33,6 @@ import de.kuschku.libquassel.client.Client; import de.kuschku.libquassel.primitives.types.QVariant; import de.kuschku.libquassel.syncables.types.abstracts.AIdentity; import de.kuschku.libquassel.syncables.types.interfaces.QIdentity; -import de.kuschku.util.CompatibilityUtils; public class Identity extends AIdentity<Identity> { private int id; @@ -80,20 +79,12 @@ public class Identity extends AIdentity<Identity> { this.quitReason = quitReason; } - private String defaultNick() { - return "quassel"; - } - - - private String defaultRealName() { - return "Quassel IRC User"; - } @Override public void setToDefaults() { setIdentityName(""); - setRealName(defaultRealName()); - setNicks(Collections.singletonList(defaultNick())); + setRealName("Quassel IRC User"); + setNicks(Collections.singletonList("quassel")); setAwayNick(""); setAwayNickEnabled(false); setAwayReason("Gone fishing."); diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java index cd6357971cf521c4fb479e8e0a0d22360f5e83f9..c2d02098206966572ac0a075d89ea7327ec6fea8 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java @@ -151,10 +151,12 @@ public class IgnoreListManager extends AIgnoreListManager<IgnoreListManager> { public class IgnoreListItem { private final IgnoreType type; + @NonNull private final SmartRegEx ignoreRule; private final boolean isRegEx; private final StrictnessType strictness; private final ScopeType scope; + @NonNull private final SmartRegEx[] scopeRules; private boolean isActive; diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java index ecdd4368c39e30cab057be311fc1333514861110..aa1c11002ab78995a0e2499f52706a1af38e98db 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java @@ -83,7 +83,7 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { } @NonNull - public static IrcChannel create(String channelName) { + public static IrcChannel create(@NonNull String channelName) { return new IrcChannel( channelName, "", @@ -95,8 +95,8 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { } @Override - public boolean isKnownUser(QIrcUser ircuser) { - return userModes.containsKey(ircuser); + public boolean isKnownUser(@Nullable QIrcUser ircuser) { + return ircuser != null && userModes.containsKey(ircuser.nick()); } @Override @@ -144,7 +144,7 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { } @Override - public String userModes(QIrcUser ircuser) { + public String userModes(@NonNull QIrcUser ircuser) { return userModes(ircuser.nick()); } @@ -283,7 +283,7 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { } public void _joinIrcUser(@Nullable QIrcUser ircuser, @NonNull String mode) { - if (ircuser == null || userModes.containsKey(ircuser)) { + if (ircuser == null || userModes.containsKey(ircuser.nick())) { _addUserMode(ircuser, mode); } else { userModes.put(ircuser.nick(), ModeUtils.toModes(mode)); @@ -319,7 +319,7 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { } @Override - public void _setUserModes(QIrcUser ircuser, String modes) { + public void _setUserModes(@NonNull QIrcUser ircuser, String modes) { if (isKnownUser(ircuser)) { userModes.put(ircuser.nick(), ModeUtils.toModes(modes)); @@ -334,7 +334,7 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { } @Override - public void _addUserMode(QIrcUser ircuser, @NonNull String mode) { + public void _addUserMode(@NonNull QIrcUser ircuser, @NonNull String mode) { if (!isKnownUser(ircuser) || !isValidChannelUserMode(mode)) return; @@ -351,12 +351,12 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { } @Override - public void _removeUserMode(QIrcUser ircuser, @NonNull String mode) { + public void _removeUserMode(@NonNull QIrcUser ircuser, @NonNull String mode) { if (!isKnownUser(ircuser) || !isValidChannelUserMode(mode)) return; - if (userModes.get(ircuser).contains(ModeUtils.toMode(mode))) { - userModes.get(ircuser).remove(ModeUtils.toMode(mode)); + if (userModes.get(ircuser.nick()).contains(ModeUtils.toMode(mode))) { + userModes.get(ircuser.nick()).remove(ModeUtils.toMode(mode)); _update(); } } @@ -440,16 +440,16 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { } if (cachedChanModes != null) { if (cachedChanModes.get("A") != null) - A_channelModes = (Map<Character, List<String>>) cachedChanModes.get("A"); + A_channelModes = (Map<Character, List<String>>) cachedChanModes.get("A"); if (cachedChanModes.get("B") != null) - B_channelModes = (Map<Character, String>) cachedChanModes.get("B"); + B_channelModes = (Map<Character, String>) cachedChanModes.get("B"); if (cachedChanModes.get("C") != null) - C_channelModes = (Map<Character, String>) cachedChanModes.get("C"); + C_channelModes = (Map<Character, String>) cachedChanModes.get("C"); if (cachedChanModes.get("D") != null) - D_channelModes = ModeUtils.toModes((String) cachedChanModes.get("D")); + D_channelModes = ModeUtils.toModes((String) cachedChanModes.get("D")); } cachedUserModes = null; @@ -496,6 +496,7 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { init(client.networkManager().network(Integer.parseInt(split[0])), client); } + @NonNull public ObservableSet<String> users() { return users; } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java index e33a0e401f0a6a07d37dddf0691f750e987192d1..8e61b521aeea17d716d257a8bf83c15033a42402 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java @@ -52,6 +52,7 @@ public class IrcUser extends AIrcUser<IrcUser> { @NonNull private final SparseArray<DateTime> lastSpokenTo = new SparseArray<>(); private final List<String> cachedChannels; + private final Set<QIrcChannel> channels = new HashSet<>(); private String user; private String host; private String nick; @@ -68,7 +69,6 @@ public class IrcUser extends AIrcUser<IrcUser> { private boolean encrypted; private QNetwork network; private Set<Character> userModes; - private Set<QIrcChannel> channels = new HashSet<>(); public IrcUser(String server, String ircOperator, boolean away, int lastAwayMessage, DateTime idleTime, String whoisServiceReply, String suserHost, String nick, String realName, String awayMessage, DateTime loginTime, boolean encrypted, List<String> channels, String host, String userModes, String user) { this.server = server; @@ -437,9 +437,9 @@ public class IrcUser extends AIrcUser<IrcUser> { this.client = client; if (cachedChannels != null) - for (String channelName : cachedChannels) { - channels.add(network().newIrcChannel(channelName)); - } + for (String channelName : cachedChannels) { + channels.add(network().newIrcChannel(channelName)); + } _update(); } @@ -459,6 +459,7 @@ public class IrcUser extends AIrcUser<IrcUser> { public void _update(IrcUser from) { } + @NonNull @Override public String toString() { return "IrcUser{" + hostmask() + '}'; diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java index ff8721d3895e0a0e38b2db7804bbdd046c378558..a26880d34ddb2575fd390984483de2e9bf44c5ee 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java @@ -124,7 +124,7 @@ public class Network extends ANetwork<Network> implements Observer { @Override public boolean isMyNick(String nick) { - return false; + return IrcCaseMapper.equalsIgnoreCase(myNick, nick); } @Override @@ -185,11 +185,13 @@ public class Network extends ANetwork<Network> implements Observer { return index == -1 ? Integer.MAX_VALUE : index; } + @NonNull @Override public ChannelModeType channelModeType(char mode) { return channelModeType(ModeUtils.fromMode(mode)); } + @NonNull @Override public ChannelModeType channelModeType(@NonNull String mode) { String chanmodes = support("CHANMODES"); @@ -746,7 +748,7 @@ public class Network extends ANetwork<Network> implements Observer { } @Override - public void _addIrcChannel(IrcChannel ircChannel) { + public void _addIrcChannel(@NonNull IrcChannel ircChannel) { channels.put(ircChannel.name(), ircChannel); } @@ -766,10 +768,10 @@ public class Network extends ANetwork<Network> implements Observer { networkInfo._setNetworkId(Integer.parseInt(objectName)); client.networkManager().createNetwork(this); for (QIrcChannel channel : channels.values()) { - ((IrcChannel) channel).init(networkId()+"/"+channel.name(), provider, client); + ((IrcChannel) channel).init(networkId() + "/" + channel.name(), provider, client); } for (QIrcUser user : nicks.values()) { - ((IrcUser) user).init(networkId()+"/"+user.nick(), provider, client); + ((IrcUser) user).init(networkId() + "/" + user.nick(), provider, client); } } @@ -782,6 +784,7 @@ public class Network extends ANetwork<Network> implements Observer { return networkInfo.serverList(); } + @NonNull @Override public String toString() { return "Network{" + @@ -791,7 +794,7 @@ public class Network extends ANetwork<Network> implements Observer { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/NetworkInfo.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/NetworkInfo.java index 9d07c7d8ae667b17f22b2bfd1e1a2dd14f26c62e..93c2d49b2d88e146dca1039126bb2d13acbd1072 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/NetworkInfo.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/NetworkInfo.java @@ -22,6 +22,7 @@ package de.kuschku.libquassel.syncables.types.impl; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import java.util.Collections; import java.util.List; @@ -291,40 +292,33 @@ public class NetworkInfo extends Observable { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; NetworkInfo that = (NetworkInfo) o; - if (networkId != that.networkId) return false; - if (identity != that.identity) return false; - if (useRandomServer != that.useRandomServer) return false; - if (useAutoIdentify != that.useAutoIdentify) return false; - if (useSasl != that.useSasl) return false; - if (useAutoReconnect != that.useAutoReconnect) return false; - if (autoReconnectInterval != that.autoReconnectInterval) return false; - if (autoReconnectRetries != that.autoReconnectRetries) return false; - if (unlimitedReconnectRetries != that.unlimitedReconnectRetries) return false; - if (rejoinChannels != that.rejoinChannels) return false; - if (networkName != null ? !networkName.equals(that.networkName) : that.networkName != null) - return false; - if (codecForServer != null ? !codecForServer.equals(that.codecForServer) : that.codecForServer != null) - return false; - if (codecForEncoding != null ? !codecForEncoding.equals(that.codecForEncoding) : that.codecForEncoding != null) - return false; - if (codecForDecoding != null ? !codecForDecoding.equals(that.codecForDecoding) : that.codecForDecoding != null) - return false; - if (serverList != null ? !serverList.equals(that.serverList) : that.serverList != null) - return false; - if (perform != null ? !perform.equals(that.perform) : that.perform != null) return false; - if (autoIdentifyService != null ? !autoIdentifyService.equals(that.autoIdentifyService) : that.autoIdentifyService != null) - return false; - if (autoIdentifyPassword != null ? !autoIdentifyPassword.equals(that.autoIdentifyPassword) : that.autoIdentifyPassword != null) - return false; - if (saslAccount != null ? !saslAccount.equals(that.saslAccount) : that.saslAccount != null) - return false; - return saslPassword != null ? saslPassword.equals(that.saslPassword) : that.saslPassword == null; + return (networkId == that.networkId && + identity == that.identity && + useRandomServer == that.useRandomServer && + useAutoIdentify == that.useAutoIdentify && + useSasl == that.useSasl && + useAutoReconnect == that.useAutoReconnect && + autoReconnectInterval == that.autoReconnectInterval && + autoReconnectRetries == that.autoReconnectRetries && + unlimitedReconnectRetries == that.unlimitedReconnectRetries && + rejoinChannels == that.rejoinChannels && + (networkName != null ? networkName.equals(that.networkName) : that.networkName == null) && + (codecForServer != null ? codecForServer.equals(that.codecForServer) : that.codecForServer == null) && + (codecForEncoding != null ? codecForEncoding.equals(that.codecForEncoding) : that.codecForEncoding == null) && + (codecForDecoding != null ? codecForDecoding.equals(that.codecForDecoding) : that.codecForDecoding == null) && + (serverList != null ? serverList.equals(that.serverList) : that.serverList == null) && + (perform != null ? perform.equals(that.perform) : that.perform == null) && + (autoIdentifyService != null ? autoIdentifyService.equals(that.autoIdentifyService) : that.autoIdentifyService == null) && + (autoIdentifyPassword != null ? autoIdentifyPassword.equals(that.autoIdentifyPassword) : that.autoIdentifyPassword == null) && + (saslAccount != null ? saslAccount.equals(that.saslAccount) : that.saslAccount == null) && + (saslPassword != null ? saslPassword.equals(that.saslPassword) : that.saslPassword == null) + ); } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBacklogManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBacklogManager.java index 7c435b84b25e59490b1b6f564783580ff8419595..d4d4f4864279634467cc6db46fb143b33f5cb208 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBacklogManager.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBacklogManager.java @@ -23,7 +23,6 @@ package de.kuschku.libquassel.syncables.types.interfaces; import android.support.annotation.NonNull; -import java.util.BitSet; import java.util.List; import java.util.Set; @@ -72,5 +71,6 @@ public interface QBacklogManager<T extends QSyncableObject<T>> extends QSyncable int waitingMax(); + @NonNull Set<Integer> waiting(); } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewConfig.java index 5ebe0c0e077383c485c904833e336e54d48d0a7a..640099fc099ad398228a6e747e13c8ebfcd407f3 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewConfig.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewConfig.java @@ -21,6 +21,8 @@ package de.kuschku.libquassel.syncables.types.interfaces; +import android.support.annotation.NonNull; + import de.kuschku.libquassel.syncables.Synced; import de.kuschku.util.observables.lists.ObservableList; import de.kuschku.util.observables.lists.ObservableSet; @@ -97,12 +99,16 @@ public interface QBufferViewConfig extends QObservable { void _requestSetBufferViewName(final String bufferViewName); + @NonNull ObservableList<Integer> bufferList(); + @NonNull ObservableSet<Integer> bufferIds(); + @NonNull ObservableSet<Integer> removedBuffers(); + @NonNull ObservableSet<Integer> temporarilyRemovedBuffers(); @Synced diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java index ba586d878fb5d7436ffc532e4ec9d6f8fc0f8eca..66db4de0df5d8373df8175eb35c0e876b34ee37e 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java @@ -22,6 +22,7 @@ package de.kuschku.libquassel.syncables.types.interfaces; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import java.util.List; @@ -148,8 +149,10 @@ public interface QIrcChannel extends QObservable { void init(QNetwork network, Client client); + @Nullable String getObjectName(); + @NonNull ObservableSet<String> users(); void _ircUserNickChanged(String oldNick, String newNick); diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcUser.java index 2db4fa03f7ff09dbe594aa8c8baba6f874a4da60..7152d307ae1fba4769f0fb0ac4d227748a68bf18 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcUser.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcUser.java @@ -22,6 +22,7 @@ package de.kuschku.libquassel.syncables.types.interfaces; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import org.joda.time.DateTime; @@ -205,5 +206,6 @@ public interface QIrcUser extends QObservable { void init(QNetwork network, Client client); + @Nullable String getObjectName(); } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java index 94093c47a627d465a4f12ba9c7cc4e0d8edca11f..c7f42451de13d909911ac209fdcddac6afd1a0b8 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java @@ -57,8 +57,10 @@ public interface QNetwork extends QObservable { int modeToIndex(String mode); + @NonNull ChannelModeType channelModeType(final char mode); + @NonNull ChannelModeType channelModeType(final String mode); String networkName(); diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java index 9a5a1e24e72912eaf685bf98c4b0da0c48d24e30..e5a1e21438ab733f5d547e050c8cfa7ea03ee240 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.java @@ -75,6 +75,7 @@ import aspm.annotations.StringPreference; import butterknife.Bind; import butterknife.ButterKnife; import de.kuschku.libquassel.BusProvider; +import de.kuschku.libquassel.client.Client; import de.kuschku.libquassel.events.BacklogInitEvent; import de.kuschku.libquassel.events.BacklogReceivedEvent; import de.kuschku.libquassel.events.ConnectionChangeEvent; @@ -87,11 +88,10 @@ import de.kuschku.libquassel.localtypes.BacklogFilter; import de.kuschku.libquassel.localtypes.buffers.Buffer; import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer; import de.kuschku.libquassel.message.Message; +import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager; import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewManager; import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; import de.kuschku.quasseldroid_ng.BuildConfig; import de.kuschku.quasseldroid_ng.R; import de.kuschku.quasseldroid_ng.service.ClientBackgroundThread; @@ -152,29 +152,32 @@ public class ChatActivity extends AppCompatActivity { private Drawer drawerLeft; private Drawer drawerRight; private AdvancedEditor editor; - private BufferViewConfigItem wrapper; - private NickListWrapper nicklistwrapper; @Nullable private QuasselService.LocalBinder binder; @Nullable private final ServiceConnection serviceConnection = new ServiceConnection() { @UiThread - public void onServiceConnected(@NonNull ComponentName cn, @NonNull IBinder service) { + public void onServiceConnected(ComponentName cn, IBinder service) { + assertNotNull(cn); + assertNotNull(service); + if (service instanceof QuasselService.LocalBinder) { ChatActivity.this.binder = (QuasselService.LocalBinder) service; - if (binder.getBackgroundThread() != null) { + if (binder != null && binder.getBackgroundThread() != null) { ClientBackgroundThread backgroundThread = binder.getBackgroundThread(); assertNotNull(backgroundThread); serviceInterface.disconnect(); - context.setProvider(backgroundThread.client().provider); - context.setClient(backgroundThread.client().client); - context.provider().event.register(ChatActivity.this); + BusProvider provider = backgroundThread.client().provider; + Client client = backgroundThread.client().client; + context.setProvider(provider); + context.setClient(client); + provider.event.register(ChatActivity.this); updateSubTitle(); - if (context.client().connectionStatus() == ConnectionChangeEvent.Status.CONNECTED) { + if (client.connectionStatus() == ConnectionChangeEvent.Status.CONNECTED) { updateBufferViewConfigs(); } } @@ -182,22 +185,34 @@ public class ChatActivity extends AppCompatActivity { } @UiThread - public void onServiceDisconnected(@NonNull ComponentName cn) { + public void onServiceDisconnected(ComponentName cn) { + assertNotNull(cn); + serviceInterface.disconnect(); binder = null; } }; - private static void updateNoColor(Buffer buffer, @NonNull Menu menu) { + private static void updateNoColor(@Nullable Buffer buffer, @NonNull Menu menu) { boolean isNoColor = isNoColor(buffer); - menu.findItem(R.id.format_bold).setEnabled(!isNoColor); - menu.findItem(R.id.format_italic).setEnabled(!isNoColor); - menu.findItem(R.id.format_underline).setEnabled(!isNoColor); - menu.findItem(R.id.format_paint).setEnabled(!isNoColor); - menu.findItem(R.id.format_fill).setEnabled(!isNoColor); - } - - public static boolean isNoColor(Buffer buffer) { + MenuItem item_bold = menu.findItem(R.id.format_bold); + if (item_bold != null) + item_bold.setEnabled(!isNoColor); + MenuItem item_italic = menu.findItem(R.id.format_italic); + if (item_italic != null) + item_italic.setEnabled(!isNoColor); + MenuItem item_underline = menu.findItem(R.id.format_underline); + if (item_underline != null) + item_underline.setEnabled(!isNoColor); + MenuItem item_paint = menu.findItem(R.id.format_paint); + if (item_paint != null) + item_paint.setEnabled(!isNoColor); + MenuItem item_fill = menu.findItem(R.id.format_fill); + if (item_fill != null) + item_fill.setEnabled(!isNoColor); + } + + public static boolean isNoColor(@Nullable Buffer buffer) { if (buffer == null) return false; if (!(buffer instanceof ChannelBuffer)) @@ -207,10 +222,12 @@ 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); + Client client = context.client(); + if (client != null) { + ConnectionChangeEvent.Status status = client.connectionStatus(); + if (status == ConnectionChangeEvent.Status.CONNECTED) { + if (this.status.bufferId > 0) { + Buffer buffer = client.bufferManager().buffer(this.status.bufferId); if (buffer != null && buffer instanceof ChannelBuffer) { QIrcChannel channel = ((ChannelBuffer) buffer).getChannel(); if (channel != null) { @@ -219,8 +236,8 @@ public class ChatActivity extends AppCompatActivity { } } } - } else { - updateSubTitle(context.client().connectionStatus().name()); + } else if (status != null) { + updateSubTitle(status.name()); return; } } @@ -313,8 +330,11 @@ public class ChatActivity extends AppCompatActivity { return super.onCreateOptionsMenu(menu); } + // FIXME: REWRITE @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { + assertNotNull(item); + List<Integer> filterSettings = Arrays.asList( Message.Type.Join.value, Message.Type.Part.value, @@ -374,13 +394,16 @@ public class ChatActivity extends AppCompatActivity { } private void setupContext() { - context.setSettings(new WrappedSettings(this)); - AppTheme theme = AppTheme.themeFromString(context.settings().theme.get()); + WrappedSettings settings = new WrappedSettings(this); + context.setSettings(settings); + AppTheme theme = AppTheme.themeFromString(settings.theme.get()); setTheme(theme.themeId); context.setThemeUtil(new ThemeUtil(this, theme)); } private void setupEditorLayout() { + assertNotNull(slidingLayout); + slidingLayout.setAntiDragView(R.id.card_panel); slidingLayout.setPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() { @Override @@ -412,15 +435,26 @@ public class ChatActivity extends AppCompatActivity { } private void initLoader() { + assertNotNull(swipeView); + ThemeUtil themeUtil = context.themeUtil(); + assertNotNull(themeUtil); + + Client client = context.client(); + assertNotNull(client); + QBacklogManager<? extends QBacklogManager> backlogManager = client.backlogManager(); + + swipeView.setEnabled(false); - swipeView.setColorSchemeColors(context.themeUtil().res.colorPrimary); + swipeView.setColorSchemeColors(themeUtil.res.colorPrimary); swipeView.setOnRefreshListener(() -> { - assertNotNull(context.client()); - context.client().backlogManager().requestMoreBacklog(status.bufferId, 20); + assertNotNull(backlogManager); + backlogManager.requestMoreBacklog(status.bufferId, 20); }); } private void setupHistory() { + assertNotNull(msgHistory); + FastAdapter<IItem> fastAdapter = new FastAdapter<>(); ItemAdapter<IItem> itemAdapter = new ItemAdapter<>(); itemAdapter.wrap(fastAdapter); @@ -448,6 +482,8 @@ public class ChatActivity extends AppCompatActivity { } private void setupContent() { + assertNotNull(messages); + messages.setItemAnimator(new DefaultItemAnimator()); messages.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true)); messageAdapter = new MessageAdapter(this, context, new AutoScroller(messages)); @@ -455,6 +491,14 @@ public class ChatActivity extends AppCompatActivity { } private void setupEditor() { + assertNotNull(formattingMenu); + assertNotNull(editor); + assertNotNull(slidingLayoutHistory); + assertNotNull(send); + assertNotNull(chatline); + Client client = context.client(); + assertNotNull(client); + getMenuInflater().inflate(R.menu.formatting, formattingMenu.getMenu()); formattingMenu.setOnMenuItemClickListener(item -> { switch (item.getItemId()) { @@ -470,22 +514,6 @@ public class ChatActivity extends AppCompatActivity { case R.id.action_history: slidingLayoutHistory.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED); return true; - case R.id.debug_init_channels: { - for (QNetwork network : context.client().networkManager().networks()) { - for (QIrcChannel name : network.ircChannels()) { - context.client().requestInitObject("IrcChannel", network.networkId() + "/" + name.name()); - } - } - return true; - } - case R.id.debug_init_users: { - for (QNetwork network : context.client().networkManager().networks()) { - for (QIrcUser name : network.ircUsers()) { - context.client().requestInitObject("IrcUser", network.networkId() + "/" + name.nick()); - } - } - return true; - } default: return false; } @@ -504,6 +532,8 @@ public class ChatActivity extends AppCompatActivity { .withSavedInstance(savedInstanceState) .withTranslucentStatusBar(true) .build(); + assertNotNull(drawerLeft); + assertNotNull(drawerLeft.getAdapter()); drawerLeft.addStickyFooterItem(new PrimaryDrawerItem().withIcon(R.drawable.ic_server_light).withName("(Re-)Connect").withIdentifier(-1)); drawerLeft.addStickyFooterItem(new SecondaryDrawerItem().withName("Settings").withIdentifier(-2)); drawerLeft.setOnDrawerItemClickListener((view, position, drawerItem) -> { @@ -528,7 +558,7 @@ public class ChatActivity extends AppCompatActivity { drawerRight = new DrawerBuilder() .withActivity(this) .withSavedInstance(savedInstanceState) - .withDrawerGravity(Gravity.RIGHT) + .withDrawerGravity(Gravity.END) .build(); } @@ -547,19 +577,25 @@ public class ChatActivity extends AppCompatActivity { } public void setChatlineExpanded(boolean expanded) { + assertNotNull(chatline); + assertNotNull(chatline.getLayoutParams()); + ThemeUtil themeUtil = context.themeUtil(); + assertNotNull(themeUtil); + int selectionStart = chatline.getSelectionStart(); int selectionEnd = chatline.getSelectionEnd(); if (expanded) { chatline.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; } else { - chatline.getLayoutParams().height = context.themeUtil().res.actionBarSize; + chatline.getLayoutParams().height = themeUtil.res.actionBarSize; } chatline.setSingleLine(!expanded); chatline.setSelection(selectionStart, selectionEnd); } + // FIXME: Rewrite properly public void showThemeDialog() { String[] strings = new String[AppTheme.values().length]; int startIndex = -1; @@ -584,6 +620,11 @@ public class ChatActivity extends AppCompatActivity { } private void selectBufferViewConfig(@IntRange(from = -1) int bufferViewConfigId) { + assertNotNull(drawerLeft); + assertNotNull(accountHeader); + Client client = context.client(); + assertNotNull(client); + status.bufferViewConfigId = bufferViewConfigId; accountHeader.setActiveProfile(bufferViewConfigId, false); @@ -591,12 +632,12 @@ public class ChatActivity extends AppCompatActivity { drawerLeft.removeAllItems(); } else { drawerLeft.removeAllItems(); - QBufferViewManager bufferViewManager = context.client().bufferViewManager(); + QBufferViewManager bufferViewManager = client.bufferViewManager(); assertNotNull(bufferViewManager); QBufferViewConfig viewConfig = bufferViewManager.bufferViewConfig(bufferViewConfigId); assertNotNull(viewConfig); - wrapper = new BufferViewConfigItem(drawerLeft, viewConfig, context); + new BufferViewConfigItem(drawerLeft, viewConfig, context); } } @@ -626,7 +667,7 @@ public class ChatActivity extends AppCompatActivity { updateNoColor(buffer, formattingMenu.getMenu()); if (buffer instanceof ChannelBuffer && ((ChannelBuffer) buffer).getChannel() != null) { - nicklistwrapper = new NickListWrapper(drawerRight, ((ChannelBuffer) buffer).getChannel()); + NickListWrapper nicklistwrapper = new NickListWrapper(drawerRight, ((ChannelBuffer) buffer).getChannel()); } else { drawerRight.removeAllItems(); } @@ -675,8 +716,6 @@ public class ChatActivity extends AppCompatActivity { updateSubTitle(); switch (event.status) { - case HANDSHAKE: - break; case CONNECTED: updateBufferViewConfigs(); break; @@ -791,6 +830,8 @@ public class ChatActivity extends AppCompatActivity { } public void onEventMainThread(@NonNull GeneralErrorEvent event) { + assertNotNull(messages); + Snackbar.make(messages, event.toString(), Snackbar.LENGTH_LONG).show(); for (String line : Splitter.fixedLength(2048).split(event.toString())) { Log.e("ChatActivity", line); @@ -803,8 +844,10 @@ public class ChatActivity extends AppCompatActivity { updateSubTitle(); } - private void updateSubTitle(CharSequence text) { - if (context.client() != null) { + private void updateSubTitle(@Nullable CharSequence text) { + assertNotNull(toolbar); + + if (text != null) { toolbar.setSubtitle(text); } else { toolbar.setSubtitle(""); diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/NickListWrapper.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/NickListWrapper.java index 05a7953832e017c0d7ad0d42c5f6416449ef8ce3..d55c3a6b6aea40ab99efa8733ea6b0e38029db0d 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/NickListWrapper.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/NickListWrapper.java @@ -21,6 +21,8 @@ package de.kuschku.quasseldroid_ng.ui.chat; +import android.support.annotation.NonNull; + import com.mikepenz.materialdrawer.Drawer; import com.mikepenz.materialdrawer.holder.BadgeStyle; import com.mikepenz.materialdrawer.model.PrimaryDrawerItem; @@ -30,16 +32,16 @@ import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; 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.lists.ObservableSortedList; public class NickListWrapper { + @NonNull private final QIrcChannel channel; - private ObservableSortedList<QIrcUser> list = new ObservableSortedList<>(QIrcUser.class, new ObservableSortedList.ItemComparator<QIrcUser>() { + private final ObservableSortedList<QIrcUser> list = new ObservableSortedList<>(QIrcUser.class, new ObservableSortedList.ItemComparator<QIrcUser>() { @Override - public int compare(QIrcUser o1, QIrcUser o2) { + public int compare(@NonNull QIrcUser o1, @NonNull QIrcUser o2) { int indexa = channel.network().modeToIndex(channel.userModes(o1)); int indexb = channel.network().modeToIndex(channel.userModes(o2)); if (indexa == indexb) { @@ -55,12 +57,12 @@ public class NickListWrapper { } @Override - public boolean areItemsTheSame(QIrcUser item1, QIrcUser item2) { + public boolean areItemsTheSame(@NonNull QIrcUser item1, @NonNull QIrcUser item2) { return Objects.equals(item1.hostmask(), item2.hostmask()); } }); - public NickListWrapper(Drawer drawerRight, QIrcChannel channel) { + public NickListWrapper(@NonNull Drawer drawerRight, @NonNull QIrcChannel channel) { drawerRight.removeAllItems(); this.channel = channel; for (String nick : channel.users()) { @@ -141,7 +143,7 @@ public class NickListWrapper { } } - private IDrawerItem fromUser(QIrcUser user) { + private IDrawerItem fromUser(@NonNull QIrcUser user) { return new PrimaryDrawerItem() .withName(user.nick()) .withBadge(channel.network().modeToPrefix(channel.userModes(user))) diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItem.java index 6fa5b285f444f45c2620bff4540999ca85c65500..c466e13cfc23ea163729051240c4d976bf82c054 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItem.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItem.java @@ -47,6 +47,7 @@ public class BufferItem extends SecondaryDrawerItem { private final Buffer buffer; @NonNull private final AppContext context; + public BufferItem(@NonNull Buffer buffer, @NonNull AppContext context) { this.buffer = buffer; this.context = context; @@ -120,10 +121,11 @@ public class BufferItem extends SecondaryDrawerItem { return ColorHolder.fromColor(context.themeUtil().res.colorForegroundSecondary); } + @NonNull @Override public ColorHolder getTextColor() { int type = context.client().bufferSyncer().activity(buffer.getInfo().id()); - if ((type & Message.Type.Plain.value) != 0 || (type & Message.Type.Notice.value) != 0) + if ((type & Message.Type.Plain.value) != 0 || (type & Message.Type.Notice.value) != 0) return ColorHolder.fromColor(context.themeUtil().res.colorTintMessage); else if ((type & ~Message.Type.DayChange.value) != 0) return ColorHolder.fromColor(context.themeUtil().res.colorTintActivity); diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItemManager.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItemManager.java index de6fb515ec803442cfc2d131aef823713fe6dc9e..b4e59756904ba99e1e7674508d954bef6fd6c4e1 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItemManager.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferItemManager.java @@ -22,6 +22,7 @@ package de.kuschku.quasseldroid_ng.ui.chat.drawer; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import java.util.HashMap; import java.util.Map; @@ -35,10 +36,11 @@ public class BufferItemManager implements ElementCallback<Integer>, IObservable< private final MultiElementCallbackWrapper<BufferItem> callback = MultiElementCallbackWrapper.<BufferItem>of(); + @Nullable private final AppContext context; private final Map<Integer, BufferItem> items = new HashMap<>(); - public BufferItemManager(AppContext context) { + public BufferItemManager(@Nullable AppContext context) { this.context = context; context.client().bufferManager().bufferIds().addCallback(this); for (Integer id : context.client().bufferManager().bufferIds()) { diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigItem.java index 9f121e05472a3640ad2f0453c730cf74727d0767..f23eb526e2a86f44244df255c38b6040444d5baf 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigItem.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigItem.java @@ -21,12 +21,16 @@ package de.kuschku.quasseldroid_ng.ui.chat.drawer; +import android.support.annotation.NonNull; + import com.mikepenz.materialdrawer.Drawer; import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; import java.util.HashSet; import java.util.Set; +import de.kuschku.libquassel.client.Client; +import de.kuschku.libquassel.client.NetworkManager; import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; import de.kuschku.quasseldroid_ng.ui.theme.AppContext; @@ -34,27 +38,40 @@ import de.kuschku.util.observables.callbacks.DrawerItemCallback; import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper; import de.kuschku.util.observables.lists.ObservableComparableSortedList; +import static de.kuschku.util.AndroidAssert.assertNotNull; + public class BufferViewConfigItem implements DrawerItemCallback { + @NonNull private final BufferItemManager manager; + @NonNull private final ObservableComparableSortedList<NetworkItem> networks = new ObservableComparableSortedList<>(NetworkItem.class); + @NonNull private final Drawer drawer; + @NonNull private final QBufferViewConfig config; + @NonNull private final AppContext context; - public BufferViewConfigItem(Drawer drawer, QBufferViewConfig config, AppContext context) { + public BufferViewConfigItem(@NonNull Drawer drawer, @NonNull QBufferViewConfig config, @NonNull AppContext context) { this.drawer = drawer; this.config = config; this.context = context; manager = new BufferItemManager(context); config.addObserver(this::rebuildNetworkList); + assertNotNull(drawer.getItemAdapter()); networks.addCallback(new AdapterUICallbackWrapper(drawer.getItemAdapter())); rebuildNetworkList(); } private void rebuildNetworkList() { + Client client = context.client(); + assertNotNull(client); + NetworkManager networkManager = client.networkManager(); + assertNotNull(networkManager); + // First we build a list of all network ids we want to display Set<Integer> ids = new HashSet<>(); - for (QNetwork network : context.client().networkManager().networks()) { + for (QNetwork network : networkManager.networks()) { if (config.networkId() <= 0 || network.networkId() == config.networkId()) { ids.add(network.networkId()); } @@ -62,7 +79,7 @@ public class BufferViewConfigItem implements DrawerItemCallback { // Now we build a list of all items to remove Set<NetworkItem> removed = new HashSet<>(); for (NetworkItem item : networks) { - if (ids.contains(item.getNetwork().networkId())) { + if (item.getNetwork() != null && ids.contains(item.getNetwork().networkId())) { // And make sure that ids only contains those networks added ids.remove(item.getNetwork().networkId()); } else { @@ -78,9 +95,12 @@ public class BufferViewConfigItem implements DrawerItemCallback { drawer.removeItem(item.getIdentifier()); } for (int id : ids) { - NetworkItem item = new NetworkItem(config, context.client(), manager, context.client().networkManager().network(id)); - networks.add(item); - item.addCallback(this); + QNetwork network = networkManager.network(id); + if (network != null) { + NetworkItem item = new NetworkItem(config, client, manager, network); + networks.add(item); + item.addCallback(this); + } } for (NetworkItem item : networks) { if (ids.contains(item.getNetwork().networkId())) { @@ -98,7 +118,7 @@ public class BufferViewConfigItem implements DrawerItemCallback { } @Override - public void notifyChanged(IDrawerItem item) { + public void notifyChanged(@NonNull IDrawerItem item) { int position = drawer.getAdapter().getPosition(item); if (position != -1) { drawer.getAdapter().notifyAdapterItemChanged(position); diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java index b4ea95b7f65c7a37f0d1aa333f2f9db8b065cdc4..a0b65a947de23b67180d49112e62b7e11c519220 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java @@ -40,13 +40,17 @@ import de.kuschku.util.observables.callbacks.ElementCallback; import de.kuschku.util.observables.callbacks.wrappers.MultiDrawerItemCallback; public class NetworkItem extends PrimaryDrawerItem implements IObservable<DrawerItemCallback>, ContentComparable<NetworkItem> { + @NonNull private final QBufferViewConfig config; + @NonNull private final Client client; + @NonNull private final BufferItemManager manager; + @NonNull private final QNetwork network; private final MultiDrawerItemCallback callback = MultiDrawerItemCallback.of(); - public NetworkItem(QBufferViewConfig config, Client client, BufferItemManager manager, QNetwork network) { + public NetworkItem(@NonNull QBufferViewConfig config, @NonNull Client client, @NonNull BufferItemManager manager, @NonNull QNetwork network) { this.config = config; this.client = client; this.manager = manager; @@ -71,6 +75,7 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Drawer client.bufferManager().byNetwork(network.networkId()).addCallback(elemCallback); } + @NonNull @Override public List<IDrawerItem> getSubItems() { List<IDrawerItem> bufferItems = new ArrayList<>(); @@ -82,6 +87,7 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Drawer return bufferItems; } + @NonNull @Override public StringHolder getName() { return new StringHolder(network.networkName()); @@ -98,7 +104,7 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Drawer } @Override - public boolean areItemsTheSame(NetworkItem other) { + public boolean areItemsTheSame(@NonNull NetworkItem other) { return network.networkId() == other.network.networkId(); } @@ -112,6 +118,7 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Drawer return network.networkName().compareToIgnoreCase(another.network.networkName()); } + @NonNull public QNetwork getNetwork() { return network; } diff --git a/app/src/main/java/de/kuschku/util/CompatibilityUtils.java b/app/src/main/java/de/kuschku/util/CompatibilityUtils.java index 5ec83b0e7d001bd94ddbdce17b1e6f1d6c5c9f34..f5eacb925b29ef50479700f09c354238064b947a 100644 --- a/app/src/main/java/de/kuschku/util/CompatibilityUtils.java +++ b/app/src/main/java/de/kuschku/util/CompatibilityUtils.java @@ -21,22 +21,15 @@ package de.kuschku.util; -import android.accounts.Account; -import android.accounts.AccountManager; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.util.Log; -import android.util.Patterns; import java.io.OutputStream; import java.lang.reflect.Field; -import java.util.regex.Pattern; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; -import de.kuschku.quasseldroid_ng.QuasselDroidNG; - public class CompatibilityUtils { private CompatibilityUtils() { } @@ -96,13 +89,15 @@ public class CompatibilityUtils { /** * Because Android’s String::split is broken + * * @param str The string to be broken into chars * @return A list with all substrings of length 1 of the first string, in order */ - public static String[] partStringByChar(String str) { + @NonNull + public static String[] partStringByChar(@NonNull String str) { String[] chars = new String[str.length()]; for (int i = 0; i < chars.length; i++) { - chars[i] = str.substring(i, i+1); + chars[i] = str.substring(i, i + 1); } return chars; } diff --git a/app/src/main/java/de/kuschku/util/irc/IrcCaseMapper.java b/app/src/main/java/de/kuschku/util/irc/IrcCaseMapper.java index 4a98bc160023215136353091a07065dbace99a02..a692f8ccbfae3a9250968f74e347f664c797f590 100644 --- a/app/src/main/java/de/kuschku/util/irc/IrcCaseMapper.java +++ b/app/src/main/java/de/kuschku/util/irc/IrcCaseMapper.java @@ -22,6 +22,7 @@ package de.kuschku.util.irc; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import java.util.Locale; @@ -44,7 +45,10 @@ public class IrcCaseMapper { .replaceAll("~", "^"); } - public static boolean equalsIgnoreCase(@NonNull String a, @NonNull String b) { - return toLowerCase(a).equals(toLowerCase(b)) || toUpperCase(a).equals(toUpperCase(b)); + public static boolean equalsIgnoreCase(@Nullable String a, @Nullable String b) { + if (a == null || b == null) + return (a == b); + else + return toLowerCase(a).equals(toLowerCase(b)) || toUpperCase(a).equals(toUpperCase(b)); } } diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/GeneralObservable.java b/app/src/main/java/de/kuschku/util/observables/callbacks/GeneralObservable.java index b4b7086acb25f4aaf725d78bcd3e16d8e01fc824..a42b820cdb838a6733afe98d6eccb23adfd5aed2 100644 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/GeneralObservable.java +++ b/app/src/main/java/de/kuschku/util/observables/callbacks/GeneralObservable.java @@ -27,7 +27,7 @@ import java.util.Set; import de.kuschku.libquassel.syncables.types.interfaces.QObservable; public class GeneralObservable implements QObservable, GeneralCallback { - Set<GeneralCallback> callbackSet = new HashSet<>(); + final Set<GeneralCallback> callbackSet = new HashSet<>(); @Override public void addObserver(GeneralCallback o) { diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiDrawerItemCallback.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiDrawerItemCallback.java index 5c47b2bc38a3a29b7d4a5f2813c458398c78e2ee..83b3b49d50f09ffdd3abe5341987088d7431865c 100644 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiDrawerItemCallback.java +++ b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiDrawerItemCallback.java @@ -37,10 +37,11 @@ public class MultiDrawerItemCallback implements DrawerItemCallback, IObservable< @NonNull final Set<DrawerItemCallback> callbacks; - private MultiDrawerItemCallback(List<DrawerItemCallback> multiGeneralCallbacks) { + private MultiDrawerItemCallback(@NonNull List<DrawerItemCallback> multiGeneralCallbacks) { this.callbacks = new HashSet<>(multiGeneralCallbacks); } + @NonNull public static MultiDrawerItemCallback of(DrawerItemCallback... callbacks) { return new MultiDrawerItemCallback(Arrays.asList(callbacks)); } diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiElementCallbackWrapper.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiElementCallbackWrapper.java index 3cc9c051ade18eaf20329c6444831a4caf2d7529..2d49b099f6fe8c8f015ef77ced027a1c5ad4aa04 100644 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiElementCallbackWrapper.java +++ b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiElementCallbackWrapper.java @@ -22,6 +22,7 @@ package de.kuschku.util.observables.callbacks.wrappers; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.annotation.UiThread; import java.util.Arrays; @@ -42,7 +43,7 @@ public class MultiElementCallbackWrapper<T> implements ElementCallback<T> { @SafeVarargs @NonNull - public static <T> MultiElementCallbackWrapper of(@NonNull ElementCallback<T>... callbacks) { + public static <T> MultiElementCallbackWrapper<T> of(@NonNull ElementCallback<T>... callbacks) { return new MultiElementCallbackWrapper<>(Arrays.asList(callbacks)); } @@ -55,21 +56,21 @@ public class MultiElementCallbackWrapper<T> implements ElementCallback<T> { } @Override - public void notifyItemInserted(T element) { + public void notifyItemInserted(@Nullable T element) { for (ElementCallback<T> callback : callbacks) { callback.notifyItemInserted(element); } } @Override - public void notifyItemRemoved(T element) { + public void notifyItemRemoved(@Nullable T element) { for (ElementCallback<T> callback : callbacks) { callback.notifyItemInserted(element); } } @Override - public void notifyItemChanged(T element) { + public void notifyItemChanged(@Nullable T element) { for (ElementCallback<T> callback : callbacks) { callback.notifyItemInserted(element); } diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiGeneralCallback.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiGeneralCallback.java index 1519d2956b6b35c5b774f6e3918f116bc442b3a9..f56ab5a7c2bbd93cecde1afd3ceaddb7212a22a3 100644 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiGeneralCallback.java +++ b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiGeneralCallback.java @@ -35,10 +35,11 @@ public class MultiGeneralCallback implements IObservable<GeneralCallback>, Gener @NonNull final Set<GeneralCallback> callbacks; - private MultiGeneralCallback(List<MultiGeneralCallback> multiGeneralCallbacks) { + private MultiGeneralCallback(@NonNull List<MultiGeneralCallback> multiGeneralCallbacks) { this.callbacks = new HashSet<>(multiGeneralCallbacks); } + @NonNull public static MultiGeneralCallback of(MultiGeneralCallback... callbacks) { return new MultiGeneralCallback(Arrays.asList(callbacks)); } diff --git a/app/src/main/java/de/kuschku/util/observables/lists/ObservableSet.java b/app/src/main/java/de/kuschku/util/observables/lists/ObservableSet.java index e67bbeb226f7a769b5fb5aea3ab87c4ef7334c89..8efa231a938327e096c1b85b67cf9b3e618d2315 100644 --- a/app/src/main/java/de/kuschku/util/observables/lists/ObservableSet.java +++ b/app/src/main/java/de/kuschku/util/observables/lists/ObservableSet.java @@ -22,6 +22,7 @@ package de.kuschku.util.observables.lists; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import java.util.Collection; import java.util.HashSet; @@ -86,11 +87,11 @@ public class ObservableSet<T> extends HashSet<T> implements IObservableSet<Eleme } @Override - public boolean remove(Object object) { + public boolean remove(@Nullable Object object) { assertNotNull(this.callback); boolean contains = contains(object); - if (contains) { + if (contains && object != null) { super.remove(object); callback.notifyItemRemoved((T) object); return true; @@ -130,11 +131,14 @@ public class ObservableSet<T> extends HashSet<T> implements IObservableSet<Eleme @Override public boolean hasNext() { + assertNotNull(iterator); return iterator.hasNext(); } + @Nullable @Override public E next() { + assertNotNull(iterator); current = iterator.next(); return current; } @@ -142,6 +146,7 @@ public class ObservableSet<T> extends HashSet<T> implements IObservableSet<Eleme @Override public void remove() { assertNotNull(callback); + assertNotNull(iterator); iterator.remove(); callback.notifyItemRemoved((T) current); diff --git a/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java b/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java index d6be86100b5e19bb59057608c4262c69e669aaf9..7674ab8b0c581eac4340e7d7c337463f65f4fd7c 100644 --- a/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java +++ b/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java @@ -30,6 +30,7 @@ import java.util.regex.Pattern; public class SmartRegEx { @NonNull private final Pattern pattern; + @NonNull private final String rule; public SmartRegEx(@NonNull String rule, int flags, @NonNull Syntax syntax) { @@ -37,6 +38,7 @@ public class SmartRegEx { this.rule = rule; } + @NonNull public String rule() { return rule; } @@ -60,7 +62,7 @@ public class SmartRegEx { } } - private Pattern transformWildcard(String glob, int flags) { + private Pattern transformWildcard(@NonNull String glob, int flags) { return Pattern.compile(GlobTransformer.convertGlobToRegex(glob), flags); } diff --git a/app/src/main/res/menu/formatting.xml b/app/src/main/res/menu/formatting.xml index 57b0ae94f416955752c39a47a976bd11e15b4039..b807f4c067552fb0be866ca24e08decf74aff8c4 100644 --- a/app/src/main/res/menu/formatting.xml +++ b/app/src/main/res/menu/formatting.xml @@ -52,19 +52,4 @@ android:icon="?attr/iconHistory" android:title="@string/labelHistory" app:showAsAction="always" /> - - <item - android:id="@+id/action_debug" - android:icon="?attr/iconDebug" - android:title="@string/labelDebug" - app:showAsAction="always"> - <menu> - <item - android:id="@+id/debug_init_channels" - android:title="Request Channels" /> - <item - android:id="@+id/debug_init_users" - android:title="Request Users" /> - </menu> - </item> </menu>