include mediaType and size in message content
This commit is contained in:
parent
506e4e1d0c
commit
69866e591c
|
@ -74,7 +74,7 @@ dependencies {
|
||||||
annotationProcessor project(':annotation-processor')
|
annotationProcessor project(':annotation-processor')
|
||||||
|
|
||||||
// make Java 8 API available
|
// make Java 8 API available
|
||||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.2'
|
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
|
||||||
|
|
||||||
|
|
||||||
// Jetpack / AndroidX libraries
|
// Jetpack / AndroidX libraries
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
"formatVersion": 1,
|
"formatVersion": 1,
|
||||||
"database": {
|
"database": {
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"identityHash": "8be54d59ea976565ba5a4f7a9faf9109",
|
"identityHash": "77c7c4ba9aae53855e38b8ce967e2668",
|
||||||
"entities": [
|
"entities": [
|
||||||
{
|
{
|
||||||
"tableName": "account",
|
"tableName": "account",
|
||||||
|
@ -1947,7 +1947,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"tableName": "message_content",
|
"tableName": "message_content",
|
||||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `messageVersionId` INTEGER NOT NULL, `language` TEXT, `type` TEXT, `body` TEXT, `url` TEXT, FOREIGN KEY(`messageVersionId`) REFERENCES `message_version`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
|
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `messageVersionId` INTEGER NOT NULL, `language` TEXT, `partType` TEXT, `mediaType` TEXT, `size` INTEGER, `body` TEXT, `url` TEXT, `cached` INTEGER NOT NULL, FOREIGN KEY(`messageVersionId`) REFERENCES `message_version`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
"fieldPath": "id",
|
"fieldPath": "id",
|
||||||
|
@ -1968,11 +1968,23 @@
|
||||||
"notNull": false
|
"notNull": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldPath": "type",
|
"fieldPath": "partType",
|
||||||
"columnName": "type",
|
"columnName": "partType",
|
||||||
"affinity": "TEXT",
|
"affinity": "TEXT",
|
||||||
"notNull": false
|
"notNull": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"fieldPath": "mediaType",
|
||||||
|
"columnName": "mediaType",
|
||||||
|
"affinity": "TEXT",
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldPath": "size",
|
||||||
|
"columnName": "size",
|
||||||
|
"affinity": "INTEGER",
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"fieldPath": "body",
|
"fieldPath": "body",
|
||||||
"columnName": "body",
|
"columnName": "body",
|
||||||
|
@ -1984,6 +1996,12 @@
|
||||||
"columnName": "url",
|
"columnName": "url",
|
||||||
"affinity": "TEXT",
|
"affinity": "TEXT",
|
||||||
"notNull": false
|
"notNull": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldPath": "cached",
|
||||||
|
"columnName": "cached",
|
||||||
|
"affinity": "INTEGER",
|
||||||
|
"notNull": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"primaryKey": {
|
"primaryKey": {
|
||||||
|
@ -2694,7 +2712,7 @@
|
||||||
"views": [],
|
"views": [],
|
||||||
"setupQueries": [
|
"setupQueries": [
|
||||||
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
|
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
|
||||||
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '8be54d59ea976565ba5a4f7a9faf9109')"
|
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '77c7c4ba9aae53855e38b8ce967e2668')"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -516,7 +516,8 @@ public class MessageTransformationTest extends BaseTransformationTest {
|
||||||
final var messages = database.messageDao().getMessagesForTesting(1L);
|
final var messages = database.messageDao().getMessagesForTesting(1L);
|
||||||
final var message = Iterables.getOnlyElement(messages);
|
final var message = Iterables.getOnlyElement(messages);
|
||||||
Assert.assertEquals(Modification.RETRACTION, message.modification);
|
Assert.assertEquals(Modification.RETRACTION, message.modification);
|
||||||
Assert.assertEquals(PartType.RETRACTION, Iterables.getOnlyElement(message.contents).type);
|
Assert.assertEquals(
|
||||||
|
PartType.RETRACTION, Iterables.getOnlyElement(message.contents).partType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -2,6 +2,7 @@ package im.conversations.android.database;
|
||||||
|
|
||||||
import androidx.room.TypeConverter;
|
import androidx.room.TypeConverter;
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
|
import com.google.common.net.MediaType;
|
||||||
import de.measite.minidns.DNSName;
|
import de.measite.minidns.DNSName;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
|
@ -176,4 +177,14 @@ public final class Converters {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TypeConverter
|
||||||
|
public static String fromMediaType(final MediaType mediaType) {
|
||||||
|
return mediaType == null ? null : mediaType.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@TypeConverter
|
||||||
|
public static MediaType toMediaType(final String mediaType) {
|
||||||
|
return mediaType == null ? null : MediaType.parse(mediaType);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import androidx.room.Entity;
|
||||||
import androidx.room.ForeignKey;
|
import androidx.room.ForeignKey;
|
||||||
import androidx.room.Index;
|
import androidx.room.Index;
|
||||||
import androidx.room.PrimaryKey;
|
import androidx.room.PrimaryKey;
|
||||||
|
import com.google.common.net.MediaType;
|
||||||
import im.conversations.android.database.model.MessageContent;
|
import im.conversations.android.database.model.MessageContent;
|
||||||
import im.conversations.android.database.model.PartType;
|
import im.conversations.android.database.model.PartType;
|
||||||
|
|
||||||
|
@ -26,20 +27,27 @@ public class MessageContentEntity {
|
||||||
|
|
||||||
public String language;
|
public String language;
|
||||||
|
|
||||||
public PartType type;
|
public PartType partType;
|
||||||
|
public MediaType mediaType;
|
||||||
|
public Long size;
|
||||||
|
|
||||||
public String body;
|
public String body;
|
||||||
|
|
||||||
public String url;
|
public String url;
|
||||||
|
|
||||||
|
public boolean cached;
|
||||||
|
|
||||||
public static MessageContentEntity of(
|
public static MessageContentEntity of(
|
||||||
final long messageVersionId, final MessageContent content) {
|
final long messageVersionId, final MessageContent content) {
|
||||||
final var entity = new MessageContentEntity();
|
final var entity = new MessageContentEntity();
|
||||||
entity.messageVersionId = messageVersionId;
|
entity.messageVersionId = messageVersionId;
|
||||||
entity.language = content.language;
|
entity.language = content.language;
|
||||||
entity.type = content.type;
|
entity.partType = content.partType;
|
||||||
|
entity.mediaType = content.mediaType;
|
||||||
|
entity.size = content.size;
|
||||||
entity.body = content.body;
|
entity.body = content.body;
|
||||||
entity.url = content.url;
|
entity.url = content.url;
|
||||||
|
entity.cached = content.cached;
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,30 +1,45 @@
|
||||||
package im.conversations.android.database.model;
|
package im.conversations.android.database.model;
|
||||||
|
|
||||||
import com.google.common.base.Objects;
|
import com.google.common.base.Objects;
|
||||||
|
import com.google.common.net.MediaType;
|
||||||
|
|
||||||
public class MessageContent {
|
public class MessageContent {
|
||||||
|
|
||||||
public final String language;
|
public final String language;
|
||||||
|
|
||||||
public final PartType type;
|
public final PartType partType;
|
||||||
|
public MediaType mediaType;
|
||||||
|
public Long size;
|
||||||
|
|
||||||
public final String body;
|
public final String body;
|
||||||
|
|
||||||
public final String url;
|
public final String url;
|
||||||
|
|
||||||
public MessageContent(String language, PartType type, String body, String url) {
|
public boolean cached;
|
||||||
|
|
||||||
|
public MessageContent(
|
||||||
|
String language,
|
||||||
|
PartType partType,
|
||||||
|
MediaType mediaType,
|
||||||
|
Long size,
|
||||||
|
String body,
|
||||||
|
String url,
|
||||||
|
boolean cached) {
|
||||||
this.language = language;
|
this.language = language;
|
||||||
this.type = type;
|
this.partType = partType;
|
||||||
|
this.mediaType = mediaType;
|
||||||
|
this.size = size;
|
||||||
this.body = body;
|
this.body = body;
|
||||||
this.url = url;
|
this.url = url;
|
||||||
|
this.cached = cached;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MessageContent text(final String body, final String language) {
|
public static MessageContent text(final String body, final String language) {
|
||||||
return new MessageContent(language, PartType.TEXT, body, null);
|
return new MessageContent(language, PartType.TEXT, null, null, body, null, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MessageContent file(final String url) {
|
public static MessageContent file(final String url) {
|
||||||
return new MessageContent(null, PartType.FILE, null, url);
|
return new MessageContent(null, PartType.FILE, null, null, null, url, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -32,14 +47,17 @@ public class MessageContent {
|
||||||
if (this == o) return true;
|
if (this == o) return true;
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
MessageContent that = (MessageContent) o;
|
MessageContent that = (MessageContent) o;
|
||||||
return Objects.equal(language, that.language)
|
return cached == that.cached
|
||||||
&& type == that.type
|
&& Objects.equal(language, that.language)
|
||||||
|
&& partType == that.partType
|
||||||
|
&& Objects.equal(mediaType, that.mediaType)
|
||||||
|
&& Objects.equal(size, that.size)
|
||||||
&& Objects.equal(body, that.body)
|
&& Objects.equal(body, that.body)
|
||||||
&& Objects.equal(url, that.url);
|
&& Objects.equal(url, that.url);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return Objects.hashCode(language, type, body, url);
|
return Objects.hashCode(language, partType, mediaType, size, body, url, cached);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,7 +105,7 @@ public final class MessageWithContentReactions
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasPreview() {
|
public boolean hasPreview() {
|
||||||
return Iterables.tryFind(this.contents, c -> c.type == PartType.FILE).isPresent();
|
return Iterables.tryFind(this.contents, c -> c.partType == PartType.FILE).isPresent();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasDownloadButton() {
|
public boolean hasDownloadButton() {
|
||||||
|
@ -113,7 +113,7 @@ public final class MessageWithContentReactions
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasTextContent() {
|
public boolean hasTextContent() {
|
||||||
return Iterables.tryFind(this.contents, c -> c.type == PartType.TEXT).isPresent();
|
return Iterables.tryFind(this.contents, c -> c.partType == PartType.TEXT).isPresent();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasInReplyTo() {
|
public boolean hasInReplyTo() {
|
||||||
|
|
|
@ -22,13 +22,22 @@ public class MessageContentWrapper {
|
||||||
|
|
||||||
public static final MessageContentWrapper RETRACTION =
|
public static final MessageContentWrapper RETRACTION =
|
||||||
new MessageContentWrapper(
|
new MessageContentWrapper(
|
||||||
ImmutableList.of(new MessageContent(null, PartType.RETRACTION, null, null)),
|
ImmutableList.of(
|
||||||
|
new MessageContent(
|
||||||
|
null, PartType.RETRACTION, null, null, null, null, false)),
|
||||||
Encryption.CLEARTEXT,
|
Encryption.CLEARTEXT,
|
||||||
null);
|
null);
|
||||||
|
|
||||||
private static final List<MessageContent> NOT_ENCRYPTED_FOR_THIS_DEVICE =
|
private static final List<MessageContent> NOT_ENCRYPTED_FOR_THIS_DEVICE =
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new MessageContent(null, PartType.NOT_ENCRYPTED_FOR_THIS_DEVICE, null, null));
|
new MessageContent(
|
||||||
|
null,
|
||||||
|
PartType.NOT_ENCRYPTED_FOR_THIS_DEVICE,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
false));
|
||||||
|
|
||||||
public final List<MessageContent> contents;
|
public final List<MessageContent> contents;
|
||||||
public final Encryption encryption;
|
public final Encryption encryption;
|
||||||
|
@ -104,8 +113,11 @@ public class MessageContentWrapper {
|
||||||
new MessageContent(
|
new MessageContent(
|
||||||
null,
|
null,
|
||||||
PartType.DECRYPTION_FAILURE,
|
PartType.DECRYPTION_FAILURE,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
exceptionToMessage(cause),
|
exceptionToMessage(cause),
|
||||||
null)),
|
null,
|
||||||
|
false)),
|
||||||
Encryption.FAILURE,
|
Encryption.FAILURE,
|
||||||
null);
|
null);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,8 @@ public final class TextContents {
|
||||||
final boolean removeFallback,
|
final boolean removeFallback,
|
||||||
final int inReplyToFallbackStart,
|
final int inReplyToFallbackStart,
|
||||||
final int inReplyToFallbackEnd) {
|
final int inReplyToFallbackEnd) {
|
||||||
final var textContents = Collections2.filter(messageContents, c -> c.type == PartType.TEXT);
|
final var textContents =
|
||||||
|
Collections2.filter(messageContents, c -> c.partType == PartType.TEXT);
|
||||||
if (textContents.size() == 1 && removeFallback) {
|
if (textContents.size() == 1 && removeFallback) {
|
||||||
final String body = Strings.nullToEmpty(Iterables.getOnlyElement(textContents).body);
|
final String body = Strings.nullToEmpty(Iterables.getOnlyElement(textContents).body);
|
||||||
if (inReplyToFallbackEnd > inReplyToFallbackStart
|
if (inReplyToFallbackEnd > inReplyToFallbackStart
|
||||||
|
|
|
@ -4,7 +4,7 @@ buildscript {
|
||||||
material = "1.8.0"
|
material = "1.8.0"
|
||||||
lifecycleVersion = "2.2.0"
|
lifecycleVersion = "2.2.0"
|
||||||
navVersion = '2.5.3'
|
navVersion = '2.5.3'
|
||||||
roomVersion = "2.5.0"
|
roomVersion = "2.5.1"
|
||||||
preferenceVersion = "1.2.0"
|
preferenceVersion = "1.2.0"
|
||||||
espressoVersion = "3.5.1"
|
espressoVersion = "3.5.1"
|
||||||
pagingVersion = "3.1.1"
|
pagingVersion = "3.1.1"
|
||||||
|
|
Loading…
Reference in a new issue