diff --git a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java index 3da4609ceb5a2cc4121aa37044c4d837f9f5a870..685c074ba23d514b77437973a016cd70a3b125b6 100644 --- a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java +++ b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java @@ -96,7 +96,7 @@ public class ProtocolHandler implements IProtocolHandler { final Object syncable = client.unsafe_getObjectByIdentifier(packedFunc.className, packedFunc.objectName); if (syncable == null) { - Log.d("ProtocolHandler", String.format("Sync Failed: %s::%s(%s, %s)", packedFunc.className, packedFunc.methodName, packedFunc.objectName, packedFunc.params)); + Log.w("ProtocolHandler", String.format("Sync Failed: %s::%s(%s, %s)", packedFunc.className, packedFunc.methodName, packedFunc.objectName, packedFunc.params)); if (client.connectionStatus() == ConnectionChangeEvent.Status.INITIALIZING_DATA) client.bufferSync(packedFunc); } else { diff --git a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java index 832b84ff6183dcf3288a1b9fa88a4d635c1f3073..749bc98ef395e8fa8f871fc1021fb6ea574c3712 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java +++ b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java @@ -24,6 +24,7 @@ package de.kuschku.libquassel.client; import android.support.annotation.IntRange; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.util.Log; import java.util.HashMap; import java.util.HashSet; @@ -38,7 +39,9 @@ import de.kuschku.libquassel.localtypes.buffers.Buffer; import de.kuschku.libquassel.localtypes.buffers.Buffers; import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer; import de.kuschku.libquassel.localtypes.buffers.QueryBuffer; +import de.kuschku.libquassel.localtypes.buffers.StatusBuffer; import de.kuschku.libquassel.primitives.types.BufferInfo; +import de.kuschku.libquassel.syncables.types.impl.Network; import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; @@ -53,6 +56,7 @@ public class BufferManager { private final Map<String, Integer> buffersByNick = new HashMap<>(); private final Map<String, Integer> buffersByChannel = new HashMap<>(); + private final Map<Integer, Integer> statusBuffers = new HashMap<>(); private final Map<Integer, ObservableSet<Integer>> buffersByNetwork = new HashMap<>(); private final ObservableSet<Integer> bufferIds = new ObservableSet<>(); private final Set<Integer> laterRequests = new HashSet<>(); @@ -120,12 +124,15 @@ public class BufferManager { } private void updateBufferMapEntries(@NonNull Buffer buffer, String name) { - buffersByNick.remove(buffer.objectName()); - buffersByChannel.remove(buffer.objectName()); if (buffer instanceof ChannelBuffer) { + buffersByChannel.remove(buffer.objectName()); buffersByChannel.put(buffer.objectName(name), buffer.getInfo().id); } else if (buffer instanceof QueryBuffer) { + buffersByNick.remove(buffer.objectName()); buffersByNick.put(buffer.objectName(name), buffer.getInfo().id); + } else if (buffer instanceof StatusBuffer) { + statusBuffers.remove(buffer.getInfo().networkId); + statusBuffers.put(buffer.getInfo().networkId, buffer.getInfo().id); } } @@ -187,4 +194,8 @@ public class BufferManager { client.setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED); } } + + public StatusBuffer network(int networkId) { + return (StatusBuffer) buffers.get(statusBuffers.get(networkId)); + } } diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java index 0281af62ebb68ec7e7c03ac51185af8d692b830c..b12ba76f2ab7dc0c5a3f2497d6b3e1f4360a770f 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java @@ -204,7 +204,6 @@ public class BacklogFilter implements UICallback { setFiltersInternal(filters); client.metaDataManager().setHiddendata(client.coreId(), bufferId, filters); int after = client.metaDataManager().hiddendata(client.coreId(), bufferId); - Log.e("DEBUG", filters + ":" + after); } private void setFiltersInternal(int filters) { diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/BacklogStorage.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/BacklogStorage.java index 1df4329f9112162158fc82540a702cacc7029c61..32418578b5a3ea813bdf69f5a8cae5a1c770e2f2 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/BacklogStorage.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/BacklogStorage.java @@ -25,6 +25,7 @@ import android.support.annotation.IntRange; import android.support.annotation.NonNull; import java.util.List; +import java.util.Set; import de.kuschku.libquassel.client.Client; import de.kuschku.libquassel.localtypes.BacklogFilter; @@ -56,4 +57,6 @@ public interface BacklogStorage { void markBufferUnused(@IntRange(from = 0) int bufferid); void clear(@IntRange(from = 0) int bufferid); + + Set<BacklogFilter> getFilters(); } diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java index 7a53276ec8647f2745a76d893fb82c6995727f10..c85e01f8c331930a8b64fcc0d8bb5496fb7dfb02 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java @@ -31,7 +31,9 @@ import com.raizlabs.android.dbflow.sql.language.SQLite; import com.raizlabs.android.dbflow.structure.database.DatabaseWrapper; import com.raizlabs.android.dbflow.structure.database.transaction.ITransaction; +import java.util.HashSet; import java.util.List; +import java.util.Set; import de.kuschku.libquassel.client.Client; import de.kuschku.libquassel.localtypes.BacklogFilter; @@ -51,6 +53,8 @@ public class HybridBacklogStorage implements BacklogStorage { private final SparseArray<BacklogFilter> filters = new SparseArray<>(); @NonNull private final SparseArray<Integer> latestMessage = new SparseArray<>(); + @NonNull + private final Set<BacklogFilter> filterSet = new HashSet<>(); private Client client; @@ -175,7 +179,10 @@ public class HybridBacklogStorage implements BacklogStorage { backlogs.get(bufferid).removeCallback(filters.get(bufferid)); backlogs.remove(bufferid); filteredBacklogs.remove(bufferid); - filters.remove(bufferid); + synchronized (filterSet) { + filterSet.remove(filters.get(bufferid)); + filters.remove(bufferid); + } } } @@ -187,6 +194,12 @@ public class HybridBacklogStorage implements BacklogStorage { } } + @NonNull + @Override + public Set<BacklogFilter> getFilters() { + return filterSet; + } + private void ensureExisting(@IntRange(from = -1) int bufferId) { assertNotNull(client); if (backlogs.get(bufferId) == null) { @@ -200,7 +213,10 @@ public class HybridBacklogStorage implements BacklogStorage { backlogs.put(bufferId, messages); } filteredBacklogs.put(bufferId, filteredMessages); - filters.put(bufferId, backlogFilter); + synchronized (filterSet) { + filters.put(bufferId, backlogFilter); + filterSet.add(backlogFilter); + } } } } diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java deleted file mode 100644 index fe0c2e4bab1786399fde3885bd51c6c3f60fb858..0000000000000000000000000000000000000000 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.localtypes.backlogstorage; - -import android.support.annotation.IntRange; -import android.support.annotation.NonNull; -import android.util.SparseArray; - -import java.util.List; - -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.localtypes.BacklogFilter; -import de.kuschku.libquassel.message.Message; -import de.kuschku.util.observables.lists.ObservableComparableSortedList; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -public class MemoryBacklogStorage implements BacklogStorage { - @NonNull - private final SparseArray<ObservableComparableSortedList<Message>> backlogs = new SparseArray<>(); - @NonNull - private final SparseArray<ObservableComparableSortedList<Message>> filteredBacklogs = new SparseArray<>(); - @NonNull - private final SparseArray<BacklogFilter> filters = new SparseArray<>(); - @NonNull - private final SparseArray<Integer> latestMessage = new SparseArray<>(); - - private Client client; - - @NonNull - @Override - public ObservableComparableSortedList<Message> getUnfiltered(@IntRange(from = -1) int bufferid) { - ensureExisting(bufferid); - return backlogs.get(bufferid); - } - - @NonNull - @Override - public ObservableComparableSortedList<Message> getFiltered(@IntRange(from = -1) int bufferid) { - ensureExisting(bufferid); - return filteredBacklogs.get(bufferid); - } - - @NonNull - @Override - public BacklogFilter getFilter(int bufferid) { - ensureExisting(bufferid); - return filters.get(bufferid); - } - - @Override - public int getLatest(@IntRange(from = 0) int bufferid) { - return latestMessage.get(bufferid, -1); - } - - @Override - public void insertMessages(@IntRange(from = 0) int bufferId, @NonNull Message... messages) { - ensureExisting(bufferId); - for (Message message : messages) { - client.unbufferBuffer(message.bufferInfo); - backlogs.get(bufferId).add(message); - updateLatest(message); - } - } - - @Override - public void insertMessages(@IntRange(from = 0) int bufferId, List<Message> messages) { - ensureExisting(bufferId); - for (Message message : messages) { - client.unbufferBuffer(message.bufferInfo); - backlogs.get(bufferId).add(message); - updateLatest(message); - } - } - - public void updateLatest(@NonNull Message message) { - if (message.id > getLatest(message.bufferInfo.id)) { - latestMessage.put(message.bufferInfo.id, message.id); - } - } - - @Override - public void insertMessages(@NonNull Message... messages) { - for (Message message : messages) { - ensureExisting(message.bufferInfo.id); - client.unbufferBuffer(message.bufferInfo); - backlogs.get(message.bufferInfo.id).add(message); - updateLatest(message); - } - } - - @Override - public void insertMessages(List<Message> messages) { - for (Message message : messages) { - ensureExisting(message.bufferInfo.id); - client.unbufferBuffer(message.bufferInfo); - backlogs.get(message.bufferInfo.id).add(message); - updateLatest(message); - } - } - - public void setClient(Client client) { - this.client = client; - } - - @Override - public void markBufferUnused(@IntRange(from = 0) int bufferid) { - // Does nothing in memory backlog storage - } - - @Override - public void clear(@IntRange(from = 0) int bufferid) { - ensureExisting(bufferid); - backlogs.get(bufferid).clear(); - } - - private void ensureExisting(@IntRange(from = -1) int bufferId) { - assertNotNull(client); - if (backlogs.get(bufferId) == null) { - ObservableComparableSortedList<Message> messages = new ObservableComparableSortedList<>(Message.class, true); - ObservableComparableSortedList<Message> filteredMessages = new ObservableComparableSortedList<>(Message.class, true); - BacklogFilter backlogFilter = new BacklogFilter(client, bufferId, messages, filteredMessages); - messages.addCallback(backlogFilter); - backlogs.put(bufferId, messages); - filteredBacklogs.put(bufferId, filteredMessages); - filters.put(bufferId, backlogFilter); - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java index 72ae63042aed01ba73e04f16dd56200c7659effa..bf87ac64d87295523a96cb2e25a1deb2abb8ce0f 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java @@ -41,6 +41,10 @@ public class StatusBuffer implements Buffer { this.client = client; } + public void updateStatus() { + status.set(getNetwork() != null && getNetwork().isConnected() ? BufferInfo.BufferStatus.ONLINE : BufferInfo.BufferStatus.OFFLINE); + } + @NonNull @Override public BufferInfo getInfo() { @@ -65,8 +69,7 @@ public class StatusBuffer implements Buffer { @NonNull @Override public ObservableField<BufferInfo.BufferStatus> getStatus() { - // FIXME: Make this dynamic - status.set(getNetwork().isConnected() ? BufferInfo.BufferStatus.ONLINE : BufferInfo.BufferStatus.OFFLINE); + updateStatus(); return status; } 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 7b2ed24e00848649d4824e5d322bc187f6205026..716699c6cf5b2bcc57ac826723cd63ef389cef7c 100644 --- a/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java +++ b/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java @@ -94,7 +94,7 @@ public class DatastreamPeer implements RemotePeer { this.connection = connection; this.busProvider = busProvider; this.busProvider.dispatch.register(this); - this.parseExecutor = Executors.newCachedThreadPool(); + this.parseExecutor = Executors.newSingleThreadExecutor(); } @NonNull diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java index c2d02098206966572ac0a075d89ea7327ec6fea8..288e7249f3d80d7bfa392317ae88b78d882fd526 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java @@ -23,14 +23,17 @@ package de.kuschku.libquassel.syncables.types.impl; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.util.Log; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import de.kuschku.libquassel.BusProvider; import de.kuschku.libquassel.client.Client; +import de.kuschku.libquassel.localtypes.BacklogFilter; import de.kuschku.libquassel.message.Message; import de.kuschku.libquassel.primitives.types.QVariant; import de.kuschku.libquassel.syncables.serializers.IgnoreListManagerSerializer; @@ -112,22 +115,21 @@ public class IgnoreListManager extends AIgnoreListManager<IgnoreListManager> { @Override public StrictnessType match(String msgContents, String msgSender, Message.Type msgType, @NonNull String network, @NonNull String bufferName) { - if (msgType != Message.Type.Plain && msgType != Message.Type.Notice && msgType != Message.Type.Action) - return StrictnessType.UnmatchedStrictness; - - for (IgnoreListItem item : ignoreList) { - if (!item.isActive || item.type == IgnoreType.CtcpIgnore) - continue; - - if (item.scopeMatch(network, bufferName)) { - String str; - if (item.type == IgnoreType.MessageIgnore) - str = msgContents; - else - str = msgSender; - - if (item.matches(str)) - return item.strictness; + if (msgType == Message.Type.Plain || msgType == Message.Type.Notice || msgType == Message.Type.Action) { + for (IgnoreListItem item : ignoreList) { + if (!item.isActive || item.type == IgnoreType.CtcpIgnore) + continue; + + if (item.scopeMatch(network, bufferName)) { + String str; + if (item.type == IgnoreType.MessageIgnore) + str = msgContents; + else + str = msgSender; + + if (item.matches(str)) + return item.strictness; + } } } return StrictnessType.UnmatchedStrictness; @@ -140,7 +142,19 @@ public class IgnoreListManager extends AIgnoreListManager<IgnoreListManager> { @Override public void _update(IgnoreListManager from) { + this.ignoreList.clear(); + this.ignoreList.addAll(from.ignoreList); + this._update(); + } + @Override + public void _update() { + super._update(); + synchronized (client.backlogStorage().getFilters()) { + for (BacklogFilter filter : client.backlogStorage().getFilters()) { + filter.update(); + } + } } @Override @@ -207,5 +221,23 @@ public class IgnoreListManager extends AIgnoreListManager<IgnoreListManager> { } return false; } + + @Override + public String toString() { + return "IgnoreListItem{" + + "type=" + type + + ", ignoreRule=" + ignoreRule + + ", isRegEx=" + isRegEx + + ", strictness=" + strictness + + ", scope=" + scope + + ", scopeRules=" + Arrays.toString(scopeRules) + + ", isActive=" + isActive + + '}'; + } + } + + @Override + public String toString() { + return String.valueOf(ignoreList); } } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java index 201f33605921e7d7f88e916c64ff7db36b2aa4a3..0bbf2d0f79274614edf16bab3cda57da158c73a2 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java @@ -37,6 +37,7 @@ import java.util.Set; import de.kuschku.libquassel.BusProvider; import de.kuschku.libquassel.client.Client; +import de.kuschku.libquassel.events.ConnectionChangeEvent; import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer; import de.kuschku.libquassel.primitives.types.BufferInfo; import de.kuschku.libquassel.primitives.types.QVariant; @@ -532,10 +533,12 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { @Override public void _update() { super._update(); - ChannelBuffer buffer = client.bufferManager().channel(this); - if (buffer != null) { - for (QBufferViewConfig qBufferViewConfig : client.bufferViewManager().bufferViewConfigs()) { - qBufferViewConfig.bufferIds().notifyItemChanged(buffer.getInfo().id); + if (client.connectionStatus() != ConnectionChangeEvent.Status.INITIALIZING_DATA) { + ChannelBuffer buffer = client.bufferManager().channel(this); + if (buffer != null) { + for (QBufferViewConfig qBufferViewConfig : client.bufferViewManager().bufferViewConfigs()) { + qBufferViewConfig.bufferIds().notifyItemChanged(buffer.getInfo().id); + } } } } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java index aa7e94d8cfd1322338bdb5e018ab251f0150b2ed..c00da699fa9f44445ba3c181131f841af47b2aec 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java @@ -405,8 +405,10 @@ public class IrcUser extends AIrcUser<IrcUser> { channels.remove(channel); if (!skip_channel_part) channel._part(this); + /* if (channels.isEmpty() && !network().isMe(this)) _quit(); + */ } _update(); } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java index 04844b485ae9a18aafc8218e6d1ab3a8e83158d0..41fda6a571a15142830dd4ae9e6ee607f951a121 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java @@ -23,6 +23,7 @@ package de.kuschku.libquassel.syncables.types.impl; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.util.Log; import java.util.ArrayList; import java.util.Arrays; @@ -35,9 +36,13 @@ import java.util.Observer; import de.kuschku.libquassel.BusProvider; import de.kuschku.libquassel.client.Client; +import de.kuschku.libquassel.events.ConnectionChangeEvent; +import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer; +import de.kuschku.libquassel.localtypes.buffers.StatusBuffer; import de.kuschku.libquassel.objects.types.NetworkServer; import de.kuschku.libquassel.primitives.types.QVariant; import de.kuschku.libquassel.syncables.types.abstracts.ANetwork; +import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; @@ -772,6 +777,27 @@ public class Network extends ANetwork<Network> implements Observer { } + + + @Override + public void _update() { + super._update(); + if (client != null && client.connectionStatus() != ConnectionChangeEvent.Status.INITIALIZING_DATA) { + StatusBuffer buffer = client.bufferManager().network(networkInfo.networkId()); + if (buffer != null) { + buffer.updateStatus(); + for (QBufferViewConfig qBufferViewConfig : client.bufferViewManager().bufferViewConfigs()) { + qBufferViewConfig.bufferIds().notifyItemChanged(buffer.getInfo().id); + qBufferViewConfig.networkList().notifyItemChanged(this); + } + } else { + for (QBufferViewConfig qBufferViewConfig : client.bufferViewManager().bufferViewConfigs()) { + qBufferViewConfig.networkList().notifyItemChanged(this); + } + } + } + } + @Override public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client) { super.init(objectName, provider, client); diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIgnoreListManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIgnoreListManager.java index a114509bca80a79cff8f2f74a0894a18168b548d..48d2b28ba54911a42f23470c35af03f1d624ea7e 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIgnoreListManager.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIgnoreListManager.java @@ -106,12 +106,12 @@ public interface QIgnoreListManager extends QObservable { @NonNull public static StrictnessType of(int id) { switch (id) { - case 1: - return UnmatchedStrictness; - case 2: - return SoftStrictness; default: case 0: + return UnmatchedStrictness; + case 1: + return SoftStrictness; + case 2: return HardStrictness; } } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java index 5e2391e3a405925f1d14deca957e05f51dc40eae..f8bb27f59edbd93519f3bd6b6b13a139ecc0cdfb 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java @@ -150,6 +150,6 @@ public class ChannelDetailActivity extends BoundActivity { } public void onEventMainThread(GeneralErrorEvent event) { - Log.e("DEBUG", String.valueOf(event)); + Log.e("ChannelDetailActivity", String.valueOf(event)); } } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java index 31134ad77d9ef5f0f58f88d9ad0f53a9174b68fc..a6557621f5b7f37f640a564f8d53189011b749bc 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java @@ -159,9 +159,10 @@ public class MainActivity extends BoundActivity { public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.action_show_all: { - Log.d("QD-NG", "Toggling Show/Hide All"); - chatListAdapter.toggleShowAll(); + item.setChecked(chatListAdapter.toggleShowAll()); } break; + case R.id.action_manage_chat_lists: { + } } return false; } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigAdapter.java index 90f0c3388da88f58010a614b5e7db6205b62c9e8..a9209676644ee3e6e6db2214309f1f6112c198c3 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigAdapter.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigAdapter.java @@ -94,11 +94,19 @@ public class BufferViewConfigAdapter extends ExpandableRecyclerAdapter<NetworkVi @Override public void notifyItemInserted(int position) { notifyParentItemInserted(position); + if (items.get(position).isInitiallyExpanded()) + expandParent(position); + else + collapseParent(position); } @Override public void notifyItemChanged(int position) { notifyParentItemChanged(position); + if (items.get(position).isInitiallyExpanded()) + expandParent(position); + else + collapseParent(position); } @Override @@ -114,20 +122,22 @@ public class BufferViewConfigAdapter extends ExpandableRecyclerAdapter<NetworkVi @Override public void notifyItemRangeInserted(int position, int count) { - notifyParentItemRangeInserted(position, count); + for (int i = position; i < position + count; i++) { + this.notifyItemInserted(i); + } } @Override public void notifyItemRangeChanged(int position, int count) { for (int i = position; i < position + count; i++) { - notifyParentItemChanged(i); + this.notifyItemChanged(i); } } @Override public void notifyItemRangeRemoved(int position, int count) { for (int i = position; i < position + count; i++) { - notifyParentItemRemoved(position); + this.notifyItemRemoved(position); } } }); @@ -259,7 +269,9 @@ public class BufferViewConfigAdapter extends ExpandableRecyclerAdapter<NetworkVi return showAll; } - public void toggleShowAll() { - showAll.set(!showAll.get()); + public boolean toggleShowAll() { + boolean before = showAll.get(); + showAll.set(!before); + return !before; } } 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 27c981ef8da3d29eb4bb88b142f46a169728c22d..848998de725f123bafa2f08ab5b2b40d47731c56 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 @@ -97,7 +97,7 @@ public class NetworkItem implements ParentListItem { @Override public void notifyItemChanged(Integer element) { Buffer buffer = context.client().bufferManager().buffer(element); - if (buffer != null && buffer.getInfo().networkId == network.networkId()) { + if (buffer != null && buffer.getInfo().networkId == network.networkId() && buffers.contains(buffer)) { buffers.notifyItemChanged(buffers.indexOf(buffer)); } } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java index ba5cfdbee2c524f29b5da9be312a7c4532082a0b..1f4cee76aa107008b3cfdcef117860d02c000c04 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java @@ -68,6 +68,8 @@ public class ChatFragment extends BoundFragment { private LinearLayoutManager layoutManager; private boolean loading = false; + private int recyclerViewMeasuredHeight = 0; + @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -83,7 +85,6 @@ public class ChatFragment extends BoundFragment { messageAdapter = new MessageAdapter(getActivity(), context, new AutoScroller(messages)); messages.setAdapter(messageAdapter); - final int measuredHeight = messages.getMeasuredHeight(); messages.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { @@ -95,10 +96,12 @@ public class ChatFragment extends BoundFragment { backlogManager.requestMoreBacklog(client.backlogManager().open(), 20); loading = true; } + if (recyclerViewMeasuredHeight == 0) + recyclerViewMeasuredHeight = recyclerView.getMeasuredHeight(); boolean canScrollDown = recyclerView.canScrollVertically(1); boolean isScrollingDown = dy > 0; - int scrollOffsetFromBottom = recyclerView.computeVerticalScrollRange() - recyclerView.computeVerticalScrollOffset() - measuredHeight; - boolean isMoreThanOneScreenFromBottom = scrollOffsetFromBottom > measuredHeight; + int scrollOffsetFromBottom = recyclerView.computeVerticalScrollRange() - recyclerView.computeVerticalScrollOffset() - recyclerViewMeasuredHeight; + boolean isMoreThanOneScreenFromBottom = scrollOffsetFromBottom > recyclerViewMeasuredHeight; boolean smartVisibility = scrollDown.getVisibility() == View.VISIBLE || isMoreThanOneScreenFromBottom; scrollDown.setVisibility((canScrollDown && isScrollingDown && smartVisibility) ? View.VISIBLE : View.GONE); } diff --git a/app/src/main/java/de/kuschku/util/ReflectionUtils.java b/app/src/main/java/de/kuschku/util/ReflectionUtils.java index 86a1bf6537f8af09aadec2d77b3cd30f7d341a03..adf1907f7a3a38842d23d60e74f5770fde60f031 100644 --- a/app/src/main/java/de/kuschku/util/ReflectionUtils.java +++ b/app/src/main/java/de/kuschku/util/ReflectionUtils.java @@ -65,7 +65,6 @@ public class ReflectionUtils { try { m.invoke(o, argv); } catch (Exception e) { - Log.e("DEBUG", m.toString()); throw new SyncInvocationException(e, String.format("Error invoking %s::%s with arguments %s and classes %s", o.getClass().getSimpleName(), name, Arrays.toString(argv), Arrays.toString(classes))); } } diff --git a/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java b/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java index 7674ab8b0c581eac4340e7d7c337463f65f4fd7c..82b326f5e099a1778f54046155e4b34acb2df966 100644 --- a/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java +++ b/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java @@ -70,4 +70,9 @@ public class SmartRegEx { WILDCARD, REGEX } + + @Override + public String toString() { + return rule; + } } diff --git a/app/src/main/res/menu/chatlist.xml b/app/src/main/res/menu/chatlist.xml index e2b37c7b7d1a7cf475d9b55627dc826f5356168b..b168c6942c37e0c5052ad1141112025bf02350a5 100644 --- a/app/src/main/res/menu/chatlist.xml +++ b/app/src/main/res/menu/chatlist.xml @@ -28,8 +28,9 @@ app:showAsAction="ifRoom" /> <item android:id="@+id/action_show_all" - android:title="@string/action_show_hide_hidden" - app:showAsAction="never" /> + android:title="@string/action_show_hidden" + app:showAsAction="never" + android:checkable="true" /> <item android:id="@+id/action_manage_chat_lists" android:title="@string/action_manage_chat_lists" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8ee6c11f051c852a9af0bead1122b6f00c8abf92..ea87b3df1a60f4a2cf7269996e7e93751a08176d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -85,6 +85,6 @@ <string name="label_search">Find in Buffer</string> <string name="label_disconnect">Disconnect</string> <string name="action_manage_chat_lists">Manage Chat Lists</string> - <string name="action_show_hide_hidden">Show/Hide Hidden</string> + <string name="action_show_hidden">Show Hidden</string> <string name="action_join_channel">Join Channel</string> </resources>