From b11fbf4c4c7e8d8122fbca0d45463e1d770d7497 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Sun, 31 Jan 2016 04:23:10 +0100 Subject: [PATCH] Cleaned up the code a bit --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 4 +- .../de/kuschku/libquassel/BusProvider.java | 4 + .../java/de/kuschku/libquassel/Client.java | 26 ++-- .../de/kuschku/libquassel/CoreConnection.java | 7 +- .../kuschku/libquassel/ProtocolHandler.java | 5 +- .../libquassel/events/LagChangedEvent.java | 3 + .../events/UnknownCertificateEvent.java | 4 +- .../libquassel/functions/types/Heartbeat.java | 7 + .../functions/types/HeartbeatReply.java | 3 + .../kuschku/libquassel/localtypes/Buffer.java | 1 + .../libquassel/localtypes/ChannelBuffer.java | 1 + .../localtypes/NotificationManager.java | 25 ++-- .../libquassel/localtypes/QueryBuffer.java | 1 + .../libquassel/localtypes/StatusBuffer.java | 1 + .../backlogmanagers/BacklogFilter.java | 6 +- .../backlogmanagers/SimpleBacklogManager.java | 9 +- .../kuschku/libquassel/message/Message.java | 2 +- .../libquassel/primitives/QMetaType.java | 1 + .../libquassel/protocols/DatastreamPeer.java | 2 +- .../libquassel/ssl/QuasselTrustManager.java | 4 +- .../serializers/AliasManagerSerializer.java | 4 + .../IgnoreListManagerSerializer.java | 8 +- .../serializers/NetworkConfigSerializer.java | 4 +- .../syncables/types/AliasManager.java | 16 ++- .../syncables/types/BufferSyncer.java | 4 +- .../syncables/types/BufferViewConfig.java | 7 +- .../syncables/types/BufferViewManager.java | 4 +- .../libquassel/syncables/types/Identity.java | 2 +- .../syncables/types/IgnoreListManager.java | 28 ++-- .../syncables/types/IrcChannel.java | 123 ++++++++++-------- .../libquassel/syncables/types/IrcUser.java | 4 +- .../libquassel/syncables/types/Network.java | 18 ++- .../syncables/types/NetworkConfig.java | 4 +- .../service/ClientBackgroundThread.java | 1 - .../service/QuasselService.java | 10 -- .../quasseldroid_ng/ui/chat/ChatActivity.java | 72 +++++----- .../ui/chat/chatview/ChatMessageRenderer.java | 9 +- .../ui/chat/chatview/MessageAdapter.java | 6 +- .../ui/chat/drawer/BufferItem.java | 20 ++- .../chat/drawer/BufferViewConfigWrapper.java | 14 +- .../ui/chat/drawer/NetworkItem.java | 52 ++++---- .../ui/editor/AdvancedEditor.java | 7 +- .../ui/editor/FormattingHelper.java | 14 +- .../quasseldroid_ng/ui/theme/AppContext.java | 6 + .../quasseldroid_ng/ui/theme/AppTheme.java | 6 +- .../quasseldroid_ng/ui/theme/ThemeUtil.java | 100 +++++++------- .../java/de/kuschku/util/AndroidAssert.java | 3 +- .../CertificateDatabaseHandler.java | 21 +-- .../util/certificates/CertificateUtils.java | 13 +- .../SQLiteCertificateManager.java | 18 ++- .../util/instancestateutil/Storable.java | 1 + .../keyboardutils/DialogKeyboardUtil.java | 32 ----- .../keyboardutils/EditTextKeyboardUtil.java | 62 --------- .../de/kuschku/util/niohelpers/Helper.java | 3 +- .../util/niohelpers/WrappedChannel.java | 2 +- .../util/observables/AutoScroller.java | 3 +- .../wrappers/GeneralCallbackWrapper.java | 5 +- .../ChildParentObservableSortedList.java | 28 +--- .../lists/ObservableElementList.java | 1 + .../lists/ObservableSortedList.java | 32 +++-- .../java/de/kuschku/util/ui/MessageUtil.java | 5 +- .../StorageBackendParcelable.java | 2 + .../drawable/popup_background_material.xml | 22 ---- app/src/main/res/layout/content_main.xml | 4 +- app/src/main/res/layout/dialog_address.xml | 5 +- app/src/main/res/layout/dialog_login.xml | 4 +- app/src/main/res/layout/slider_main.xml | 6 +- app/src/main/res/layout/widget_editor.xml | 9 +- app/src/main/res/menu/chat.xml | 7 +- app/src/main/res/menu/formatting.xml | 24 ++-- app/src/main/res/menu/global.xml | 8 -- app/src/main/res/values/attrs.xml | 12 +- app/src/main/res/values/dimens.xml | 5 - app/src/main/res/values/strings.xml | 74 ++++++----- app/src/main/res/values/styles.xml | 24 ++-- 76 files changed, 545 insertions(+), 551 deletions(-) delete mode 100644 app/src/main/java/de/kuschku/util/keyboardutils/DialogKeyboardUtil.java delete mode 100644 app/src/main/java/de/kuschku/util/keyboardutils/EditTextKeyboardUtil.java delete mode 100644 app/src/main/res/drawable/popup_background_material.xml delete mode 100644 app/src/main/res/menu/global.xml diff --git a/app/build.gradle b/app/build.gradle index de410d6a8..af97a0a87 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -36,7 +36,7 @@ if (versionPropsFile.canRead()) { versionProps.load(new FileInputStream(versionPropsFile)) def runTasks = gradle.startParameter.taskNames - versionBuild = Integer.valueOf(versionProps['VERSION_BUILD']) + versionBuild = Integer.valueOf(versionProps['VERSION_BUILD'].toString()) if ('assemble' in runTasks || 'assembleRelease' in runTasks || 'aR' in runTasks) { versionBuild = versionBuild + 1 } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f75ba9a47..e4d7309b9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,13 +7,13 @@ <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" - android:label="@string/app_name" + android:label="@string/appName" android:supportsRtl="true"> <service android:name=".service.QuasselService" /> <activity android:name=".ui.chat.ChatActivity" - android:label="@string/app_name" + android:label="@string/appName" android:launchMode="singleTask" android:theme="@style/AppTheme.Light"> <intent-filter> diff --git a/app/src/main/java/de/kuschku/libquassel/BusProvider.java b/app/src/main/java/de/kuschku/libquassel/BusProvider.java index 108bad6e0..be377d09c 100644 --- a/app/src/main/java/de/kuschku/libquassel/BusProvider.java +++ b/app/src/main/java/de/kuschku/libquassel/BusProvider.java @@ -18,8 +18,11 @@ public class BusProvider { @NonNull private final String id; + @NonNull private final BusHandler handleHandler = new BusHandler("QHANDLE"); + @NonNull private final BusHandler dispatchHandler = new BusHandler("QDISPATCH"); + @NonNull private final BusHandler eventHandler = new BusHandler("QEVENT"); public BusProvider() { @@ -44,6 +47,7 @@ public class BusProvider { this.event.post(o); } + @NonNull @Override public String toString() { return "BusProvider{" + diff --git a/app/src/main/java/de/kuschku/libquassel/Client.java b/app/src/main/java/de/kuschku/libquassel/Client.java index d942bf33a..01cbc30d3 100644 --- a/app/src/main/java/de/kuschku/libquassel/Client.java +++ b/app/src/main/java/de/kuschku/libquassel/Client.java @@ -57,15 +57,20 @@ public class Client { @NonNull private final BusProvider busProvider; private long lag; - private ConnectionChangeEvent.Status connectionStatus; + @NonNull + private ConnectionChangeEvent.Status connectionStatus = ConnectionChangeEvent.Status.DISCONNECTED; + @Nullable private ClientInitAck core; @Nullable private SessionState state; + @Nullable private BufferViewManager bufferViewManager; + @Nullable private BufferSyncer bufferSyncer; - private ClientData clientData; + @Nullable private IgnoreListManager ignoreListManager; - private Map<Integer, Identity> Identities = new HashMap<>(); + @NonNull + private final Map<Integer, Identity> Identities = new HashMap<>(); public Client(@NonNull final BusProvider busProvider) { this(new SimpleBacklogManager(busProvider), busProvider); @@ -221,26 +226,24 @@ public class Client { } } + @Nullable public BufferSyncer getBufferSyncer() { return bufferSyncer; } - public void setBufferSyncer(BufferSyncer bufferSyncer) { + public void setBufferSyncer(@Nullable BufferSyncer bufferSyncer) { this.bufferSyncer = bufferSyncer; } + @Nullable public ClientInitAck getCore() { return core; } - public void setCore(ClientInitAck core) { + public void setCore(@Nullable ClientInitAck core) { this.core = core; } - public void setClientData(ClientData clientData) { - this.clientData = clientData; - } - @NonNull public Collection<Buffer> getBuffers(int networkId) { return new Stream<>(this.buffers.values()).filter(buffer -> buffer.getInfo().networkId == networkId).list(); @@ -261,7 +264,7 @@ public class Client { busProvider.sendEvent(new ConnectionChangeEvent(connectionStatus)); } - public void login(String username, String password) { + public void login(@NonNull String username, @NonNull String password) { busProvider.dispatch(new HandshakeFunction(new ClientLogin( username, password ))); @@ -281,11 +284,12 @@ public class Client { busProvider.sendEvent(new LagChangedEvent(lag)); } + @Nullable public IgnoreListManager getIgnoreListManager() { return ignoreListManager; } - public void setIgnoreListManager(IgnoreListManager ignoreListManager) { + public void setIgnoreListManager(@Nullable IgnoreListManager ignoreListManager) { this.ignoreListManager = ignoreListManager; } diff --git a/app/src/main/java/de/kuschku/libquassel/CoreConnection.java b/app/src/main/java/de/kuschku/libquassel/CoreConnection.java index b7ed184f5..6f7530932 100644 --- a/app/src/main/java/de/kuschku/libquassel/CoreConnection.java +++ b/app/src/main/java/de/kuschku/libquassel/CoreConnection.java @@ -5,8 +5,6 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; -import org.joda.time.DateTime; - import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; @@ -70,7 +68,7 @@ public class CoreConnection { @Nullable private Client client; @NonNull - private CertificateManager certificateManager; + private final CertificateManager certificateManager; public CoreConnection(@NonNull final ServerAddress address, @NonNull final ClientData clientData, @NonNull final BusProvider busProvider, @NonNull CertificateManager certificateManager) { this.address = address; @@ -260,6 +258,7 @@ public class CoreConnection { // Mark prehandshake as read hasReadPreHandshake = true; + assertNotNull(heartbeatThread); heartbeatThread.start(); // Send client data to core @@ -303,7 +302,7 @@ public class CoreConnection { assertNotNull(client); while (running) { - Heartbeat heartbeat = new Heartbeat(DateTime.now()); + Heartbeat heartbeat = new Heartbeat(); busProvider.dispatch(heartbeat); Thread.sleep(30 * 1000); diff --git a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java index 323cea8dc..28281d6ea 100644 --- a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java +++ b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java @@ -53,6 +53,7 @@ public class ProtocolHandler implements IProtocolHandler { client.getInitDataQueue().remove(packedFunc.className + ":" + packedFunc.objectName); if (client.getInitDataQueue().isEmpty()) { client.setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED); + busProvider.dispatch(new Heartbeat()); } } } @@ -121,7 +122,7 @@ public class ProtocolHandler implements IProtocolHandler { } public void onEvent(@NonNull SessionInit message) { - busProvider.dispatch(new Heartbeat(DateTime.now())); + busProvider.dispatch(new Heartbeat()); client.setState(message.SessionState); @@ -133,6 +134,8 @@ public class ProtocolHandler implements IProtocolHandler { client.sendInitRequest("NetworkConfig", "GlobalNetworkConfig", true); client.sendInitRequest("IgnoreListManager", "", true); //sendInitRequest("TransferManager", ""); // This thing never gets sent... + + assertNotNull(client.getState()); for (int NetworkId : client.getState().NetworkIds) { client.sendInitRequest("Network", String.valueOf(NetworkId), true); } diff --git a/app/src/main/java/de/kuschku/libquassel/events/LagChangedEvent.java b/app/src/main/java/de/kuschku/libquassel/events/LagChangedEvent.java index 4b5cdcf56..e4917ba46 100644 --- a/app/src/main/java/de/kuschku/libquassel/events/LagChangedEvent.java +++ b/app/src/main/java/de/kuschku/libquassel/events/LagChangedEvent.java @@ -1,5 +1,7 @@ package de.kuschku.libquassel.events; +import android.support.annotation.NonNull; + public class LagChangedEvent { public final long lag; @@ -7,6 +9,7 @@ public class LagChangedEvent { this.lag = lag; } + @NonNull @Override public String toString() { return "LagChangedEvent{" + diff --git a/app/src/main/java/de/kuschku/libquassel/events/UnknownCertificateEvent.java b/app/src/main/java/de/kuschku/libquassel/events/UnknownCertificateEvent.java index 93a6e7883..dd795e248 100644 --- a/app/src/main/java/de/kuschku/libquassel/events/UnknownCertificateEvent.java +++ b/app/src/main/java/de/kuschku/libquassel/events/UnknownCertificateEvent.java @@ -1,5 +1,7 @@ package de.kuschku.libquassel.events; +import android.support.annotation.NonNull; + import java.security.cert.X509Certificate; import de.kuschku.libquassel.ssl.UnknownCertificateException; @@ -14,7 +16,7 @@ public class UnknownCertificateEvent { this.address = address; } - public UnknownCertificateEvent(UnknownCertificateException cause) { + public UnknownCertificateEvent(@NonNull UnknownCertificateException cause) { this(cause.certificate, cause.address); } } diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/Heartbeat.java b/app/src/main/java/de/kuschku/libquassel/functions/types/Heartbeat.java index cf10f69f7..23d083efa 100644 --- a/app/src/main/java/de/kuschku/libquassel/functions/types/Heartbeat.java +++ b/app/src/main/java/de/kuschku/libquassel/functions/types/Heartbeat.java @@ -1,5 +1,7 @@ package de.kuschku.libquassel.functions.types; +import android.support.annotation.NonNull; + import org.joda.time.DateTime; public class Heartbeat { @@ -9,6 +11,11 @@ public class Heartbeat { this.dateTime = dateTime; } + public Heartbeat() { + this(DateTime.now()); + } + + @NonNull @Override public String toString() { return "Heartbeat{" + 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 ecfe819d5..b6433eb49 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 @@ -1,5 +1,7 @@ package de.kuschku.libquassel.functions.types; +import android.support.annotation.NonNull; + import org.joda.time.DateTime; public class HeartbeatReply { @@ -9,6 +11,7 @@ public class HeartbeatReply { this.dateTime = dateTime; } + @NonNull @Override public String toString() { return "HeartbeatReply{" + diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/Buffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/Buffer.java index 6c61d0a3f..725ed1db7 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/Buffer.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/Buffer.java @@ -12,5 +12,6 @@ public interface Buffer { @Nullable String getName(); + @NonNull BufferInfo.BufferStatus getStatus(); } diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/ChannelBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/ChannelBuffer.java index 41f855121..5328dbdbb 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/ChannelBuffer.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/ChannelBuffer.java @@ -29,6 +29,7 @@ public class ChannelBuffer implements Buffer { return getInfo().name; } + @NonNull @Override public BufferInfo.BufferStatus getStatus() { return channel == null ? BufferInfo.BufferStatus.OFFLINE : BufferInfo.BufferStatus.ONLINE; diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/NotificationManager.java b/app/src/main/java/de/kuschku/libquassel/localtypes/NotificationManager.java index 9ae407ba0..caafbdfe6 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/NotificationManager.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/NotificationManager.java @@ -1,5 +1,6 @@ package de.kuschku.libquassel.localtypes; +import android.support.annotation.NonNull; import android.util.SparseArray; import java.util.ArrayList; @@ -13,14 +14,18 @@ import de.kuschku.libquassel.syncables.types.Network; import de.kuschku.util.observables.lists.ObservableComparableSortedList; public class NotificationManager { - private SparseArray<ObservableComparableSortedList<Message>> notifications = new SparseArray<>(); - private List<HighlightRule> highlights = new ArrayList<>(); - private Client client; + @NonNull + private final SparseArray<ObservableComparableSortedList<Message>> notifications = new SparseArray<>(); + @NonNull + private final List<HighlightRule> highlights = new ArrayList<>(); + @NonNull + private final Client client; - public NotificationManager(Client client) { + public NotificationManager(@NonNull Client client) { this.client = client; } + @NonNull public ObservableComparableSortedList<Message> getNotifications(int bufferid) { if (notifications.get(bufferid) == null) notifications.put(bufferid, new ObservableComparableSortedList<>(Message.class)); @@ -32,13 +37,13 @@ public class NotificationManager { notifications.put(id, new ObservableComparableSortedList<>(Message.class)); } - public void receiveMessage(Message message) { + public void receiveMessage(@NonNull Message message) { if (checkMessage(message)) { getNotifications(message.bufferInfo.id).add(message); } } - public boolean checkMessage(Message message) { + public boolean checkMessage(@NonNull Message message) { Buffer buffer = client.getBuffer(message.bufferInfo.id); if (buffer == null) return false; Network network = client.getNetwork(buffer.getInfo().networkId); @@ -50,6 +55,8 @@ public class NotificationManager { if (message.content.contains(nick)) return true; } + if (buffer.getName() == null) + return false; for (HighlightRule rule : highlights) { if (rule.matches(message.content, buffer.getName())) return true; @@ -57,7 +64,7 @@ public class NotificationManager { return false; } - public void receiveMessages(List<Message> messages) { + public void receiveMessages(@NonNull List<Message> messages) { for (Message message : messages) { receiveMessage(message); } @@ -69,14 +76,14 @@ public class NotificationManager { public final boolean invertChannelRule; public final boolean caseSensitive; - public HighlightRule(String rule, String channelRule, boolean invertChannelRule, boolean caseSensitive) { + public HighlightRule(@NonNull String rule, @NonNull String channelRule, boolean invertChannelRule, boolean caseSensitive) { this.rule = rule.isEmpty() ? Pattern.compile(".*") : Pattern.compile(rule); this.channelRule = channelRule.isEmpty() ? Pattern.compile(".*") : Pattern.compile(channelRule); this.invertChannelRule = invertChannelRule; this.caseSensitive = caseSensitive; } - public boolean matches(String message, String channelName) { + public boolean matches(@NonNull String message, @NonNull String channelName) { return (invertChannelRule ^ channelRule.matcher(channelName).matches() && rule.matcher(message).matches()); } } diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/QueryBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/QueryBuffer.java index 64c6bcc8c..ea22fc135 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/QueryBuffer.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/QueryBuffer.java @@ -29,6 +29,7 @@ public class QueryBuffer implements Buffer { return getInfo().name; } + @NonNull @Override public BufferInfo.BufferStatus getStatus() { return (user == null) ? BufferInfo.BufferStatus.OFFLINE : diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/StatusBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/StatusBuffer.java index c28a09c25..463f718ba 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/StatusBuffer.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/StatusBuffer.java @@ -29,6 +29,7 @@ public class StatusBuffer implements Buffer { return network.getNetworkName(); } + @NonNull @Override public BufferInfo.BufferStatus getStatus() { return network.isConnected() ? BufferInfo.BufferStatus.ONLINE : BufferInfo.BufferStatus.OFFLINE; diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java index 2fd588da6..ad1820b94 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/BacklogFilter.java @@ -1,6 +1,7 @@ package de.kuschku.libquassel.localtypes.backlogmanagers; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import org.joda.time.DateTime; import org.joda.time.DateTimeUtils; @@ -23,8 +24,10 @@ public class BacklogFilter implements UICallback { @NonNull private final ObservableSortedList<Message> filtered; + @NonNull private final Set<Message.Type> filteredTypes = new HashSet<>(); + @Nullable private DateTime earliestMessage; public BacklogFilter(@NonNull Client client, int bufferId, @NonNull ObservableSortedList<Message> unfiltered, @NonNull ObservableSortedList<Message> filtered) { @@ -44,7 +47,6 @@ public class BacklogFilter implements UICallback { private void updateDayChangeMessages() { DateTime now = DateTime.now().withMillisOfDay(0); - int id = -1; while (now.isAfter(earliestMessage)) { filtered.add(new Message( (int) DateTimeUtils.toJulianDay(now.getMillis()), @@ -65,7 +67,7 @@ public class BacklogFilter implements UICallback { } } - private boolean filterItem(Message message) { + private boolean filterItem(@NonNull Message message) { return (client.getIgnoreListManager() != null && client.getIgnoreListManager().matches(message)) || filteredTypes.contains(message.type); } diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/SimpleBacklogManager.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/SimpleBacklogManager.java index c3bd0e981..13dc501a5 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/SimpleBacklogManager.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogmanagers/SimpleBacklogManager.java @@ -46,7 +46,7 @@ public class SimpleBacklogManager extends BacklogManager<SimpleBacklogManager> { } public void requestBacklog(int bufferId, int from, int to, int count, int extra) { - busProvider.dispatch(new SyncFunction<>("BacklogManager", "", "requestBacklog", Lists.newArrayList( + busProvider.dispatch(new SyncFunction<>("BacklogManager", "", "requestBacklog", Lists.<QVariant>newArrayList( new QVariant<>("BufferId", bufferId), new QVariant<>("MsgId", from), new QVariant<>("MsgId", to), @@ -56,6 +56,7 @@ public class SimpleBacklogManager extends BacklogManager<SimpleBacklogManager> { } public void receiveBacklog(@IntRange(from = 0) int bufferId, int from, int to, int count, int extra, @NonNull List<Message> messages) { + assertNotNull(client); get(bufferId).addAll(messages); client.getNotificationManager().receiveMessages(messages); @@ -64,6 +65,7 @@ public class SimpleBacklogManager extends BacklogManager<SimpleBacklogManager> { @Override public void displayMessage(@IntRange(from = 0) int bufferId, @NonNull Message message) { + assertNotNull(client); ObservableSortedList<Message> messages = get(bufferId); assertNotNull(messages); @@ -81,10 +83,7 @@ public class SimpleBacklogManager extends BacklogManager<SimpleBacklogManager> { @Override public void requestMoreBacklog(@IntRange(from = 0) int bufferId, int count) { ObservableSortedList<Message> backlog = backlogs.get(bufferId); - int messageId = - (backlog == null) ? -1 : - (backlog.last() == null) ? -1 : - backlog.last().messageId; + int messageId = (backlog == null || backlog.last() == null) ? -1 : backlog.last().messageId; requestBacklog(bufferId, -1, messageId, count, 0); } diff --git a/app/src/main/java/de/kuschku/libquassel/message/Message.java b/app/src/main/java/de/kuschku/libquassel/message/Message.java index 627698d1b..96209566c 100644 --- a/app/src/main/java/de/kuschku/libquassel/message/Message.java +++ b/app/src/main/java/de/kuschku/libquassel/message/Message.java @@ -57,7 +57,7 @@ public class Message implements ContentComparable<Message> { } @Override - public boolean areItemsTheSame(Message other) { + public boolean areItemsTheSame(@NonNull Message other) { return this.messageId == other.messageId; } diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java index 7b8f7bd1e..e865910a1 100644 --- a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java +++ b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java @@ -45,6 +45,7 @@ public class QMetaType<T> { public final String name; @NonNull public final Class cl; + @Nullable public final PrimitiveSerializer<T> serializer; public QMetaType(@NonNull Class cl, @NonNull Type type) { diff --git a/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java b/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java index 46edc8cc6..4ce9befbb 100644 --- a/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java +++ b/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java @@ -297,7 +297,7 @@ public class DatastreamPeer implements RemotePeer { } else { handlePackedFunc(data); } - } catch (BufferUnderflowException | BufferOverflowException e) { + } catch (@NonNull BufferUnderflowException | BufferOverflowException e) { Helper.printHexDump(buffer.array()); busProvider.sendEvent(new GeneralErrorEvent(e)); } catch (Exception e) { diff --git a/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java b/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java index 838aff5b3..e56952d48 100644 --- a/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java +++ b/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java @@ -21,7 +21,7 @@ public class QuasselTrustManager implements X509TrustManager { @NonNull private final CertificateManager certificateManager; @NonNull - private ServerAddress address; + private final ServerAddress address; public QuasselTrustManager(@NonNull X509TrustManager wrapped, @NonNull CertificateManager certificateManager, @NonNull ServerAddress address) { this.wrapped = wrapped; @@ -29,6 +29,7 @@ public class QuasselTrustManager implements X509TrustManager { this.address = address; } + @NonNull public static QuasselTrustManager fromFactory(@NonNull TrustManagerFactory factory, @NonNull CertificateManager certificateManager, @NonNull ServerAddress address) throws GeneralSecurityException { TrustManager[] managers = factory.getTrustManagers(); for (TrustManager manager : managers) { @@ -39,6 +40,7 @@ public class QuasselTrustManager implements X509TrustManager { throw new GeneralSecurityException("Couldn’t find trustmanager provided by factory"); } + @NonNull public static QuasselTrustManager fromDefault(@NonNull CertificateManager certificateManager, @NonNull ServerAddress address) throws GeneralSecurityException { TrustManagerFactory factory = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); factory.init((KeyStore) null); diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/AliasManagerSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/AliasManagerSerializer.java index 9aab84c3f..582ce2969 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/AliasManagerSerializer.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/AliasManagerSerializer.java @@ -13,6 +13,9 @@ import de.kuschku.libquassel.objects.serializers.ObjectSerializer; import de.kuschku.libquassel.primitives.types.QVariant; import de.kuschku.libquassel.syncables.types.AliasManager; +import static de.kuschku.util.AndroidAssert.*; + +@SuppressWarnings("unchecked") public class AliasManagerSerializer implements ObjectSerializer<AliasManager> { @NonNull private static final AliasManagerSerializer serializer = new AliasManagerSerializer(); @@ -42,6 +45,7 @@ public class AliasManagerSerializer implements ObjectSerializer<AliasManager> { @Override public AliasManager fromLegacy(@NonNull Map<String, QVariant> map) { Map<String, QVariant<List<String>>> aliases = (Map<String, QVariant<List<String>>>) map.get("Aliases").data; + assertNotNull(aliases); return new AliasManager( aliases.get("names").data, aliases.get("expansions").data diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IgnoreListManagerSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IgnoreListManagerSerializer.java index dcd8885a5..06910ade9 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IgnoreListManagerSerializer.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IgnoreListManagerSerializer.java @@ -13,13 +13,18 @@ import de.kuschku.libquassel.objects.serializers.ObjectSerializer; import de.kuschku.libquassel.primitives.types.QVariant; import de.kuschku.libquassel.syncables.types.IgnoreListManager; +import static de.kuschku.util.AndroidAssert.*; + +@SuppressWarnings("unchecked") public class IgnoreListManagerSerializer implements ObjectSerializer<IgnoreListManager> { - private static IgnoreListManagerSerializer serializer = new IgnoreListManagerSerializer(); + @NonNull + private static final IgnoreListManagerSerializer serializer = new IgnoreListManagerSerializer(); private IgnoreListManagerSerializer() { } + @NonNull public static IgnoreListManagerSerializer get() { return serializer; } @@ -41,6 +46,7 @@ public class IgnoreListManagerSerializer implements ObjectSerializer<IgnoreListM @Override public IgnoreListManager fromLegacy(@NonNull Map<String, QVariant> map) { Map<String, QVariant> internalMap = (Map<String, QVariant>) map.get("IgnoreList").data; + assertNotNull(internalMap); return new IgnoreListManager( (List<Integer>) internalMap.get("scope").data, (List<Integer>) internalMap.get("ignoreType").data, diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkConfigSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkConfigSerializer.java index a0640ae66..dbb0ce45e 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkConfigSerializer.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkConfigSerializer.java @@ -13,12 +13,14 @@ import de.kuschku.libquassel.primitives.types.QVariant; import de.kuschku.libquassel.syncables.types.NetworkConfig; public class NetworkConfigSerializer implements ObjectSerializer<NetworkConfig> { - private static NetworkConfigSerializer serializer = new NetworkConfigSerializer(); + @NonNull + private static final NetworkConfigSerializer serializer = new NetworkConfigSerializer(); private NetworkConfigSerializer() { } + @NonNull public static NetworkConfigSerializer get() { return serializer; } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/AliasManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/AliasManager.java index 4236fc778..fda75af07 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/AliasManager.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/AliasManager.java @@ -12,8 +12,8 @@ import de.kuschku.libquassel.primitives.types.QVariant; import de.kuschku.libquassel.syncables.serializers.AliasManagerSerializer; public class AliasManager extends SyncableObject<AliasManager> { - public List<String> names; - public List<String> expansions; + private List<String> names; + private List<String> expansions; public AliasManager(List<String> names, List<String> expansions) { this.names = names; @@ -26,13 +26,21 @@ public class AliasManager extends SyncableObject<AliasManager> { } @Override - public void update(AliasManager from) { + public void update(@NonNull AliasManager from) { names = from.names; expansions = from.expansions; } @Override - public void update(Map<String, QVariant> from) { + public void update(@NonNull Map<String, QVariant> from) { update(AliasManagerSerializer.get().fromDatastream(from)); } + + public List<String> getNames() { + return names; + } + + public List<String> getExpansions() { + return expansions; + } } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferSyncer.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferSyncer.java index 1e23c7246..483cd014e 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferSyncer.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferSyncer.java @@ -44,13 +44,13 @@ public class BufferSyncer extends SyncableObject<BufferSyncer> { } @Override - public void update(BufferSyncer from) { + public void update(@NonNull BufferSyncer from) { LastSeenMsg = from.LastSeenMsg; MarkerLines = from.MarkerLines; } @Override - public void update(Map<String, QVariant> from) { + public void update(@NonNull Map<String, QVariant> from) { update(BufferSyncerSerializer.get().fromDatastream(from)); } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferViewConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferViewConfig.java index 45aefb051..e3594383a 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferViewConfig.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferViewConfig.java @@ -21,7 +21,8 @@ public class BufferViewConfig extends SyncableObject<BufferViewConfig> { private List<Integer> temporarilyRemovedBuffers; private boolean hideInactiveNetworks; private IObservableList<ElementCallback<Integer>, Integer> buffers; - private IObservableList<ElementCallback<Integer>, Integer> NetworkList = new ObservableElementList<>(); + @NonNull + private final IObservableList<ElementCallback<Integer>, Integer> NetworkList = new ObservableElementList<>(); private int allowedBufferTypes; private boolean sortAlphabetically; private boolean disableDecoration; @@ -194,7 +195,7 @@ public class BufferViewConfig extends SyncableObject<BufferViewConfig> { } @Override - public void update(BufferViewConfig from) { + public void update(@NonNull BufferViewConfig from) { this.bufferViewName = from.bufferViewName; this.temporarilyRemovedBuffers = from.temporarilyRemovedBuffers; this.hideInactiveNetworks = from.hideInactiveNetworks; @@ -210,7 +211,7 @@ public class BufferViewConfig extends SyncableObject<BufferViewConfig> { } @Override - public void update(Map<String, QVariant> from) { + public void update(@NonNull Map<String, QVariant> from) { update(BufferViewConfigSerializer.get().fromDatastream(from)); } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferViewManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferViewManager.java index 8c329eefa..cd19db5ef 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferViewManager.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/BufferViewManager.java @@ -39,7 +39,7 @@ public class BufferViewManager extends SyncableObject<BufferViewManager> { } @Override - public void update(BufferViewManager from) { + public void update(@NonNull BufferViewManager from) { this.BufferViews = from.BufferViews; for (int id : BufferViews.keySet()) { client.sendInitRequest("BufferViewConfig", String.valueOf(id)); @@ -47,7 +47,7 @@ public class BufferViewManager extends SyncableObject<BufferViewManager> { } @Override - public void update(Map<String, QVariant> from) { + public void update(@NonNull Map<String, QVariant> from) { update(BufferViewManagerSerializer.get().fromDatastream(from)); } } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/Identity.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/Identity.java index 85d18f607..fbae122e6 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/Identity.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/Identity.java @@ -268,7 +268,7 @@ public class Identity extends SyncableObject<Identity> { } @Override - public void update(Map<String, QVariant> from) { + public void update(@NonNull Map<String, QVariant> from) { update(IdentitySerializer.get().fromDatastream(from)); } } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/IgnoreListManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/IgnoreListManager.java index 876c9e565..0fc331b3f 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/IgnoreListManager.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/IgnoreListManager.java @@ -16,11 +16,12 @@ import de.kuschku.libquassel.syncables.serializers.IgnoreListManagerSerializer; import static de.kuschku.util.AndroidAssert.assertEquals; public class IgnoreListManager extends SyncableObject<IgnoreListManager> { - List<IgnoreRule> ignoreRules = new ArrayList<>(); + @NonNull + final List<IgnoreRule> ignoreRules = new ArrayList<>(); - public IgnoreListManager(List<Integer> scope, List<Integer> ignoreType, - List<Boolean> isActive, List<String> scopeRule, List<Boolean> isRegEx, - List<Integer> strictness, List<String> ignoreRule) { + public IgnoreListManager(@NonNull List<Integer> scope, @NonNull List<Integer> ignoreType, + @NonNull List<Boolean> isActive, @NonNull List<String> scopeRule, @NonNull List<Boolean> isRegEx, + @NonNull List<Integer> strictness, @NonNull List<String> ignoreRule) { assertEquals(scope.size(), ignoreType.size(), isActive.size(), scopeRule.size(), isRegEx.size(), strictness.size(), ignoreRule.size()); for (int i = 0; i < scope.size(); i++) { @@ -47,7 +48,7 @@ public class IgnoreListManager extends SyncableObject<IgnoreListManager> { } @Override - public void update(Map<String, QVariant> from) { + public void update(@NonNull Map<String, QVariant> from) { update(IgnoreListManagerSerializer.get().fromDatastream(from)); } @@ -56,13 +57,13 @@ public class IgnoreListManager extends SyncableObject<IgnoreListManager> { } public static class IgnoreRule { - private Scope scope; - private Type ignoreType; - private boolean isActive; - private String scopeRule; - private boolean isRegEx; - private Strictness strictness; - private String ignoreRule; + private final Scope scope; + private final Type ignoreType; + private final boolean isActive; + private final String scopeRule; + private final boolean isRegEx; + private final Strictness strictness; + private final String ignoreRule; public IgnoreRule(Integer scope, Integer ignoreType, boolean isActive, String scopeRule, boolean isRegEx, Integer strictness, String ignoreRule) { this( @@ -98,6 +99,7 @@ public class IgnoreListManager extends SyncableObject<IgnoreListManager> { this.id = id; } + @NonNull public static Strictness of(int id) { switch (id) { case 0: @@ -124,6 +126,7 @@ public class IgnoreListManager extends SyncableObject<IgnoreListManager> { this.id = id; } + @NonNull public static Type of(int id) { switch (id) { case 0: @@ -150,6 +153,7 @@ public class IgnoreListManager extends SyncableObject<IgnoreListManager> { this.id = id; } + @NonNull public static Scope of(int id) { switch (id) { case 0: diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcChannel.java index 5a1b8e9b7..b231d6204 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcChannel.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcChannel.java @@ -31,7 +31,7 @@ public class IrcChannel extends SyncableObject<IrcChannel> { @Synced private Map<String, String> UserModes; @Synced - private Map<String, Object> ChanModes; + private ChanModes chanModes; @Synced private boolean encrypted; @@ -39,44 +39,15 @@ public class IrcChannel extends SyncableObject<IrcChannel> { private Network network; public IrcChannel(String name, String topic, String password, Map<String, String> userModes, - Map<String, Object> chanModes, boolean encrypted) { + @NonNull Map<String, Object> chanModes, boolean encrypted) { this.name = name; this.topic = topic; this.password = password; this.UserModes = userModes; - this.ChanModes = chanModes; + this.chanModes = new ChanModes(chanModes); this.encrypted = encrypted; } - @NonNull - public Map<String, List<String>> getA_ChanModes() { - if (ChanModes.get("A") == null) ChanModes.put("A", new HashMap<>()); - return (Map<String, List<String>>) ChanModes.get("A"); - } - - @NonNull - public Map<String, String> getB_ChanModes() { - if (ChanModes.get("B") == null) ChanModes.put("B", new HashMap<>()); - return (Map<String, String>) ChanModes.get("B"); - } - - @NonNull - public Map<String, String> getC_ChanModes() { - if (ChanModes.get("C") == null) ChanModes.put("C", new HashMap<>()); - return (Map<String, String>) ChanModes.get("C"); - } - - @NonNull - public Set<String> getD_ChanModes() { - if (ChanModes.get("D") instanceof String) { - List<String> list = Arrays.asList(((String) ChanModes.get("D")).split("")); - ChanModes.put("D", new HashSet<>(list)); - } else if (ChanModes.get("D") == null) { - ChanModes.put("D", new HashSet<>()); - } - return (Set<String>) ChanModes.get("D"); - } - @NonNull @Override public String toString() { @@ -85,7 +56,7 @@ public class IrcChannel extends SyncableObject<IrcChannel> { ", topic='" + topic + '\'' + ", password='" + password + '\'' + ", UserModes=" + UserModes + - ", ChanModes=" + ChanModes + + ", ChanModes=" + chanModes + ", encrypted=" + encrypted + '}'; } @@ -137,7 +108,7 @@ public class IrcChannel extends SyncableObject<IrcChannel> { addChannelMode(String.copyValueOf(new char[]{mode}), params); } - public void addChannelMode(String mode, String params) { + public void addChannelMode(@NonNull String mode, String params) { assertNotNull(network); Network.ChannelModeType type = network.channelModeType(mode); @@ -145,21 +116,21 @@ public class IrcChannel extends SyncableObject<IrcChannel> { case NOT_A_CHANMODE: return; case A_CHANMODE: - if (!getA_ChanModes().containsKey(mode)) { - getA_ChanModes().put(mode, new ArrayList<>(Collections.singleton(params))); + if (!chanModes.A.containsKey(mode)) { + chanModes.A.put(mode, new ArrayList<>(Collections.singleton(params))); } else { - getA_ChanModes().get(mode).add(params); + chanModes.A.get(mode).add(params); } break; case B_CHANMODE: - getB_ChanModes().put(mode, params); + chanModes.B.put(mode, params); break; case C_CHANMODE: - getB_ChanModes().put(mode, params); + chanModes.C.put(mode, params); break; case D_CHANMODE: - getD_ChanModes().add(mode); + chanModes.D.add(mode); break; } } @@ -172,7 +143,7 @@ public class IrcChannel extends SyncableObject<IrcChannel> { removeChannelMode(String.copyValueOf(new char[]{mode}), params); } - public void removeChannelMode(String mode, String params) { + public void removeChannelMode(@NonNull String mode, String params) { assertNotNull(network); Network.ChannelModeType type = network.channelModeType(mode); @@ -180,17 +151,17 @@ public class IrcChannel extends SyncableObject<IrcChannel> { case NOT_A_CHANMODE: return; case A_CHANMODE: - if (getA_ChanModes().containsKey(mode)) - getA_ChanModes().get(mode).removeAll(Collections.singleton(params)); + if (chanModes.A.containsKey(mode)) + chanModes.A.get(mode).removeAll(Collections.singleton(params)); break; case B_CHANMODE: - getB_ChanModes().remove(mode); + chanModes.B.remove(mode); break; case C_CHANMODE: - getB_ChanModes().remove(mode); + chanModes.C.remove(mode); break; case D_CHANMODE: - getB_ChanModes().remove(mode); + chanModes.D.remove(mode); break; } } @@ -203,19 +174,19 @@ public class IrcChannel extends SyncableObject<IrcChannel> { return hasMode(String.copyValueOf(new char[]{mode})); } - public boolean hasMode(String mode) { + public boolean hasMode(@NonNull String mode) { assertNotNull(network); Network.ChannelModeType type = network.channelModeType(mode); switch (type) { case A_CHANMODE: - return getA_ChanModes().containsKey(mode); + return chanModes.A.containsKey(mode); case B_CHANMODE: - return getA_ChanModes().containsKey(mode); + return chanModes.B.containsKey(mode); case C_CHANMODE: - return getA_ChanModes().containsKey(mode); + return chanModes.C.containsKey(mode); case D_CHANMODE: - return getA_ChanModes().containsKey(mode); + return chanModes.D.contains(mode); default: return false; @@ -273,21 +244,61 @@ public class IrcChannel extends SyncableObject<IrcChannel> { } @Override - public void update(IrcChannel from) { + public void update(@NonNull IrcChannel from) { this.name = from.name; this.topic = from.topic; this.password = from.password; this.UserModes = from.UserModes; - this.ChanModes = from.ChanModes; + this.chanModes = from.chanModes; this.encrypted = from.encrypted; } @Override - public void update(Map<String, QVariant> from) { + public void update(@NonNull Map<String, QVariant> from) { update(IrcChannelSerializer.get().fromDatastream(from)); } - public Map<String, Object> getChanModes() { - return ChanModes; + public ChanModes getChanModes() { + return chanModes; + } + + public static class ChanModes { + @NonNull + public final Map<String, List<String>> A; + @NonNull + public final Map<String, String> B; + @NonNull + public final Map<String, String> C; + @NonNull + public final Set<String> D; + + @SuppressWarnings("unchecked") + public ChanModes(@NonNull Map<String, Object> rawModes) { + A = (Map<String, List<String>>) rawModes.get("A"); + B = (Map<String, String>) rawModes.get("B"); + C = (Map<String, String>) rawModes.get("C"); + D = new HashSet<>(Arrays.asList(((String) rawModes.get("D")).split(""))); + } + + @NonNull + public Map<String, Object> toMap() { + Map<String, Object> out = new HashMap<>(); + out.put("A", A); + out.put("B", B); + out.put("C", C); + out.put("D", D); + return out; + } + + @NonNull + @Override + public String toString() { + return "ChanModes{" + + "A=" + A + + ", B=" + B + + ", C=" + C + + ", D=" + D + + '}'; + } } } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcUser.java index e38da03c3..472d2f719 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcUser.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcUser.java @@ -224,7 +224,7 @@ public class IrcUser extends SyncableObject<IrcUser> { } @Override - public void update(IrcUser from) { + public void update(@NonNull IrcUser from) { this.server = from.server; this.ircOperator = from.ircOperator; this.away = from.away; @@ -244,7 +244,7 @@ public class IrcUser extends SyncableObject<IrcUser> { } @Override - public void update(Map<String, QVariant> from) { + public void update(@NonNull Map<String, QVariant> from) { update(IrcUserSerializer.get().fromDatastream(from)); } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/Network.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/Network.java index cfb73a1c4..5cddcf65b 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/Network.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/Network.java @@ -156,7 +156,7 @@ public class Network extends SyncableObject<Network> implements ContentComparabl setSupportedModes(map); } - public void addIrcUser(String sender) { + public void addIrcUser(@NonNull String sender) { client.sendInitRequest("IrcUser", getObjectName() + "/" + IrcUserUtils.getNick(sender)); } @@ -170,9 +170,11 @@ public class Network extends SyncableObject<Network> implements ContentComparabl if (modes == null) return new IrcMode(0, ""); final List<IrcMode> usermodes = new ArrayList<>(modes.length()); + Map<String, IrcMode> supportedModes = getSupportedModes(); + assertNotNull(supportedModes); for (String mode : modes.split("")) { - if (getSupportedModes().containsKey(mode)) - usermodes.add(getSupportedModes().get(mode)); + if (supportedModes.containsKey(mode)) + usermodes.add(supportedModes.get(mode)); } Collections.sort(usermodes, (o1, o2) -> o1.rank - o2.rank); return usermodes.size() > 0 ? usermodes.get(0) : new IrcMode(0, ""); @@ -506,7 +508,7 @@ public class Network extends SyncableObject<Network> implements ContentComparabl } @Override - public void update(Network from) { + public void update(@NonNull Network from) { this.channels = from.channels; this.users = from.users; this.ServerList = from.ServerList; @@ -539,7 +541,7 @@ public class Network extends SyncableObject<Network> implements ContentComparabl } @Override - public void update(Map<String, QVariant> from) { + public void update(@NonNull Map<String, QVariant> from) { update(NetworkSerializer.get().fromDatastream(from)); } @@ -549,7 +551,7 @@ public class Network extends SyncableObject<Network> implements ContentComparabl } @Override - public boolean areItemsTheSame(Network other) { + public boolean areItemsTheSame(@NonNull Network other) { return networkId == other.networkId; } @@ -562,11 +564,13 @@ public class Network extends SyncableObject<Network> implements ContentComparabl this.client = client; } + @NonNull public ChannelModeType channelModeType(char mode) { return channelModeType(String.copyValueOf(new char[]{mode})); } - public ChannelModeType channelModeType(String mode) { + @NonNull + public ChannelModeType channelModeType(@NonNull String mode) { if (mode.isEmpty()) return ChannelModeType.NOT_A_CHANMODE; diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/NetworkConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/NetworkConfig.java index 32d885b45..bb7d13089 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/NetworkConfig.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/NetworkConfig.java @@ -101,7 +101,7 @@ public class NetworkConfig extends SyncableObject<NetworkConfig> { } @Override - public void update(NetworkConfig from) { + public void update(@NonNull NetworkConfig from) { this.autoWhoNickLimit = from.autoWhoNickLimit; this.autoWhoDelay = from.autoWhoDelay; this.autoWhoEnabled = from.autoWhoEnabled; @@ -113,7 +113,7 @@ public class NetworkConfig extends SyncableObject<NetworkConfig> { } @Override - public void update(Map<String, QVariant> from) { + public void update(@NonNull Map<String, QVariant> from) { update(NetworkConfigSerializer.get().fromDatastream(from)); } } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java b/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java index f3619522e..4ba84fde7 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java @@ -39,7 +39,6 @@ public class ClientBackgroundThread implements Runnable { this.certificateManager = new SQLiteCertificateManager(context); this.connection = new CoreConnection(address, CLIENT_DATA, provider, certificateManager); this.handler = new ProtocolHandler(provider); - this.handler.client.setClientData(CLIENT_DATA); this.connection.setClient(handler.client); } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.java b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.java index b621d9aa2..b6245e866 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.java @@ -22,16 +22,6 @@ public class QuasselService extends Service { return binder; } - @Override - public void onCreate() { - super.onCreate(); - } - - @Override - public void onDestroy() { - super.onDestroy(); - } - @Override public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; 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 ad7f34965..009d877ea 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 @@ -42,8 +42,6 @@ import com.mikepenz.materialdrawer.model.ProfileDrawerItem; import com.mikepenz.materialdrawer.model.SecondaryDrawerItem; import com.sothree.slidinguppanel.SlidingUpPanelLayout; -import org.joda.time.DateTime; - import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -61,13 +59,13 @@ import de.kuschku.libquassel.events.ConnectionChangeEvent; import de.kuschku.libquassel.events.GeneralErrorEvent; import de.kuschku.libquassel.events.LagChangedEvent; import de.kuschku.libquassel.events.UnknownCertificateEvent; -import de.kuschku.libquassel.functions.types.Heartbeat; import de.kuschku.libquassel.localtypes.Buffer; import de.kuschku.libquassel.localtypes.ChannelBuffer; import de.kuschku.libquassel.localtypes.backlogmanagers.BacklogFilter; import de.kuschku.libquassel.message.Message; import de.kuschku.libquassel.syncables.types.BufferViewConfig; import de.kuschku.libquassel.syncables.types.BufferViewManager; +import de.kuschku.libquassel.syncables.types.IrcChannel; import de.kuschku.quasseldroid_ng.BuildConfig; import de.kuschku.quasseldroid_ng.R; import de.kuschku.quasseldroid_ng.service.ClientBackgroundThread; @@ -82,7 +80,6 @@ import de.kuschku.util.ServerAddress; import de.kuschku.util.certificates.CertificateUtils; import de.kuschku.util.instancestateutil.Storable; import de.kuschku.util.instancestateutil.Store; -import de.kuschku.util.keyboardutils.DialogKeyboardUtil; import de.kuschku.util.observables.AutoScroller; import de.kuschku.util.observables.lists.ObservableSortedList; import de.kuschku.util.ui.SpanFormatter; @@ -138,7 +135,8 @@ public class ChatActivity extends AppCompatActivity { int bufferViewConfigId = -1; } - private ServiceInterface serviceInterface = new ServiceInterface(); + @NonNull + private final ServiceInterface serviceInterface = new ServiceInterface(); private class ServiceInterface { private void connect(@NonNull ServerAddress address) { assertNotNull(binder); @@ -148,8 +146,6 @@ public class ChatActivity extends AppCompatActivity { context.getProvider().event.register(ChatActivity.this); binder.startBackgroundThread(context.getProvider(), address); onConnectionEstablished(); - - context.getProvider().handle(new Heartbeat(DateTime.parse("1980-01-01T00:00"))); } private void disconnect() { @@ -161,7 +157,8 @@ public class ChatActivity extends AppCompatActivity { } } - private ServiceConnection serviceConnection = new ServiceConnection() { + @Nullable + private final ServiceConnection serviceConnection = new ServiceConnection() { @UiThread public void onServiceConnected(@NonNull ComponentName cn, @NonNull IBinder service) { if (service instanceof QuasselService.LocalBinder) { @@ -175,8 +172,11 @@ public class ChatActivity extends AppCompatActivity { context.setProvider(backgroundThread.provider); context.setClient(backgroundThread.handler.client); context.getProvider().event.register(ChatActivity.this); - updateBufferViewConfigs(); + updateSubTitle(); + if (context.getClient().getConnectionStatus() == ConnectionChangeEvent.Status.CONNECTED) { + updateBufferViewConfigs(); + } } } } @@ -209,7 +209,9 @@ public class ChatActivity extends AppCompatActivity { String lastPassword; } - private AppContext context = new AppContext(); + @NonNull + private final AppContext context = new AppContext(); + @Nullable private QuasselService.LocalBinder binder; @Override @@ -299,7 +301,7 @@ public class ChatActivity extends AppCompatActivity { } @Override - public boolean onOptionsItemSelected(MenuItem item) { + public boolean onOptionsItemSelected(@NonNull MenuItem item) { List<Integer> filterSettings = Arrays.asList( Message.Type.Join.value, Message.Type.Part.value, @@ -358,7 +360,7 @@ public class ChatActivity extends AppCompatActivity { return super.onOptionsItemSelected(item); } - private static void updateNoColor(Buffer buffer, Menu menu) { + private static void updateNoColor(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); @@ -368,8 +370,14 @@ public class ChatActivity extends AppCompatActivity { } public static boolean isNoColor(Buffer buffer) { - return buffer instanceof ChannelBuffer && ((ChannelBuffer) buffer).getChannel() != null && - ((ChannelBuffer) buffer).getChannel().getD_ChanModes().contains("c"); + assertNotNull(buffer); + if (buffer instanceof ChannelBuffer) { + IrcChannel channel = ((ChannelBuffer) buffer).getChannel(); + assertNotNull(channel); + return channel.hasMode('c'); + } else { + return false; + } } private void setupContext() { @@ -577,7 +585,6 @@ public class ChatActivity extends AppCompatActivity { wrapper = new BufferViewConfigWrapper(context, viewConfig, drawerLeft); wrapper.updateDrawerItems(); - String name = viewConfig.getBufferViewName(); } } @@ -586,7 +593,7 @@ public class ChatActivity extends AppCompatActivity { swipeView.setEnabled(false); messageAdapter.setMessageList(MessageAdapter.emptyList()); - toolbar.setTitle(getResources().getString(R.string.app_name)); + toolbar.setTitle(getResources().getString(R.string.appName)); } else { swipeView.setEnabled(true); @@ -621,7 +628,7 @@ public class ChatActivity extends AppCompatActivity { chatline.setText(""); } - public void onEventMainThread(ConnectionChangeEvent event) { + public void onEventMainThread(@NonNull ConnectionChangeEvent event) { updateSubTitle(); switch (event.status) { @@ -662,10 +669,11 @@ public class ChatActivity extends AppCompatActivity { private void showLoginDialog() { MaterialDialog dialog = new MaterialDialog.Builder(this) - .title("Address") + .title(R.string.labelLogin) .customView(R.layout.dialog_login, false) .onPositive((dialog1, which) -> { View parent = dialog1.getCustomView(); + assertNotNull(parent); AppCompatEditText usernameField = (AppCompatEditText) parent.findViewById(R.id.username); AppCompatEditText passwordField = (AppCompatEditText) parent.findViewById(R.id.password); String username = usernameField.getText().toString(); @@ -673,14 +681,16 @@ public class ChatActivity extends AppCompatActivity { context.getSettings().lastUsername.set(username); context.getSettings().lastPassword.set(password); context.getClient().login(username, password); - - Log.e("TIME", String.valueOf(System.currentTimeMillis())); + }) + .cancelListener(dialog1 -> { + if (binder != null) + binder.stopBackgroundThread(); + serviceInterface.disconnect(); }) .negativeColor(context.getThemeUtil().res.colorForeground) - .positiveText("Login") - .negativeText("Cancel") + .positiveText(R.string.labelLogin) + .negativeText(R.string.labelCancel) .build(); - dialog.setOnKeyListener(new DialogKeyboardUtil(dialog)); ((AppCompatEditText) dialog.getView().findViewById(R.id.username)).setText(context.getSettings().lastUsername.get()); ((AppCompatEditText) dialog.getView().findViewById(R.id.password)).setText(context.getSettings().lastPassword.get()); dialog.show(); @@ -688,13 +698,14 @@ public class ChatActivity extends AppCompatActivity { public void showConnectDialog() { MaterialDialog dialog = new MaterialDialog.Builder(this) - .title("Address") + .title(R.string.labelAddress) .customView(R.layout.dialog_address, false) .onPositive((dialog1, which) -> { if (binder != null && binder.getBackgroundThread() != null) binder.stopBackgroundThread(); View parent = dialog1.getCustomView(); + assertNotNull(parent); AppCompatEditText hostField = (AppCompatEditText) parent.findViewById(R.id.host); AppCompatEditText portField = (AppCompatEditText) parent.findViewById(R.id.port); String host = hostField.getText().toString().trim(); @@ -704,28 +715,27 @@ public class ChatActivity extends AppCompatActivity { serviceInterface.connect(new ServerAddress(host, port)); }) .negativeColor(context.getThemeUtil().res.colorForeground) - .positiveText("Connect") - .negativeText("Cancel") + .positiveText(R.string.labelConnect) + .negativeText(R.string.labelCancel) .build(); AppCompatEditText hostField = (AppCompatEditText) dialog.getView().findViewById(R.id.host); AppCompatEditText portField = (AppCompatEditText) dialog.getView().findViewById(R.id.port); - dialog.setOnKeyListener(new DialogKeyboardUtil(dialog)); hostField.setText(context.getSettings().lastHost.get()); portField.setText(String.valueOf(context.getSettings().lastPort.get())); dialog.show(); } - public void onEventMainThread(BacklogReceivedEvent event) { + public void onEventMainThread(@NonNull BacklogReceivedEvent event) { if (event.bufferId == status.bufferId) { swipeView.setRefreshing(false); } } - public void onEventMainThread(UnknownCertificateEvent event) { + public void onEventMainThread(@NonNull UnknownCertificateEvent event) { new MaterialDialog.Builder(this) - .content("Do you trust this certificate?\n" + CertificateUtils.certificateToFingerprint(event.certificate, "")) + .content(context.getThemeUtil().translations.warningCertificate + "\n" + CertificateUtils.certificateToFingerprint(event.certificate, "")) .title("Unknown Certificate") .onPositive((dialog, which) -> { if (binder.getBackgroundThread() != null) { @@ -739,7 +749,7 @@ public class ChatActivity extends AppCompatActivity { .show(); } - public void onEventMainThread(GeneralErrorEvent event) { + public void onEventMainThread(@NonNull GeneralErrorEvent event) { Snackbar.make(messages, event.toString(), Snackbar.LENGTH_LONG).show(); for (String line : Splitter.fixedLength(2048).split(event.toString())) { Log.e("ChatActivity", line); diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java index 4000bcf78..3abdc7d93 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java @@ -1,6 +1,5 @@ package de.kuschku.quasseldroid_ng.ui.chat.chatview; -import android.content.Context; import android.graphics.Typeface; import android.support.annotation.ColorInt; import android.support.annotation.NonNull; @@ -24,14 +23,14 @@ public class ChatMessageRenderer { private MessageStyleContainer plainStyle; @NonNull - private AppContext context; + private final AppContext context; - public ChatMessageRenderer(@NonNull Context ctx, @NonNull AppContext context) { + public ChatMessageRenderer(@NonNull AppContext context) { this.context = context; setTheme(context); } - public void setTheme(AppContext context) { + public void setTheme(@NonNull AppContext context) { this.helper = new IrcFormatHelper(context); this.highlightStyle = new MessageStyleContainer( @@ -84,7 +83,7 @@ public class ChatMessageRenderer { } @NonNull - private CharSequence getBufferName(Message message) { + private CharSequence getBufferName(@NonNull Message message) { assertNotNull(context.getClient()); Buffer buffer = context.getClient().getBuffer(message.bufferInfo.id); assertNotNull(buffer); diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageAdapter.java index 9a4d6deae..04052b6b8 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageAdapter.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageAdapter.java @@ -22,7 +22,8 @@ import static de.kuschku.util.AndroidAssert.assertNotNull; @UiThread public class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> { - private static ObservableSortedList<Message> emptyList = new ObservableComparableSortedList<Message>(Message.class); + @NonNull + private static final ObservableSortedList<Message> emptyList = new ObservableComparableSortedList<>(Message.class); @NonNull private final ChatMessageRenderer renderer; @NonNull @@ -34,10 +35,11 @@ public class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> { public MessageAdapter(@NonNull Context ctx, @NonNull AppContext context, @Nullable AutoScroller scroller) { this.inflater = LayoutInflater.from(ctx); - this.renderer = new ChatMessageRenderer(ctx, context); + this.renderer = new ChatMessageRenderer(context); this.callback = new AdapterUICallbackWrapper(this, scroller); } + @NonNull public static ObservableSortedList<Message> emptyList() { return emptyList; } 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 ac9816842..3ad9a4b5c 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 @@ -1,6 +1,8 @@ package de.kuschku.quasseldroid_ng.ui.chat.drawer; import android.graphics.Color; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.view.View; import android.widget.TextView; @@ -27,13 +29,17 @@ import de.kuschku.util.observables.lists.ObservableComparableSortedList; import de.kuschku.util.ui.MessageUtil; public class BufferItem extends SecondaryDrawerItem implements IObservable<GeneralCallback>, GeneralCallback { + @NonNull private final Buffer buffer; + @NonNull private final AppContext context; + @NonNull private final ObservableComparableSortedList<Message> notifications; - private GeneralCallbackWrapper callback = new GeneralCallbackWrapper(); + @NonNull + private final GeneralCallbackWrapper callback = new GeneralCallbackWrapper(); - public BufferItem(Buffer buffer, AppContext context) { + public BufferItem(@NonNull Buffer buffer, @NonNull AppContext context) { this.buffer = buffer; this.context = context; notifications = context.getClient().getNotificationManager().getNotifications(buffer.getInfo().id); @@ -49,6 +55,7 @@ public class BufferItem extends SecondaryDrawerItem implements IObservable<Gener callback.notifyChanged(); } + @NonNull @Override public StringHolder getBadge() { return new StringHolder(String.valueOf(notifications.size())); @@ -79,14 +86,16 @@ public class BufferItem extends SecondaryDrawerItem implements IObservable<Gener return super.getDescription(); } + @Nullable @Override public StringHolder getName() { if (buffer instanceof StatusBuffer) - return new StringHolder(context.getThemeUtil().translations.title_status_buffer); + return new StringHolder(context.getThemeUtil().translations.titleStatusBuffer); else return new StringHolder(buffer.getName()); } + @NonNull @Override public ImageHolder getIcon() { if (buffer instanceof ChannelBuffer) { @@ -115,6 +124,7 @@ public class BufferItem extends SecondaryDrawerItem implements IObservable<Gener return buffer.getStatus() == BufferInfo.BufferStatus.ONLINE; } + @NonNull @Override public ColorHolder getIconColor() { return buffer.getStatus() == BufferInfo.BufferStatus.ONLINE ? @@ -122,6 +132,7 @@ public class BufferItem extends SecondaryDrawerItem implements IObservable<Gener new ColorHolder(); } + @NonNull @Override public ColorHolder getDescriptionTextColor() { return ColorHolder.fromColor(context.getThemeUtil().res.colorForegroundSecondary); @@ -137,6 +148,7 @@ public class BufferItem extends SecondaryDrawerItem implements IObservable<Gener this.callback.removeCallback(callback); } + @NonNull public Buffer getBuffer() { return buffer; } @@ -147,7 +159,7 @@ public class BufferItem extends SecondaryDrawerItem implements IObservable<Gener } @Override - public void onPostBindView(IDrawerItem drawerItem, View view) { + public void onPostBindView(IDrawerItem drawerItem, @NonNull View view) { super.onPostBindView(drawerItem, view); if (getDescription() != null && getDescription().getText() != null) diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigWrapper.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigWrapper.java index 83e4c0c57..d8271da29 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigWrapper.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigWrapper.java @@ -1,5 +1,7 @@ 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; @@ -15,10 +17,10 @@ import static de.kuschku.util.AndroidAssert.assertNotNull; public class BufferViewConfigWrapper { private Drawer drawer; - private BufferViewConfig config; - private ObservableSortedList<NetworkItem> networks = new ObservableSortedList<>(NetworkItem.class, new ObservableSortedList.ItemComparator<NetworkItem>() { + @NonNull + private final ObservableSortedList<NetworkItem> networks = new ObservableSortedList<>(NetworkItem.class, new ObservableSortedList.ItemComparator<NetworkItem>() { @Override - public int compare(NetworkItem o1, NetworkItem o2) { + public int compare(@NonNull NetworkItem o1, @NonNull NetworkItem o2) { return o1.getName().getText().compareTo(o2.getName().getText()); } @@ -28,13 +30,12 @@ public class BufferViewConfigWrapper { } @Override - public boolean areItemsTheSame(NetworkItem item1, NetworkItem item2) { + public boolean areItemsTheSame(@NonNull NetworkItem item1, @NonNull NetworkItem item2) { return item1.getNetwork().getNetworkId() == item2.getNetwork().getNetworkId(); } }); - public BufferViewConfigWrapper(AppContext context, BufferViewConfig config, Drawer drawer) { - this.config = config; + public BufferViewConfigWrapper(@NonNull AppContext context, @NonNull BufferViewConfig config, Drawer drawer) { this.drawer = drawer; config.doLateInit(); networks.clear(); @@ -90,6 +91,7 @@ public class BufferViewConfigWrapper { this.drawer = drawer; } + @NonNull public ArrayList<IDrawerItem> getItems() { ArrayList<IDrawerItem> items = new ArrayList<>(); for (IDrawerItem item : networks) { 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 ea4bfec59..f1c3a8b4c 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 @@ -1,8 +1,9 @@ package de.kuschku.quasseldroid_ng.ui.chat.drawer; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.util.SparseArray; -import com.mikepenz.materialdrawer.holder.ColorHolder; import com.mikepenz.materialdrawer.holder.StringHolder; import com.mikepenz.materialdrawer.model.PrimaryDrawerItem; import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; @@ -27,32 +28,30 @@ import static de.kuschku.libquassel.primitives.types.BufferInfo.Type.QUERY; import static de.kuschku.libquassel.primitives.types.BufferInfo.Type.STATUS; public class NetworkItem extends PrimaryDrawerItem implements IObservable<GeneralCallback>, GeneralCallback { - private final AppContext context; + @NonNull private final Network network; - private final BufferViewConfig config; + @NonNull private final ObservableSortedList<BufferItem> buffers = new ObservableSortedList<>(BufferItem.class, new AlphabeticalComparator()); + @NonNull private final SparseArray<BufferItem> bufferIds = new SparseArray<>(); - + @NonNull private final GeneralCallbackWrapper callback = new GeneralCallbackWrapper(); - public NetworkItem(AppContext context, Network network, BufferViewConfig config) { - this.context = context; + public NetworkItem(@NonNull AppContext context, @NonNull Network network, @NonNull BufferViewConfig config) { this.network = network; - this.config = config; - for (Integer bufferId : this.config.getBuffers()) { + for (Integer bufferId : config.getBuffers()) { Buffer buffer = context.getClient().getBuffer(bufferId); if (buffer != null && buffer.getInfo().networkId == network.getNetworkId()) { this.buffers.add(new BufferItem(buffer, context)); } } - this.config.getBuffers().addCallback(new ElementCallback<Integer>() { + config.getBuffers().addCallback(new ElementCallback<Integer>() { @Override public void notifyItemInserted(Integer element) { - if (network.getBuffers().contains(element)) { + Buffer buffer = context.getClient().getBuffer(element); + if (network.getBuffers().contains(buffer)) { if (bufferIds.get(element) == null) { - Buffer buffer = context.getClient().getBuffer(element); - BufferItem bufferItem = new BufferItem(buffer, context); buffers.add(bufferItem); bufferItem.addCallback(NetworkItem.this); @@ -79,26 +78,19 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Genera }); } - @Override - public boolean isIconTinted() { - return super.isIconTinted(); - } - - @Override - public ColorHolder getIconColor() { - return super.getIconColor(); - } - + @NonNull @Override public StringHolder getDescription() { return new StringHolder(String.valueOf(network.getLatency())); } + @Nullable @Override public StringHolder getName() { return new StringHolder(network.getNetworkName()); } + @NonNull @Override public List<IDrawerItem> getSubItems() { ArrayList<IDrawerItem> items = new ArrayList<>(); @@ -123,6 +115,7 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Genera this.callback.removeCallback(callback); } + @NonNull public Network getNetwork() { return network; } @@ -134,11 +127,16 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Genera class AlphabeticalComparator implements ObservableSortedList.ItemComparator<BufferItem> { @Override - public int compare(BufferItem o1, BufferItem o2) { + public int compare(@NonNull BufferItem o1, @NonNull BufferItem o2) { BufferInfo.Type type1 = o1.getBuffer().getInfo().type; BufferInfo.Type type2 = o2.getBuffer().getInfo().type; if (type1 == type2) { - return o1.getBuffer().getName().compareTo(o2.getBuffer().getName()); + if (o1.getBuffer().getName() == null) + return -1; + else if (o2.getBuffer().getName() == null) + return 1; + else + return o1.getBuffer().getName().compareTo(o2.getBuffer().getName()); } else { // Type1 is status, Type2 isn’t if (type1 == STATUS) return -1; @@ -167,14 +165,14 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Genera } @Override - public boolean areItemsTheSame(BufferItem item1, BufferItem item2) { + public boolean areItemsTheSame(@NonNull BufferItem item1, @NonNull BufferItem item2) { return item1.getBuffer().getInfo().id == item2.getBuffer().getInfo().id; } } class NoneComparator implements ObservableSortedList.ItemComparator<BufferItem> { @Override - public int compare(BufferItem o1, BufferItem o2) { + public int compare(@NonNull BufferItem o1, @NonNull BufferItem o2) { return o1.getBuffer().getInfo().id - o2.getBuffer().getInfo().id; } @@ -184,7 +182,7 @@ public class NetworkItem extends PrimaryDrawerItem implements IObservable<Genera } @Override - public boolean areItemsTheSame(BufferItem item1, BufferItem item2) { + public boolean areItemsTheSame(@NonNull BufferItem item1, @NonNull BufferItem item2) { return item1.getBuffer().getInfo().id == item2.getBuffer().getInfo().id; } } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/AdvancedEditor.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/AdvancedEditor.java index ab9884be5..f3efc6f65 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/AdvancedEditor.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/AdvancedEditor.java @@ -2,6 +2,7 @@ package de.kuschku.quasseldroid_ng.ui.editor; import android.support.annotation.ColorInt; import android.support.annotation.IntRange; +import android.support.annotation.NonNull; import android.text.Spanned; import android.text.style.BackgroundColorSpan; import android.text.style.ForegroundColorSpan; @@ -11,8 +12,9 @@ import android.widget.EditText; import de.kuschku.quasseldroid_ng.ui.theme.AppContext; public class AdvancedEditor { - private EditText editText; - private FormattingHelper helper; + private final EditText editText; + @NonNull + private final FormattingHelper helper; public AdvancedEditor(AppContext context, EditText editText) { this.helper = new FormattingHelper(context); @@ -115,6 +117,7 @@ public class AdvancedEditor { } } + @NonNull public String toFormatString() { return helper.toEscapeCodes(editText.getText()); } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/FormattingHelper.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/FormattingHelper.java index 74780cc7a..e1caabe55 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/FormattingHelper.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/FormattingHelper.java @@ -1,21 +1,25 @@ package de.kuschku.quasseldroid_ng.ui.editor; +import android.support.annotation.NonNull; import android.text.Spanned; import android.text.style.BackgroundColorSpan; import android.text.style.CharacterStyle; import android.text.style.ForegroundColorSpan; import android.text.style.UnderlineSpan; +import java.util.Locale; + import de.kuschku.quasseldroid_ng.ui.theme.AppContext; public class FormattingHelper { - private AppContext context; + private final AppContext context; public FormattingHelper(AppContext context) { this.context = context; } - public String toEscapeCodes(Spanned text) { + @NonNull + public String toEscapeCodes(@NonNull Spanned text) { StringBuilder out = new StringBuilder(); withinParagraph(out, text, 0, text.length()); return out.toString(); @@ -30,7 +34,7 @@ public class FormattingHelper { return 0; } - private void withinParagraph(StringBuilder out, Spanned text, + private void withinParagraph(@NonNull StringBuilder out, @NonNull Spanned text, int start, int end) { int next; for (int i = start; i < end; i = next) { @@ -65,7 +69,7 @@ public class FormattingHelper { } out.append((char) 0x03); - out.append(String.format("%02d,%02d", fg, bg)); + out.append(String.format(Locale.US, "%02d,%02d", fg, bg)); jump = true; } else if (style[j] instanceof BackgroundColorSpan) { @@ -80,7 +84,7 @@ public class FormattingHelper { bg = colorToId(((BackgroundColorSpan) style[j]).getBackgroundColor()); out.append((char) 0x03); - out.append(String.format("%02d,%02d", fg, bg)); + out.append(String.format(Locale.US, "%02d,%02d", fg, bg)); jump = true; } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppContext.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppContext.java index 06bf9f86d..ca03163f8 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppContext.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppContext.java @@ -1,5 +1,7 @@ package de.kuschku.quasseldroid_ng.ui.theme; +import android.support.annotation.NonNull; + import de.kuschku.libquassel.BusProvider; import de.kuschku.libquassel.Client; import de.kuschku.quasseldroid_ng.ui.chat.WrappedSettings; @@ -18,6 +20,7 @@ public class AppContext { this.themeUtil = themeUtil; } + @NonNull public AppContext withThemeUtil(ThemeUtil themeUtil) { setThemeUtil(themeUtil); return this; @@ -31,6 +34,7 @@ public class AppContext { this.settings = settings; } + @NonNull public AppContext withSettings(WrappedSettings settings) { setSettings(settings); return this; @@ -44,6 +48,7 @@ public class AppContext { this.client = client; } + @NonNull public AppContext withClient(Client client) { setClient(client); return this; @@ -57,6 +62,7 @@ public class AppContext { this.provider = provider; } + @NonNull public AppContext withProvider(BusProvider provider) { setProvider(provider); return this; diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java index 7bfbbc77f..e85fb35a6 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java @@ -1,5 +1,7 @@ package de.kuschku.quasseldroid_ng.ui.theme; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.annotation.StyleRes; import de.kuschku.quasseldroid_ng.R; @@ -20,7 +22,8 @@ public enum AppTheme { return themeFromString(s).themeId; } - public static AppTheme themeFromString(String s) { + @NonNull + public static AppTheme themeFromString(@Nullable String s) { if (s == null) s = ""; switch (s) { case "MATERIAL_DARK": @@ -36,6 +39,7 @@ public enum AppTheme { } } + @NonNull @Override public String toString() { return name() + "{" + diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java index 336fa5268..2450e23bc 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java @@ -18,8 +18,10 @@ import de.kuschku.util.ui.SpanFormatter; public class ThemeUtil { @NonNull public final Colors res = new Colors(); + @NonNull public final FormatStrings translations = new FormatStrings(); - public DateTimeFormatHelper formatter; + @NonNull + public final DateTimeFormatHelper formatter; public ThemeUtil(@NonNull Context ctx) { initColors(new ContextThemeWrapper(ctx, ctx.getTheme())); @@ -42,135 +44,137 @@ public class ThemeUtil { } public static class FormatStrings { - @AutoString(R.string.username_hostmask) - public String username_hostmask; + @AutoString(R.string.usernameHostmask) + public String usernameHostmask; - @AutoString(R.string.message_plain) - public String message_plain; + @AutoString(R.string.messagePlain) + public String messagePlain; - @AutoString(R.string.message_join) - public String message_join; + @AutoString(R.string.messageJoin) + public String messageJoin; - @AutoString(R.string.message_part) - public String message_part; + @AutoString(R.string.messagePart) + public String messagePart; - @AutoString(R.string.message_part_extra) - public String message_part_extra; + @AutoString(R.string.messagePartExtra) + public String messagePartExtra; - @AutoString(R.string.message_quit) - public String message_quit; + @AutoString(R.string.messageQuit) + public String messageQuit; - @AutoString(R.string.message_quit_extra) - public String message_quit_extra; + @AutoString(R.string.messageQuitExtra) + public String messageQuitExtra; - @AutoString(R.string.message_kill) - public String message_kill; + @AutoString(R.string.messageKill) + public String messageKill; - @AutoString(R.string.message_kick) - public String message_kick; + @AutoString(R.string.messageKick) + public String messageKick; - @AutoString(R.string.message_kick_extra) - public String message_kick_extra; + @AutoString(R.string.messageKickExtra) + public String messageKickExtra; - @AutoString(R.string.message_mode) - public String message_mode; + @AutoString(R.string.messageMode) + public String messageMode; - @AutoString(R.string.message_nick_self) - public String message_nick_self; + @AutoString(R.string.messageNickSelf) + public String messageNickSelf; - @AutoString(R.string.message_nick_other) - public String message_nick_other; + @AutoString(R.string.messageNickOther) + public String messageNickOther; - @AutoString(R.string.message_daychange) - public String message_daychange; + @AutoString(R.string.messageDayChange) + public String messageDaychange; - @AutoString(R.string.message_action) - public String message_action; + @AutoString(R.string.messageAction) + public String messageAction; - @AutoString(R.string.title_status_buffer) - public String title_status_buffer; + @AutoString(R.string.labelStatusBuffer) + public String titleStatusBuffer; + @AutoString(R.string.warningCertificate) + public String warningCertificate; @NonNull public CharSequence formatUsername(@NonNull CharSequence nick, @NonNull CharSequence hostmask) { - return SpanFormatter.format(username_hostmask, nick, hostmask); + return SpanFormatter.format(usernameHostmask, nick, hostmask); } @NonNull public CharSequence formatJoin(@NonNull CharSequence user, @NonNull CharSequence channel) { - return SpanFormatter.format(message_join, user, channel); + return SpanFormatter.format(messageJoin, user, channel); } @NonNull public CharSequence formatPart(@NonNull CharSequence user, @NonNull CharSequence channel) { - return SpanFormatter.format(message_part, user, channel); + return SpanFormatter.format(messagePart, user, channel); } @NonNull public CharSequence formatPart(@NonNull CharSequence user, @NonNull CharSequence channel, @Nullable CharSequence reason) { if (reason == null || reason.length() == 0) return formatPart(user, channel); - return SpanFormatter.format(message_part_extra, user, channel, reason); + return SpanFormatter.format(messagePartExtra, user, channel, reason); } @NonNull public CharSequence formatQuit(@NonNull CharSequence user) { - return SpanFormatter.format(message_quit, user); + return SpanFormatter.format(messageQuit, user); } @NonNull public CharSequence formatQuit(@NonNull CharSequence user, @Nullable CharSequence reason) { if (reason == null || reason.length() == 0) return formatQuit(user); - return SpanFormatter.format(message_quit_extra, user, reason); + return SpanFormatter.format(messageQuitExtra, user, reason); } @NonNull public CharSequence formatKill(@NonNull CharSequence user, @NonNull CharSequence channel) { - return SpanFormatter.format(message_kill, user, channel); + return SpanFormatter.format(messageKill, user, channel); } @NonNull public CharSequence formatKick(@NonNull CharSequence user, @NonNull CharSequence kicked) { - return SpanFormatter.format(message_kick, user, kicked); + return SpanFormatter.format(messageKick, user, kicked); } @NonNull public CharSequence formatKick(@NonNull CharSequence user, @NonNull CharSequence kicked, @Nullable CharSequence reason) { if (reason == null || reason.length() == 0) return formatKick(user, kicked); - return SpanFormatter.format(message_kick_extra, user, kicked, reason); + return SpanFormatter.format(messageKickExtra, user, kicked, reason); } @NonNull public CharSequence formatMode(@NonNull CharSequence mode, @NonNull CharSequence user) { - return SpanFormatter.format(message_mode, mode, user); + return SpanFormatter.format(messageMode, mode, user); } @NonNull public CharSequence formatNick(@NonNull CharSequence newNick) { - return SpanFormatter.format(message_nick_self, newNick); + return SpanFormatter.format(messageNickSelf, newNick); } @NonNull public CharSequence formatNick(@NonNull CharSequence oldNick, @Nullable CharSequence newNick) { if (newNick == null || newNick.length() == 0) return formatNick(oldNick); - return SpanFormatter.format(message_nick_other, oldNick, newNick); + return SpanFormatter.format(messageNickOther, oldNick, newNick); } @NonNull public CharSequence formatDayChange(@NonNull CharSequence day) { - return SpanFormatter.format(message_daychange, day); + return SpanFormatter.format(messageDaychange, day); } @NonNull public CharSequence formatAction(@NonNull CharSequence user, @NonNull CharSequence channel) { - return SpanFormatter.format(message_action, user, channel); + return SpanFormatter.format(messageAction, user, channel); } @NonNull public CharSequence formatPlain(@NonNull CharSequence nick, @NonNull CharSequence message) { - return SpanFormatter.format(message_plain, nick, message); + return SpanFormatter.format(messagePlain, nick, message); } } diff --git a/app/src/main/java/de/kuschku/util/AndroidAssert.java b/app/src/main/java/de/kuschku/util/AndroidAssert.java index f9d7bb0f8..1787d84fa 100644 --- a/app/src/main/java/de/kuschku/util/AndroidAssert.java +++ b/app/src/main/java/de/kuschku/util/AndroidAssert.java @@ -1,5 +1,6 @@ package de.kuschku.util; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import junit.framework.Assert; @@ -340,7 +341,7 @@ public class AndroidAssert extends Assert { } } - public static void assertEquals(int... elements) { + public static void assertEquals(@NonNull int... elements) { if (BuildConfig.DEBUG) { if (elements.length > 0) { int first = elements[0]; diff --git a/app/src/main/java/de/kuschku/util/certificates/CertificateDatabaseHandler.java b/app/src/main/java/de/kuschku/util/certificates/CertificateDatabaseHandler.java index f06452b5c..0d55f9784 100644 --- a/app/src/main/java/de/kuschku/util/certificates/CertificateDatabaseHandler.java +++ b/app/src/main/java/de/kuschku/util/certificates/CertificateDatabaseHandler.java @@ -5,6 +5,7 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteStatement; +import android.support.annotation.NonNull; import java.util.ArrayList; import java.util.Collection; @@ -15,32 +16,32 @@ import java.util.Map; public class CertificateDatabaseHandler extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; - private static final String DATABASE_NAME = "certificates"; - private static final String TABLE_CERTIFICATES = "certificates"; + @NonNull private static final String DATABASE_NAME = "certificates"; + @NonNull private static final String TABLE_CERTIFICATES = "certificates"; - private static final String KEY_CORE_ADDRESS = "core_address"; - private static final String KEY_FINGERPRINT = "fingerprint"; + @NonNull private static final String KEY_CORE_ADDRESS = "core_address"; + @NonNull private static final String KEY_FINGERPRINT = "fingerprint"; // Again we can only use String.format, as SQL doesn’t support table or column names to be bound // in prepared statements - private static final String STATEMENT_INSERT = + @NonNull private static final String STATEMENT_INSERT = String.format("INSERT OR IGNORE INTO %s(%s, %s) VALUES (?, ?)", TABLE_CERTIFICATES, KEY_CORE_ADDRESS, KEY_FINGERPRINT); - private static final String STATEMENT_DELETE = + @NonNull private static final String STATEMENT_DELETE = String.format("DELETE FROM %s WHERE %s = ? AND %s = ?", TABLE_CERTIFICATES, KEY_CORE_ADDRESS, KEY_FINGERPRINT); - private static final String STATEMENT_DELETE_ALL = + @NonNull private static final String STATEMENT_DELETE_ALL = String.format("DELETE FROM %s WHERE %s = ?", TABLE_CERTIFICATES, KEY_CORE_ADDRESS); - private static final String SPECIFIER_FIND_ALL = String.format("%s = ?", KEY_CORE_ADDRESS); + @NonNull private static final String SPECIFIER_FIND_ALL = String.format("%s = ?", KEY_CORE_ADDRESS); public CertificateDatabaseHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override - public void onCreate(SQLiteDatabase db) { + public void onCreate(@NonNull SQLiteDatabase db) { // Why do we use String.format and not prepared statements? Because we can’t bind table or // column names in prepared statements String statement = String.format("CREATE TABLE %s (%s, %s, PRIMARY KEY (%s, %s), UNIQUE(%s, %s));", @@ -118,6 +119,7 @@ public class CertificateDatabaseHandler extends SQLiteOpenHelper { ); } + @NonNull public List<String> findCertificates(String coreAddress) { Cursor cursor = cursorFindCertificates(coreAddress); List<String> certificates = new ArrayList<>(); @@ -131,6 +133,7 @@ public class CertificateDatabaseHandler extends SQLiteOpenHelper { return certificates; } + @NonNull public Map<String, Collection<String>> findAllCertificates() { Cursor cursor = cursorFindAllCertificates(); diff --git a/app/src/main/java/de/kuschku/util/certificates/CertificateUtils.java b/app/src/main/java/de/kuschku/util/certificates/CertificateUtils.java index 2cdcef68e..d683f14ed 100644 --- a/app/src/main/java/de/kuschku/util/certificates/CertificateUtils.java +++ b/app/src/main/java/de/kuschku/util/certificates/CertificateUtils.java @@ -1,5 +1,7 @@ package de.kuschku.util.certificates; +import android.support.annotation.NonNull; + import com.google.common.base.Joiner; import java.security.MessageDigest; @@ -18,11 +20,11 @@ public class CertificateUtils { private CertificateUtils() { } - public static String certificateToFingerprint(X509Certificate certificate) throws NoSuchAlgorithmException, CertificateEncodingException { + public static String certificateToFingerprint(@NonNull X509Certificate certificate) throws NoSuchAlgorithmException, CertificateEncodingException { return hashToFingerprint(getHash(certificate)); } - public static String certificateToFingerprint(X509Certificate certificate, String defaultValue) { + public static String certificateToFingerprint(@NonNull X509Certificate certificate, String defaultValue) { try { return certificateToFingerprint(certificate); } catch (Exception e) { @@ -30,13 +32,13 @@ public class CertificateUtils { } } - private static byte[] getHash(X509Certificate certificate) throws NoSuchAlgorithmException, CertificateEncodingException { + private static byte[] getHash(@NonNull X509Certificate certificate) throws NoSuchAlgorithmException, CertificateEncodingException { MessageDigest digest = java.security.MessageDigest.getInstance("SHA1"); digest.update(certificate.getEncoded()); return digest.digest(); } - public static String hashToFingerprint(byte[] hash) { + public static String hashToFingerprint(@NonNull byte[] hash) { String[] formattedBytes = new String[hash.length]; for (int i = 0; i < hash.length; i++) { // Format each byte as hex string @@ -45,7 +47,8 @@ public class CertificateUtils { return Joiner.on(":").join(formattedBytes); } - public static Collection<String> getHostnames(X509Certificate certificate) throws CertificateParsingException { + @NonNull + public static Collection<String> getHostnames(@NonNull X509Certificate certificate) throws CertificateParsingException { Set<String> hostnames = new HashSet<>(); for (List<?> data : certificate.getSubjectAlternativeNames()) { if (Objects.equals(data.get(0), 2) && data.get(1) instanceof String) diff --git a/app/src/main/java/de/kuschku/util/certificates/SQLiteCertificateManager.java b/app/src/main/java/de/kuschku/util/certificates/SQLiteCertificateManager.java index 86c74a357..5f58d5c9f 100644 --- a/app/src/main/java/de/kuschku/util/certificates/SQLiteCertificateManager.java +++ b/app/src/main/java/de/kuschku/util/certificates/SQLiteCertificateManager.java @@ -1,6 +1,7 @@ package de.kuschku.util.certificates; import android.content.Context; +import android.support.annotation.NonNull; import java.security.cert.X509Certificate; import java.util.Collection; @@ -12,14 +13,15 @@ import de.kuschku.libquassel.ssl.UnknownCertificateException; import de.kuschku.util.ServerAddress; public class SQLiteCertificateManager implements CertificateManager { - private CertificateDatabaseHandler handler; + @NonNull + private final CertificateDatabaseHandler handler; public SQLiteCertificateManager(Context context) { this.handler = new CertificateDatabaseHandler(context); } @Override - public boolean isTrusted(X509Certificate certificate, ServerAddress core) { + public boolean isTrusted(@NonNull X509Certificate certificate, @NonNull ServerAddress core) { try { certificate.checkValidity(); return handler.findCertificates(core.host).contains(CertificateUtils.certificateToFingerprint(certificate)); @@ -29,7 +31,7 @@ public class SQLiteCertificateManager implements CertificateManager { } @Override - public boolean addCertificate(X509Certificate certificate, ServerAddress core) { + public boolean addCertificate(@NonNull X509Certificate certificate, @NonNull ServerAddress core) { try { return handler.addCertificate(CertificateUtils.certificateToFingerprint(certificate), core.host); } catch (Exception e) { @@ -38,7 +40,7 @@ public class SQLiteCertificateManager implements CertificateManager { } @Override - public boolean removeCertificate(X509Certificate certificate, ServerAddress core) { + public boolean removeCertificate(@NonNull X509Certificate certificate, @NonNull ServerAddress core) { try { return handler.removeCertificate(CertificateUtils.certificateToFingerprint(certificate), core.host); } catch (Exception e) { @@ -47,20 +49,22 @@ public class SQLiteCertificateManager implements CertificateManager { } @Override - public boolean removeAllCertificates(ServerAddress core) { + public boolean removeAllCertificates(@NonNull ServerAddress core) { return handler.removeCertificates(core.host); } @Override - public void checkTrusted(X509Certificate certificate, ServerAddress address) throws UnknownCertificateException { + public void checkTrusted(@NonNull X509Certificate certificate, @NonNull ServerAddress address) throws UnknownCertificateException { if (!isTrusted(certificate, address)) throw new UnknownCertificateException(certificate, address); } - public List<String> findCertificates(ServerAddress core) { + @NonNull + public List<String> findCertificates(@NonNull ServerAddress core) { return handler.findCertificates(core.host); } + @NonNull public Map<String, Collection<String>> findAllCertificates() { return handler.findAllCertificates(); } diff --git a/app/src/main/java/de/kuschku/util/instancestateutil/Storable.java b/app/src/main/java/de/kuschku/util/instancestateutil/Storable.java index b29e5ccec..b9e535c2a 100644 --- a/app/src/main/java/de/kuschku/util/instancestateutil/Storable.java +++ b/app/src/main/java/de/kuschku/util/instancestateutil/Storable.java @@ -9,6 +9,7 @@ import java.io.Serializable; import java.lang.reflect.Field; import java.util.ArrayList; +@SuppressWarnings("unchecked") public class Storable { public boolean onRestoreInstanceState(@NonNull Bundle in) { try { diff --git a/app/src/main/java/de/kuschku/util/keyboardutils/DialogKeyboardUtil.java b/app/src/main/java/de/kuschku/util/keyboardutils/DialogKeyboardUtil.java deleted file mode 100644 index 3e36cc221..000000000 --- a/app/src/main/java/de/kuschku/util/keyboardutils/DialogKeyboardUtil.java +++ /dev/null @@ -1,32 +0,0 @@ -package de.kuschku.util.keyboardutils; - -import android.content.DialogInterface; -import android.view.KeyEvent; - -import com.afollestad.materialdialogs.DialogAction; -import com.afollestad.materialdialogs.MaterialDialog; - -/** - * A util class that automatically handles <code>enter</code> and <code>esc</code> in dialogs - * properly: By calling onPositive or onNeutral - */ -public class DialogKeyboardUtil implements DialogInterface.OnKeyListener { - MaterialDialog dialog; - - public DialogKeyboardUtil(MaterialDialog dialog) { - this.dialog = dialog; - } - - @Override - public boolean onKey(DialogInterface d, int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_ENTER) { - dialog.getActionButton(DialogAction.POSITIVE).callOnClick(); - dialog.dismiss(); - return true; - } else if (keyCode == KeyEvent.KEYCODE_ESCAPE) { - dialog.dismiss(); - return true; - } - return false; - } -} diff --git a/app/src/main/java/de/kuschku/util/keyboardutils/EditTextKeyboardUtil.java b/app/src/main/java/de/kuschku/util/keyboardutils/EditTextKeyboardUtil.java deleted file mode 100644 index 317a416c5..000000000 --- a/app/src/main/java/de/kuschku/util/keyboardutils/EditTextKeyboardUtil.java +++ /dev/null @@ -1,62 +0,0 @@ -package de.kuschku.util.keyboardutils; - -import android.support.v7.widget.AppCompatEditText; -import android.util.Log; -import android.view.KeyEvent; -import android.view.View; - -//TODO: FIND A WAY TO TEST THIS – THE EMULATOR DOESN'T WORK -public class EditTextKeyboardUtil implements AppCompatEditText.OnKeyListener { - AppCompatEditText editText; - boolean reverse; - - public EditTextKeyboardUtil(AppCompatEditText editText) { - this.editText = editText; - } - - @Override - public boolean onKey(View v, int keyCode, KeyEvent event) { - Log.e("DEBUG", keyCode + " : " + event.toString()); - - if (event.isShiftPressed()) { - switch (keyCode) { - case KeyEvent.KEYCODE_DPAD_LEFT: - if (editText.getSelectionStart() == editText.getSelectionEnd()) - reverse = true; - - if (reverse) { - int start = Math.max(0, editText.getSelectionStart() - 1); - editText.setSelection(start, editText.getSelectionEnd()); - } else { - int end = Math.min(editText.length(), editText.getSelectionEnd() - 1); - editText.setSelection(end, end); - } - break; - case KeyEvent.KEYCODE_DPAD_RIGHT: - if (editText.getSelectionStart() == editText.getSelectionEnd()) - reverse = false; - - if (reverse) { - int start = Math.max(0, editText.getSelectionStart() + 1); - editText.setSelection(start, editText.getSelectionEnd()); - } else { - int end = Math.min(editText.length(), editText.getSelectionEnd() + 1); - editText.setSelection(end, end); - } - break; - } - } else { - switch (keyCode) { - case KeyEvent.KEYCODE_DPAD_LEFT: - int start = Math.max(0, editText.getSelectionStart() - 1); - editText.setSelection(start, start); - break; - case KeyEvent.KEYCODE_DPAD_RIGHT: - int end = Math.min(editText.length(), editText.getSelectionEnd() + 1); - editText.setSelection(end, end); - break; - } - } - return false; - } -} diff --git a/app/src/main/java/de/kuschku/util/niohelpers/Helper.java b/app/src/main/java/de/kuschku/util/niohelpers/Helper.java index 30a6250a8..70d3ac538 100644 --- a/app/src/main/java/de/kuschku/util/niohelpers/Helper.java +++ b/app/src/main/java/de/kuschku/util/niohelpers/Helper.java @@ -1,5 +1,6 @@ package de.kuschku.util.niohelpers; +import android.support.annotation.NonNull; import android.util.Log; public class Helper { @@ -8,7 +9,7 @@ public class Helper { } - public static void printHexDump(byte[] data) { + public static void printHexDump(@NonNull byte[] data) { Log.e("HexDump", "Hexdump following: "); String bytes = ""; String text = ""; diff --git a/app/src/main/java/de/kuschku/util/niohelpers/WrappedChannel.java b/app/src/main/java/de/kuschku/util/niohelpers/WrappedChannel.java index 33769496b..95e6974d2 100644 --- a/app/src/main/java/de/kuschku/util/niohelpers/WrappedChannel.java +++ b/app/src/main/java/de/kuschku/util/niohelpers/WrappedChannel.java @@ -48,7 +48,7 @@ public class WrappedChannel implements Flushable, ByteChannel, InterruptibleChan if (this.rawOut != null) this.out = new DataOutputStream(rawOut); } - public WrappedChannel(Socket s) throws IOException { + public WrappedChannel(@NonNull Socket s) throws IOException { this(s.getInputStream(), s.getOutputStream()); this.socket = s; } diff --git a/app/src/main/java/de/kuschku/util/observables/AutoScroller.java b/app/src/main/java/de/kuschku/util/observables/AutoScroller.java index 413495258..89d07c3e6 100644 --- a/app/src/main/java/de/kuschku/util/observables/AutoScroller.java +++ b/app/src/main/java/de/kuschku/util/observables/AutoScroller.java @@ -1,5 +1,6 @@ package de.kuschku.util.observables; +import android.support.annotation.NonNull; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -7,7 +8,7 @@ public class AutoScroller { private final RecyclerView recyclerView; private final LinearLayoutManager manager; - public AutoScroller(RecyclerView recyclerView) { + public AutoScroller(@NonNull RecyclerView recyclerView) { this(recyclerView, (LinearLayoutManager) recyclerView.getLayoutManager()); } diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/GeneralCallbackWrapper.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/GeneralCallbackWrapper.java index 1cb1f28d6..e66b93b37 100644 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/GeneralCallbackWrapper.java +++ b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/GeneralCallbackWrapper.java @@ -1,5 +1,7 @@ package de.kuschku.util.observables.callbacks.wrappers; +import android.support.annotation.NonNull; + import java.util.HashSet; import java.util.Set; @@ -7,7 +9,8 @@ import de.kuschku.util.observables.IObservable; import de.kuschku.util.observables.callbacks.GeneralCallback; public class GeneralCallbackWrapper implements IObservable<GeneralCallback>, GeneralCallback { - Set<GeneralCallback> callbacks = new HashSet<>(); + @NonNull + final Set<GeneralCallback> callbacks = new HashSet<>(); @Override public void notifyChanged() { diff --git a/app/src/main/java/de/kuschku/util/observables/lists/ChildParentObservableSortedList.java b/app/src/main/java/de/kuschku/util/observables/lists/ChildParentObservableSortedList.java index 45466867a..34b52407a 100644 --- a/app/src/main/java/de/kuschku/util/observables/lists/ChildParentObservableSortedList.java +++ b/app/src/main/java/de/kuschku/util/observables/lists/ChildParentObservableSortedList.java @@ -10,8 +10,8 @@ import de.kuschku.util.observables.callbacks.wrappers.MultiUIChildParentCallback import de.kuschku.util.observables.callbacks.wrappers.ParentUICallbackWrapper; public class ChildParentObservableSortedList<T extends IObservable<UIChildCallback>> extends ObservableSortedList<T> { - - private MultiUIChildParentCallback callback = MultiUIChildParentCallback.of(); + @NonNull + private final MultiUIChildParentCallback callback = MultiUIChildParentCallback.of(); public ChildParentObservableSortedList(@NonNull Class<T> cl, @NonNull ItemComparator<T> comparator) { super(cl, comparator); @@ -46,21 +46,6 @@ public class ChildParentObservableSortedList<T extends IObservable<UIChildCallba get(position).addCallback(callback); } - @Override - public void notifyItemChanged(int position) { - super.notifyItemChanged(position); - } - - @Override - public void notifyItemRemoved(int position) { - super.notifyItemRemoved(position); - } - - @Override - public void notifyItemMoved(int from, int to) { - super.notifyItemMoved(from, to); - } - @Override public void notifyItemRangeInserted(int position, int count) { super.notifyItemRangeInserted(position, count); @@ -69,14 +54,5 @@ public class ChildParentObservableSortedList<T extends IObservable<UIChildCallba } } - @Override - public void notifyItemRangeChanged(int position, int count) { - super.notifyItemRangeChanged(position, count); - } - - @Override - public void notifyItemRangeRemoved(int position, int count) { - super.notifyItemRangeRemoved(position, count); - } } } diff --git a/app/src/main/java/de/kuschku/util/observables/lists/ObservableElementList.java b/app/src/main/java/de/kuschku/util/observables/lists/ObservableElementList.java index 44a5f35d3..cd9a49d33 100644 --- a/app/src/main/java/de/kuschku/util/observables/lists/ObservableElementList.java +++ b/app/src/main/java/de/kuschku/util/observables/lists/ObservableElementList.java @@ -9,6 +9,7 @@ import java.util.Iterator; import de.kuschku.util.observables.callbacks.ElementCallback; import de.kuschku.util.observables.callbacks.wrappers.MultiElementCallbackWrapper; +@SuppressWarnings("unchecked") public class ObservableElementList<T> extends ArrayList<T> implements IObservableList<ElementCallback<T>, T> { @NonNull private final MultiElementCallbackWrapper<T> callback = MultiElementCallbackWrapper.<T>of(); diff --git a/app/src/main/java/de/kuschku/util/observables/lists/ObservableSortedList.java b/app/src/main/java/de/kuschku/util/observables/lists/ObservableSortedList.java index 41c8ffb83..8f39a208d 100644 --- a/app/src/main/java/de/kuschku/util/observables/lists/ObservableSortedList.java +++ b/app/src/main/java/de/kuschku/util/observables/lists/ObservableSortedList.java @@ -19,6 +19,7 @@ import de.kuschku.util.observables.callbacks.wrappers.MultiUICallbackWrapper; import static de.kuschku.util.AndroidAssert.assertTrue; +@SuppressWarnings("unchecked") public class ObservableSortedList<T> implements IObservableList<UICallback, T> { @NonNull private final SortedList<T> list; @@ -213,6 +214,7 @@ public class ObservableSortedList<T> implements IObservableList<UICallback, T> { callback.notifyItemChanged(position); } + @NonNull @Override public String toString() { return Arrays.toString(toArray()); @@ -234,35 +236,31 @@ public class ObservableSortedList<T> implements IObservableList<UICallback, T> { @Override public void onInserted(int position, int count) { - if (callback != null) - if (count == 1) - callback.notifyItemInserted(position); - else - callback.notifyItemRangeInserted(position, count); + if (count == 1) + callback.notifyItemInserted(position); + else + callback.notifyItemRangeInserted(position, count); } @Override public void onRemoved(int position, int count) { - if (callback != null) - if (count == 1) - callback.notifyItemRemoved(position); - else - callback.notifyItemRangeRemoved(position, count); + if (count == 1) + callback.notifyItemRemoved(position); + else + callback.notifyItemRangeRemoved(position, count); } @Override public void onMoved(int fromPosition, int toPosition) { - if (callback != null) - callback.notifyItemMoved(fromPosition, toPosition); + callback.notifyItemMoved(fromPosition, toPosition); } @Override public void onChanged(int position, int count) { - if (callback != null) - if (count == 1) - callback.notifyItemChanged(position); - else - callback.notifyItemRangeChanged(position, count); + if (count == 1) + callback.notifyItemChanged(position); + else + callback.notifyItemRangeChanged(position, count); } @Override diff --git a/app/src/main/java/de/kuschku/util/ui/MessageUtil.java b/app/src/main/java/de/kuschku/util/ui/MessageUtil.java index e14b2ea81..9426c9a47 100644 --- a/app/src/main/java/de/kuschku/util/ui/MessageUtil.java +++ b/app/src/main/java/de/kuschku/util/ui/MessageUtil.java @@ -1,6 +1,7 @@ package de.kuschku.util.ui; import android.graphics.Typeface; +import android.support.annotation.NonNull; import android.text.Spannable; import android.text.SpannableString; import android.text.SpannableStringBuilder; @@ -18,7 +19,8 @@ public class MessageUtil { /** * Parse mIRC style codes in IrcMessage */ - public static SpannableString parseStyleCodes(ThemeUtil themeUtil, String content, boolean parse) { + @NonNull + public static SpannableString parseStyleCodes(@NonNull ThemeUtil themeUtil, @NonNull String content, boolean parse) { if (!parse) { return new SpannableString(content .replaceAll("\\x02", "") @@ -46,7 +48,6 @@ public class MessageUtil { int start, end, endSearchOffset, startIndicatorLength, style, fg, bg; while (true) { content = newString.toString(); - start = -1; end = -1; startIndicatorLength = 1; style = 0; diff --git a/app/src/main/java/de/kuschku/util/ui/parcelableUtil/StorageBackendParcelable.java b/app/src/main/java/de/kuschku/util/ui/parcelableUtil/StorageBackendParcelable.java index 0132e130f..4b9bd9dbd 100644 --- a/app/src/main/java/de/kuschku/util/ui/parcelableUtil/StorageBackendParcelable.java +++ b/app/src/main/java/de/kuschku/util/ui/parcelableUtil/StorageBackendParcelable.java @@ -94,12 +94,14 @@ public class StorageBackendParcelable extends StorageBackend implements Parcelab dest.writeInt(type.getValue()); switch (type) { case Int: + assertNotNull(q.data); dest.writeInt((Integer) q.data); break; case QString: dest.writeString((String) q.data); break; case Bool: + assertNotNull(q.data); dest.writeInt(((Boolean) q.data) ? 1 : 0); break; default: diff --git a/app/src/main/res/drawable/popup_background_material.xml b/app/src/main/res/drawable/popup_background_material.xml deleted file mode 100644 index d8de1f5bd..000000000 --- a/app/src/main/res/drawable/popup_background_material.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2014 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - - <corners android:radius="2dp" /> - <solid android:color="?attr/colorBackground" /> - -</shape> diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml index 2fd170432..404ade997 100644 --- a/app/src/main/res/layout/content_main.xml +++ b/app/src/main/res/layout/content_main.xml @@ -1,9 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" android:id="@+id/swipe_view" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="?attr/colorBackground"> + android:background="?attr/colorBackground" + tools:showIn="@layout/activity_chat"> <android.support.v7.widget.RecyclerView android:id="@+id/messages" diff --git a/app/src/main/res/layout/dialog_address.xml b/app/src/main/res/layout/dialog_address.xml index 0942bf2b9..b73bd050d 100644 --- a/app/src/main/res/layout/dialog_address.xml +++ b/app/src/main/res/layout/dialog_address.xml @@ -13,7 +13,7 @@ android:layout_height="wrap_content"> <android.support.v7.widget.AppCompatEditText android:id="@+id/host" - android:hint="Hostname" + android:hint="@string/labelHostname" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textUri" /> @@ -24,8 +24,7 @@ android:layout_height="wrap_content"> <android.support.v7.widget.AppCompatEditText android:id="@+id/port" - android:hint="Port" - android:text="4242" + android:hint="@string/labelPort" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" /> diff --git a/app/src/main/res/layout/dialog_login.xml b/app/src/main/res/layout/dialog_login.xml index fedef624f..feb924391 100644 --- a/app/src/main/res/layout/dialog_login.xml +++ b/app/src/main/res/layout/dialog_login.xml @@ -13,7 +13,7 @@ android:layout_height="wrap_content"> <android.support.v7.widget.AppCompatEditText android:id="@+id/username" - android:hint="Username" + android:hint="@string/labelUsername" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="text" /> @@ -24,7 +24,7 @@ android:layout_height="wrap_content"> <android.support.v7.widget.AppCompatEditText android:id="@+id/password" - android:hint="Password" + android:hint="@string/labelPassword" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPassword" /> diff --git a/app/src/main/res/layout/slider_main.xml b/app/src/main/res/layout/slider_main.xml index f3c374a74..b4b03e6c4 100644 --- a/app/src/main/res/layout/slider_main.xml +++ b/app/src/main/res/layout/slider_main.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <com.sothree.slidinguppanel.SlidingUpPanelLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:sothree="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" android:id="@+id/sliding_layout_history" android:layout_width="fill_parent" android:layout_height="fill_parent" @@ -12,7 +13,8 @@ sothree:umanoOverlay="true" sothree:umanoPanelHeight="@dimen/message_history_panel_height" sothree:umanoScrollableView="@+id/msg_history" - sothree:umanoShadowHeight="0.0dip"> + sothree:umanoShadowHeight="0.0dip" + tools:showIn="@layout/activity_chat"> <include layout="@layout/widget_editor" /> @@ -42,7 +44,7 @@ android:gravity="center_vertical" android:paddingLeft="16.0dip" android:paddingRight="16.0dip" - android:text="@string/message_history" + android:text="@string/labelHistory" android:textAppearance="@style/TextAppearance.AppCompat.Body2" android:textColor="?attr/colorForegroundSecondary" /> diff --git a/app/src/main/res/layout/widget_editor.xml b/app/src/main/res/layout/widget_editor.xml index 58e98cb79..da173e340 100644 --- a/app/src/main/res/layout/widget_editor.xml +++ b/app/src/main/res/layout/widget_editor.xml @@ -1,9 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> -<RelativeLayout - xmlns:android="http://schemas.android.com/apk/res/android" +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingBottom="@dimen/message_history_panel_height"> + xmlns:tools="http://schemas.android.com/tools" + android:paddingBottom="@dimen/message_history_panel_height" + tools:showIn="@layout/slider_main"> <ScrollView android:id="@+id/chatline_scroller" @@ -22,7 +23,7 @@ android:layout_height="?attr/actionBarSize" android:background="@android:color/transparent" android:gravity="top" - android:hint="@string/message_placeholder" + android:hint="@string/placeholder" android:inputType="textCapSentences|textShortMessage|textAutoCorrect" android:paddingBottom="17dp" android:paddingLeft="20dp" diff --git a/app/src/main/res/menu/chat.xml b/app/src/main/res/menu/chat.xml index 9f5ae5a47..16640329a 100644 --- a/app/src/main/res/menu/chat.xml +++ b/app/src/main/res/menu/chat.xml @@ -5,11 +5,6 @@ android:id="@+id/action_hide_events" android:icon="@android:drawable/ic_menu_sort_by_size" android:orderInCategory="100" - android:title="Hide events" + android:title="@string/labelHideEvents" app:showAsAction="ifRoom" /> - <item - android:id="@+id/action_settings" - android:orderInCategory="100" - android:title="@string/action_settings" - app:showAsAction="never" /> </menu> diff --git a/app/src/main/res/menu/formatting.xml b/app/src/main/res/menu/formatting.xml index d2319d915..bbabecc87 100644 --- a/app/src/main/res/menu/formatting.xml +++ b/app/src/main/res/menu/formatting.xml @@ -3,32 +3,32 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/format_bold" - android:icon="?attr/ic_format_bold" + android:icon="?attr/iconFormatBold" app:showAsAction="always" - android:title="@string/format_bold" /> + android:title="@string/formatBold" /> <item android:id="@+id/format_italic" - android:icon="?attr/ic_format_italic" + android:icon="?attr/iconFormatItalic" app:showAsAction="always" - android:title="@string/format_italic" /> + android:title="@string/formatItalic" /> <item android:id="@+id/format_underline" - android:icon="?attr/ic_format_underline" + android:icon="?attr/iconFormatUnderline" app:showAsAction="always" - android:title="@string/format_underline" /> + android:title="@string/formatUnderline" /> <item android:id="@+id/format_paint" - android:icon="?attr/ic_format_paint" + android:icon="?attr/iconFormatPaint" app:showAsAction="always" - android:title="@string/format_color" /> + android:title="@string/formatColor" /> <item android:id="@+id/format_fill" - android:icon="?attr/ic_format_fill" + android:icon="?attr/iconFormatFill" app:showAsAction="always" - android:title="@string/format_fill" /> + android:title="@string/formatFill" /> <item android:id="@+id/action_history" - android:icon="?attr/ic_history" + android:icon="?attr/iconHistory" app:showAsAction="always" - android:title="@string/message_history" /> + android:title="@string/labelHistory" /> </menu> diff --git a/app/src/main/res/menu/global.xml b/app/src/main/res/menu/global.xml deleted file mode 100644 index 80dac4c96..000000000 --- a/app/src/main/res/menu/global.xml +++ /dev/null @@ -1,8 +0,0 @@ -<menu xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - <item - android:id="@+id/action_settings" - android:orderInCategory="100" - android:title="@string/action_settings" - app:showAsAction="never" /> -</menu> diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index c782848f4..ccd73f507 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -60,12 +60,12 @@ <attr name="chatlineExpandedSize" /> <!-- Format icons --> - <attr name="ic_format_bold" format="reference" /> - <attr name="ic_format_italic" format="reference" /> - <attr name="ic_format_underline" format="reference" /> - <attr name="ic_format_paint" format="reference" /> - <attr name="ic_format_fill" format="reference" /> - <attr name="ic_history" format="reference" /> + <attr name="iconFormatBold" format="reference" /> + <attr name="iconFormatItalic" format="reference" /> + <attr name="iconFormatUnderline" format="reference" /> + <attr name="iconFormatPaint" format="reference" /> + <attr name="iconFormatFill" format="reference" /> + <attr name="iconHistory" format="reference" /> <attr name="cardStyle" format="reference" /> </resources> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 879ca0f5a..08082e6cc 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,14 +2,9 @@ <!-- Default screen margins, per the Android Design guidelines. --> <dimen name="activity_horizontal_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dimen> - <dimen name="fab_margin">16dp</dimen> <dimen name="message_horizontal">8dp</dimen> <dimen name="message_vertical">4dp</dimen> - <dimen name="text_margin">16dp</dimen> - <!-- Per the design guidelines, navigation drawers should be between 240dp and 320dp: - https://developer.android.com/design/patterns/navigation-drawer.html --> - <dimen name="navigation_drawer_width">240dp</dimen> <dimen name="message_history_panel_height">0dip</dimen> </resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a6a06bdd2..346d1f116 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,44 +1,60 @@ <resources> - <string name="app_name">QuasselDroid</string> - <string name="action_settings">Settings</string> + <string name="appName">QuasselDroid</string> + <string name="appDescription">An Android-based client for the decentralized Quassel IRC client.</string> + <string name="appDescriptionLong">Quassel is a distributed, decentralized IRC client, written using C++ and Qt. QuasselDroid is a pure-java client for the Quassel core, allowing you to connect to your Quassel core using your Android™ phone.</string> + <string name="appLinkGithubTitle">GitHub</string> + <string name="appLinkGithubUrl" translatable="false">https://github.com/sandsmark/QuasselDroid</string> + <string name="appLinkCommunityTitle">Community</string> + <string name="appLinkCommunityUrl" translatable="false">https://plus.google.com/communities/104094956084217666662</string> <!-- Message format strings --> - <string name="message_plain">%1$s: %2$s</string> + <string name="usernameHostmask">%1$s (%2$s)</string> - <string name="message_join">%1$s has joined %2$s</string> + <string name="messagePlain">%1$s: %2$s</string> - <string name="message_part">%1$s has left %2$s</string> - <string name="message_part_extra">"%1$s has left %2$s (%3$s)</string> + <string name="messageJoin">%1$s has joined %2$s</string> - <string name="message_quit">%1$s has quit</string> - <string name="message_quit_extra">%1$s has quit (%2$s)</string> + <string name="messagePart">%1$s has left %2$s</string> + <string name="messagePartExtra">"%1$s has left %2$s (%3$s)</string> - <string name="message_kill">%1$s was killed: %2$s</string> + <string name="messageQuit">%1$s has quit</string> + <string name="messageQuitExtra">%1$s has quit (%2$s)</string> - <string name="message_kick">%1$s has kicked %2$s from %3$s</string> - <string name="message_kick_extra">%1$s has kicked %2$s from %3$s: %4$s</string> + <string name="messageKill">%1$s was killed: %2$s</string> - <string name="message_mode">Mode %1$s by %2$s</string> + <string name="messageKick">%1$s has kicked %2$s from %3$s</string> + <string name="messageKickExtra">%1$s has kicked %2$s from %3$s: %4$s</string> - <string name="message_nick_self">You are now known as %1$s</string> - <string name="message_nick_other">%1$s is now known as %2$s</string> + <string name="messageMode">Mode %1$s by %2$s</string> - <string name="message_daychange">{ Day changed to %1$s }</string> + <string name="messageNickSelf">You are now known as %1$s</string> + <string name="messageNickOther">%1$s is now known as %2$s</string> - <string name="message_action">* %1$s %2$s</string> + <string name="messageDayChange">{ Day changed to %1$s }</string> + + <string name="messageAction">* %1$s %2$s</string> <!-- Editor UI --> - <string name="message_placeholder">Write a message…</string> - <string name="message_history">Message History</string> - <string name="format_bold">Bold</string> - <string name="format_italic">Italic</string> - <string name="format_underline">Underline</string> - <string name="format_color">Text Color</string> - <string name="format_fill">Background Color</string> - - <!-- Misc --> - <string name="username_hostmask">%1$s (%2$s)</string> - <string name="title_status_buffer">Status Buffer</string> - <string name="open_drawer">open</string> - <string name="close_drawer">close</string> + <string name="placeholder">Write a message…</string> + <string name="formatBold">Bold</string> + <string name="formatItalic">Italic</string> + <string name="formatUnderline">Underline</string> + <string name="formatColor">Text Color</string> + <string name="formatFill">Background Color</string> + + <!-- Actions --> + <string name="labelLogin">Login</string> + <string name="labelCancel">Cancel</string> + <string name="labelConnect">Connect</string> + <string name="labelSettings">Settings</string> + <string name="labelStatusBuffer">Status Buffer</string> + <string name="labelAddress">Address</string> + <string name="labelHistory">Input History</string> + <string name="labelHostname">Hostname</string> + <string name="labelPort">Port</string> + <string name="labelPassword">Password</string> + <string name="labelUsername">Username</string> + <string name="labelHideEvents">Hide events</string> + + <string name="warningCertificate">Do you trust this certificate?</string> </resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 4e8d94402..e297271ad 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -11,12 +11,12 @@ <item name="colorControlHighlight">@color/colorAccentFocus</item> <item name="windowActionModeOverlay">true</item> - <item name="ic_format_bold">@drawable/ic_format_bold_dark</item> - <item name="ic_format_italic">@drawable/ic_format_italic_dark</item> - <item name="ic_format_underline">@drawable/ic_format_underline_dark</item> - <item name="ic_format_paint">@drawable/ic_format_paint_dark</item> - <item name="ic_format_fill">@drawable/ic_format_fill_dark</item> - <item name="ic_history">@drawable/ic_history_dark</item> + <item name="iconFormatBold">@drawable/ic_format_bold_dark</item> + <item name="iconFormatItalic">@drawable/ic_format_italic_dark</item> + <item name="iconFormatUnderline">@drawable/ic_format_underline_dark</item> + <item name="iconFormatPaint">@drawable/ic_format_paint_dark</item> + <item name="iconFormatFill">@drawable/ic_format_fill_dark</item> + <item name="iconHistory">@drawable/ic_history_dark</item> <item name="cardStyle">@style/CardView.Dark</item> </style> @@ -31,12 +31,12 @@ <item name="colorControlHighlight">@color/colorAccentFocus</item> <item name="windowActionModeOverlay">true</item> - <item name="ic_format_bold">@drawable/ic_format_bold_light</item> - <item name="ic_format_italic">@drawable/ic_format_italic_light</item> - <item name="ic_format_underline">@drawable/ic_format_underline_light</item> - <item name="ic_format_paint">@drawable/ic_format_paint_light</item> - <item name="ic_format_fill">@drawable/ic_format_fill_light</item> - <item name="ic_history">@drawable/ic_history_light</item> + <item name="iconFormatBold">@drawable/ic_format_bold_light</item> + <item name="iconFormatItalic">@drawable/ic_format_italic_light</item> + <item name="iconFormatUnderline">@drawable/ic_format_underline_light</item> + <item name="iconFormatPaint">@drawable/ic_format_paint_light</item> + <item name="iconFormatFill">@drawable/ic_format_fill_light</item> + <item name="iconHistory">@drawable/ic_history_light</item> <item name="cardStyle">@style/CardView.Light</item> </style> -- GitLab