diff --git a/app/src/main/java/de/kuschku/libquassel/client/QBufferManager.java b/app/src/main/java/de/kuschku/libquassel/client/QBufferManager.java index dffa62054eef3f3c46fd225e7b1f2375f8dad0f1..9a8c9a9ec35fc2b874351a5b493e124a17908240 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/QBufferManager.java +++ b/app/src/main/java/de/kuschku/libquassel/client/QBufferManager.java @@ -23,15 +23,20 @@ package de.kuschku.libquassel.client; import android.support.annotation.IntRange; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; 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.interfaces.QIrcChannel; +import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; import static de.kuschku.util.AndroidAssert.assertNotNull; @@ -42,8 +47,8 @@ public class QBufferManager { private final QClient client; // We cache those, because the networks might not be initialized at begin - @Nullable - private List<BufferInfo> bufferInfos; + @NonNull + private Map<String, Set<BufferInfo>> bufferInfos = new HashMap<>(); public QBufferManager(QClient client) { this.client = client; @@ -68,19 +73,49 @@ public class QBufferManager { } public void init(List<BufferInfo> bufferInfos) { - this.bufferInfos = bufferInfos; + for (BufferInfo info : bufferInfos) { + if (this.bufferInfos.get(objectName(info)) == null) + this.bufferInfos.put(objectName(info), new HashSet<>()); + + this.bufferInfos.get(objectName(info)).add(info); + } + } + + private String objectName(BufferInfo info) { + if (info.type() == BufferInfo.Type.STATUS) + return String.valueOf(info.networkId()); + else + return info.networkId() + "/" + info.name(); } - public void postInit() { - if (bufferInfos != null) { - for (BufferInfo info : bufferInfos) { + public void postInit(String objectName, QIrcUser ircUser) { + if (bufferInfos.get(objectName) != null) + for (BufferInfo info : bufferInfos.get(objectName)) { QNetwork network = client.networkManager().network(info.networkId()); assertNotNull(network); - Buffer buffer = Buffers.fromType(info, network); - assertNotNull(buffer); - createBuffer(buffer); + createBuffer(new QueryBuffer(info, ircUser)); + } + } + + public void postInit(String objectName, QNetwork ircUser) { + if (bufferInfos.get(objectName) != null) + for (BufferInfo info : bufferInfos.get(objectName)) { + QNetwork network = client.networkManager().network(info.networkId()); + assertNotNull(network); + createBuffer(new StatusBuffer(info, ircUser)); + } + } + + public Map<Integer, Buffer> buffers() { + return buffers; + } + + public void postInit(String objectName, QIrcChannel ircChannel) { + if (bufferInfos.get(objectName) != null) + for (BufferInfo info : bufferInfos.get(objectName)) { + QNetwork network = client.networkManager().network(info.networkId()); + assertNotNull(network); + createBuffer(new ChannelBuffer(info, ircChannel)); } - } - bufferInfos = null; } } diff --git a/app/src/main/java/de/kuschku/libquassel/client/QClient.java b/app/src/main/java/de/kuschku/libquassel/client/QClient.java index b4e5ff7084f2fa1933caa03222497c1693046d24..801df36fc8f345660b878c7a4074424c84c15078 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/QClient.java +++ b/app/src/main/java/de/kuschku/libquassel/client/QClient.java @@ -188,8 +188,6 @@ public class QClient extends AClient { this.connectionStatus = connectionStatus; if (connectionStatus == ConnectionChangeEvent.Status.LOADING_BACKLOG) { - networkManager.postInit(); - bufferManager.postInit(); setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED); } provider.sendEvent(new ConnectionChangeEvent(connectionStatus)); diff --git a/app/src/main/java/de/kuschku/libquassel/client/QNetworkManager.java b/app/src/main/java/de/kuschku/libquassel/client/QNetworkManager.java index 7684b66946be6545c8339956d74ec9b50ef0ffda..a6a87902230ff264198861a70a56aced6dc56a33 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/QNetworkManager.java +++ b/app/src/main/java/de/kuschku/libquassel/client/QNetworkManager.java @@ -78,13 +78,6 @@ public class QNetworkManager extends Observable { } - public void postInit() { - for (QNetwork network : networks.values()) { - network.postInit(); - } - _update(); - } - public List<QNetwork> networks() { return new ArrayList<>(networks.values()); } diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java index 5f01c7c44bb7125ef97a2907f8b94d0db1749bfe..ea3d4db269a99a9c219e5b32579a3b4dee096d8e 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java @@ -27,6 +27,8 @@ import android.support.annotation.Nullable; import de.kuschku.libquassel.primitives.types.BufferInfo; import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; +import static de.kuschku.util.AndroidAssert.assertNotNull; + public class ChannelBuffer implements Buffer { @NonNull private BufferInfo info; @@ -34,6 +36,7 @@ public class ChannelBuffer implements Buffer { private QIrcChannel channel; public ChannelBuffer(@NonNull BufferInfo info, @Nullable QIrcChannel channel) { + assertNotNull(channel); this.info = info; this.channel = channel; } diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java index 45ec2ee3f51a5324ee259ad82eb241ad9bee6e48..48cee59997ff698426063bb4aecc075ed3ce77d8 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java @@ -27,6 +27,8 @@ import android.support.annotation.Nullable; import de.kuschku.libquassel.primitives.types.BufferInfo; import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; +import static de.kuschku.util.AndroidAssert.assertNotNull; + public class QueryBuffer implements Buffer { @Nullable private final QIrcUser user; @@ -34,6 +36,7 @@ public class QueryBuffer implements Buffer { private BufferInfo info; public QueryBuffer(@NonNull BufferInfo info, @Nullable QIrcUser user) { + assertNotNull(user); this.info = info; this.user = user; } 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 4e371f952db903e8df20c54e3850da2f0727093e..c9e53b4f3d965a0adb050900f4b9fdc8eac15493 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 @@ -416,7 +416,8 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { @SuppressWarnings("unchecked") @Override - public void init(QNetwork network) { + public void init(QNetwork network, QClient client) { + this.client = client; this.network = network; @@ -441,6 +442,10 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { cachedUserModes = null; cachedChanModes = null; + + this.network._addIrcChannel(this); + + client.bufferManager().postInit(network.networkId() + "/" + name(), this); _update(); } @@ -476,9 +481,8 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { @Override public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull QClient client) { super.init(objectName, provider, client); - String[] split = objectName.split("/", 2); assertEquals(split.length, 2); - init(client.networkManager().network(Integer.parseInt(split[0]))); + init(client.networkManager().network(Integer.parseInt(split[0])), client); } } 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 2c00aa28cc533b343d7db56cb41a8bb4902e306f..66b907e1a0935e56271f1302dad3e058f15a049b 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 @@ -432,13 +432,16 @@ public class IrcUser extends AIrcUser<IrcUser> { } @Override - public void init(QNetwork network) { + public void init(QNetwork network, QClient client) { this.network = network; + this.client = client; + channels = new HashSet<>(); if (cachedChannels != null) for (String channelName : cachedChannels) { channels.add(network().newIrcChannel(channelName)); } + client.bufferManager().postInit(network.networkId() + "/" + nick(), this); _update(); } @@ -447,7 +450,7 @@ public class IrcUser extends AIrcUser<IrcUser> { super.init(objectName, provider, client); String[] split = objectName.split("/", 2); assertEquals(split.length, 2); - init(client.networkManager().network(Integer.parseInt(split[0]))); + init(client.networkManager().network(Integer.parseInt(split[0])), client); } @Override 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 8f410236732b125a11435c37e1eb1143a96ad32e..4548a6ab25bb8a6a95b63c83bc7741a4af8330fc 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 @@ -658,7 +658,7 @@ public class Network extends ANetwork<Network> implements Observer { @NonNull private QIrcUser newIrcUser(@NonNull String mask) { IrcUser user = IrcUser.create(mask); - user.init(this); + user.init(this, client); client.requestInitObject("IrcUser", user.getObjectName()); nicks.put(user.nick(), user); _update(); @@ -731,13 +731,9 @@ public class Network extends ANetwork<Network> implements Observer { _update(); } - public void postInit() { - for (QIrcChannel channel : ircChannels()) { - channel.init(this); - } - for (QIrcUser user : ircUsers()) { - user.init(this); - } + @Override + public void _addIrcChannel(IrcChannel ircChannel) { + channels.put(ircChannel.name(), ircChannel); } @Override @@ -761,6 +757,7 @@ public class Network extends ANetwork<Network> implements Observer { for (QIrcUser name : ircUsers()) { client.requestInitObject("IrcUser", networkId() + "/" + name.nick()); } + client.bufferManager().postInit(String.valueOf(networkId()), this); } @Override diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java index ea24211e08535182d0b9524b6730d54f7bb6367e..4427a5c8b717231a09810d736ffb9c66fe9becc9 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java @@ -25,6 +25,7 @@ import android.support.annotation.NonNull; import java.util.List; +import de.kuschku.libquassel.client.QClient; import de.kuschku.libquassel.syncables.Synced; public interface QIrcChannel { @@ -144,5 +145,5 @@ public interface QIrcChannel { void _removeChannelMode(final char mode, final String value); - void init(QNetwork network); + void init(QNetwork network, QClient client); } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcUser.java index 05d0f780cc3ae7a528452e133739a285c7712b46..e321051b3850dd89d0f751eaaf3ae8df3f8c1f0d 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcUser.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcUser.java @@ -27,6 +27,7 @@ import org.joda.time.DateTime; import java.util.List; +import de.kuschku.libquassel.client.QClient; import de.kuschku.libquassel.syncables.Synced; public interface QIrcUser { @@ -202,5 +203,5 @@ public interface QIrcUser { void _removeUserModes(final String modes); - void init(QNetwork network); + void init(QNetwork network, QClient client); } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java index a21fd717ddb71bef725f864bb7cedb646bb5fca4..c4f6ce5eb478fa11958490170f01a5459330ef6e 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java @@ -28,6 +28,7 @@ import java.util.List; import de.kuschku.libquassel.objects.types.NetworkServer; import de.kuschku.libquassel.syncables.Synced; +import de.kuschku.libquassel.syncables.types.impl.IrcChannel; import de.kuschku.libquassel.syncables.types.impl.NetworkInfo; public interface QNetwork { @@ -340,7 +341,7 @@ public interface QNetwork { void _removeChansAndUsers(); - void postInit(); + void _addIrcChannel(IrcChannel ircChannel); enum ConnectionState { Disconnected(0), 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 a100e820da0818f8df39a0b663147d0cf3834ac3..2444e5132ae97b340c8c7dc654a328ae7973f46a 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 @@ -87,6 +87,8 @@ import de.kuschku.libquassel.message.Message; import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewManager; import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; +import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; +import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; import de.kuschku.quasseldroid_ng.BuildConfig; import de.kuschku.quasseldroid_ng.R; import de.kuschku.quasseldroid_ng.service.ClientBackgroundThread; @@ -443,6 +445,22 @@ public class ChatActivity extends AppCompatActivity { case R.id.action_history: slidingLayoutHistory.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED); return true; + case R.id.debug_init_channels: { + for (QNetwork network : context.client().networkManager().networks()) { + for (QIrcChannel name : network.ircChannels()) { + context.client().requestInitObject("IrcChannel", network.networkId() + "/" + name.name()); + } + } + return true; + } + case R.id.debug_init_users: { + for (QNetwork network : context.client().networkManager().networks()) { + for (QIrcUser name : network.ircUsers()) { + context.client().requestInitObject("IrcUser", network.networkId() + "/" + name.nick()); + } + } + return true; + } default: return false; } diff --git a/app/src/main/res/menu/formatting.xml b/app/src/main/res/menu/formatting.xml index b807f4c067552fb0be866ca24e08decf74aff8c4..57b0ae94f416955752c39a47a976bd11e15b4039 100644 --- a/app/src/main/res/menu/formatting.xml +++ b/app/src/main/res/menu/formatting.xml @@ -52,4 +52,19 @@ android:icon="?attr/iconHistory" android:title="@string/labelHistory" app:showAsAction="always" /> + + <item + android:id="@+id/action_debug" + android:icon="?attr/iconDebug" + android:title="@string/labelDebug" + app:showAsAction="always"> + <menu> + <item + android:id="@+id/debug_init_channels" + android:title="Request Channels" /> + <item + android:id="@+id/debug_init_users" + android:title="Request Users" /> + </menu> + </item> </menu> diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml index 35ef11afef4f1701cfae4681ae148fa06723edef..64c4e08004423dede91430266e2081cb46b8a574 100644 --- a/app/src/main/res/values-w820dp/dimens.xml +++ b/app/src/main/res/values-w820dp/dimens.xml @@ -20,8 +20,5 @@ --> <resources> - <!-- Example customization of dimensions originally defined in res/values/dimens.xml - (such as screen margins) for screens with more than 820dp of available width. This - would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> <dimen name="activity_horizontal_margin">64dp</dimen> </resources> diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 418fc7e93314cc53e1a57364f4aa903b368d6f93..986086c9dc4ce663a209e80369346c9584e057cb 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -87,6 +87,7 @@ <attr name="iconFormatPaint" format="reference" /> <attr name="iconFormatFill" format="reference" /> <attr name="iconHistory" format="reference" /> + <attr name="iconDebug" format="reference" /> <attr name="cardStyle" format="reference" /> </resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a2be9b54d8959dc7fd9eeda6c57f765514071bee..e9564f3292a120b083f76a7e38c8bb1c804fb9e8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -78,4 +78,5 @@ <string name="labelHideEvents">Hide events</string> <string name="warningCertificate">Do you trust this certificate?</string> + <string name="labelDebug">Debug</string> </resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 3ba4657085ae8c0ac8d578b0edfe982b02555623..d23e2803f43246c7af044316d53251491f86ab45 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -38,6 +38,7 @@ <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="iconDebug">@drawable/ic_bug_dark</item> <item name="cardStyle">@style/CardView.Dark</item> </style> @@ -58,6 +59,7 @@ <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="iconDebug">@drawable/ic_bug_light</item> <item name="cardStyle">@style/CardView.Light</item> </style>