diff --git a/app/build.gradle b/app/build.gradle index 89d0b14651f9cd494dfead2d2401a7c312136776..fe0ce963fe63692ca6ca5994ecae32eef734da4a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,8 +20,8 @@ */ apply plugin: 'com.android.application' -apply plugin: 'com.neenbedankt.android-apt' apply plugin: 'me.tatarka.retrolambda' +apply plugin: 'com.neenbedankt.android-apt' dependencies { repositories { @@ -72,13 +72,13 @@ if (versionPropsFile.exists() && versionPropsFile.canRead()) { def rawVersionName = "0.2.0" android { - compileSdkVersion 23 - buildToolsVersion "23.0.2" + compileSdkVersion 24 + buildToolsVersion "24.0.0" defaultConfig { - applicationId "de.kuschku.quasseldroid_ng" + applicationId "com.iskrembilen.quasseldroid" minSdkVersion 16 - targetSdkVersion 23 + targetSdkVersion 24 versionCode versionBuild versionName rawVersionName + " Build #" + versionBuild } @@ -154,14 +154,18 @@ dependencies { compile('com.github.afollestad.material-dialogs:core:0.8.5.3@aar') { transitive = true } compile('com.github.afollestad.material-dialogs:commons:0.8.5.3@aar') { transitive = true } - compile 'com.android.support:appcompat-v7:23.1.1' - compile 'com.android.support:design:23.1.1' - compile 'com.android.support:support-v4:23.1.1' - compile 'com.android.support:recyclerview-v7:23.1.1' - compile 'com.android.support:preference-v14:23.1.1' - compile 'com.android.support:cardview-v7:23.1.1' + // ORM + apt "com.github.Raizlabs.DBFlow:dbflow-processor:3.1.1" + compile "com.github.Raizlabs.DBFlow:dbflow-core:3.1.1" + compile "com.github.Raizlabs.DBFlow:dbflow:3.1.1" + + compile 'com.android.support:appcompat-v7:24.0.0' + compile 'com.android.support:design:24.0.0' + compile 'com.android.support:support-v4:24.0.0' + compile 'com.android.support:recyclerview-v7:24.0.0' + compile 'com.android.support:preference-v14:24.0.0' + compile 'com.android.support:cardview-v7:24.0.0' // UI autobinding - compile 'com.jakewharton:butterknife:8.0.0-SNAPSHOT' - apt 'com.jakewharton:butterknife-compiler:8.0.0-SNAPSHOT' + compile 'com.jakewharton:butterknife:7.0.1' } 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 7e4042db56d821dee8b7b1e6adef8d00d9d5a8b4..832b84ff6183dcf3288a1b9fa88a4d635c1f3073 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java +++ b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java @@ -62,16 +62,16 @@ public class BufferManager { } public void createBuffer(@NonNull Buffer buffer) { - buffers.put(buffer.getInfo().id(), buffer); - bufferIds.add(buffer.getInfo().id()); - byNetwork(buffer.getInfo().networkId()).add(buffer.getInfo().id()); - updateBufferMapEntries(buffer, buffer.getInfo().name()); + buffers.put(buffer.getInfo().id, buffer); + bufferIds.add(buffer.getInfo().id); + byNetwork(buffer.getInfo().networkId).add(buffer.getInfo().id); + updateBufferMapEntries(buffer, buffer.getInfo().name); } public void removeBuffer(@IntRange(from = 0) int id) { Buffer buffer = buffers.get(id); if (buffer != null) - byNetwork(buffer.getInfo().networkId()).remove(id); + byNetwork(buffer.getInfo().networkId).remove(id); buffers.remove(id); bufferIds.remove(id); } @@ -81,11 +81,11 @@ public class BufferManager { } public void updateBufferInfo(@NonNull BufferInfo bufferInfo) { - Buffer buffer = buffer(bufferInfo.id()); + Buffer buffer = buffer(bufferInfo.id); if (buffer == null) return; - if (buffer.getInfo().networkId() != bufferInfo.networkId()) { - buffersByNetwork.get(buffer.getInfo().networkId()).remove(bufferInfo.id()); - buffersByNetwork.get(buffer.getInfo().networkId()).add(bufferInfo.id()); + if (buffer.getInfo().networkId != bufferInfo.networkId) { + buffersByNetwork.get(buffer.getInfo().networkId).remove(bufferInfo.id); + buffersByNetwork.get(buffer.getInfo().networkId).add(bufferInfo.id); } buffer.setInfo(bufferInfo); } @@ -93,7 +93,7 @@ public class BufferManager { public void init(@NonNull List<BufferInfo> bufferInfos) { for (BufferInfo info : bufferInfos) { createBuffer(info); - laterRequests.add(info.id()); + laterRequests.add(info.id); } } @@ -109,7 +109,7 @@ public class BufferManager { } public boolean exists(@NonNull BufferInfo info) { - return buffers.containsKey(info.id()); + return buffers.containsKey(info.id); } public void renameBuffer(int bufferId, @NonNull String newName) { @@ -123,9 +123,9 @@ public class BufferManager { buffersByNick.remove(buffer.objectName()); buffersByChannel.remove(buffer.objectName()); if (buffer instanceof ChannelBuffer) { - buffersByChannel.put(buffer.objectName(name), buffer.getInfo().id()); + buffersByChannel.put(buffer.objectName(name), buffer.getInfo().id); } else if (buffer instanceof QueryBuffer) { - buffersByNick.put(buffer.objectName(name), buffer.getInfo().id()); + buffersByNick.put(buffer.objectName(name), buffer.getInfo().id); } } diff --git a/app/src/main/java/de/kuschku/libquassel/client/Client.java b/app/src/main/java/de/kuschku/libquassel/client/Client.java index 09fd97c125ac915af9ac038bcc4776864c75ae3c..fe51a75aeb9458fd6d01d717a3922daac34e4ae6 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/Client.java +++ b/app/src/main/java/de/kuschku/libquassel/client/Client.java @@ -460,12 +460,12 @@ public class Client extends AClient { public void unbufferBuffer(@NonNull BufferInfo info) { if (!bufferManager().exists(info)) { bufferManager().createBuffer(info); - Log.d("libquassel", "Creating buffer from message info: " + info.id()); + Log.d("libquassel", "Creating buffer from message info: " + info.id); } - if (bufferedBuffers.containsKey(info.id())) { - Pair<QBufferViewConfig, Integer> pair = bufferedBuffers.get(info.id()); - pair.first._addBuffer(info.id(), pair.second); - Log.d("libquassel", "Un-Queueing buffer: " + info.id()); + if (bufferedBuffers.containsKey(info.id)) { + Pair<QBufferViewConfig, Integer> pair = bufferedBuffers.get(info.id); + pair.first._addBuffer(info.id, pair.second); + Log.d("libquassel", "Un-Queueing buffer: " + info.id); } } 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 c5e2b7ac11d0c20697c2ec1a096bf354e3bf21e5..e251540c845853b61c86b3c9eba08318b756f801 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java @@ -74,12 +74,12 @@ public class BacklogFilter implements UICallback { private void updateDayChangeMessages() { DateTime now = DateTime.now().withMillisOfDay(0); while (now.isAfter(earliestMessage)) { - bus.post(new MessageInsertEvent(new Message( + bus.post(new MessageInsertEvent(Message.create( (int) DateTimeUtils.toJulianDay(now.getMillis()), now, Message.Type.DayChange, new Message.Flags(false, false, false, false, false), - new BufferInfo( + BufferInfo.create( bufferId, -1, BufferInfo.Type.INVALID, @@ -94,7 +94,7 @@ public class BacklogFilter implements UICallback { } private boolean filterItem(@NonNull Message message) { - QNetwork network = client.networkManager().network(client.bufferManager().buffer(message.bufferInfo.id()).getInfo().networkId()); + QNetwork network = client.networkManager().network(client.bufferManager().buffer(message.bufferInfo.id).getInfo().networkId); assertNotNull(network); return (client.ignoreListManager() != null && client.ignoreListManager().matches(message, network)) || filteredTypes.contains(message.type); } 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 d270922ee99ebcdafd6c4b9e07a81223b555df17..ff0e7e0d47352576625ec43ca323104932dbd2e4 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/NotificationManager.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/NotificationManager.java @@ -58,7 +58,7 @@ public class NotificationManager { public void receiveMessage(@NonNull Message message) { if (checkMessage(message)) { - getNotifications(message.bufferInfo.id()).add(message); + getNotifications(message.bufferInfo.id).add(message); } } 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 34b15a618a30d1e1759e005a8a553d2e5da80b08..95ef6c34ea0ec552fc315a5a5b043aeb974da076 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 @@ -46,4 +46,8 @@ public interface BacklogStorage { void insertMessages(Message... messages); void setClient(Client client); + + void markBufferUnused(@IntRange(from = 0) int bufferid); + + void clear(@IntRange(from = 0) int bufferid); } 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 new file mode 100644 index 0000000000000000000000000000000000000000..0127826dacb72994fcfb3703f8778c7fc23d7ac6 --- /dev/null +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java @@ -0,0 +1,156 @@ +/* + * 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 com.raizlabs.android.dbflow.config.FlowManager; +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.List; + +import de.kuschku.libquassel.client.Client; +import de.kuschku.libquassel.localtypes.BacklogFilter; +import de.kuschku.libquassel.localtypes.orm.ConnectedDatabase; +import de.kuschku.libquassel.message.Message; +import de.kuschku.libquassel.message.Message_Table; +import de.kuschku.util.observables.lists.ObservableComparableSortedList; + +import static de.kuschku.util.AndroidAssert.assertNotNull; + +public class HybridBacklogStorage 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); + FlowManager.getDatabase(ConnectedDatabase.class).executeTransaction(new ITransaction() { + @Override + public void execute(DatabaseWrapper databaseWrapper) { + for (Message message : messages) { + client.unbufferBuffer(message.bufferInfo); + synchronized (backlogs) { + if (backlogs.get(bufferId) != null) + backlogs.get(bufferId).add(message); + message.save(); + message.bufferInfo.save(); + } + 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) { + client.unbufferBuffer(message.bufferInfo); + synchronized (backlogs) { + if (backlogs.get(message.bufferInfo.id) != null) + 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) { + synchronized (backlogs) { + if (backlogs.get(bufferid) != null && filters.get(bufferid) != null) + backlogs.get(bufferid).removeCallback(filters.get(bufferid)); + backlogs.remove(bufferid); + filteredBacklogs.remove(bufferid); + filters.remove(bufferid); + } + } + + @Override + public void clear(@IntRange(from = 0) int bufferid) { + SQLite.delete().from(Message.class).where(Message_Table.bufferInfo_id.eq(bufferid)); + } + + 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); + synchronized (backlogs) { + List<Message> messageList = SQLite.select().from(Message.class).where(Message_Table.bufferInfo_id.eq(bufferId)).queryList(); + messages.addAll(messageList); + backlogs.put(bufferId, messages); + } + filteredBacklogs.put(bufferId, filteredMessages); + filters.put(bufferId, 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 index c887d11adf89ea8316c97fc99f7ee64db648df6f..462354cb5c5b4831671e0d1ab3e3f44cf88a6787 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java @@ -81,17 +81,17 @@ public class MemoryBacklogStorage implements BacklogStorage { } public void updateLatest(@NonNull Message message) { - if (message.messageId > getLatest(message.bufferInfo.id())) { - latestMessage.put(message.bufferInfo.id(), message.messageId); + 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()); + ensureExisting(message.bufferInfo.id); client.unbufferBuffer(message.bufferInfo); - backlogs.get(message.bufferInfo.id()).add(message); + backlogs.get(message.bufferInfo.id).add(message); updateLatest(message); } } @@ -100,6 +100,17 @@ public class MemoryBacklogStorage implements BacklogStorage { 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) { diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java index a1ab5b5b7f779b3195f7112055cbb3d7a8d60f83..dcbd564f994f5d1f6a7e32bea8866b1401f6c96d 100644 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java @@ -34,7 +34,7 @@ public class Buffers { @Nullable public static Buffer fromType(@NonNull BufferInfo info, @NonNull Client client) { - switch (info.type()) { + switch (info.type) { case QUERY: return new QueryBuffer(info, client); case CHANNEL: 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 cf00f0ce094bc8ff1247070b9985ad28b6dbfd50..f900335960a1b71bea7393f0b348fdd3ce2f32e9 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 @@ -56,7 +56,7 @@ public class ChannelBuffer implements Buffer { @Nullable @Override public String getName() { - return getInfo().name(); + return getInfo().name; } @NonNull @@ -69,24 +69,24 @@ public class ChannelBuffer implements Buffer { @Override public void renameBuffer(@NonNull String newName) { - info.setName(newName); + info.name = newName; } @NonNull @Override public String objectName() { - return objectName(info.name()); + return objectName(info.name); } @NonNull @Override public String objectName(String name) { - return info.networkId() + "/" + name; + return info.networkId + "/" + name; } @Nullable public QIrcChannel getChannel() { - return client.networkManager().network(info.networkId()).ircChannel(info.name()); + return client.networkManager().network(info.networkId).ircChannel(info.name); } @NonNull 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 89a50725740692f0c527a442329ea05af7d1b6a0..a87f00a1f24052123a1ba31a4660fa57e64fdd02 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 @@ -56,7 +56,7 @@ public class QueryBuffer implements Buffer { @Nullable @Override public String getName() { - return getInfo().name(); + return getInfo().name; } @NonNull @@ -71,24 +71,24 @@ public class QueryBuffer implements Buffer { @Override public void renameBuffer(@NonNull String newName) { - info.setName(newName); + info.name = newName; } @NonNull @Override public String objectName() { - return objectName(info.name()); + return objectName(info.name); } @NonNull @Override public String objectName(String name) { - return info.networkId() + "/" + name; + return info.networkId + "/" + name; } @Nullable public QIrcUser getUser() { - return client.networkManager().network(info.networkId()).ircUser(info.name()); + return client.networkManager().network(info.networkId).ircUser(info.name); } @NonNull 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 5828b6306e4048a19f36a5e792743b64c5070562..72ae63042aed01ba73e04f16dd56200c7659effa 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 @@ -53,7 +53,7 @@ public class StatusBuffer implements Buffer { } public QNetwork getNetwork() { - return client.networkManager().network(info.networkId()); + return client.networkManager().network(info.networkId); } @Nullable @@ -73,18 +73,18 @@ public class StatusBuffer implements Buffer { @NonNull @Override public String objectName() { - return objectName(info.name()); + return objectName(info.name); } @NonNull @Override public String objectName(String name) { - return info.networkId() + "/" + name; + return info.networkId + "/" + name; } @Override public void renameBuffer(@NonNull String newName) { - this.info.setName(newName); + this.info.name = newName; } @NonNull diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/orm/ConnectedDatabase.java b/app/src/main/java/de/kuschku/libquassel/localtypes/orm/ConnectedDatabase.java new file mode 100644 index 0000000000000000000000000000000000000000..b2205a9292181fdbc3fc8fd22df64ce668f3390e --- /dev/null +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/orm/ConnectedDatabase.java @@ -0,0 +1,9 @@ +package de.kuschku.libquassel.localtypes.orm; + +import com.raizlabs.android.dbflow.annotation.Database; + +@Database(name = ConnectedDatabase.NAME, version = ConnectedDatabase.VERSION) +public class ConnectedDatabase { + public static final String NAME = "ConnectedDatabase"; + public static final int VERSION = 2; +} \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/BufferTypeConverter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/BufferTypeConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..6ce2477934b559484f8befbf12996dc1c81e385c --- /dev/null +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/BufferTypeConverter.java @@ -0,0 +1,18 @@ +package de.kuschku.libquassel.localtypes.orm.converters; + +import com.raizlabs.android.dbflow.converter.TypeConverter; + +import de.kuschku.libquassel.primitives.types.BufferInfo; + +@com.raizlabs.android.dbflow.annotation.TypeConverter +public class BufferTypeConverter extends TypeConverter<Short, BufferInfo.Type> { + @Override + public Short getDBValue(BufferInfo.Type model) { + return model.id; + } + + @Override + public BufferInfo.Type getModelValue(Short data) { + return BufferInfo.Type.fromId(data); + } +} diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/DateTimeConverter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/DateTimeConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..280ac445cfb6d3fb3a6dc08781a050a0c749165f --- /dev/null +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/DateTimeConverter.java @@ -0,0 +1,18 @@ +package de.kuschku.libquassel.localtypes.orm.converters; + +import com.raizlabs.android.dbflow.converter.TypeConverter; + +import org.joda.time.DateTime; + +@com.raizlabs.android.dbflow.annotation.TypeConverter +public class DateTimeConverter extends TypeConverter<Long, DateTime> { + @Override + public Long getDBValue(DateTime model) { + return model.getMillis(); + } + + @Override + public DateTime getModelValue(Long data) { + return new DateTime(data.longValue()); + } +} diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/MessageFlagsConverter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/MessageFlagsConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..b3f1d9b18cc224ed01cdec05800fa5e32df50f06 --- /dev/null +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/MessageFlagsConverter.java @@ -0,0 +1,18 @@ +package de.kuschku.libquassel.localtypes.orm.converters; + +import com.raizlabs.android.dbflow.converter.TypeConverter; + +import de.kuschku.libquassel.message.Message; + +@com.raizlabs.android.dbflow.annotation.TypeConverter +public class MessageFlagsConverter extends TypeConverter<Short, Message.Flags> { + @Override + public Short getDBValue(Message.Flags model) { + return (short) model.flags; + } + + @Override + public Message.Flags getModelValue(Short data) { + return new Message.Flags(data.byteValue()); + } +} diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/MessageTypeConverter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/MessageTypeConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..3327777ff9a67a458013af74b34a4959ce48e12b --- /dev/null +++ b/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/MessageTypeConverter.java @@ -0,0 +1,18 @@ +package de.kuschku.libquassel.localtypes.orm.converters; + +import com.raizlabs.android.dbflow.converter.TypeConverter; + +import de.kuschku.libquassel.message.Message; + +@com.raizlabs.android.dbflow.annotation.TypeConverter +public class MessageTypeConverter extends TypeConverter<Integer, Message.Type> { + @Override + public Integer getDBValue(Message.Type model) { + return model.value; + } + + @Override + public Message.Type getModelValue(Integer data) { + return Message.Type.fromId(data); + } +} 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 487c8b0dd5da04a7ee2caa3baf6ee82da87bcb93..3534ac91882f4b02d8c82da1649f9df1153934d8 100644 --- a/app/src/main/java/de/kuschku/libquassel/message/Message.java +++ b/app/src/main/java/de/kuschku/libquassel/message/Message.java @@ -24,45 +24,49 @@ package de.kuschku.libquassel.message; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import com.raizlabs.android.dbflow.annotation.Column; +import com.raizlabs.android.dbflow.annotation.ForeignKey; +import com.raizlabs.android.dbflow.annotation.PrimaryKey; +import com.raizlabs.android.dbflow.annotation.Table; +import com.raizlabs.android.dbflow.structure.BaseModel; + import org.joda.time.DateTime; import java.io.Serializable; import java.util.Comparator; +import de.kuschku.libquassel.localtypes.orm.ConnectedDatabase; import de.kuschku.libquassel.primitives.types.BufferInfo; import de.kuschku.util.observables.ContentComparable; -public class Message implements ContentComparable<Message> { - public final int messageId; - @NonNull - public final DateTime time; - @NonNull - public final Type type; - @NonNull - public final Flags flags; - @NonNull - public final BufferInfo bufferInfo; - @Nullable - public final String sender; - @Nullable - public final String content; - - public Message(int messageId, @NonNull DateTime time, @NonNull Type type, @NonNull Flags flags, @NonNull BufferInfo bufferInfo, @Nullable String sender, - @Nullable String content) { - this.messageId = messageId; - this.time = time; - this.type = type; - this.flags = flags; - this.bufferInfo = bufferInfo; - this.sender = sender; - this.content = content; - } +@Table(database = ConnectedDatabase.class) +public class Message extends BaseModel implements ContentComparable<Message> { + @PrimaryKey + public int id; + + @Column + public DateTime time; + + @Column + public Type type; + + @Column + public Flags flags; + + @ForeignKey + public BufferInfo bufferInfo; + + @Column + public String sender; + + @Column + public String content; @NonNull @Override public String toString() { return "Message{" + - "messageId=" + messageId + + "id=" + id + ", time=" + time + ", type=" + type + ", flags=" + flags + @@ -79,22 +83,34 @@ public class Message implements ContentComparable<Message> { @Override public boolean areItemsTheSame(@NonNull Message other) { - return this.messageId == other.messageId; + return this.id == other.id; } @Override public int hashCode() { - return messageId; + return id; } @Override public int compareTo(@NonNull Message another) { if (this.type != Type.DayChange && another.type != Type.DayChange) - return this.messageId - another.messageId; + return this.id - another.id; else return this.time.compareTo(another.time); } + public static Message create(int id, DateTime time, Type type, Flags flags, BufferInfo bufferInfo, String sender, String content) { + Message message = new Message(); + message.id = id; + message.time = time; + message.type = type; + message.flags = flags; + message.bufferInfo = bufferInfo; + message.sender = sender; + message.content = content; + return message; + } + public enum Type { Plain(0x00001), Notice(0x00002), @@ -164,6 +180,7 @@ public class Message implements ContentComparable<Message> { return Error; } } + } public static class Flags { @@ -212,12 +229,13 @@ public class Message implements ContentComparable<Message> { output.append("]"); return output.toString(); } + } public static class MessageComparator implements Comparator<Message>, Serializable { @Override public int compare(@NonNull Message o1, @NonNull Message o2) { - return o1.messageId - o2.messageId; + return o1.id - o2.id; } @Override @@ -225,4 +243,5 @@ public class Message implements ContentComparable<Message> { return obj == this; } } + } diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/BufferInfoSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/BufferInfoSerializer.java index a6fc89548e3eb7a8c82071c8ea6acef375860905..0e838f015e23a53d947b408e102b8c43b4f2832b 100644 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/BufferInfoSerializer.java +++ b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/BufferInfoSerializer.java @@ -43,17 +43,17 @@ public class BufferInfoSerializer implements PrimitiveSerializer<BufferInfo> { @Override public void serialize(@NonNull ByteChannel channel, @NonNull BufferInfo data) throws IOException { - IntSerializer.get().serialize(channel, data.id()); - IntSerializer.get().serialize(channel, data.networkId()); - ShortSerializer.get().serialize(channel, data.type().id); - IntSerializer.get().serialize(channel, data.groupId()); - ByteArraySerializer.get().serialize(channel, data.name()); + IntSerializer.get().serialize(channel, data.id); + IntSerializer.get().serialize(channel, data.networkId); + ShortSerializer.get().serialize(channel, data.type.id); + IntSerializer.get().serialize(channel, data.groupId); + ByteArraySerializer.get().serialize(channel, data.name); } @NonNull @Override public BufferInfo deserialize(@NonNull final ByteBuffer buffer) throws IOException { - return new BufferInfo( + return BufferInfo.create( IntSerializer.get().deserialize(buffer), IntSerializer.get().deserialize(buffer), BufferInfo.Type.fromId(ShortSerializer.get().deserialize(buffer)), diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/MessageSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/MessageSerializer.java index e552ee77cb08a25ae15cb3715057d6f699a2d6cc..9e7b73796c595b9d4f747b81e22419cd3a691caa 100644 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/MessageSerializer.java +++ b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/MessageSerializer.java @@ -47,7 +47,7 @@ public class MessageSerializer implements PrimitiveSerializer<Message> { @Override public void serialize(@NonNull ByteChannel channel, @NonNull Message data) throws IOException { - IntSerializer.get().serialize(channel, data.messageId); + IntSerializer.get().serialize(channel, data.id); IntSerializer.get().serialize(channel, (int) (data.time.getMillis() / 1000)); IntSerializer.get().serialize(channel, data.type.value); ByteSerializer.get().serialize(channel, data.flags.flags); @@ -67,7 +67,7 @@ public class MessageSerializer implements PrimitiveSerializer<Message> { String sender = ByteArraySerializer.get().deserialize(buffer); String message = ByteArraySerializer.get().deserialize(buffer); - return new Message( + return Message.create( messageId, time, type, diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/types/BufferInfo.java b/app/src/main/java/de/kuschku/libquassel/primitives/types/BufferInfo.java index de1fe2a29360f720beb30a0dd4d17720e2d95df1..473325e5a6e82288b609d1a788aad3863ec87aef 100644 --- a/app/src/main/java/de/kuschku/libquassel/primitives/types/BufferInfo.java +++ b/app/src/main/java/de/kuschku/libquassel/primitives/types/BufferInfo.java @@ -24,64 +24,30 @@ package de.kuschku.libquassel.primitives.types; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -public class BufferInfo { - private int id; - private int networkId; - @NonNull - private Type type; - private int groupId; - @Nullable - private String name; - - public BufferInfo(int id, int networkId, @NonNull Type type, int groupId, @Nullable String name) { - this.id = id; - this.networkId = networkId; - this.type = type; - this.groupId = groupId; - this.name = name; - } +import com.raizlabs.android.dbflow.annotation.Column; +import com.raizlabs.android.dbflow.annotation.PrimaryKey; +import com.raizlabs.android.dbflow.annotation.Table; +import com.raizlabs.android.dbflow.converter.TypeConverter; +import com.raizlabs.android.dbflow.structure.BaseModel; - public int id() { - return id; - } +import de.kuschku.libquassel.localtypes.orm.ConnectedDatabase; - public void setId(int id) { - this.id = id; - } +@Table(database = ConnectedDatabase.class) +public class BufferInfo extends BaseModel { + @PrimaryKey + public int id; - public int networkId() { - return networkId; - } + @Column + public int networkId; - public void setNetworkId(int networkId) { - this.networkId = networkId; - } + @Column + public Type type; - @NonNull - public Type type() { - return type; - } + @Column + public int groupId; - public void setType(@NonNull Type type) { - this.type = type; - } - - public int groupId() { - return groupId; - } - - public void setGroupId(int groupId) { - this.groupId = groupId; - } - - @Nullable - public String name() { - return name; - } - - public void setName(@Nullable String name) { - this.name = name; - } + @Column + public String name; @NonNull @Override @@ -95,6 +61,16 @@ public class BufferInfo { '}'; } + public static BufferInfo create(int id, int networkId, Type type, int groupId, String name) { + BufferInfo info = new BufferInfo(); + info.id = id; + info.networkId = networkId; + info.type = type; + info.groupId = groupId; + info.name = name; + return info; + } + public enum Type { INVALID(0x00), STATUS(0x01), @@ -127,6 +103,7 @@ public class BufferInfo { return INVALID; } } + } public enum BufferStatus { @@ -141,4 +118,5 @@ public class BufferInfo { MESSAGES, HIGHLIGHTS } + } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcUserSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcUserSerializer.java index 6b9a3f28861d588707c4f044feab14a1c8544959..498c5701efdc42b6e728b5c636ea5e4b5f763c7b 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcUserSerializer.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcUserSerializer.java @@ -66,6 +66,7 @@ public class IrcUserSerializer implements ObjectSerializer<IrcUser> { map.data.put("suserHost", new QVariant<>(data.suserHost())); map.data.put("nick", new QVariant<>(data.nick())); map.data.put("realName", new QVariant<>(data.realName())); + map.data.put("account", new QVariant<>(data.account())); map.data.put("awayMessage", new QVariant<>(data.awayMessage())); map.data.put("loginTime", new QVariant<>(data.loginTime())); map.data.put("encrypted", new QVariant<>(data.encrypted())); @@ -95,6 +96,7 @@ public class IrcUserSerializer implements ObjectSerializer<IrcUser> { (String) map.get("suserHost").data, (String) map.get("nick").data, (String) map.get("realName").data, + (String) map.get("account").data, (String) map.get("awayMessage").data, (DateTime) map.get("loginTime").data, (boolean) map.get("encrypted").data, diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkSerializer.java index 6dbacc8a7c2b96d7ec88ce0e0e852e86fdf2ffa5..f68c1ed38b592af8149f1e7b5963ab6db3fe3286 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkSerializer.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkSerializer.java @@ -115,6 +115,7 @@ public class NetworkSerializer implements ObjectSerializer<Network> { (String) users.get("suserHost").data.get(i), (String) users.get("nick").data.get(i), (String) users.get("realName").data.get(i), + (String) users.get("account").data.get(i), (String) users.get("awayMessage").data.get(i), (DateTime) users.get("loginTime").data.get(i), (boolean) users.get("encrypted").data.get(i), diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIgnoreListManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIgnoreListManager.java index 2677b200428d675cf1d791d061d79a43c7d19a23..603385e55fb0c3f6d312844d89931206aa442cb5 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIgnoreListManager.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIgnoreListManager.java @@ -80,6 +80,6 @@ public abstract class AIgnoreListManager<T extends AIgnoreListManager<T>> extend @Override public boolean matches(Message message, QNetwork network) { assertNotNull(network); - return match(message.content, message.sender, message.type, network.networkName(), message.bufferInfo.name()) != StrictnessType.UnmatchedStrictness; + return match(message.content, message.sender, message.type, network.networkName(), message.bufferInfo.name) != StrictnessType.UnmatchedStrictness; } } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java index f6dfb61007566268ebdbe5481564f5e9b665e889..04bc72d06956bd57adedf53f473cbb1cb43231b2 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java @@ -54,6 +54,12 @@ public abstract class AIrcUser<T extends AIrcUser<T>> extends SyncableObject<T> syncVar("setRealName", realName); } + @Override + public void setAccount(String account) { + _setAccount(account); + syncVar("setAccount", account); + } + @Override public void setAway(boolean away) { _setAway(away); diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/AliasManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/AliasManager.java index f462171abfec2271bfff3955d3bc95f368d8bf7d..3a6e7865cf6c5c161153b1a859d1cefd99972ef0 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/AliasManager.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/AliasManager.java @@ -109,8 +109,8 @@ public class AliasManager extends AAliasManager<AliasManager> { command = command.replaceAll(String.format(Locale.US, "$%d", j), params.get(j - 1)); } command = command.replaceAll("\\$0", args); - command = command.replaceAll("\\$channelname", info.name() != null ? info.name() : ""); - command = command.replaceAll("\\$channel", info.name() != null ? info.name() : ""); + command = command.replaceAll("\\$channelname", info.name != null ? info.name : ""); + command = command.replaceAll("\\$channel", info.name != null ? info.name : ""); command = command.replaceAll("\\$currentnick", network.myNick()); command = command.replaceAll("\\$nick", network.myNick()); command = command.replaceAll("\\$network", network.networkName()); @@ -204,7 +204,7 @@ public class AliasManager extends AAliasManager<AliasManager> { args = message.substring(space + 1); } int index = indexOfIgnoreCase(command); - QNetwork network = client.networkManager().network(info.networkId()); + QNetwork network = client.networkManager().network(info.networkId); if (index != -1 && network != null) { Alias alias = aliases.get(index); list.addAll(expand(alias.expansion, info, network, args)); diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java index 605b2f9d6178758e3078c3b5a93dcec65e91373b..62c97c1f063e10f3229cf8385040ba4cf830fa68 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java @@ -23,6 +23,9 @@ package de.kuschku.libquassel.syncables.types.impl; import android.support.annotation.IntRange; import android.support.annotation.NonNull; +import android.util.Log; + +import com.raizlabs.android.dbflow.sql.language.SQLite; import java.util.HashSet; import java.util.List; @@ -38,6 +41,7 @@ import de.kuschku.libquassel.events.ConnectionChangeEvent; import de.kuschku.libquassel.localtypes.BacklogFilter; import de.kuschku.libquassel.localtypes.backlogstorage.BacklogStorage; import de.kuschku.libquassel.message.Message; +import de.kuschku.libquassel.message.Message_Table; import de.kuschku.libquassel.primitives.types.QVariant; import de.kuschku.libquassel.syncables.types.abstracts.ABacklogManager; import de.kuschku.util.observables.lists.ObservableComparableSortedList; @@ -65,7 +69,7 @@ public class BacklogManager extends ABacklogManager<BacklogManager> { if (!initialized.contains(bufferId) || null == (last = storage.getUnfiltered(bufferId).last())) requestBacklogInitial(bufferId, amount); else { - requestBacklog(bufferId, -1, last.messageId, amount, 0); + requestBacklog(bufferId, -1, last.id, amount, 0); } } @@ -76,7 +80,11 @@ public class BacklogManager extends ABacklogManager<BacklogManager> { waiting.add(id); waitingMax++; - requestBacklog(id, -1, -1, amount, 0); + Message lastMessageForBuffer = SQLite.select().from(Message.class).where(Message_Table.bufferInfo_id.eq(id)).orderBy(Message_Table.id, false).limit(1).querySingle(); + if (lastMessageForBuffer != null) + requestBacklog(id, lastMessageForBuffer.id, -1, amount, 1); + else + requestBacklog(id, -1, -1, amount, 1); } @Override @@ -88,6 +96,11 @@ public class BacklogManager extends ABacklogManager<BacklogManager> { public void _receiveBacklog(int id, int first, int last, int limit, int additional, @NonNull List<Message> messages) { assertNotNull(provider); + Log.d("DEBUG", "Received " + messages.size() + " messages out of a max of " + limit); + + Message lastMessageForBuffer = SQLite.select().from(Message.class).where(Message_Table.bufferInfo_id.eq(id)).orderBy(Message_Table.id, false).limit(1).querySingle(); + if (lastMessageForBuffer != null && messages.get(0).id > lastMessageForBuffer.id) + storage.clear(id); storage.insertMessages(id, messages.toArray(new Message[messages.size()])); if (messages.size() > 0 && !client.bufferManager().exists(messages.get(0).bufferInfo)) client.bufferManager().createBuffer(messages.get(0).bufferInfo); @@ -125,8 +138,8 @@ public class BacklogManager extends ABacklogManager<BacklogManager> { Set<Integer> buffers = new HashSet<>(); for (Message message : messages) { - storage.insertMessages(message.bufferInfo.id(), message); - buffers.add(message.bufferInfo.id()); + storage.insertMessages(message.bufferInfo.id, message); + buffers.add(message.bufferInfo.id); } for (int id : buffers) { provider.sendEvent(new BacklogReceivedEvent(id)); @@ -167,10 +180,13 @@ public class BacklogManager extends ABacklogManager<BacklogManager> { public void open(int bufferId) { assertNotNull(provider); + int oldBuffer = open(); setOpen(bufferId); if (bufferId != -1 && client.bufferSyncer() != null) client.bufferSyncer().requestMarkBufferAsRead(bufferId); provider.sendEvent(new BufferChangeEvent()); + if (oldBuffer != bufferId) + client.backlogStorage().markBufferUnused(oldBuffer); } @Override @@ -181,7 +197,7 @@ public class BacklogManager extends ABacklogManager<BacklogManager> { @Override public void receiveBacklog(@NonNull Message msg) { storage.insertMessages(msg); - if (msg.bufferInfo.id() == openBuffer && openBuffer != -1) + if (msg.bufferInfo.id == openBuffer && openBuffer != -1) client.bufferSyncer().requestMarkBufferAsRead(openBuffer); } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java index 1b6c15ec4b71beb92a7e72a5ee34f1a1e1afdfe3..23176613b28ec36bf7d503273d4a7071148e5941 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java @@ -177,8 +177,8 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> { _setLastSeenMsg(buffer, -1); _setMarkerLine(buffer, -1); } else { - _setLastSeenMsg(buffer, lastMessage.messageId); - _setMarkerLine(buffer, lastMessage.messageId); + _setLastSeenMsg(buffer, lastMessage.id); + _setMarkerLine(buffer, lastMessage.id); } } @@ -232,9 +232,9 @@ public class BufferSyncer extends ABufferSyncer<BufferSyncer> { } public void addActivity(@NonNull Message message) { - int lastSeenMsg = lastSeenMsg(message.bufferInfo.id()); - if (message.messageId > lastSeenMsg) { - addActivity(message.bufferInfo.id(), message.type); + int lastSeenMsg = lastSeenMsg(message.bufferInfo.id); + if (message.id > lastSeenMsg) { + addActivity(message.bufferInfo.id, message.type); } } } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java index 507797837af4243bed17751eced2e3e1f2c3359b..9ec26017d47f05a8c6f253cd4a04e3826a069ab7 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java @@ -141,10 +141,10 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> { @Override public DisplayType mayDisplay(Buffer buffer) { if (buffer != null && - (allowedBufferTypes == 0 || (0 != (buffer.getInfo().type().id & allowedBufferTypes()))) && - (networkId == 0 || (networkId == buffer.getInfo().networkId())) + (allowedBufferTypes == 0 || (0 != (buffer.getInfo().type.id & allowedBufferTypes()))) && + (networkId == 0 || (networkId == buffer.getInfo().networkId)) ) { - int bufferid = buffer.getInfo().id(); + int bufferid = buffer.getInfo().id; if (bufferIds.contains(bufferid) && !temporarilyRemovedBuffers.contains(bufferid) && !removedBuffers.contains(bufferid)) return DisplayType.ALWAYS; else if (temporarilyRemovedBuffers.contains(bufferid) && !removedBuffers.contains(bufferid)) 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 8e61b521aeea17d716d257a8bf83c15033a42402..aa7e94d8cfd1322338bdb5e018ab251f0150b2ed 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 @@ -23,6 +23,7 @@ package de.kuschku.libquassel.syncables.types.impl; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v7.widget.LinearLayoutCompat; import android.util.SparseArray; import org.joda.time.DateTime; @@ -57,6 +58,7 @@ public class IrcUser extends AIrcUser<IrcUser> { private String host; private String nick; private String realName; + private String account; private boolean away; private String awayMessage; private DateTime idleTime; @@ -70,7 +72,7 @@ public class IrcUser extends AIrcUser<IrcUser> { private QNetwork network; private Set<Character> userModes; - public IrcUser(String server, String ircOperator, boolean away, int lastAwayMessage, DateTime idleTime, String whoisServiceReply, String suserHost, String nick, String realName, String awayMessage, DateTime loginTime, boolean encrypted, List<String> channels, String host, String userModes, String user) { + public IrcUser(String server, String ircOperator, boolean away, int lastAwayMessage, DateTime idleTime, String whoisServiceReply, String suserHost, String nick, String realName, String account, String awayMessage, DateTime loginTime, boolean encrypted, List<String> channels, String host, String userModes, String user) { this.server = server; this.ircOperator = ircOperator; this.away = away; @@ -80,6 +82,7 @@ public class IrcUser extends AIrcUser<IrcUser> { this.suserHost = suserHost; this.nick = nick; this.realName = realName; + this.account = account; this.awayMessage = awayMessage; this.loginTime = loginTime; this.encrypted = encrypted; @@ -118,6 +121,7 @@ public class IrcUser extends AIrcUser<IrcUser> { null, null, null, + null, false, null, host, @@ -146,6 +150,11 @@ public class IrcUser extends AIrcUser<IrcUser> { return realName; } + @Override + public String account() { + return account; + } + @Override public String hostmask() { return String.format("%s!%s@%s", nick(), user(), host()); @@ -280,6 +289,12 @@ public class IrcUser extends AIrcUser<IrcUser> { _update(); } + @Override + public void _setAccount(String account) { + this.account = account; + _update(); + } + @Override public void _setAway(boolean away) { this.away = away; 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 7152d307ae1fba4769f0fb0ac4d227748a68bf18..d6310272f167b00c38042232e29f1c163cd9c5f6 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 @@ -42,6 +42,8 @@ public interface QIrcUser extends QObservable { String hostmask(); + String account(); + boolean isAway(); @Synced @@ -101,6 +103,11 @@ public interface QIrcUser extends QObservable { void _setRealName(final String realName); + @Synced + void setAccount(final String account); + + void _setAccount(final String account); + void _setAway(final boolean away); @Synced diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasselDroidNG.java b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasselDroidNG.java index d67ec36b3bfb92f11c69efb454b5e1ae51abe437..3cc4a1d3ea0d5762340264ca11795f25cad943cf 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasselDroidNG.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasselDroidNG.java @@ -24,6 +24,11 @@ package de.kuschku.quasseldroid_ng; import android.app.Application; import android.content.Context; +import com.raizlabs.android.dbflow.config.FlowConfig; +import com.raizlabs.android.dbflow.config.FlowManager; + +import de.kuschku.libquassel.localtypes.orm.ConnectedDatabase; + public class QuasselDroidNG extends Application { private static Context applicationContext; @@ -36,5 +41,7 @@ public class QuasselDroidNG extends Application { public void onCreate() { super.onCreate(); applicationContext = getApplicationContext(); + FlowManager.init(new FlowConfig.Builder(this).build()); + FlowManager.getDatabase(ConnectedDatabase.class).getWritableDatabase(); } } 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 08db2fe2fa9597afb2f30b0fa3f59d31bac73fea..1bdc49cdc2bf44354f31eb2885d5da011d2729ef 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 @@ -33,7 +33,7 @@ import de.kuschku.libquassel.client.FeatureFlags; import de.kuschku.libquassel.events.ConnectionChangeEvent; import de.kuschku.libquassel.events.GeneralErrorEvent; import de.kuschku.libquassel.events.LoginRequireEvent; -import de.kuschku.libquassel.localtypes.backlogstorage.MemoryBacklogStorage; +import de.kuschku.libquassel.localtypes.backlogstorage.HybridBacklogStorage; import de.kuschku.libquassel.protocols.RemotePeer; import de.kuschku.quasseldroid_ng.ui.settings.Settings; import de.kuschku.util.CompatibilityUtils; @@ -62,7 +62,7 @@ public class ClientBackgroundThread implements Runnable { provider, CLIENT_DATA, new SQLiteCertificateManager(context), - new MemoryBacklogStorage(), + new HybridBacklogStorage(), new SQLiteBufferMetaDataManager(context), account.id.toString() ); 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 d2913478ace5eaa4fb64de758e66ec072cf72760..5e2391e3a405925f1d14deca957e05f51dc40eae 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 @@ -83,7 +83,7 @@ public class ChannelDetailActivity extends BoundActivity { if (channel == null) return; if (channel.topic() == null) { - topic.setText(R.string.no_topic_set); + topic.setText(R.string.labelNoTopic); topic.setTextColor(context.themeUtil().res.colorForegroundSecondary); topic.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC)); } else { 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 ed2679724e916754f906c72a6cbe3dbd34cdd7d7..9a8cf337aca4c01eb85e25fc67abbf944f9baedc 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 @@ -134,7 +134,7 @@ public class MainActivity extends BoundActivity { chatListAdapter = BufferViewConfigAdapter.of(context); chatListAdapter.setBufferClickListener(buffer -> { if (context.client() != null) { - context.client().backlogManager().open(buffer.getInfo().id()); + context.client().backlogManager().open(buffer.getInfo().id); if (drawerLayout != null) drawerLayout.closeDrawer(GravityCompat.START); } @@ -150,6 +150,7 @@ public class MainActivity extends BoundActivity { if (drawerLayout != null) { ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.material_drawer_open, R.string.material_drawer_close); toggle.syncState(); + drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); } replaceFragment(new LoadingFragment()); @@ -161,15 +162,16 @@ public class MainActivity extends BoundActivity { } @Override - protected void onPause() { - super.onPause(); + protected void onStop() { + super.onStop(); if (context.client() != null) context.client().backlogManager().setOpen(-1); + context.client().backlogStorage().markBufferUnused(context.client().backlogManager().open()); } @Override - protected void onResume() { - super.onResume(); + protected void onStart() { + super.onStart(); if (context.client() != null) context.client().backlogManager().open(status.bufferId); } @@ -266,6 +268,7 @@ public class MainActivity extends BoundActivity { int id = backlogManager.open(); status.bufferId = id; updateBuffer(id); + chatListAdapter.setOpen(id); } } @@ -331,6 +334,9 @@ public class MainActivity extends BoundActivity { } private void onConnected() { + if (drawerLayout != null) + drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); + context.client().backlogManager().open(status.bufferId); if (context.client().bufferViewManager() != null) { chatListSpinner.setAdapter(new BufferViewConfigSpinnerAdapter(context, context.client().bufferViewManager())); 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 48ede6dd59edbfcfb8b5c78d6f4e9fdee9562fac..a0c4af4a22d014308ba8131e4ac2c00dc2f55d3a 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 @@ -105,7 +105,7 @@ public class ChatMessageRenderer { @NonNull private CharSequence getBufferName(@NonNull Message message) { assertNotNull(context.client()); - Buffer buffer = context.client().bufferManager().buffer(message.bufferInfo.id()); + Buffer buffer = context.client().bufferManager().buffer(message.bufferInfo.id); assertNotNull(buffer); String name = buffer.getName(); assertNotNull(name); 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 a391374ae96124e4fa8a4308865d4d374d10ae90..1e1be5585a7b70e1ac4244221a719195230a71a5 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 @@ -35,6 +35,7 @@ import java.lang.ref.WeakReference; import java.util.Map; import java.util.WeakHashMap; +import de.kuschku.libquassel.events.BufferChangeEvent; import de.kuschku.libquassel.localtypes.buffers.Buffer; import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewHolder.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewHolder.java index 8ec64bcd060124786f5f6d66180978e40f34bf95..2723807f2372aec183ba9b8c75ec974a56bfca59 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewHolder.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewHolder.java @@ -95,7 +95,7 @@ public class BufferViewHolder extends ChildViewHolder { status = buffer.getStatus(); name.setText(buffer.getName()); if (viewIntBinder != null) viewIntBinder.unbind(); - viewIntBinder = new ViewIntBinder(context.client().bufferSyncer().activity(buffer.getInfo().id())); + viewIntBinder = new ViewIntBinder(context.client().bufferSyncer().activity(buffer.getInfo().id)); viewIntBinder.bindTextColor(name, colorFromActivityStatus(buffer)); setDescription(context.deserializer().formatString(getDescription(buffer))); setBadge(0); @@ -103,9 +103,9 @@ public class BufferViewHolder extends ChildViewHolder { itemView.setBackground(background); - id = buffer.getInfo().id(); + id = buffer.getInfo().id; - BufferInfo.Type type = buffer.getInfo().type(); + BufferInfo.Type type = buffer.getInfo().type; setIcon(context, type, status); callback = new Observable.OnPropertyChangedCallback() { @Override @@ -121,7 +121,7 @@ public class BufferViewHolder extends ChildViewHolder { @NonNull private Function<Integer, Integer> colorFromActivityStatus(Buffer buffer) { return activities -> { - int filters = context.client().backlogManager().filter(buffer.getInfo().id()).getFilters(); + int filters = context.client().backlogManager().filter(buffer.getInfo().id).getFilters(); activities = activities & ~filters; if (0 != ((activities & Message.Type.Plain.value) | (activities & Message.Type.Notice.value) | (activities & Message.Type.Action.value))) return context.themeUtil().res.colorTintMessage; 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 2220c55db4db4018f09eabd882e744c326f97e91..e528083d03886eb890a7e8a77b02dc54c123e0d1 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 @@ -39,20 +39,20 @@ public class NetworkItem implements ParentListItem { private final ObservableSortedList<Buffer> buffers = new ObservableSortedList<>(Buffer.class, new ObservableSortedList.ItemComparator<Buffer>() { @Override public int compare(Buffer o1, Buffer o2) { - if (o1.getInfo().type() == o2.getInfo().type()) { + if (o1.getInfo().type == o2.getInfo().type) { return IrcCaseMapper.toLowerCase(o1.getName()).compareTo(IrcCaseMapper.toLowerCase(o2.getName())); } else { - if (o1.getInfo().type() == BufferInfo.Type.STATUS) + if (o1.getInfo().type == BufferInfo.Type.STATUS) return -1; - else if (o2.getInfo().type() == BufferInfo.Type.STATUS) + else if (o2.getInfo().type == BufferInfo.Type.STATUS) return 1; - else if (o1.getInfo().type() == BufferInfo.Type.CHANNEL) + else if (o1.getInfo().type == BufferInfo.Type.CHANNEL) return -1; - else if (o2.getInfo().type() == BufferInfo.Type.CHANNEL) + else if (o2.getInfo().type == BufferInfo.Type.CHANNEL) return 1; - else if (o1.getInfo().type() == BufferInfo.Type.GROUP) + else if (o1.getInfo().type == BufferInfo.Type.GROUP) return -1; - else if (o2.getInfo().type() == BufferInfo.Type.GROUP) + else if (o2.getInfo().type == BufferInfo.Type.GROUP) return 1; else return -1; @@ -66,7 +66,7 @@ public class NetworkItem implements ParentListItem { @Override public boolean areItemsTheSame(Buffer item1, Buffer item2) { - return item1.getInfo().id() == item2.getInfo().id(); + return item1.getInfo().id == item2.getInfo().id; } }); @@ -74,14 +74,14 @@ public class NetworkItem implements ParentListItem { this.network = network; for (int id : config.bufferList()) { Buffer buffer = context.client().bufferManager().buffer(id); - if (context.bufferDisplayTypes().contains(config.mayDisplay(buffer)) && buffer.getInfo().networkId() == network.networkId()) + if (context.bufferDisplayTypes().contains(config.mayDisplay(buffer)) && buffer.getInfo().networkId == network.networkId()) buffers.add(buffer); } config.bufferIds().addCallback(new ElementCallback<Integer>() { @Override public void notifyItemInserted(Integer id) { Buffer buffer = context.client().bufferManager().buffer(id); - if (context.bufferDisplayTypes().contains(config.mayDisplay(buffer)) && buffer.getInfo().networkId() == network.networkId()) + if (context.bufferDisplayTypes().contains(config.mayDisplay(buffer)) && buffer.getInfo().networkId == network.networkId()) buffers.add(buffer); } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/ScrollRefreshLayout.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/ScrollRefreshLayout.java new file mode 100644 index 0000000000000000000000000000000000000000..cdaaf8338b606cb006d09f173ec8f5c32c8490d7 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/ScrollRefreshLayout.java @@ -0,0 +1,36 @@ +/* + * 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.quasseldroid_ng.ui.chat.util; + +import android.content.Context; +import android.support.v4.widget.SwipeRefreshLayout; +import android.util.AttributeSet; + +public class ScrollRefreshLayout extends SwipeRefreshLayout { + public ScrollRefreshLayout(Context context) { + super(context); + } + + public ScrollRefreshLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } +} diff --git a/app/src/main/java/de/kuschku/util/AndroidAssert.java b/app/src/main/java/de/kuschku/util/AndroidAssert.java index 10d2b882993b259f78408d19c1c1307771e88693..055db4b0d081c0e0ff7b0fc4bbbdbfe92581c396 100644 --- a/app/src/main/java/de/kuschku/util/AndroidAssert.java +++ b/app/src/main/java/de/kuschku/util/AndroidAssert.java @@ -43,7 +43,7 @@ public class AndroidAssert extends Assert { } } - public static void assertTrue(String message, boolean condition) { + public static void assertTrue(@Nullable String message, boolean condition) { if (BuildConfig.DEBUG) { if (!condition) fail(message); } @@ -79,7 +79,7 @@ public class AndroidAssert extends Assert { } } - public static void fail(String message) { + public static void fail(@Nullable String message) { if (BuildConfig.DEBUG) { throw new AssertionError(message); } diff --git a/app/src/main/java/de/kuschku/util/irc/format/IrcFormatHelper.java b/app/src/main/java/de/kuschku/util/irc/format/IrcFormatHelper.java index c7fefd73ae2849df748641d338d6f890ee813676..dd1f64cb938d2322f083e2e086380195dadc7c99 100644 --- a/app/src/main/java/de/kuschku/util/irc/format/IrcFormatHelper.java +++ b/app/src/main/java/de/kuschku/util/irc/format/IrcFormatHelper.java @@ -98,10 +98,10 @@ public class IrcFormatHelper { } Matcher channelMatcher = channelPattern.matcher(str); while (channelMatcher.find()) { - QIrcChannel channel = client.networkManager().network(bufferInfo.networkId()).ircChannel(channelMatcher.group()); + QIrcChannel channel = client.networkManager().network(bufferInfo.networkId).ircChannel(channelMatcher.group()); Buffer buffer = client.bufferManager().channel(channel); if (buffer != null) - spans.add(new FutureClickableSpan(new ChannelSpan(client, buffer.getInfo().id(), listener), channelMatcher.start(), channelMatcher.end())); + spans.add(new FutureClickableSpan(new ChannelSpan(client, buffer.getInfo().id, listener), channelMatcher.start(), channelMatcher.end())); } for (FutureClickableSpan span : spans) { str.setSpan(span.span, span.start, span.end, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); diff --git a/app/src/main/java/de/kuschku/util/servicebound/BoundActivity.java b/app/src/main/java/de/kuschku/util/servicebound/BoundActivity.java index 17a70f76df050157140579479efb6d03784df102..1ca1e97bec8c56f823c9a75b392ddd0dbcf33991 100644 --- a/app/src/main/java/de/kuschku/util/servicebound/BoundActivity.java +++ b/app/src/main/java/de/kuschku/util/servicebound/BoundActivity.java @@ -69,8 +69,8 @@ public abstract class BoundActivity extends AppCompatActivity { } @Override - protected void onResume() { - super.onResume(); + protected void onStart() { + super.onStart(); ServiceHelper.connectToService(this, connection); if (themeId != AppTheme.themeFromString(context.settings().preferenceTheme.get()).themeId) { finish(); @@ -79,8 +79,8 @@ public abstract class BoundActivity extends AppCompatActivity { } @Override - protected void onPause() { - super.onPause(); + protected void onStop() { + super.onStop(); ServiceHelper.disconnect(this, connection); } diff --git a/app/src/main/res/layout/fragment_chat.xml b/app/src/main/res/layout/fragment_chat.xml index 5816e09be308dd4d92a5792ec998909b225a75a6..b7053461b94feb75a05ff6253a6752fb8a60ca67 100644 --- a/app/src/main/res/layout/fragment_chat.xml +++ b/app/src/main/res/layout/fragment_chat.xml @@ -34,7 +34,7 @@ app:umanoShadowHeight="4dp" tools:showIn="@layout/activity_chat"> - <android.support.v4.widget.SwipeRefreshLayout + <de.kuschku.quasseldroid_ng.ui.chat.util.ScrollRefreshLayout android:id="@+id/swipe_view" android:layout_width="match_parent" android:layout_height="match_parent"> @@ -44,7 +44,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" /> - </android.support.v4.widget.SwipeRefreshLayout> + </de.kuschku.quasseldroid_ng.ui.chat.util.ScrollRefreshLayout> <include layout="@layout/widget_slider" /> diff --git a/app/src/main/res/layout/slide.xml b/app/src/main/res/layout/slide.xml index ec09103310cca21ba4e01e9be8319488360ceed3..17b39ffe7205c1192cee2fe1fb6586381f732c7d 100644 --- a/app/src/main/res/layout/slide.xml +++ b/app/src/main/res/layout/slide.xml @@ -23,7 +23,8 @@ <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:background="@color/md_light_cards" > <LinearLayout android:layout_width="match_parent" @@ -60,8 +61,7 @@ <FrameLayout android:id="@+id/content_host" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/md_light_cards" /> + android:layout_height="wrap_content" /> </LinearLayout> diff --git a/app/src/main/res/layout/slide_account_core.xml b/app/src/main/res/layout/slide_account_core.xml index de5791d490fa396ceb37395672f46843bae32386..6783884843514080e572060b52b1a444c1ef7955 100644 --- a/app/src/main/res/layout/slide_account_core.xml +++ b/app/src/main/res/layout/slide_account_core.xml @@ -30,7 +30,7 @@ <android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="Hostname"> + android:hint="@string/labelHostname"> <android.support.v7.widget.AppCompatEditText android:id="@+id/host" android:layout_width="match_parent" @@ -41,12 +41,13 @@ <android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="Port"> + android:hint="@string/labelPort"> <android.support.v7.widget.AppCompatEditText android:id="@+id/port" android:layout_width="match_parent" android:layout_height="wrap_content" - android:inputType="number" /> + android:inputType="number" + android:text="@string/defaultPort"/> </android.support.design.widget.TextInputLayout> </LinearLayout> diff --git a/app/src/main/res/layout/widget_chatmessage.xml b/app/src/main/res/layout/widget_chatmessage.xml index 9eefa41750ade2e6d771b30d1fb10cad083f4669..021b53088ae44f8da06e0ce85c3692ab6737e9f2 100644 --- a/app/src/main/res/layout/widget_chatmessage.xml +++ b/app/src/main/res/layout/widget_chatmessage.xml @@ -22,7 +22,7 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="wrap_content" android:clickable="true" android:gravity="top" android:orientation="horizontal" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e7d11601209bf0a22b549d2d9ef68fac5e6ab21d..ae9ebc859451dd4ea8195067844ff14e7d7e4751 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -30,13 +30,14 @@ <!-- Editor UI --> <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 --> + <!-- Actions, Labels and Messages --> <string name="labelLogin">Login</string> <string name="labelCancel">Cancel</string> <string name="labelReconnect">Connect</string> @@ -49,10 +50,14 @@ <string name="labelPassword">Password</string> <string name="labelUsername">Username</string> <string name="labelHideEvents">Hide events</string> - + <string name="labelNoTopic">No Topic Set</string> + <string name="labelUserOnHost">%1$s on %2$s</string> <string name="warningCertificate">Do you trust this certificate?</string> - <string name="labelUserOnHost">%1$s on %2$s</string> + <!-- Defaults --> + <string name="defaultPort" translatable="false">4242</string> + + <!-- Slides --> <string name="slideAccountcoreTitle">The Core</string> <string name="slideAccountcoreDescription">First, please choose which server your core is hosted on – if you don’t know what a core is, click [here]</string> @@ -66,6 +71,8 @@ <string name="slideAccountnameTitle">Customize Account</string> <string name="slideAccountnameDescription">Give this account a name and icon</string> + <!-- Status --> + <string name="statusConnecting">Connecting</string> <string name="statusHandshake">Logging in</string> <string name="statusInitData">Loading Networks and Channels</string> @@ -73,5 +80,4 @@ <string name="statusConnected">Connected</string> <string name="statusWelcome">Welcome!</string> <string name="statusDisconnected">Connection lost</string> - <string name="no_topic_set">No Topic Set</string> </resources>