Unverified Commit 0c89d0b6 authored by Filipe Brito's avatar Filipe Brito Committed by GitHub

Merge branch 'develop' into issue-profile-render

parents c0c0d08a 1fd253cc
...@@ -18,7 +18,7 @@ android { ...@@ -18,7 +18,7 @@ android {
applicationId "chat.rocket.android" applicationId "chat.rocket.android"
minSdkVersion versions.minSdk minSdkVersion versions.minSdk
targetSdkVersion versions.targetSdk targetSdkVersion versions.targetSdk
versionCode 2061 versionCode 2065
versionName "3.4.0" versionName "3.4.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true multiDexEnabled true
......
{
"formatVersion": 1,
"database": {
"version": 10,
"identityHash": "db46c12dbb8747200288f48d5dc5558b",
"entities": [
{
"tableName": "users",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `username` TEXT, `name` TEXT, `status` TEXT NOT NULL, `utcOffset` REAL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "username",
"columnName": "username",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "status",
"columnName": "status",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "utcOffset",
"columnName": "utcOffset",
"affinity": "REAL",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_users_username",
"unique": false,
"columnNames": [
"username"
],
"createSql": "CREATE INDEX `index_users_username` ON `${TABLE_NAME}` (`username`)"
}
],
"foreignKeys": []
},
{
"tableName": "chatrooms",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `subscriptionId` TEXT NOT NULL, `type` TEXT NOT NULL, `name` TEXT NOT NULL, `fullname` TEXT, `userId` TEXT, `ownerId` TEXT, `readonly` INTEGER, `isDefault` INTEGER, `favorite` INTEGER, `open` INTEGER NOT NULL, `alert` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `userMentions` INTEGER, `groupMentions` INTEGER, `updatedAt` INTEGER, `timestamp` INTEGER, `lastSeen` INTEGER, `lastMessageText` TEXT, `lastMessageUserId` TEXT, `lastMessageTimestamp` INTEGER, `broadcast` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`ownerId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`lastMessageUserId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "subscriptionId",
"columnName": "subscriptionId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "fullname",
"columnName": "fullname",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "ownerId",
"columnName": "ownerId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "readonly",
"columnName": "readonly",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "favorite",
"columnName": "favorite",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "open",
"columnName": "open",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "alert",
"columnName": "alert",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "userMentions",
"columnName": "userMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "groupMentions",
"columnName": "groupMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastSeen",
"columnName": "lastSeen",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastMessageText",
"columnName": "lastMessageText",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageUserId",
"columnName": "lastMessageUserId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageTimestamp",
"columnName": "lastMessageTimestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "broadcast",
"columnName": "broadcast",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_chatrooms_userId",
"unique": false,
"columnNames": [
"userId"
],
"createSql": "CREATE INDEX `index_chatrooms_userId` ON `${TABLE_NAME}` (`userId`)"
},
{
"name": "index_chatrooms_ownerId",
"unique": false,
"columnNames": [
"ownerId"
],
"createSql": "CREATE INDEX `index_chatrooms_ownerId` ON `${TABLE_NAME}` (`ownerId`)"
},
{
"name": "index_chatrooms_subscriptionId",
"unique": true,
"columnNames": [
"subscriptionId"
],
"createSql": "CREATE UNIQUE INDEX `index_chatrooms_subscriptionId` ON `${TABLE_NAME}` (`subscriptionId`)"
},
{
"name": "index_chatrooms_updatedAt",
"unique": false,
"columnNames": [
"updatedAt"
],
"createSql": "CREATE INDEX `index_chatrooms_updatedAt` ON `${TABLE_NAME}` (`updatedAt`)"
},
{
"name": "index_chatrooms_lastMessageUserId",
"unique": false,
"columnNames": [
"lastMessageUserId"
],
"createSql": "CREATE INDEX `index_chatrooms_lastMessageUserId` ON `${TABLE_NAME}` (`lastMessageUserId`)"
}
],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"ownerId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"lastMessageUserId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "messages",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `roomId` TEXT NOT NULL, `message` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, `senderId` TEXT, `updatedAt` INTEGER, `editedAt` INTEGER, `editedBy` TEXT, `senderAlias` TEXT, `avatar` TEXT, `type` TEXT, `groupable` INTEGER NOT NULL, `parseUrls` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `role` TEXT, `synced` INTEGER NOT NULL, `unread` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`senderId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`editedBy`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "senderId",
"columnName": "senderId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "editedAt",
"columnName": "editedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "editedBy",
"columnName": "editedBy",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "senderAlias",
"columnName": "senderAlias",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "avatar",
"columnName": "avatar",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "groupable",
"columnName": "groupable",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "parseUrls",
"columnName": "parseUrls",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "pinned",
"columnName": "pinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "role",
"columnName": "role",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "synced",
"columnName": "synced",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"senderId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"editedBy"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_favorites",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `userId` TEXT NOT NULL, PRIMARY KEY(`messageId`, `userId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"userId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_mentions",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `userId` TEXT NOT NULL, PRIMARY KEY(`messageId`, `userId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"userId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_channels",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `roomId` TEXT NOT NULL, `roomName` TEXT, PRIMARY KEY(`messageId`, `roomId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomName",
"columnName": "roomName",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"roomId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "attachments",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` TEXT NOT NULL, `message_id` TEXT NOT NULL, `title` TEXT, `type` TEXT, `description` TEXT, `text` TEXT, `author_name` TEXT, `author_icon` TEXT, `author_link` TEXT, `thumb_url` TEXT, `color` TEXT, `fallback` TEXT, `title_link` TEXT, `title_link_download` INTEGER NOT NULL, `image_url` TEXT, `image_type` TEXT, `image_size` INTEGER, `video_url` TEXT, `video_type` TEXT, `video_size` INTEGER, `audio_url` TEXT, `audio_type` TEXT, `audio_size` INTEGER, `message_link` TEXT, `timestamp` INTEGER, `has_actions` INTEGER NOT NULL, `has_fields` INTEGER NOT NULL, `button_alignment` TEXT, PRIMARY KEY(`_id`), FOREIGN KEY(`message_id`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "_id",
"columnName": "_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "messageId",
"columnName": "message_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorName",
"columnName": "author_name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorIcon",
"columnName": "author_icon",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorLink",
"columnName": "author_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "thumbUrl",
"columnName": "thumb_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "color",
"columnName": "color",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "fallback",
"columnName": "fallback",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "titleLink",
"columnName": "title_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "titleLinkDownload",
"columnName": "title_link_download",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "imageUrl",
"columnName": "image_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageType",
"columnName": "image_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageSize",
"columnName": "image_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "videoUrl",
"columnName": "video_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "videoType",
"columnName": "video_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "videoSize",
"columnName": "video_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "audioUrl",
"columnName": "audio_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "audioType",
"columnName": "audio_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "audioSize",
"columnName": "audio_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "messageLink",
"columnName": "message_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "hasActions",
"columnName": "has_actions",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "hasFields",
"columnName": "has_fields",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "buttonAlignment",
"columnName": "button_alignment",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"_id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"message_id"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "attachment_fields",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `attachmentId` TEXT NOT NULL, `title` TEXT NOT NULL, `value` TEXT NOT NULL, FOREIGN KEY(`attachmentId`) REFERENCES `attachments`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "attachmentId",
"columnName": "attachmentId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "value",
"columnName": "value",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_attachment_fields_attachmentId",
"unique": false,
"columnNames": [
"attachmentId"
],
"createSql": "CREATE INDEX `index_attachment_fields_attachmentId` ON `${TABLE_NAME}` (`attachmentId`)"
}
],
"foreignKeys": [
{
"table": "attachments",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"attachmentId"
],
"referencedColumns": [
"_id"
]
}
]
},
{
"tableName": "attachment_action",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `attachmentId` TEXT NOT NULL, `type` TEXT NOT NULL, `text` TEXT, `url` TEXT, `isWebView` INTEGER, `webViewHeightRatio` TEXT, `imageUrl` TEXT, `message` TEXT, `isMessageInChatWindow` INTEGER, FOREIGN KEY(`attachmentId`) REFERENCES `attachments`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "attachmentId",
"columnName": "attachmentId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isWebView",
"columnName": "isWebView",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "webViewHeightRatio",
"columnName": "webViewHeightRatio",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageUrl",
"columnName": "imageUrl",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isMessageInChatWindow",
"columnName": "isMessageInChatWindow",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_attachment_action_attachmentId",
"unique": false,
"columnNames": [
"attachmentId"
],
"createSql": "CREATE INDEX `index_attachment_action_attachmentId` ON `${TABLE_NAME}` (`attachmentId`)"
}
],
"foreignKeys": [
{
"table": "attachments",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"attachmentId"
],
"referencedColumns": [
"_id"
]
}
]
},
{
"tableName": "urls",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`urlId` INTEGER PRIMARY KEY AUTOINCREMENT, `messageId` TEXT NOT NULL, `url` TEXT NOT NULL, `hostname` TEXT, `title` TEXT, `description` TEXT, `imageUrl` TEXT, FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "urlId",
"columnName": "urlId",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "hostname",
"columnName": "hostname",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageUrl",
"columnName": "imageUrl",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"urlId"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_urls_messageId",
"unique": false,
"columnNames": [
"messageId"
],
"createSql": "CREATE INDEX `index_urls_messageId` ON `${TABLE_NAME}` (`messageId`)"
}
],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "reactions",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `messageId` TEXT NOT NULL, `count` INTEGER NOT NULL, `usernames` TEXT NOT NULL, PRIMARY KEY(`reaction`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "reaction",
"columnName": "reaction",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "count",
"columnName": "count",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "usernames",
"columnName": "usernames",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"reaction"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_reactions_messageId",
"unique": false,
"columnNames": [
"messageId"
],
"createSql": "CREATE INDEX `index_reactions_messageId` ON `${TABLE_NAME}` (`messageId`)"
}
],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "messages_sync",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`roomId` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, PRIMARY KEY(`roomId`))",
"fields": [
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"roomId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
}
],
"setupQueries": [
"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, \"db46c12dbb8747200288f48d5dc5558b\")"
]
}
}
\ No newline at end of file
{
"formatVersion": 1,
"database": {
"version": 12,
"identityHash": "f0e15bc95a0bb09b052c484704dd3abd",
"entities": [
{
"tableName": "users",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `username` TEXT, `name` TEXT, `status` TEXT NOT NULL, `utcOffset` REAL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "username",
"columnName": "username",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "status",
"columnName": "status",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "utcOffset",
"columnName": "utcOffset",
"affinity": "REAL",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_users_username",
"unique": false,
"columnNames": [
"username"
],
"createSql": "CREATE INDEX `index_users_username` ON `${TABLE_NAME}` (`username`)"
}
],
"foreignKeys": []
},
{
"tableName": "chatrooms",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `subscriptionId` TEXT NOT NULL, `parentId` TEXT, `type` TEXT NOT NULL, `name` TEXT NOT NULL, `fullname` TEXT, `userId` TEXT, `ownerId` TEXT, `readonly` INTEGER, `isDefault` INTEGER, `favorite` INTEGER, `topic` TEXT, `announcement` TEXT, `description` TEXT, `open` INTEGER NOT NULL, `alert` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `userMentions` INTEGER, `groupMentions` INTEGER, `updatedAt` INTEGER, `timestamp` INTEGER, `lastSeen` INTEGER, `lastMessageText` TEXT, `lastMessageUserId` TEXT, `lastMessageTimestamp` INTEGER, `broadcast` INTEGER, `muted` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`ownerId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`lastMessageUserId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "subscriptionId",
"columnName": "subscriptionId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "parentId",
"columnName": "parentId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "fullname",
"columnName": "fullname",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "ownerId",
"columnName": "ownerId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "readonly",
"columnName": "readonly",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "favorite",
"columnName": "favorite",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "topic",
"columnName": "topic",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "announcement",
"columnName": "announcement",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "open",
"columnName": "open",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "alert",
"columnName": "alert",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "userMentions",
"columnName": "userMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "groupMentions",
"columnName": "groupMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastSeen",
"columnName": "lastSeen",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastMessageText",
"columnName": "lastMessageText",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageUserId",
"columnName": "lastMessageUserId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageTimestamp",
"columnName": "lastMessageTimestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "broadcast",
"columnName": "broadcast",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "muted",
"columnName": "muted",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_chatrooms_userId",
"unique": false,
"columnNames": [
"userId"
],
"createSql": "CREATE INDEX `index_chatrooms_userId` ON `${TABLE_NAME}` (`userId`)"
},
{
"name": "index_chatrooms_ownerId",
"unique": false,
"columnNames": [
"ownerId"
],
"createSql": "CREATE INDEX `index_chatrooms_ownerId` ON `${TABLE_NAME}` (`ownerId`)"
},
{
"name": "index_chatrooms_subscriptionId",
"unique": true,
"columnNames": [
"subscriptionId"
],
"createSql": "CREATE UNIQUE INDEX `index_chatrooms_subscriptionId` ON `${TABLE_NAME}` (`subscriptionId`)"
},
{
"name": "index_chatrooms_updatedAt",
"unique": false,
"columnNames": [
"updatedAt"
],
"createSql": "CREATE INDEX `index_chatrooms_updatedAt` ON `${TABLE_NAME}` (`updatedAt`)"
},
{
"name": "index_chatrooms_lastMessageUserId",
"unique": false,
"columnNames": [
"lastMessageUserId"
],
"createSql": "CREATE INDEX `index_chatrooms_lastMessageUserId` ON `${TABLE_NAME}` (`lastMessageUserId`)"
}
],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"ownerId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"lastMessageUserId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "messages",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `roomId` TEXT NOT NULL, `message` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, `senderId` TEXT, `updatedAt` INTEGER, `editedAt` INTEGER, `editedBy` TEXT, `senderAlias` TEXT, `avatar` TEXT, `type` TEXT, `groupable` INTEGER NOT NULL, `parseUrls` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `role` TEXT, `synced` INTEGER NOT NULL, `unread` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`senderId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`editedBy`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "senderId",
"columnName": "senderId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "editedAt",
"columnName": "editedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "editedBy",
"columnName": "editedBy",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "senderAlias",
"columnName": "senderAlias",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "avatar",
"columnName": "avatar",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "groupable",
"columnName": "groupable",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "parseUrls",
"columnName": "parseUrls",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "pinned",
"columnName": "pinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "role",
"columnName": "role",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "synced",
"columnName": "synced",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"senderId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"editedBy"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_favorites",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `userId` TEXT NOT NULL, PRIMARY KEY(`messageId`, `userId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"userId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_mentions",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `userId` TEXT NOT NULL, PRIMARY KEY(`messageId`, `userId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"userId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_channels",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `roomId` TEXT NOT NULL, `roomName` TEXT, PRIMARY KEY(`messageId`, `roomId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomName",
"columnName": "roomName",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"roomId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "attachments",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` TEXT NOT NULL, `message_id` TEXT NOT NULL, `title` TEXT, `type` TEXT, `description` TEXT, `text` TEXT, `author_name` TEXT, `author_icon` TEXT, `author_link` TEXT, `thumb_url` TEXT, `color` TEXT, `fallback` TEXT, `title_link` TEXT, `title_link_download` INTEGER NOT NULL, `image_url` TEXT, `image_type` TEXT, `image_size` INTEGER, `video_url` TEXT, `video_type` TEXT, `video_size` INTEGER, `audio_url` TEXT, `audio_type` TEXT, `audio_size` INTEGER, `message_link` TEXT, `timestamp` INTEGER, `has_actions` INTEGER NOT NULL, `has_fields` INTEGER NOT NULL, `button_alignment` TEXT, PRIMARY KEY(`_id`), FOREIGN KEY(`message_id`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "_id",
"columnName": "_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "messageId",
"columnName": "message_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorName",
"columnName": "author_name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorIcon",
"columnName": "author_icon",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorLink",
"columnName": "author_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "thumbUrl",
"columnName": "thumb_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "color",
"columnName": "color",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "fallback",
"columnName": "fallback",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "titleLink",
"columnName": "title_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "titleLinkDownload",
"columnName": "title_link_download",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "imageUrl",
"columnName": "image_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageType",
"columnName": "image_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageSize",
"columnName": "image_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "videoUrl",
"columnName": "video_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "videoType",
"columnName": "video_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "videoSize",
"columnName": "video_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "audioUrl",
"columnName": "audio_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "audioType",
"columnName": "audio_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "audioSize",
"columnName": "audio_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "messageLink",
"columnName": "message_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "hasActions",
"columnName": "has_actions",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "hasFields",
"columnName": "has_fields",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "buttonAlignment",
"columnName": "button_alignment",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"_id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"message_id"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "attachment_fields",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `attachmentId` TEXT NOT NULL, `title` TEXT NOT NULL, `value` TEXT NOT NULL, FOREIGN KEY(`attachmentId`) REFERENCES `attachments`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "attachmentId",
"columnName": "attachmentId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "value",
"columnName": "value",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_attachment_fields_attachmentId",
"unique": false,
"columnNames": [
"attachmentId"
],
"createSql": "CREATE INDEX `index_attachment_fields_attachmentId` ON `${TABLE_NAME}` (`attachmentId`)"
}
],
"foreignKeys": [
{
"table": "attachments",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"attachmentId"
],
"referencedColumns": [
"_id"
]
}
]
},
{
"tableName": "attachment_action",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `attachmentId` TEXT NOT NULL, `type` TEXT NOT NULL, `text` TEXT, `url` TEXT, `isWebView` INTEGER, `webViewHeightRatio` TEXT, `imageUrl` TEXT, `message` TEXT, `isMessageInChatWindow` INTEGER, FOREIGN KEY(`attachmentId`) REFERENCES `attachments`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "attachmentId",
"columnName": "attachmentId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isWebView",
"columnName": "isWebView",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "webViewHeightRatio",
"columnName": "webViewHeightRatio",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageUrl",
"columnName": "imageUrl",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isMessageInChatWindow",
"columnName": "isMessageInChatWindow",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_attachment_action_attachmentId",
"unique": false,
"columnNames": [
"attachmentId"
],
"createSql": "CREATE INDEX `index_attachment_action_attachmentId` ON `${TABLE_NAME}` (`attachmentId`)"
}
],
"foreignKeys": [
{
"table": "attachments",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"attachmentId"
],
"referencedColumns": [
"_id"
]
}
]
},
{
"tableName": "urls",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`urlId` INTEGER PRIMARY KEY AUTOINCREMENT, `messageId` TEXT NOT NULL, `url` TEXT NOT NULL, `hostname` TEXT, `title` TEXT, `description` TEXT, `imageUrl` TEXT, FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "urlId",
"columnName": "urlId",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "hostname",
"columnName": "hostname",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageUrl",
"columnName": "imageUrl",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"urlId"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_urls_messageId",
"unique": false,
"columnNames": [
"messageId"
],
"createSql": "CREATE INDEX `index_urls_messageId` ON `${TABLE_NAME}` (`messageId`)"
}
],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "reactions",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `messageId` TEXT NOT NULL, `count` INTEGER NOT NULL, `usernames` TEXT NOT NULL, PRIMARY KEY(`reaction`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "reaction",
"columnName": "reaction",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "count",
"columnName": "count",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "usernames",
"columnName": "usernames",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"reaction"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_reactions_messageId",
"unique": false,
"columnNames": [
"messageId"
],
"createSql": "CREATE INDEX `index_reactions_messageId` ON `${TABLE_NAME}` (`messageId`)"
}
],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "messages_sync",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`roomId` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, PRIMARY KEY(`roomId`))",
"fields": [
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"roomId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
}
],
"setupQueries": [
"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, \"f0e15bc95a0bb09b052c484704dd3abd\")"
]
}
}
\ No newline at end of file
{ {
"formatVersion": 1, "formatVersion": 1,
"database": { "database": {
"version": 11, "version": 13,
"identityHash": "f0e15bc95a0bb09b052c484704dd3abd", "identityHash": "3bef73b44ae4edf2a74b48fd68f2c599",
"entities": [ "entities": [
{ {
"tableName": "users", "tableName": "users",
...@@ -1019,7 +1019,7 @@ ...@@ -1019,7 +1019,7 @@
}, },
{ {
"tableName": "reactions", "tableName": "reactions",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `messageId` TEXT NOT NULL, `count` INTEGER NOT NULL, `usernames` TEXT NOT NULL, PRIMARY KEY(`reaction`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `messageId` TEXT NOT NULL, `count` INTEGER NOT NULL, `usernames` TEXT NOT NULL, `names` TEXT NOT NULL, PRIMARY KEY(`reaction`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [ "fields": [
{ {
"fieldPath": "reaction", "fieldPath": "reaction",
...@@ -1044,6 +1044,12 @@ ...@@ -1044,6 +1044,12 @@
"columnName": "usernames", "columnName": "usernames",
"affinity": "TEXT", "affinity": "TEXT",
"notNull": true "notNull": true
},
{
"fieldPath": "names",
"columnName": "names",
"affinity": "TEXT",
"notNull": true
} }
], ],
"primaryKey": { "primaryKey": {
...@@ -1105,7 +1111,7 @@ ...@@ -1105,7 +1111,7 @@
], ],
"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, \"f0e15bc95a0bb09b052c484704dd3abd\")" "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"3bef73b44ae4edf2a74b48fd68f2c599\")"
] ]
} }
} }
\ No newline at end of file
{
"formatVersion": 1,
"database": {
"version": 3,
"identityHash": "06359a8c2943365dd094bc5dff210203",
"entities": [
{
"tableName": "users",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `username` TEXT, `name` TEXT, `status` TEXT NOT NULL, `utcOffset` REAL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "username",
"columnName": "username",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "status",
"columnName": "status",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "utcOffset",
"columnName": "utcOffset",
"affinity": "REAL",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_users_username",
"unique": false,
"columnNames": [
"username"
],
"createSql": "CREATE INDEX `index_users_username` ON `${TABLE_NAME}` (`username`)"
}
],
"foreignKeys": []
},
{
"tableName": "chatrooms",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `subscriptionId` TEXT NOT NULL, `type` TEXT NOT NULL, `name` TEXT NOT NULL, `fullname` TEXT, `userId` TEXT, `ownerId` TEXT, `readonly` INTEGER, `isDefault` INTEGER, `favorite` INTEGER, `open` INTEGER NOT NULL, `alert` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `userMentions` INTEGER, `groupMentions` INTEGER, `updatedAt` INTEGER, `timestamp` INTEGER, `lastSeen` INTEGER, `lastMessageText` TEXT, `lastMessageUserId` TEXT, `lastMessageTimestamp` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`ownerId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`lastMessageUserId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "subscriptionId",
"columnName": "subscriptionId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "fullname",
"columnName": "fullname",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "ownerId",
"columnName": "ownerId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "readonly",
"columnName": "readonly",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "favorite",
"columnName": "favorite",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "open",
"columnName": "open",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "alert",
"columnName": "alert",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "userMentions",
"columnName": "userMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "groupMentions",
"columnName": "groupMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastSeen",
"columnName": "lastSeen",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastMessageText",
"columnName": "lastMessageText",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageUserId",
"columnName": "lastMessageUserId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageTimestamp",
"columnName": "lastMessageTimestamp",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_chatrooms_userId",
"unique": false,
"columnNames": [
"userId"
],
"createSql": "CREATE INDEX `index_chatrooms_userId` ON `${TABLE_NAME}` (`userId`)"
},
{
"name": "index_chatrooms_ownerId",
"unique": false,
"columnNames": [
"ownerId"
],
"createSql": "CREATE INDEX `index_chatrooms_ownerId` ON `${TABLE_NAME}` (`ownerId`)"
},
{
"name": "index_chatrooms_subscriptionId",
"unique": true,
"columnNames": [
"subscriptionId"
],
"createSql": "CREATE UNIQUE INDEX `index_chatrooms_subscriptionId` ON `${TABLE_NAME}` (`subscriptionId`)"
},
{
"name": "index_chatrooms_updatedAt",
"unique": false,
"columnNames": [
"updatedAt"
],
"createSql": "CREATE INDEX `index_chatrooms_updatedAt` ON `${TABLE_NAME}` (`updatedAt`)"
}
],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"ownerId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"lastMessageUserId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"setupQueries": [
"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, \"06359a8c2943365dd094bc5dff210203\")"
]
}
}
\ No newline at end of file
{
"formatVersion": 1,
"database": {
"version": 4,
"identityHash": "e389d26bfb975f00c75dc6fc5d06d012",
"entities": [
{
"tableName": "users",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `username` TEXT, `name` TEXT, `status` TEXT NOT NULL, `utcOffset` REAL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "username",
"columnName": "username",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "status",
"columnName": "status",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "utcOffset",
"columnName": "utcOffset",
"affinity": "REAL",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_users_username",
"unique": false,
"columnNames": [
"username"
],
"createSql": "CREATE INDEX `index_users_username` ON `${TABLE_NAME}` (`username`)"
}
],
"foreignKeys": []
},
{
"tableName": "chatrooms",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `subscriptionId` TEXT NOT NULL, `type` TEXT NOT NULL, `name` TEXT NOT NULL, `fullname` TEXT, `userId` TEXT, `ownerId` TEXT, `readonly` INTEGER, `isDefault` INTEGER, `favorite` INTEGER, `open` INTEGER NOT NULL, `alert` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `userMentions` INTEGER, `groupMentions` INTEGER, `updatedAt` INTEGER, `timestamp` INTEGER, `lastSeen` INTEGER, `lastMessageText` TEXT, `lastMessageUserId` TEXT, `lastMessageTimestamp` INTEGER, `broadcast` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`ownerId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`lastMessageUserId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "subscriptionId",
"columnName": "subscriptionId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "fullname",
"columnName": "fullname",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "ownerId",
"columnName": "ownerId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "readonly",
"columnName": "readonly",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "favorite",
"columnName": "favorite",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "open",
"columnName": "open",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "alert",
"columnName": "alert",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "userMentions",
"columnName": "userMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "groupMentions",
"columnName": "groupMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastSeen",
"columnName": "lastSeen",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastMessageText",
"columnName": "lastMessageText",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageUserId",
"columnName": "lastMessageUserId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageTimestamp",
"columnName": "lastMessageTimestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "broadcast",
"columnName": "broadcast",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_chatrooms_userId",
"unique": false,
"columnNames": [
"userId"
],
"createSql": "CREATE INDEX `index_chatrooms_userId` ON `${TABLE_NAME}` (`userId`)"
},
{
"name": "index_chatrooms_ownerId",
"unique": false,
"columnNames": [
"ownerId"
],
"createSql": "CREATE INDEX `index_chatrooms_ownerId` ON `${TABLE_NAME}` (`ownerId`)"
},
{
"name": "index_chatrooms_subscriptionId",
"unique": true,
"columnNames": [
"subscriptionId"
],
"createSql": "CREATE UNIQUE INDEX `index_chatrooms_subscriptionId` ON `${TABLE_NAME}` (`subscriptionId`)"
},
{
"name": "index_chatrooms_updatedAt",
"unique": false,
"columnNames": [
"updatedAt"
],
"createSql": "CREATE INDEX `index_chatrooms_updatedAt` ON `${TABLE_NAME}` (`updatedAt`)"
}
],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"ownerId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"lastMessageUserId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"setupQueries": [
"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, \"e389d26bfb975f00c75dc6fc5d06d012\")"
]
}
}
\ No newline at end of file
{
"formatVersion": 1,
"database": {
"version": 5,
"identityHash": "47a0c30e2696ae09bc86df16cc37279d",
"entities": [
{
"tableName": "users",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `username` TEXT, `name` TEXT, `status` TEXT NOT NULL, `utcOffset` REAL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "username",
"columnName": "username",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "status",
"columnName": "status",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "utcOffset",
"columnName": "utcOffset",
"affinity": "REAL",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_users_username",
"unique": false,
"columnNames": [
"username"
],
"createSql": "CREATE INDEX `index_users_username` ON `${TABLE_NAME}` (`username`)"
}
],
"foreignKeys": []
},
{
"tableName": "chatrooms",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `subscriptionId` TEXT NOT NULL, `type` TEXT NOT NULL, `name` TEXT NOT NULL, `fullname` TEXT, `userId` TEXT, `ownerId` TEXT, `readonly` INTEGER, `isDefault` INTEGER, `favorite` INTEGER, `open` INTEGER NOT NULL, `alert` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `userMentions` INTEGER, `groupMentions` INTEGER, `updatedAt` INTEGER, `timestamp` INTEGER, `lastSeen` INTEGER, `lastMessageText` TEXT, `lastMessageUserId` TEXT, `lastMessageTimestamp` INTEGER, `broadcast` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`ownerId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`lastMessageUserId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "subscriptionId",
"columnName": "subscriptionId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "fullname",
"columnName": "fullname",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "ownerId",
"columnName": "ownerId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "readonly",
"columnName": "readonly",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "favorite",
"columnName": "favorite",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "open",
"columnName": "open",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "alert",
"columnName": "alert",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "userMentions",
"columnName": "userMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "groupMentions",
"columnName": "groupMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastSeen",
"columnName": "lastSeen",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastMessageText",
"columnName": "lastMessageText",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageUserId",
"columnName": "lastMessageUserId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageTimestamp",
"columnName": "lastMessageTimestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "broadcast",
"columnName": "broadcast",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_chatrooms_userId",
"unique": false,
"columnNames": [
"userId"
],
"createSql": "CREATE INDEX `index_chatrooms_userId` ON `${TABLE_NAME}` (`userId`)"
},
{
"name": "index_chatrooms_ownerId",
"unique": false,
"columnNames": [
"ownerId"
],
"createSql": "CREATE INDEX `index_chatrooms_ownerId` ON `${TABLE_NAME}` (`ownerId`)"
},
{
"name": "index_chatrooms_subscriptionId",
"unique": true,
"columnNames": [
"subscriptionId"
],
"createSql": "CREATE UNIQUE INDEX `index_chatrooms_subscriptionId` ON `${TABLE_NAME}` (`subscriptionId`)"
},
{
"name": "index_chatrooms_updatedAt",
"unique": false,
"columnNames": [
"updatedAt"
],
"createSql": "CREATE INDEX `index_chatrooms_updatedAt` ON `${TABLE_NAME}` (`updatedAt`)"
},
{
"name": "index_chatrooms_lastMessageUserId",
"unique": false,
"columnNames": [
"lastMessageUserId"
],
"createSql": "CREATE INDEX `index_chatrooms_lastMessageUserId` ON `${TABLE_NAME}` (`lastMessageUserId`)"
}
],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"ownerId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"lastMessageUserId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"setupQueries": [
"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, \"47a0c30e2696ae09bc86df16cc37279d\")"
]
}
}
\ No newline at end of file
{
"formatVersion": 1,
"database": {
"version": 6,
"identityHash": "03aec453cb4faec2d1357fdb673b151e",
"entities": [
{
"tableName": "users",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `username` TEXT, `name` TEXT, `status` TEXT NOT NULL, `utcOffset` REAL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "username",
"columnName": "username",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "status",
"columnName": "status",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "utcOffset",
"columnName": "utcOffset",
"affinity": "REAL",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_users_username",
"unique": false,
"columnNames": [
"username"
],
"createSql": "CREATE INDEX `index_users_username` ON `${TABLE_NAME}` (`username`)"
}
],
"foreignKeys": []
},
{
"tableName": "chatrooms",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `subscriptionId` TEXT NOT NULL, `type` TEXT NOT NULL, `name` TEXT NOT NULL, `fullname` TEXT, `userId` TEXT, `ownerId` TEXT, `readonly` INTEGER, `isDefault` INTEGER, `favorite` INTEGER, `open` INTEGER NOT NULL, `alert` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `userMentions` INTEGER, `groupMentions` INTEGER, `updatedAt` INTEGER, `timestamp` INTEGER, `lastSeen` INTEGER, `lastMessageText` TEXT, `lastMessageUserId` TEXT, `lastMessageTimestamp` INTEGER, `broadcast` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`ownerId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`lastMessageUserId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "subscriptionId",
"columnName": "subscriptionId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "fullname",
"columnName": "fullname",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "ownerId",
"columnName": "ownerId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "readonly",
"columnName": "readonly",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "favorite",
"columnName": "favorite",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "open",
"columnName": "open",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "alert",
"columnName": "alert",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "userMentions",
"columnName": "userMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "groupMentions",
"columnName": "groupMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastSeen",
"columnName": "lastSeen",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastMessageText",
"columnName": "lastMessageText",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageUserId",
"columnName": "lastMessageUserId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageTimestamp",
"columnName": "lastMessageTimestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "broadcast",
"columnName": "broadcast",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_chatrooms_userId",
"unique": false,
"columnNames": [
"userId"
],
"createSql": "CREATE INDEX `index_chatrooms_userId` ON `${TABLE_NAME}` (`userId`)"
},
{
"name": "index_chatrooms_ownerId",
"unique": false,
"columnNames": [
"ownerId"
],
"createSql": "CREATE INDEX `index_chatrooms_ownerId` ON `${TABLE_NAME}` (`ownerId`)"
},
{
"name": "index_chatrooms_subscriptionId",
"unique": true,
"columnNames": [
"subscriptionId"
],
"createSql": "CREATE UNIQUE INDEX `index_chatrooms_subscriptionId` ON `${TABLE_NAME}` (`subscriptionId`)"
},
{
"name": "index_chatrooms_updatedAt",
"unique": false,
"columnNames": [
"updatedAt"
],
"createSql": "CREATE INDEX `index_chatrooms_updatedAt` ON `${TABLE_NAME}` (`updatedAt`)"
},
{
"name": "index_chatrooms_lastMessageUserId",
"unique": false,
"columnNames": [
"lastMessageUserId"
],
"createSql": "CREATE INDEX `index_chatrooms_lastMessageUserId` ON `${TABLE_NAME}` (`lastMessageUserId`)"
}
],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"ownerId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"lastMessageUserId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "messages",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `roomId` TEXT NOT NULL, `message` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, `senderId` TEXT, `updatedAt` INTEGER, `editedAt` INTEGER, `editedBy` TEXT, `senderAlias` TEXT, `avatar` TEXT, `type` TEXT, `groupable` INTEGER NOT NULL, `parseUrls` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `role` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`senderId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`editedBy`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "senderId",
"columnName": "senderId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "editedAt",
"columnName": "editedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "editedBy",
"columnName": "editedBy",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "senderAlias",
"columnName": "senderAlias",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "avatar",
"columnName": "avatar",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "groupable",
"columnName": "groupable",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "parseUrls",
"columnName": "parseUrls",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "pinned",
"columnName": "pinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "role",
"columnName": "role",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"senderId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"editedBy"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_favorites",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `userId` TEXT NOT NULL, PRIMARY KEY(`messageId`, `userId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"userId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_mentions",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `userId` TEXT NOT NULL, PRIMARY KEY(`messageId`, `userId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"userId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_channels",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `roomId` TEXT NOT NULL, `roomName` TEXT, PRIMARY KEY(`messageId`, `roomId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomName",
"columnName": "roomName",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"roomId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "attachments",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `message_id` TEXT NOT NULL, `title` TEXT, `type` TEXT, `description` TEXT, `text` TEXT, `author_name` TEXT, `author_icon` TEXT, `author_link` TEXT, `thumb_url` TEXT, `color` TEXT, `title_link` TEXT, `title_link_download` INTEGER NOT NULL, `image_url` TEXT, `image_type` TEXT, `image_size` INTEGER, `video_url` TEXT, `video_type` TEXT, `video_size` INTEGER, `audio_url` TEXT, `audio_type` TEXT, `audio_size` INTEGER, `message_link` TEXT, `timestamp` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`message_id`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "messageId",
"columnName": "message_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorName",
"columnName": "author_name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorIcon",
"columnName": "author_icon",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorLink",
"columnName": "author_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "thumbUrl",
"columnName": "thumb_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "color",
"columnName": "color",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "titleLink",
"columnName": "title_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "titleLinkDownload",
"columnName": "title_link_download",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "imageUrl",
"columnName": "image_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageType",
"columnName": "image_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageSize",
"columnName": "image_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "videoUrl",
"columnName": "video_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "videoType",
"columnName": "video_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "videoSize",
"columnName": "video_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "audioUrl",
"columnName": "audio_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "audioType",
"columnName": "audio_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "audioSize",
"columnName": "audio_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "messageLink",
"columnName": "message_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"message_id"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "attachment_fields",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `attachmentId` TEXT NOT NULL, `title` TEXT NOT NULL, `value` TEXT NOT NULL, FOREIGN KEY(`attachmentId`) REFERENCES `attachments`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "attachmentId",
"columnName": "attachmentId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "value",
"columnName": "value",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": [
{
"table": "attachments",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"attachmentId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "urls",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `messageId` TEXT NOT NULL, `url` TEXT NOT NULL, `hostname` TEXT, `title` TEXT, `description` TEXT, `imageUrl` TEXT, FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "hostname",
"columnName": "hostname",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageUrl",
"columnName": "imageUrl",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_urls_messageId",
"unique": false,
"columnNames": [
"messageId"
],
"createSql": "CREATE INDEX `index_urls_messageId` ON `${TABLE_NAME}` (`messageId`)"
}
],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "reactions",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, PRIMARY KEY(`reaction`))",
"fields": [
{
"fieldPath": "reaction",
"columnName": "reaction",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"reaction"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "reactions_message_relations",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reactionId` TEXT NOT NULL, `messageId` TEXT NOT NULL, `count` INTEGER NOT NULL, FOREIGN KEY(`reactionId`) REFERENCES `reactions`(`reaction`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "reactionId",
"columnName": "reactionId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "count",
"columnName": "count",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_reactions_message_relations_messageId",
"unique": false,
"columnNames": [
"messageId"
],
"createSql": "CREATE INDEX `index_reactions_message_relations_messageId` ON `${TABLE_NAME}` (`messageId`)"
}
],
"foreignKeys": [
{
"table": "reactions",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"reactionId"
],
"referencedColumns": [
"reaction"
]
},
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
}
],
"setupQueries": [
"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, \"03aec453cb4faec2d1357fdb673b151e\")"
]
}
}
\ No newline at end of file
{
"formatVersion": 1,
"database": {
"version": 7,
"identityHash": "4d5ac4ae382ddb3aa3850842253e89d2",
"entities": [
{
"tableName": "users",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `username` TEXT, `name` TEXT, `status` TEXT NOT NULL, `utcOffset` REAL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "username",
"columnName": "username",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "status",
"columnName": "status",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "utcOffset",
"columnName": "utcOffset",
"affinity": "REAL",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_users_username",
"unique": false,
"columnNames": [
"username"
],
"createSql": "CREATE INDEX `index_users_username` ON `${TABLE_NAME}` (`username`)"
}
],
"foreignKeys": []
},
{
"tableName": "chatrooms",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `subscriptionId` TEXT NOT NULL, `type` TEXT NOT NULL, `name` TEXT NOT NULL, `fullname` TEXT, `userId` TEXT, `ownerId` TEXT, `readonly` INTEGER, `isDefault` INTEGER, `favorite` INTEGER, `open` INTEGER NOT NULL, `alert` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `userMentions` INTEGER, `groupMentions` INTEGER, `updatedAt` INTEGER, `timestamp` INTEGER, `lastSeen` INTEGER, `lastMessageText` TEXT, `lastMessageUserId` TEXT, `lastMessageTimestamp` INTEGER, `broadcast` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`ownerId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`lastMessageUserId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "subscriptionId",
"columnName": "subscriptionId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "fullname",
"columnName": "fullname",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "ownerId",
"columnName": "ownerId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "readonly",
"columnName": "readonly",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "favorite",
"columnName": "favorite",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "open",
"columnName": "open",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "alert",
"columnName": "alert",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "userMentions",
"columnName": "userMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "groupMentions",
"columnName": "groupMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastSeen",
"columnName": "lastSeen",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastMessageText",
"columnName": "lastMessageText",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageUserId",
"columnName": "lastMessageUserId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageTimestamp",
"columnName": "lastMessageTimestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "broadcast",
"columnName": "broadcast",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_chatrooms_userId",
"unique": false,
"columnNames": [
"userId"
],
"createSql": "CREATE INDEX `index_chatrooms_userId` ON `${TABLE_NAME}` (`userId`)"
},
{
"name": "index_chatrooms_ownerId",
"unique": false,
"columnNames": [
"ownerId"
],
"createSql": "CREATE INDEX `index_chatrooms_ownerId` ON `${TABLE_NAME}` (`ownerId`)"
},
{
"name": "index_chatrooms_subscriptionId",
"unique": true,
"columnNames": [
"subscriptionId"
],
"createSql": "CREATE UNIQUE INDEX `index_chatrooms_subscriptionId` ON `${TABLE_NAME}` (`subscriptionId`)"
},
{
"name": "index_chatrooms_updatedAt",
"unique": false,
"columnNames": [
"updatedAt"
],
"createSql": "CREATE INDEX `index_chatrooms_updatedAt` ON `${TABLE_NAME}` (`updatedAt`)"
},
{
"name": "index_chatrooms_lastMessageUserId",
"unique": false,
"columnNames": [
"lastMessageUserId"
],
"createSql": "CREATE INDEX `index_chatrooms_lastMessageUserId` ON `${TABLE_NAME}` (`lastMessageUserId`)"
}
],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"ownerId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"lastMessageUserId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "messages",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `roomId` TEXT NOT NULL, `message` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, `senderId` TEXT, `updatedAt` INTEGER, `editedAt` INTEGER, `editedBy` TEXT, `senderAlias` TEXT, `avatar` TEXT, `type` TEXT, `groupable` INTEGER NOT NULL, `parseUrls` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `role` TEXT, `synced` INTEGER NOT NULL, `unread` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`senderId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`editedBy`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "senderId",
"columnName": "senderId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "editedAt",
"columnName": "editedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "editedBy",
"columnName": "editedBy",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "senderAlias",
"columnName": "senderAlias",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "avatar",
"columnName": "avatar",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "groupable",
"columnName": "groupable",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "parseUrls",
"columnName": "parseUrls",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "pinned",
"columnName": "pinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "role",
"columnName": "role",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "synced",
"columnName": "synced",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"senderId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"editedBy"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_favorites",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `userId` TEXT NOT NULL, PRIMARY KEY(`messageId`, `userId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"userId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_mentions",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `userId` TEXT NOT NULL, PRIMARY KEY(`messageId`, `userId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"userId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_channels",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `roomId` TEXT NOT NULL, `roomName` TEXT, PRIMARY KEY(`messageId`, `roomId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomName",
"columnName": "roomName",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"roomId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "attachments",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` TEXT NOT NULL, `message_id` TEXT NOT NULL, `title` TEXT, `type` TEXT, `description` TEXT, `text` TEXT, `author_name` TEXT, `author_icon` TEXT, `author_link` TEXT, `thumb_url` TEXT, `color` TEXT, `fallback` TEXT, `title_link` TEXT, `title_link_download` INTEGER NOT NULL, `image_url` TEXT, `image_type` TEXT, `image_size` INTEGER, `video_url` TEXT, `video_type` TEXT, `video_size` INTEGER, `audio_url` TEXT, `audio_type` TEXT, `audio_size` INTEGER, `message_link` TEXT, `timestamp` INTEGER, PRIMARY KEY(`_id`), FOREIGN KEY(`message_id`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "_id",
"columnName": "_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "messageId",
"columnName": "message_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorName",
"columnName": "author_name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorIcon",
"columnName": "author_icon",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorLink",
"columnName": "author_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "thumbUrl",
"columnName": "thumb_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "color",
"columnName": "color",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "fallback",
"columnName": "fallback",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "titleLink",
"columnName": "title_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "titleLinkDownload",
"columnName": "title_link_download",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "imageUrl",
"columnName": "image_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageType",
"columnName": "image_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageSize",
"columnName": "image_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "videoUrl",
"columnName": "video_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "videoType",
"columnName": "video_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "videoSize",
"columnName": "video_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "audioUrl",
"columnName": "audio_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "audioType",
"columnName": "audio_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "audioSize",
"columnName": "audio_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "messageLink",
"columnName": "message_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"_id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"message_id"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "attachment_fields",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `attachmentId` TEXT NOT NULL, `title` TEXT NOT NULL, `value` TEXT NOT NULL, FOREIGN KEY(`attachmentId`) REFERENCES `attachments`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "attachmentId",
"columnName": "attachmentId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "value",
"columnName": "value",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": [
{
"table": "attachments",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"attachmentId"
],
"referencedColumns": [
"_id"
]
}
]
},
{
"tableName": "urls",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`urlId` INTEGER PRIMARY KEY AUTOINCREMENT, `messageId` TEXT NOT NULL, `url` TEXT NOT NULL, `hostname` TEXT, `title` TEXT, `description` TEXT, `imageUrl` TEXT, FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "urlId",
"columnName": "urlId",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "hostname",
"columnName": "hostname",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageUrl",
"columnName": "imageUrl",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"urlId"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_urls_messageId",
"unique": false,
"columnNames": [
"messageId"
],
"createSql": "CREATE INDEX `index_urls_messageId` ON `${TABLE_NAME}` (`messageId`)"
}
],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "reactions",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `messageId` TEXT NOT NULL, `count` INTEGER NOT NULL, `usernames` TEXT NOT NULL, PRIMARY KEY(`reaction`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "reaction",
"columnName": "reaction",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "count",
"columnName": "count",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "usernames",
"columnName": "usernames",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"reaction"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_reactions_messageId",
"unique": false,
"columnNames": [
"messageId"
],
"createSql": "CREATE INDEX `index_reactions_messageId` ON `${TABLE_NAME}` (`messageId`)"
}
],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "messages_sync",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`roomId` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, PRIMARY KEY(`roomId`))",
"fields": [
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"roomId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
}
],
"setupQueries": [
"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, \"4d5ac4ae382ddb3aa3850842253e89d2\")"
]
}
}
\ No newline at end of file
{
"formatVersion": 1,
"database": {
"version": 8,
"identityHash": "48d41bd13698c29cc5e0810934187c0e",
"entities": [
{
"tableName": "users",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `username` TEXT, `name` TEXT, `status` TEXT NOT NULL, `utcOffset` REAL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "username",
"columnName": "username",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "status",
"columnName": "status",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "utcOffset",
"columnName": "utcOffset",
"affinity": "REAL",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_users_username",
"unique": false,
"columnNames": [
"username"
],
"createSql": "CREATE INDEX `index_users_username` ON `${TABLE_NAME}` (`username`)"
}
],
"foreignKeys": []
},
{
"tableName": "chatrooms",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `subscriptionId` TEXT NOT NULL, `type` TEXT NOT NULL, `name` TEXT NOT NULL, `fullname` TEXT, `userId` TEXT, `ownerId` TEXT, `readonly` INTEGER, `isDefault` INTEGER, `favorite` INTEGER, `open` INTEGER NOT NULL, `alert` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `userMentions` INTEGER, `groupMentions` INTEGER, `updatedAt` INTEGER, `timestamp` INTEGER, `lastSeen` INTEGER, `lastMessageText` TEXT, `lastMessageUserId` TEXT, `lastMessageTimestamp` INTEGER, `broadcast` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`ownerId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`lastMessageUserId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "subscriptionId",
"columnName": "subscriptionId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "fullname",
"columnName": "fullname",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "ownerId",
"columnName": "ownerId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "readonly",
"columnName": "readonly",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "favorite",
"columnName": "favorite",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "open",
"columnName": "open",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "alert",
"columnName": "alert",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "userMentions",
"columnName": "userMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "groupMentions",
"columnName": "groupMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastSeen",
"columnName": "lastSeen",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastMessageText",
"columnName": "lastMessageText",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageUserId",
"columnName": "lastMessageUserId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageTimestamp",
"columnName": "lastMessageTimestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "broadcast",
"columnName": "broadcast",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_chatrooms_userId",
"unique": false,
"columnNames": [
"userId"
],
"createSql": "CREATE INDEX `index_chatrooms_userId` ON `${TABLE_NAME}` (`userId`)"
},
{
"name": "index_chatrooms_ownerId",
"unique": false,
"columnNames": [
"ownerId"
],
"createSql": "CREATE INDEX `index_chatrooms_ownerId` ON `${TABLE_NAME}` (`ownerId`)"
},
{
"name": "index_chatrooms_subscriptionId",
"unique": true,
"columnNames": [
"subscriptionId"
],
"createSql": "CREATE UNIQUE INDEX `index_chatrooms_subscriptionId` ON `${TABLE_NAME}` (`subscriptionId`)"
},
{
"name": "index_chatrooms_updatedAt",
"unique": false,
"columnNames": [
"updatedAt"
],
"createSql": "CREATE INDEX `index_chatrooms_updatedAt` ON `${TABLE_NAME}` (`updatedAt`)"
},
{
"name": "index_chatrooms_lastMessageUserId",
"unique": false,
"columnNames": [
"lastMessageUserId"
],
"createSql": "CREATE INDEX `index_chatrooms_lastMessageUserId` ON `${TABLE_NAME}` (`lastMessageUserId`)"
}
],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"ownerId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"lastMessageUserId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "messages",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `roomId` TEXT NOT NULL, `message` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, `senderId` TEXT, `updatedAt` INTEGER, `editedAt` INTEGER, `editedBy` TEXT, `senderAlias` TEXT, `avatar` TEXT, `type` TEXT, `groupable` INTEGER NOT NULL, `parseUrls` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `role` TEXT, `synced` INTEGER NOT NULL, `unread` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`senderId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`editedBy`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "senderId",
"columnName": "senderId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "editedAt",
"columnName": "editedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "editedBy",
"columnName": "editedBy",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "senderAlias",
"columnName": "senderAlias",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "avatar",
"columnName": "avatar",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "groupable",
"columnName": "groupable",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "parseUrls",
"columnName": "parseUrls",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "pinned",
"columnName": "pinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "role",
"columnName": "role",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "synced",
"columnName": "synced",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"senderId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"editedBy"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_favorites",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `userId` TEXT NOT NULL, PRIMARY KEY(`messageId`, `userId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"userId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_mentions",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `userId` TEXT NOT NULL, PRIMARY KEY(`messageId`, `userId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"userId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_channels",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `roomId` TEXT NOT NULL, `roomName` TEXT, PRIMARY KEY(`messageId`, `roomId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomName",
"columnName": "roomName",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"roomId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "attachments",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` TEXT NOT NULL, `message_id` TEXT NOT NULL, `title` TEXT, `type` TEXT, `description` TEXT, `text` TEXT, `author_name` TEXT, `author_icon` TEXT, `author_link` TEXT, `thumb_url` TEXT, `color` TEXT, `fallback` TEXT, `title_link` TEXT, `title_link_download` INTEGER NOT NULL, `image_url` TEXT, `image_type` TEXT, `image_size` INTEGER, `video_url` TEXT, `video_type` TEXT, `video_size` INTEGER, `audio_url` TEXT, `audio_type` TEXT, `audio_size` INTEGER, `message_link` TEXT, `timestamp` INTEGER, `has_actions` INTEGER NOT NULL, `button_alignment` TEXT, PRIMARY KEY(`_id`), FOREIGN KEY(`message_id`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "_id",
"columnName": "_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "messageId",
"columnName": "message_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorName",
"columnName": "author_name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorIcon",
"columnName": "author_icon",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorLink",
"columnName": "author_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "thumbUrl",
"columnName": "thumb_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "color",
"columnName": "color",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "fallback",
"columnName": "fallback",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "titleLink",
"columnName": "title_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "titleLinkDownload",
"columnName": "title_link_download",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "imageUrl",
"columnName": "image_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageType",
"columnName": "image_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageSize",
"columnName": "image_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "videoUrl",
"columnName": "video_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "videoType",
"columnName": "video_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "videoSize",
"columnName": "video_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "audioUrl",
"columnName": "audio_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "audioType",
"columnName": "audio_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "audioSize",
"columnName": "audio_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "messageLink",
"columnName": "message_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "hasActions",
"columnName": "has_actions",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "buttonAlignment",
"columnName": "button_alignment",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"_id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"message_id"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "attachment_fields",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `attachmentId` TEXT NOT NULL, `title` TEXT NOT NULL, `value` TEXT NOT NULL, FOREIGN KEY(`attachmentId`) REFERENCES `attachments`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "attachmentId",
"columnName": "attachmentId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "value",
"columnName": "value",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_attachment_fields_attachmentId",
"unique": false,
"columnNames": [
"attachmentId"
],
"createSql": "CREATE INDEX `index_attachment_fields_attachmentId` ON `${TABLE_NAME}` (`attachmentId`)"
}
],
"foreignKeys": [
{
"table": "attachments",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"attachmentId"
],
"referencedColumns": [
"_id"
]
}
]
},
{
"tableName": "attachment_action",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `attachmentId` TEXT NOT NULL, `type` TEXT NOT NULL, `text` TEXT, `url` TEXT, `isWebView` INTEGER, `webViewHeightRatio` TEXT, `imageUrl` TEXT, `message` TEXT, `isMessageInChatWindow` INTEGER, FOREIGN KEY(`attachmentId`) REFERENCES `attachments`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "attachmentId",
"columnName": "attachmentId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isWebView",
"columnName": "isWebView",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "webViewHeightRatio",
"columnName": "webViewHeightRatio",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageUrl",
"columnName": "imageUrl",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isMessageInChatWindow",
"columnName": "isMessageInChatWindow",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_attachment_action_attachmentId",
"unique": false,
"columnNames": [
"attachmentId"
],
"createSql": "CREATE INDEX `index_attachment_action_attachmentId` ON `${TABLE_NAME}` (`attachmentId`)"
}
],
"foreignKeys": [
{
"table": "attachments",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"attachmentId"
],
"referencedColumns": [
"_id"
]
}
]
},
{
"tableName": "urls",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`urlId` INTEGER PRIMARY KEY AUTOINCREMENT, `messageId` TEXT NOT NULL, `url` TEXT NOT NULL, `hostname` TEXT, `title` TEXT, `description` TEXT, `imageUrl` TEXT, FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "urlId",
"columnName": "urlId",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "hostname",
"columnName": "hostname",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageUrl",
"columnName": "imageUrl",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"urlId"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_urls_messageId",
"unique": false,
"columnNames": [
"messageId"
],
"createSql": "CREATE INDEX `index_urls_messageId` ON `${TABLE_NAME}` (`messageId`)"
}
],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "reactions",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `messageId` TEXT NOT NULL, `count` INTEGER NOT NULL, `usernames` TEXT NOT NULL, PRIMARY KEY(`reaction`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "reaction",
"columnName": "reaction",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "count",
"columnName": "count",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "usernames",
"columnName": "usernames",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"reaction"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_reactions_messageId",
"unique": false,
"columnNames": [
"messageId"
],
"createSql": "CREATE INDEX `index_reactions_messageId` ON `${TABLE_NAME}` (`messageId`)"
}
],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "messages_sync",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`roomId` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, PRIMARY KEY(`roomId`))",
"fields": [
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"roomId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
}
],
"setupQueries": [
"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, \"48d41bd13698c29cc5e0810934187c0e\")"
]
}
}
\ No newline at end of file
{
"formatVersion": 1,
"database": {
"version": 9,
"identityHash": "db46c12dbb8747200288f48d5dc5558b",
"entities": [
{
"tableName": "users",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `username` TEXT, `name` TEXT, `status` TEXT NOT NULL, `utcOffset` REAL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "username",
"columnName": "username",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "status",
"columnName": "status",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "utcOffset",
"columnName": "utcOffset",
"affinity": "REAL",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_users_username",
"unique": false,
"columnNames": [
"username"
],
"createSql": "CREATE INDEX `index_users_username` ON `${TABLE_NAME}` (`username`)"
}
],
"foreignKeys": []
},
{
"tableName": "chatrooms",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `subscriptionId` TEXT NOT NULL, `type` TEXT NOT NULL, `name` TEXT NOT NULL, `fullname` TEXT, `userId` TEXT, `ownerId` TEXT, `readonly` INTEGER, `isDefault` INTEGER, `favorite` INTEGER, `open` INTEGER NOT NULL, `alert` INTEGER NOT NULL, `unread` INTEGER NOT NULL, `userMentions` INTEGER, `groupMentions` INTEGER, `updatedAt` INTEGER, `timestamp` INTEGER, `lastSeen` INTEGER, `lastMessageText` TEXT, `lastMessageUserId` TEXT, `lastMessageTimestamp` INTEGER, `broadcast` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`ownerId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`lastMessageUserId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "subscriptionId",
"columnName": "subscriptionId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "fullname",
"columnName": "fullname",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "ownerId",
"columnName": "ownerId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "readonly",
"columnName": "readonly",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "isDefault",
"columnName": "isDefault",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "favorite",
"columnName": "favorite",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "open",
"columnName": "open",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "alert",
"columnName": "alert",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "userMentions",
"columnName": "userMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "groupMentions",
"columnName": "groupMentions",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastSeen",
"columnName": "lastSeen",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastMessageText",
"columnName": "lastMessageText",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageUserId",
"columnName": "lastMessageUserId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastMessageTimestamp",
"columnName": "lastMessageTimestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "broadcast",
"columnName": "broadcast",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_chatrooms_userId",
"unique": false,
"columnNames": [
"userId"
],
"createSql": "CREATE INDEX `index_chatrooms_userId` ON `${TABLE_NAME}` (`userId`)"
},
{
"name": "index_chatrooms_ownerId",
"unique": false,
"columnNames": [
"ownerId"
],
"createSql": "CREATE INDEX `index_chatrooms_ownerId` ON `${TABLE_NAME}` (`ownerId`)"
},
{
"name": "index_chatrooms_subscriptionId",
"unique": true,
"columnNames": [
"subscriptionId"
],
"createSql": "CREATE UNIQUE INDEX `index_chatrooms_subscriptionId` ON `${TABLE_NAME}` (`subscriptionId`)"
},
{
"name": "index_chatrooms_updatedAt",
"unique": false,
"columnNames": [
"updatedAt"
],
"createSql": "CREATE INDEX `index_chatrooms_updatedAt` ON `${TABLE_NAME}` (`updatedAt`)"
},
{
"name": "index_chatrooms_lastMessageUserId",
"unique": false,
"columnNames": [
"lastMessageUserId"
],
"createSql": "CREATE INDEX `index_chatrooms_lastMessageUserId` ON `${TABLE_NAME}` (`lastMessageUserId`)"
}
],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"ownerId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"lastMessageUserId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "messages",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `roomId` TEXT NOT NULL, `message` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, `senderId` TEXT, `updatedAt` INTEGER, `editedAt` INTEGER, `editedBy` TEXT, `senderAlias` TEXT, `avatar` TEXT, `type` TEXT, `groupable` INTEGER NOT NULL, `parseUrls` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `role` TEXT, `synced` INTEGER NOT NULL, `unread` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`senderId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION , FOREIGN KEY(`editedBy`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "senderId",
"columnName": "senderId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "updatedAt",
"columnName": "updatedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "editedAt",
"columnName": "editedAt",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "editedBy",
"columnName": "editedBy",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "senderAlias",
"columnName": "senderAlias",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "avatar",
"columnName": "avatar",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "groupable",
"columnName": "groupable",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "parseUrls",
"columnName": "parseUrls",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "pinned",
"columnName": "pinned",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "role",
"columnName": "role",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "synced",
"columnName": "synced",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "unread",
"columnName": "unread",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"senderId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"editedBy"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_favorites",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `userId` TEXT NOT NULL, PRIMARY KEY(`messageId`, `userId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"userId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_mentions",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `userId` TEXT NOT NULL, PRIMARY KEY(`messageId`, `userId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`userId`) REFERENCES `users`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "userId",
"columnName": "userId",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"messageId",
"userId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
},
{
"table": "users",
"onDelete": "NO ACTION",
"onUpdate": "NO ACTION",
"columns": [
"userId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "message_channels",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `roomId` TEXT NOT NULL, `roomName` TEXT, PRIMARY KEY(`messageId`, `roomId`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "roomName",
"columnName": "roomName",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"messageId",
"roomId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "attachments",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` TEXT NOT NULL, `message_id` TEXT NOT NULL, `title` TEXT, `type` TEXT, `description` TEXT, `text` TEXT, `author_name` TEXT, `author_icon` TEXT, `author_link` TEXT, `thumb_url` TEXT, `color` TEXT, `fallback` TEXT, `title_link` TEXT, `title_link_download` INTEGER NOT NULL, `image_url` TEXT, `image_type` TEXT, `image_size` INTEGER, `video_url` TEXT, `video_type` TEXT, `video_size` INTEGER, `audio_url` TEXT, `audio_type` TEXT, `audio_size` INTEGER, `message_link` TEXT, `timestamp` INTEGER, `has_actions` INTEGER NOT NULL, `has_fields` INTEGER NOT NULL, `button_alignment` TEXT, PRIMARY KEY(`_id`), FOREIGN KEY(`message_id`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "_id",
"columnName": "_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "messageId",
"columnName": "message_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorName",
"columnName": "author_name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorIcon",
"columnName": "author_icon",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "authorLink",
"columnName": "author_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "thumbUrl",
"columnName": "thumb_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "color",
"columnName": "color",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "fallback",
"columnName": "fallback",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "titleLink",
"columnName": "title_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "titleLinkDownload",
"columnName": "title_link_download",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "imageUrl",
"columnName": "image_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageType",
"columnName": "image_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageSize",
"columnName": "image_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "videoUrl",
"columnName": "video_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "videoType",
"columnName": "video_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "videoSize",
"columnName": "video_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "audioUrl",
"columnName": "audio_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "audioType",
"columnName": "audio_type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "audioSize",
"columnName": "audio_size",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "messageLink",
"columnName": "message_link",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "hasActions",
"columnName": "has_actions",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "hasFields",
"columnName": "has_fields",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "buttonAlignment",
"columnName": "button_alignment",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"_id"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"message_id"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "attachment_fields",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `attachmentId` TEXT NOT NULL, `title` TEXT NOT NULL, `value` TEXT NOT NULL, FOREIGN KEY(`attachmentId`) REFERENCES `attachments`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "attachmentId",
"columnName": "attachmentId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "value",
"columnName": "value",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_attachment_fields_attachmentId",
"unique": false,
"columnNames": [
"attachmentId"
],
"createSql": "CREATE INDEX `index_attachment_fields_attachmentId` ON `${TABLE_NAME}` (`attachmentId`)"
}
],
"foreignKeys": [
{
"table": "attachments",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"attachmentId"
],
"referencedColumns": [
"_id"
]
}
]
},
{
"tableName": "attachment_action",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `attachmentId` TEXT NOT NULL, `type` TEXT NOT NULL, `text` TEXT, `url` TEXT, `isWebView` INTEGER, `webViewHeightRatio` TEXT, `imageUrl` TEXT, `message` TEXT, `isMessageInChatWindow` INTEGER, FOREIGN KEY(`attachmentId`) REFERENCES `attachments`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "attachmentId",
"columnName": "attachmentId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "text",
"columnName": "text",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isWebView",
"columnName": "isWebView",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "webViewHeightRatio",
"columnName": "webViewHeightRatio",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageUrl",
"columnName": "imageUrl",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "message",
"columnName": "message",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isMessageInChatWindow",
"columnName": "isMessageInChatWindow",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_attachment_action_attachmentId",
"unique": false,
"columnNames": [
"attachmentId"
],
"createSql": "CREATE INDEX `index_attachment_action_attachmentId` ON `${TABLE_NAME}` (`attachmentId`)"
}
],
"foreignKeys": [
{
"table": "attachments",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"attachmentId"
],
"referencedColumns": [
"_id"
]
}
]
},
{
"tableName": "urls",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`urlId` INTEGER PRIMARY KEY AUTOINCREMENT, `messageId` TEXT NOT NULL, `url` TEXT NOT NULL, `hostname` TEXT, `title` TEXT, `description` TEXT, `imageUrl` TEXT, FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "urlId",
"columnName": "urlId",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "hostname",
"columnName": "hostname",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "imageUrl",
"columnName": "imageUrl",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"urlId"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_urls_messageId",
"unique": false,
"columnNames": [
"messageId"
],
"createSql": "CREATE INDEX `index_urls_messageId` ON `${TABLE_NAME}` (`messageId`)"
}
],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "reactions",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `messageId` TEXT NOT NULL, `count` INTEGER NOT NULL, `usernames` TEXT NOT NULL, PRIMARY KEY(`reaction`), FOREIGN KEY(`messageId`) REFERENCES `messages`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "reaction",
"columnName": "reaction",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "messageId",
"columnName": "messageId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "count",
"columnName": "count",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "usernames",
"columnName": "usernames",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"reaction"
],
"autoGenerate": false
},
"indices": [
{
"name": "index_reactions_messageId",
"unique": false,
"columnNames": [
"messageId"
],
"createSql": "CREATE INDEX `index_reactions_messageId` ON `${TABLE_NAME}` (`messageId`)"
}
],
"foreignKeys": [
{
"table": "messages",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"messageId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "messages_sync",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`roomId` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, PRIMARY KEY(`roomId`))",
"fields": [
{
"fieldPath": "roomId",
"columnName": "roomId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "timestamp",
"columnName": "timestamp",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"roomId"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
}
],
"setupQueries": [
"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, \"db46c12dbb8747200288f48d5dc5558b\")"
]
}
}
\ No newline at end of file
...@@ -90,7 +90,7 @@ ...@@ -90,7 +90,7 @@
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:windowSoftInputMode="adjustResize|stateAlwaysHidden" /> android:windowSoftInputMode="adjustResize|stateAlwaysHidden" />
<!-- TODO: Change to fragment--> <!-- TODO: Change to fragment -->
<activity <activity
android:name=".settings.password.ui.PasswordActivity" android:name=".settings.password.ui.PasswordActivity"
android:theme="@style/AppTheme" /> android:theme="@style/AppTheme" />
......
import android.content.Context import android.content.Context
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.view.View
import android.widget.TextView import android.widget.TextView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.DrawableCompat import androidx.core.graphics.drawable.DrawableCompat
...@@ -60,7 +61,7 @@ object DrawableHelper { ...@@ -60,7 +61,7 @@ object DrawableHelper {
/** /**
* Tints a Drawable. * Tints a Drawable.
* *
* REMARK: you MUST always wrap the Drawable before tint it. * REMARK: you MUST always wrap the Drawable before tinting it.
* *
* @param drawable The Drawable to tint. * @param drawable The Drawable to tint.
* @param context The context. * @param context The context.
...@@ -72,58 +73,74 @@ object DrawableHelper { ...@@ -72,58 +73,74 @@ object DrawableHelper {
DrawableCompat.setTint(drawable, ContextCompat.getColor(context, resId)) DrawableCompat.setTint(drawable, ContextCompat.getColor(context, resId))
/** /**
* Compounds an array of Drawable (to appear to the left of the text) into an array of TextView. * Compounds an array of Drawable (to appear on the start side of a text) into an array of TextView.
* *
* REMARK: the number of elements in both array of Drawable and EditText MUST be equal. * REMARK: the number of elements in both arrays of Drawable and TextView MUST be equal.
* *
* @param textView The array of TextView. * @param textView The array of TextView.
* @param drawables The array of Drawable. * @param drawables The array of Drawable.
* @see compoundLeftDrawable * @see compoundStartDrawable
*/ */
fun compoundDrawables(textView: Array<TextView>, drawables: Array<Drawable>) { fun compoundDrawables(textView: Array<TextView>, drawables: Array<Drawable>) {
if (textView.size != drawables.size) { if (textView.size != drawables.size) {
return return
} else { } else {
for (i in textView.indices) { for (i in textView.indices) {
textView[i].setCompoundDrawablesWithIntrinsicBounds(drawables[i], null, null, null) if (textView[i].resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL) {
textView[i].setCompoundDrawablesWithIntrinsicBounds(null, null, drawables[i], null)
} else {
textView[i].setCompoundDrawablesWithIntrinsicBounds(drawables[i], null, null, null)
}
} }
} }
} }
/** /**
* Compounds a Drawable (to appear on the left side of a text) into a TextView. * Compounds a Drawable (to appear on the start side of a text) into a TextView.
* *
* @param textView The TextView. * @param textView The TextView.
* @param drawable The Drawable. * @param drawable The Drawable.
* @see compoundDrawables * @see compoundDrawables
*/ */
fun compoundLeftDrawable(textView: TextView, drawable: Drawable) = fun compoundStartDrawable(textView: TextView, drawable: Drawable) =
textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null) if (textView.resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL) {
textView.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null)
} else {
textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)
}
/** /**
* Compounds a Drawable (to appear on the right side of a text) into a TextView. * Compounds a Drawable (to appear on the end side of a text) into a TextView.
* *
* @param textView The TextView. * @param textView The TextView.
* @param drawable The Drawable. * @param drawable The Drawable.
* @see compoundLeftDrawable * @see compoundStartDrawable
*/ */
fun compoundRightDrawable(textView: TextView, drawable: Drawable) = fun compoundEndDrawable(textView: TextView, drawable: Drawable) =
textView.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null) if (textView.resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL) {
textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)
} else {
textView.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null)
}
/** /**
* Compounds a Drawable (to appear on the left and right side of a text) into a TextView. * Compounds a Drawable (to appear on the start and end side of a text) into a TextView.
* *
* @param textView The TextView. * @param textView The TextView.
* @param leftDrawable The left Drawable. * @param startDrawable The start Drawable.
* @param rightDrawable The right Drawable. * @param endDrawable The end Drawable.
* @see compoundLeftDrawable * @see compoundStartDrawable
*/ */
fun compoundLeftAndRightDrawable( fun compoundStartAndEndDrawable(
textView: TextView, textView: TextView,
leftDrawable: Drawable, startDrawable: Drawable,
rightDrawable: Drawable endDrawable: Drawable
) = ) =
textView.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, rightDrawable, null) if (textView.resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL) {
textView.setCompoundDrawablesWithIntrinsicBounds(endDrawable, null, startDrawable, null)
} else {
textView.setCompoundDrawablesWithIntrinsicBounds(startDrawable, null, endDrawable, null)
}
/** /**
* Returns the user status drawable. * Returns the user status drawable.
...@@ -141,4 +158,4 @@ object DrawableHelper { ...@@ -141,4 +158,4 @@ object DrawableHelper {
else -> getDrawableFromId(R.drawable.ic_status_invisible_12dp, context) else -> getDrawableFromId(R.drawable.ic_status_invisible_12dp, context)
} }
} }
} }
\ No newline at end of file
...@@ -140,7 +140,7 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView { ...@@ -140,7 +140,7 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView {
val atDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_at_black_20dp, it) val atDrawable = DrawableHelper.getDrawableFromId(R.drawable.ic_at_black_20dp, it)
DrawableHelper.wrapDrawable(atDrawable) DrawableHelper.wrapDrawable(atDrawable)
DrawableHelper.tintDrawable(atDrawable, it, R.color.colorDrawableTintGrey) DrawableHelper.tintDrawable(atDrawable, it, R.color.colorDrawableTintGrey)
DrawableHelper.compoundLeftDrawable(text_username, atDrawable) DrawableHelper.compoundStartDrawable(text_username, atDrawable)
} }
} }
......
...@@ -60,17 +60,12 @@ private const val BUNDLE_IS_FAVORITE = "BUNDLE_IS_FAVORITE" ...@@ -60,17 +60,12 @@ private const val BUNDLE_IS_FAVORITE = "BUNDLE_IS_FAVORITE"
private const val BUNDLE_DISABLE_MENU = "BUNDLE_DISABLE_MENU" private const val BUNDLE_DISABLE_MENU = "BUNDLE_DISABLE_MENU"
class ChatDetailsFragment : Fragment(), ChatDetailsView { class ChatDetailsFragment : Fragment(), ChatDetailsView {
@Inject @Inject lateinit var presenter: ChatDetailsPresenter
lateinit var presenter: ChatDetailsPresenter @Inject lateinit var factory: ChatDetailsViewModelFactory
@Inject @Inject lateinit var serverUrl: CurrentServerRepository
lateinit var factory: ChatDetailsViewModelFactory @Inject lateinit var settings: GetSettingsInteractor
@Inject
lateinit var serverUrl: CurrentServerRepository
@Inject
lateinit var settings: GetSettingsInteractor
private var adapter: ChatDetailsAdapter? = null private var adapter: ChatDetailsAdapter? = null
private lateinit var viewModel: ChatDetailsViewModel private lateinit var viewModel: ChatDetailsViewModel
internal lateinit var chatRoomId: String internal lateinit var chatRoomId: String
internal lateinit var chatRoomType: String internal lateinit var chatRoomType: String
private var isSubscribed: Boolean = true private var isSubscribed: Boolean = true
...@@ -154,19 +149,19 @@ class ChatDetailsFragment : Fragment(), ChatDetailsView { ...@@ -154,19 +149,19 @@ class ChatDetailsFragment : Fragment(), ChatDetailsView {
adapter?.let { adapter?.let {
if (!disableMenu) { if (!disableMenu) {
it.addOption(getString(R.string.title_files), R.drawable.ic_files_24dp) { it.addOption(getString(R.string.title_files), R.drawable.ic_files_24dp) {
presenter.toFiles(chatRoomId!!) presenter.toFiles(chatRoomId)
} }
} }
if (chatRoomType != RoomType.DIRECT_MESSAGE && !disableMenu) { if (chatRoomType != RoomType.DIRECT_MESSAGE && !disableMenu) {
it.addOption(getString(R.string.msg_mentions), R.drawable.ic_at_black_20dp) { it.addOption(getString(R.string.msg_mentions), R.drawable.ic_at_black_20dp) {
presenter.toMentions(chatRoomId!!) presenter.toMentions(chatRoomId)
} }
it.addOption( it.addOption(
getString(R.string.title_members), getString(R.string.title_members),
R.drawable.ic_people_outline_black_24dp R.drawable.ic_people_outline_black_24dp
) { ) {
presenter.toMembers(chatRoomId!!) presenter.toMembers(chatRoomId)
} }
} }
...@@ -174,13 +169,13 @@ class ChatDetailsFragment : Fragment(), ChatDetailsView { ...@@ -174,13 +169,13 @@ class ChatDetailsFragment : Fragment(), ChatDetailsView {
getString(R.string.title_favorite_messages), getString(R.string.title_favorite_messages),
R.drawable.ic_star_border_white_24dp R.drawable.ic_star_border_white_24dp
) { ) {
presenter.toFavorites(chatRoomId!!) presenter.toFavorites(chatRoomId)
} }
it.addOption( it.addOption(
getString(R.string.title_pinned_messages), getString(R.string.title_pinned_messages),
R.drawable.ic_action_message_pin_24dp R.drawable.ic_action_message_pin_24dp
) { ) {
presenter.toPinned(chatRoomId!!) presenter.toPinned(chatRoomId)
} }
} }
} }
...@@ -200,17 +195,17 @@ class ChatDetailsFragment : Fragment(), ChatDetailsView { ...@@ -200,17 +195,17 @@ class ChatDetailsFragment : Fragment(), ChatDetailsView {
val wrappedDrawable = DrawableHelper.wrapDrawable(it) val wrappedDrawable = DrawableHelper.wrapDrawable(it)
val mutableDrawable = wrappedDrawable.mutate() val mutableDrawable = wrappedDrawable.mutate()
DrawableHelper.tintDrawable(mutableDrawable, context!!, R.color.colorPrimary) DrawableHelper.tintDrawable(mutableDrawable, context!!, R.color.colorPrimary)
DrawableHelper.compoundLeftDrawable(name, mutableDrawable) DrawableHelper.compoundStartDrawable(name, mutableDrawable)
} }
} }
private fun getDetails() { private fun getDetails() {
if (isSubscribed) if (isSubscribed)
viewModel.getDetails(chatRoomId!!).observe(viewLifecycleOwner, Observer { details -> viewModel.getDetails(chatRoomId).observe(viewLifecycleOwner, Observer { details ->
displayDetails(details) displayDetails(details)
}) })
else else
presenter.getDetails(chatRoomId!!, chatRoomType!!) presenter.getDetails(chatRoomId, chatRoomType)
} }
private fun setupOptions() { private fun setupOptions() {
......
...@@ -34,10 +34,8 @@ internal const val TAG_MESSAGE_INFO_FRAGMENT = "MessageInfoFragment" ...@@ -34,10 +34,8 @@ internal const val TAG_MESSAGE_INFO_FRAGMENT = "MessageInfoFragment"
private const val BUNDLE_MESSAGE_ID = "message_id" private const val BUNDLE_MESSAGE_ID = "message_id"
class MessageInfoFragment : Fragment(), MessageInfoView { class MessageInfoFragment : Fragment(), MessageInfoView {
@Inject @Inject lateinit var presenter: MessageInfoPresenter
lateinit var presenter: MessageInfoPresenter @Inject lateinit var analyticsManager: AnalyticsManager
@Inject
lateinit var analyticsManager: AnalyticsManager
private lateinit var adapter: ReadReceiptAdapter private lateinit var adapter: ReadReceiptAdapter
private lateinit var messageId: String private lateinit var messageId: String
......
...@@ -117,13 +117,15 @@ class ChatRoomPresenter @Inject constructor( ...@@ -117,13 +117,15 @@ class ChatRoomPresenter @Inject constructor(
private var chatRoomId: String? = null private var chatRoomId: String? = null
private lateinit var chatRoomType: String private lateinit var chatRoomType: String
private var chatIsBroadcast: Boolean = false private lateinit var chatRoomName: String
private var isBroadcast: Boolean = false
private var chatRoles = emptyList<ChatRoomRole>() private var chatRoles = emptyList<ChatRoomRole>()
private val stateChannel = Channel<State>() private val stateChannel = Channel<State>()
private var typingStatusSubscriptionId: String? = null private var typingStatusSubscriptionId: String? = null
private var lastState = manager.state private var lastState = manager.state
private var typingStatusList = arrayListOf<String>() private var typingStatusList = arrayListOf<String>()
private val roomChangesChannel = Channel<Room>(Channel.CONFLATED) private val roomChangesChannel = Channel<Room>(Channel.CONFLATED)
private var lastMessageId: String? = null
private lateinit var draftKey: String private lateinit var draftKey: String
fun setupChatRoom( fun setupChatRoom(
...@@ -135,47 +137,77 @@ class ChatRoomPresenter @Inject constructor( ...@@ -135,47 +137,77 @@ class ChatRoomPresenter @Inject constructor(
draftKey = "${currentServer}_${LocalRepository.DRAFT_KEY}$roomId" draftKey = "${currentServer}_${LocalRepository.DRAFT_KEY}$roomId"
chatRoomId = roomId chatRoomId = roomId
chatRoomType = roomType chatRoomType = roomType
chatRoomName = roomName
chatRoles = emptyList()
var canModerate = isOwnerOrMod()
GlobalScope.launch(Dispatchers.IO + strategy.jobs) { GlobalScope.launch(Dispatchers.IO + strategy.jobs) {
try { // Can post anyway if has the 'post-readonly' permission on server.
chatRoles = if (roomTypeOf(roomType) !is RoomType.DirectMessage) { val room = dbManager.getRoom(roomId)
client.chatRoomRoles(roomType = roomTypeOf(roomType), roomName = roomName) room?.let {
} else { isBroadcast = it.chatRoom.broadcast ?: false
emptyList() val roomUiModel = roomMapper.map(it, true)
} launchUI(strategy) {
} catch (ex: Exception) { view.onRoomUpdated(
Timber.e(ex) roomUiModel = roomUiModel.copy(
chatRoles = emptyList() broadcast = isBroadcast,
} finally {
// User has at least an 'owner' or 'moderator' role.
val canModerate = isOwnerOrMod()
// Can post anyway if has the 'post-readonly' permission on server.
val room = dbManager.getRoom(roomId)
room?.let {
chatIsBroadcast = it.chatRoom.broadcast ?: false
val roomUiModel = roomMapper.map(it, true)
launchUI(strategy) {
view.onRoomUpdated(roomUiModel = roomUiModel.copy(
broadcast = chatIsBroadcast,
canModerate = canModerate, canModerate = canModerate,
writable = roomUiModel.writable || canModerate writable = roomUiModel.writable || canModerate
)) )
} )
} }
}
loadMessages(roomId, roomType, clearDataSet = true) loadMessages(roomId, chatRoomType, clearDataSet = true)
chatRoomMessage?.let { messageHelper.messageIdFromPermalink(it) } loadActiveMembers(roomId, chatRoomType, filterSelfOut = true)
?.let { messageId ->
val name = messageHelper.roomNameFromPermalink(chatRoomMessage) chatRoomMessage?.let { messageHelper.messageIdFromPermalink(it) }
citeMessage( ?.let { messageId ->
name!!, val name = messageHelper.roomNameFromPermalink(chatRoomMessage)
messageHelper.roomTypeFromPermalink(chatRoomMessage)!!, citeMessage(
messageId, name!!,
true messageHelper.roomTypeFromPermalink(chatRoomMessage)!!,
) messageId,
} true
subscribeRoomChanges() )
}
/*FIXME: Get chat role can cause unresponsive problems especially on slower connections
We are updating the room again after the first step so that initial messages
get loaded in and the system appears more responsive. Something should be
done to either fix the load in speed of moderator roles or store the
information locally*/
if (getChatRole()) {
canModerate = isOwnerOrMod()
if (canModerate) {
//FIXME: add this in when moderator page is actually created
//view.updateModeration()
}
}
subscribeRoomChanges()
}
}
private suspend fun getChatRole(): Boolean {
try {
if (roomTypeOf(chatRoomType) !is RoomType.DirectMessage) {
chatRoles = withContext(Dispatchers.IO + strategy.jobs) {
client.chatRoomRoles(
roomType = roomTypeOf(chatRoomType),
roomName = chatRoomName
)
}
return true
} else {
chatRoles = emptyList()
} }
} catch (ex: Exception) {
Timber.e(ex)
chatRoles = emptyList()
} }
return false
} }
private suspend fun subscribeRoomChanges() { private suspend fun subscribeRoomChanges() {
...@@ -184,7 +216,12 @@ class ChatRoomPresenter @Inject constructor( ...@@ -184,7 +216,12 @@ class ChatRoomPresenter @Inject constructor(
manager.addRoomChannel(it, roomChangesChannel) manager.addRoomChannel(it, roomChangesChannel)
for (room in roomChangesChannel) { for (room in roomChangesChannel) {
dbManager.getRoom(room.id)?.let { chatRoom -> dbManager.getRoom(room.id)?.let { chatRoom ->
view.onRoomUpdated(roomMapper.map(chatRoom = chatRoom, showLastMessage = true)) view.onRoomUpdated(
roomMapper.map(
chatRoom = chatRoom,
showLastMessage = true
)
)
} }
} }
} }
...@@ -209,8 +246,8 @@ class ChatRoomPresenter @Inject constructor( ...@@ -209,8 +246,8 @@ class ChatRoomPresenter @Inject constructor(
) { ) {
this.chatRoomId = chatRoomId this.chatRoomId = chatRoomId
this.chatRoomType = chatRoomType this.chatRoomType = chatRoomType
launchUI(strategy) {
view.showLoading() GlobalScope.launch(Dispatchers.IO + strategy.jobs) {
try { try {
if (offset == 0L) { if (offset == 0L) {
// FIXME - load just 50 messages from DB to speed up. We will reload from Network after that // FIXME - load just 50 messages from DB to speed up. We will reload from Network after that
...@@ -218,11 +255,12 @@ class ChatRoomPresenter @Inject constructor( ...@@ -218,11 +255,12 @@ class ChatRoomPresenter @Inject constructor(
val localMessages = messagesRepository.getRecentMessages(chatRoomId, 50) val localMessages = messagesRepository.getRecentMessages(chatRoomId, 50)
val oldMessages = mapper.map( val oldMessages = mapper.map(
localMessages, RoomUiModel( localMessages, RoomUiModel(
roles = chatRoles, roles = chatRoles,
// FIXME: Why are we fixing isRoom attribute to true here? // FIXME: Why are we fixing isRoom attribute to true here?
isBroadcast = chatIsBroadcast, isRoom = true isBroadcast = isBroadcast, isRoom = true
) )
) )
lastMessageId = localMessages.firstOrNull()?.id
val lastSyncDate = messagesRepository.getLastSyncDate(chatRoomId) val lastSyncDate = messagesRepository.getLastSyncDate(chatRoomId)
if (oldMessages.isNotEmpty() && lastSyncDate != null) { if (oldMessages.isNotEmpty() && lastSyncDate != null) {
view.showMessages(oldMessages, clearDataSet) view.showMessages(oldMessages, clearDataSet)
...@@ -235,7 +273,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -235,7 +273,7 @@ class ChatRoomPresenter @Inject constructor(
} }
// TODO: For now we are marking the room as read if we can get the messages (I mean, no exception occurs) // TODO: For now we are marking the room as read if we can get the messages (I mean, no exception occurs)
// but should mark only when the user see the first unread message. // but should mark only when the user sees the first unread message.
markRoomAsRead(chatRoomId) markRoomAsRead(chatRoomId)
subscribeMessages(chatRoomId) subscribeMessages(chatRoomId)
...@@ -246,8 +284,6 @@ class ChatRoomPresenter @Inject constructor( ...@@ -246,8 +284,6 @@ class ChatRoomPresenter @Inject constructor(
}.ifNull { }.ifNull {
view.showGenericErrorMessage() view.showGenericErrorMessage()
} }
} finally {
view.hideLoading()
} }
subscribeTypingStatus() subscribeTypingStatus()
...@@ -282,7 +318,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -282,7 +318,7 @@ class ChatRoomPresenter @Inject constructor(
view.showMessages( view.showMessages(
mapper.map( mapper.map(
messages, messages,
RoomUiModel(roles = chatRoles, isBroadcast = chatIsBroadcast, isRoom = true) RoomUiModel(roles = chatRoles, isBroadcast = isBroadcast, isRoom = true)
), ),
clearDataSet clearDataSet
) )
...@@ -298,7 +334,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -298,7 +334,7 @@ class ChatRoomPresenter @Inject constructor(
view.showSearchedMessages( view.showSearchedMessages(
mapper.map( mapper.map(
messages, messages,
RoomUiModel(chatRoles, chatIsBroadcast, true) RoomUiModel(chatRoles, isBroadcast, true)
) )
) )
} catch (ex: Exception) { } catch (ex: Exception) {
...@@ -330,7 +366,11 @@ class ChatRoomPresenter @Inject constructor( ...@@ -330,7 +366,11 @@ class ChatRoomPresenter @Inject constructor(
timestamp = Instant.now().toEpochMilli(), timestamp = Instant.now().toEpochMilli(),
sender = SimpleUser(user?.id, user?.username ?: username, user?.name), sender = SimpleUser(user?.id, user?.username ?: username, user?.name),
attachments = null, attachments = null,
avatar = currentServer.avatarUrl(username!!, token?.userId, token?.authToken), avatar = currentServer.avatarUrl(
username!!,
token?.userId,
token?.authToken
),
channels = null, channels = null,
editedAt = null, editedAt = null,
editedBy = null, editedBy = null,
...@@ -352,7 +392,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -352,7 +392,7 @@ class ChatRoomPresenter @Inject constructor(
view.showNewMessage( view.showNewMessage(
mapper.map( mapper.map(
newMessage, newMessage,
RoomUiModel(roles = chatRoles, isBroadcast = chatIsBroadcast) RoomUiModel(roles = chatRoles, isBroadcast = isBroadcast)
), false ), false
) )
client.sendMessage(id, chatRoomId, text) client.sendMessage(id, chatRoomId, text)
...@@ -371,6 +411,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -371,6 +411,7 @@ class ChatRoomPresenter @Inject constructor(
throw ex throw ex
} }
} }
lastMessageId = id
} else { } else {
client.updateMessage(chatRoomId, messageId, text) client.updateMessage(chatRoomId, messageId, text)
} }
...@@ -602,16 +643,21 @@ class ChatRoomPresenter @Inject constructor( ...@@ -602,16 +643,21 @@ class ChatRoomPresenter @Inject constructor(
Timber.d("History: $messages") Timber.d("History: $messages")
if (messages.result.isNotEmpty()) { if (messages.result.isNotEmpty()) {
val models = mapper.map(messages.result, RoomUiModel( val models = mapper.map(
roles = chatRoles, messages.result, RoomUiModel(
isBroadcast = chatIsBroadcast, roles = chatRoles,
// FIXME: Why are we fixing isRoom attribute to true here? isBroadcast = isBroadcast,
isRoom = true // FIXME: Why are we fixing isRoom attribute to true here?
)) isRoom = true
)
)
messagesRepository.saveAll(messages.result) messagesRepository.saveAll(messages.result)
//if success - saving last synced time //if success - saving last synced time
//assume that BE returns ordered messages, the first message is the latest one //assume that BE returns ordered messages, the first message is the latest one
messagesRepository.saveLastSyncDate(chatRoomId, messages.result.first().timestamp) messagesRepository.saveLastSyncDate(
chatRoomId,
messages.result.first().timestamp
)
launchUI(strategy) { launchUI(strategy) {
view.showNewMessage(models, true) view.showNewMessage(models, true)
...@@ -688,9 +734,9 @@ class ChatRoomPresenter @Inject constructor( ...@@ -688,9 +734,9 @@ class ChatRoomPresenter @Inject constructor(
replyMarkdown = "[ ]($currentServer/$chatRoomType/$room?msg=$id) $mention ", replyMarkdown = "[ ]($currentServer/$chatRoomType/$room?msg=$id) $mention ",
quotedMessage = mapper.map( quotedMessage = mapper.map(
message, RoomUiModel( message, RoomUiModel(
roles = chatRoles, roles = chatRoles,
isBroadcast = chatIsBroadcast isBroadcast = isBroadcast
) )
).last().preview?.message ?: "" ).last().preview?.message ?: ""
) )
} }
...@@ -793,13 +839,15 @@ class ChatRoomPresenter @Inject constructor( ...@@ -793,13 +839,15 @@ class ChatRoomPresenter @Inject constructor(
} }
} }
fun loadActiveMembers( suspend fun loadActiveMembers(
chatRoomId: String, chatRoomId: String,
chatRoomType: String, chatRoomType: String,
offset: Long = 0, offset: Long = 0,
filterSelfOut: Boolean = false filterSelfOut: Boolean = false
) { ) {
launchUI(strategy) { val activeUsers = mutableListOf<PeopleSuggestionUiModel>()
withContext(Dispatchers.IO + strategy.jobs) {
try { try {
val members = retryIO("getMembers($chatRoomId, $chatRoomType, $offset)") { val members = retryIO("getMembers($chatRoomId, $chatRoomType, $offset)") {
client.getMembers(chatRoomId, roomTypeOf(chatRoomType), offset, 50).result client.getMembers(chatRoomId, roomTypeOf(chatRoomType), offset, 50).result
...@@ -810,12 +858,12 @@ class ChatRoomPresenter @Inject constructor( ...@@ -810,12 +858,12 @@ class ChatRoomPresenter @Inject constructor(
// Take at most the 100 most recent messages distinguished by user. Can return less. // Take at most the 100 most recent messages distinguished by user. Can return less.
val recentMessages = messagesRepository.getRecentMessages(chatRoomId, 100) val recentMessages = messagesRepository.getRecentMessages(chatRoomId, 100)
.filterNot { filterSelfOut && it.sender?.username == self } .filterNot { filterSelfOut && it.sender?.username == self }
val activeUsers = mutableListOf<PeopleSuggestionUiModel>()
recentMessages.forEach { recentMessages.forEach {
val sender = it.sender val sender = it.sender
val username = sender?.username ?: "" val username = sender?.username ?: ""
val name = sender?.name ?: "" val name = sender?.name ?: ""
val avatarUrl = currentServer.avatarUrl(username, token?.userId, token?.authToken) val avatarUrl =
currentServer.avatarUrl(username, token?.userId, token?.authToken)
val found = members.firstOrNull { member -> member.username == username } val found = members.firstOrNull { member -> member.username == username }
val status = if (found != null) found.status else UserStatus.Offline() val status = if (found != null) found.status else UserStatus.Offline()
val searchList = mutableListOf(username, name) val searchList = mutableListOf(username, name)
...@@ -836,7 +884,8 @@ class ChatRoomPresenter @Inject constructor( ...@@ -836,7 +884,8 @@ class ChatRoomPresenter @Inject constructor(
activeUsers.addAll(others.map { activeUsers.addAll(others.map {
val username = it.username ?: "" val username = it.username ?: ""
val name = it.name ?: "" val name = it.name ?: ""
val avatarUrl = currentServer.avatarUrl(username, token?.userId, token?.authToken) val avatarUrl =
currentServer.avatarUrl(username, token?.userId, token?.authToken)
val searchList = mutableListOf(username, name) val searchList = mutableListOf(username, name)
PeopleSuggestionUiModel( PeopleSuggestionUiModel(
avatarUrl, avatarUrl,
...@@ -849,11 +898,13 @@ class ChatRoomPresenter @Inject constructor( ...@@ -849,11 +898,13 @@ class ChatRoomPresenter @Inject constructor(
) )
}) })
view.populatePeopleSuggestions(activeUsers)
} catch (e: RocketChatException) { } catch (e: RocketChatException) {
Timber.e(e) Timber.e(e)
} }
} }
launchUI(strategy) {
view.populatePeopleSuggestions(activeUsers)
}
} }
fun spotlight(query: String, @AutoCompleteType type: Int, filterSelfOut: Boolean = false) { fun spotlight(query: String, @AutoCompleteType type: Int, filterSelfOut: Boolean = false) {
...@@ -966,48 +1017,49 @@ class ChatRoomPresenter @Inject constructor( ...@@ -966,48 +1017,49 @@ class ChatRoomPresenter @Inject constructor(
} }
// TODO: move this to new interactor or FetchChatRoomsInteractor? // TODO: move this to new interactor or FetchChatRoomsInteractor?
private suspend fun getChatRoomsAsync(name: String? = null): List<ChatRoom> = withContext(Dispatchers.IO) { private suspend fun getChatRoomsAsync(name: String? = null): List<ChatRoom> =
retryDB("getAllSync()") { withContext(Dispatchers.IO) {
dbManager.chatRoomDao().getAllSync().filter { retryDB("getAllSync()") {
if (name == null) { dbManager.chatRoomDao().getAllSync().filter {
return@filter true if (name == null) {
} return@filter true
it.chatRoom.name == name || it.chatRoom.fullname == name }
}.map { it.chatRoom.name == name || it.chatRoom.fullname == name
with(it.chatRoom) { }.map {
ChatRoom( with(it.chatRoom) {
id = id, ChatRoom(
subscriptionId = subscriptionId, id = id,
parentId = parentId, subscriptionId = subscriptionId,
type = roomTypeOf(type), parentId = parentId,
unread = unread, type = roomTypeOf(type),
broadcast = broadcast ?: false, unread = unread,
alert = alert, broadcast = broadcast ?: false,
fullName = fullname, alert = alert,
name = name ?: "", fullName = fullname,
favorite = favorite ?: false, name = name ?: "",
default = isDefault ?: false, favorite = favorite ?: false,
readonly = readonly, default = isDefault ?: false,
open = open, readonly = readonly,
lastMessage = null, open = open,
archived = false, lastMessage = null,
status = null, archived = false,
user = null, status = null,
userMentions = userMentions, user = null,
client = client, userMentions = userMentions,
announcement = null, client = client,
description = null, announcement = null,
groupMentions = groupMentions, description = null,
roles = null, groupMentions = groupMentions,
topic = null, roles = null,
lastSeen = this.lastSeen, topic = null,
timestamp = timestamp, lastSeen = this.lastSeen,
updatedAt = updatedAt timestamp = timestamp,
) updatedAt = updatedAt
)
}
} }
} }
} }
}
fun joinChat(chatRoomId: String) { fun joinChat(chatRoomId: String) {
launchUI(strategy) { launchUI(strategy) {
...@@ -1016,7 +1068,8 @@ class ChatRoomPresenter @Inject constructor( ...@@ -1016,7 +1068,8 @@ class ChatRoomPresenter @Inject constructor(
val canPost = permissions.canPostToReadOnlyChannels() val canPost = permissions.canPostToReadOnlyChannels()
dbManager.getRoom(chatRoomId)?.let { dbManager.getRoom(chatRoomId)?.let {
val roomUiModel = roomMapper.map(it, true).copy( val roomUiModel = roomMapper.map(it, true).copy(
writable = canPost) writable = canPost
)
view.onJoined(roomUiModel = roomUiModel) view.onJoined(roomUiModel = roomUiModel)
view.onRoomUpdated(roomUiModel = roomUiModel) view.onRoomUpdated(roomUiModel = roomUiModel)
} }
...@@ -1089,6 +1142,31 @@ class ChatRoomPresenter @Inject constructor( ...@@ -1089,6 +1142,31 @@ class ChatRoomPresenter @Inject constructor(
} }
} }
fun reactToLastMessage(text: String, roomId: String) {
launchUI(strategy) {
lastMessageId?.let { messageId ->
val emoji = text.substring(1).trimEnd()
if (emoji.length >= 2 && emoji.startsWith(":") && emoji.endsWith(":")) {
try {
retryIO("toggleEmoji($messageId, $emoji)") {
client.toggleReaction(messageId, emoji.removeSurrounding(":"))
}
logReactionEvent()
view.clearMessageComposition(true)
} catch (ex: RocketChatException) {
Timber.e(ex)
// emoji is not valid, post it
sendMessage(roomId, text, null)
}
} else {
sendMessage(roomId, text, null)
}
}.ifNull {
sendMessage(roomId, text, null)
}
}
}
private fun logReactionEvent() { private fun logReactionEvent() {
when { when {
roomTypeOf(chatRoomType) is RoomType.DirectMessage -> roomTypeOf(chatRoomType) is RoomType.DirectMessage ->
...@@ -1162,18 +1240,19 @@ class ChatRoomPresenter @Inject constructor( ...@@ -1162,18 +1240,19 @@ class ChatRoomPresenter @Inject constructor(
sendMessage(roomId, text, null) sendMessage(roomId, text, null)
} else { } else {
view.disableSendMessageButton() view.disableSendMessageButton()
val command = text.split(" ") val index = text.indexOf(" ")
val name = command[0].substring(1) var name = ""
var params = "" var params = ""
command.forEachIndexed { index, param -> if (index >= 1) {
if (index > 0) { name = text.substring(1, index)
params += "$param " params = text.substring(index + 1).trim()
}
} }
val result = retryIO("runCommand($name, $params, $roomId)") { val result = retryIO("runCommand($name, $params, $roomId)") {
client.runCommand(Command(name, params), roomId) client.runCommand(Command(name, params), roomId)
} }
if (!result) { if (result) {
view.clearMessageComposition(true)
} else {
// failed, command is not valid so post it // failed, command is not valid so post it
sendMessage(roomId, text, null) sendMessage(roomId, text, null)
} }
...@@ -1251,7 +1330,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -1251,7 +1330,7 @@ class ChatRoomPresenter @Inject constructor(
launchUI(strategy) { launchUI(strategy) {
val viewModelStreamedMessage = mapper.map( val viewModelStreamedMessage = mapper.map(
streamedMessage, RoomUiModel( streamedMessage, RoomUiModel(
roles = chatRoles, isBroadcast = chatIsBroadcast, isRoom = true roles = chatRoles, isBroadcast = isBroadcast, isRoom = true
) )
) )
val roomMessages = messagesRepository.getByRoomId(streamedMessage.roomId) val roomMessages = messagesRepository.getByRoomId(streamedMessage.roomId)
...@@ -1286,6 +1365,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -1286,6 +1365,7 @@ class ChatRoomPresenter @Inject constructor(
fun clearDraftMessage() { fun clearDraftMessage() {
localRepository.clear(draftKey) localRepository.clear(draftKey)
} }
/** /**
* Get unfinished message from local repository, when user left chat room without * Get unfinished message from local repository, when user left chat room without
* sending a message and now the user is back. * sending a message and now the user is back.
......
...@@ -139,7 +139,7 @@ class ChatRoomActivity : AppCompatActivity(), HasSupportFragmentInjector { ...@@ -139,7 +139,7 @@ class ChatRoomActivity : AppCompatActivity(), HasSupportFragmentInjector {
} }
fun setupExpandMoreForToolbar(listener: (View) -> Unit) { fun setupExpandMoreForToolbar(listener: (View) -> Unit) {
DrawableHelper.compoundRightDrawable( DrawableHelper.compoundEndDrawable(
text_toolbar_title, text_toolbar_title,
DrawableHelper.getDrawableFromId(R.drawable.ic_chatroom_toolbar_expand_more_20dp, this) DrawableHelper.getDrawableFromId(R.drawable.ic_chatroom_toolbar_expand_more_20dp, this)
) )
......
...@@ -148,10 +148,14 @@ private const val BUNDLE_CHAT_ROOM_MESSAGE = "chat_room_message" ...@@ -148,10 +148,14 @@ private const val BUNDLE_CHAT_ROOM_MESSAGE = "chat_room_message"
class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiReactionListener, class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiReactionListener,
ChatRoomAdapter.OnActionSelected, Drawable.Callback { ChatRoomAdapter.OnActionSelected, Drawable.Callback {
@Inject lateinit var presenter: ChatRoomPresenter @Inject
@Inject lateinit var parser: MessageParser lateinit var presenter: ChatRoomPresenter
@Inject lateinit var analyticsManager: AnalyticsManager @Inject
@Inject lateinit var navigator: ChatRoomNavigator lateinit var parser: MessageParser
@Inject
lateinit var analyticsManager: AnalyticsManager
@Inject
lateinit var navigator: ChatRoomNavigator
private lateinit var adapter: ChatRoomAdapter private lateinit var adapter: ChatRoomAdapter
internal lateinit var chatRoomId: String internal lateinit var chatRoomId: String
private lateinit var chatRoomName: String private lateinit var chatRoomName: String
...@@ -425,25 +429,12 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -425,25 +429,12 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
} }
} }
if (recycler_view.adapter == null) {
recycler_view.adapter = adapter
if (dataSet.size >= 30) {
recycler_view.addOnScrollListener(endlessRecyclerViewScrollListener)
}
recycler_view.addOnLayoutChangeListener(layoutChangeListener)
recycler_view.addOnScrollListener(onScrollListener)
// Load just once, on the first page...
presenter.loadActiveMembers(chatRoomId, chatRoomType, filterSelfOut = true)
}
val oldMessagesCount = adapter.itemCount val oldMessagesCount = adapter.itemCount
adapter.appendData(dataSet) adapter.appendData(dataSet)
if (oldMessagesCount == 0 && dataSet.isNotEmpty()) { if (oldMessagesCount == 0 && dataSet.isNotEmpty()) {
recycler_view.scrollToPosition(0) recycler_view.scrollToPosition(0)
verticalScrollOffset.set(0) verticalScrollOffset.set(0)
} }
presenter.loadActiveMembers(chatRoomId, chatRoomType, filterSelfOut = true)
empty_chat_view.isVisible = adapter.itemCount == 0 empty_chat_view.isVisible = adapter.itemCount == 0
dismissEmojiKeyboard() dismissEmojiKeyboard()
} }
...@@ -465,21 +456,20 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -465,21 +456,20 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
setupMessageComposer(roomUiModel) setupMessageComposer(roomUiModel)
isBroadcastChannel = roomUiModel.broadcast isBroadcastChannel = roomUiModel.broadcast
isFavorite = roomUiModel.favorite.orFalse() isFavorite = roomUiModel.favorite.orFalse()
if (isBroadcastChannel && !roomUiModel.canModerate) { disableMenu = (roomUiModel.broadcast && !roomUiModel.canModerate)
disableMenu = true activity?.invalidateOptionsMenu()
activity?.invalidateOptionsMenu()
}
} }
} }
override fun sendMessage(text: String) { override fun sendMessage(text: String) {
ui { ui {
if (!text.isBlank()) { if (!text.isBlank()) {
if (!text.startsWith("/")) { if (text.startsWith("/")) {
presenter.sendMessage(chatRoomId, text, editingMessageId)
} else {
presenter.runCommand(text, chatRoomId) presenter.runCommand(text, chatRoomId)
} else if (text.startsWith("+")) {
presenter.reactToLastMessage(text, chatRoomId)
} else {
presenter.sendMessage(chatRoomId, text, editingMessageId)
} }
} }
} }
...@@ -524,7 +514,6 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -524,7 +514,6 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
} }
} }
override fun clearMessageComposition(deleteMessage: Boolean) { override fun clearMessageComposition(deleteMessage: Boolean) {
ui { ui {
citation = null citation = null
...@@ -803,7 +792,12 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -803,7 +792,12 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
presenter.loadMessages(chatRoomId, chatRoomType, page * 30L) presenter.loadMessages(chatRoomId, chatRoomType, page * 30L)
} }
} }
recycler_view.adapter = adapter
recycler_view.addOnScrollListener(fabScrollListener) recycler_view.addOnScrollListener(fabScrollListener)
recycler_view.addOnScrollListener(endlessRecyclerViewScrollListener)
recycler_view.addOnLayoutChangeListener(layoutChangeListener)
recycler_view.addOnScrollListener(onScrollListener)
} }
private fun setupFab() { private fun setupFab() {
...@@ -896,7 +890,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -896,7 +890,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
button_take_a_photo.setOnClickListener { button_take_a_photo.setOnClickListener {
// Check for camera permission // Check for camera permission
context?.let { context?.let {
if(hasCameraPermission(it)) { if (hasCameraPermission(it)) {
dispatchTakePictureIntent() dispatchTakePictureIntent()
} else { } else {
getCameraPermission(this) getCameraPermission(this)
...@@ -964,7 +958,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -964,7 +958,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
grantResults: IntArray grantResults: IntArray
) { ) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults) super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when(requestCode) { when (requestCode) {
AndroidPermissionsHelper.CAMERA_CODE -> { AndroidPermissionsHelper.CAMERA_CODE -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted // permission was granted
......
...@@ -402,7 +402,7 @@ class UiModelMapper @Inject constructor( ...@@ -402,7 +402,7 @@ class UiModelMapper @Inject constructor(
private fun attachmentUrl(url: String?): String? { private fun attachmentUrl(url: String?): String? {
if (url.isNullOrEmpty()) return null if (url.isNullOrEmpty()) return null
if (url!!.startsWith("http")) return url if (url.startsWith("http")) return url
val fullUrl = "$baseUrl$url" val fullUrl = "$baseUrl$url"
val httpUrl = HttpUrl.parse(fullUrl) val httpUrl = HttpUrl.parse(fullUrl)
...@@ -473,18 +473,20 @@ class UiModelMapper @Inject constructor( ...@@ -473,18 +473,20 @@ class UiModelMapper @Inject constructor(
val list = mutableListOf<ReactionUiModel>() val list = mutableListOf<ReactionUiModel>()
val customEmojis = EmojiRepository.getCustomEmojis() val customEmojis = EmojiRepository.getCustomEmojis()
it.getShortNames().forEach { shortname -> it.getShortNames().forEach { shortname ->
val usernames = it.getUsernames(shortname).orEmpty() it.getUsernames(shortname)?.let { usernames ->
val count = usernames.size val count = usernames.size
val custom = customEmojis.firstOrNull { emoji -> emoji.shortname == shortname } val custom = customEmojis.firstOrNull { emoji -> emoji.shortname == shortname }
list.add( list.add(
ReactionUiModel(messageId = message.id, ReactionUiModel(messageId = message.id,
shortname = shortname, shortname = shortname,
unicode = EmojiParser.parse(context, shortname), unicode = EmojiParser.parse(context, shortname),
count = count, count = count,
usernames = usernames, usernames = usernames,
url = custom?.url, url = custom?.url,
isCustom = custom != null) isCustom = custom != null)
) )
}
} }
list list
} }
......
...@@ -105,9 +105,11 @@ class RoomUiModelMapper( ...@@ -105,9 +105,11 @@ class RoomUiModelMapper(
avatar = serverUrl.avatarUrl(name!!, token?.userId, token?.authToken, isGroupOrChannel = true), avatar = serverUrl.avatarUrl(name!!, token?.userId, token?.authToken, isGroupOrChannel = true),
lastMessage = if (showLastMessage) { lastMessage = if (showLastMessage) {
mapLastMessage( mapLastMessage(
lastMessage?.sender?.id, lastMessage?.sender?.username, lastMessage?.sender?.id,
lastMessage?.sender?.name, lastMessage?.message, lastMessage?.sender?.username,
isDirectMessage = type is RoomType.DirectMessage lastMessage?.sender?.name,
lastMessage?.message,
isDirectMessage = type is RoomType.DirectMessage
) )
} else { } else {
null null
......
...@@ -3,6 +3,7 @@ package chat.rocket.android.chatrooms.adapter ...@@ -3,6 +3,7 @@ package chat.rocket.android.chatrooms.adapter
import android.content.res.Resources import android.content.res.Resources
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.view.View import android.view.View
import android.widget.TextView
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isInvisible import androidx.core.view.isInvisible
import androidx.core.view.isVisible import androidx.core.view.isVisible
...@@ -15,7 +16,6 @@ import com.bumptech.glide.Glide ...@@ -15,7 +16,6 @@ import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
import kotlinx.android.synthetic.main.item_chat.view.* import kotlinx.android.synthetic.main.item_chat.view.*
import kotlinx.android.synthetic.main.unread_messages_badge.view.*
class RoomViewHolder(itemView: View, private val listener: (RoomUiModel) -> Unit) : class RoomViewHolder(itemView: View, private val listener: (RoomUiModel) -> Unit) :
ViewHolder<RoomItemHolder>(itemView) { ViewHolder<RoomItemHolder>(itemView) {
...@@ -31,8 +31,6 @@ class RoomViewHolder(itemView: View, private val listener: (RoomUiModel) -> Unit ...@@ -31,8 +31,6 @@ class RoomViewHolder(itemView: View, private val listener: (RoomUiModel) -> Unit
override fun bindViews(data: RoomItemHolder) { override fun bindViews(data: RoomItemHolder) {
val room = data.data val room = data.data
with(itemView) { with(itemView) {
val avatar = room.avatar
Glide.with(image_avatar.context) Glide.with(image_avatar.context)
.load(room.avatar) .load(room.avatar)
.apply(RequestOptions.bitmapTransform(RoundedCorners(10))) .apply(RequestOptions.bitmapTransform(RoundedCorners(10)))
...@@ -63,6 +61,7 @@ class RoomViewHolder(itemView: View, private val listener: (RoomUiModel) -> Unit ...@@ -63,6 +61,7 @@ class RoomViewHolder(itemView: View, private val listener: (RoomUiModel) -> Unit
} }
if (room.alert) { if (room.alert) {
val text_total_unread_messages = text_total_unread_messages as TextView
if (room.unread == null) text_total_unread_messages.text = "!" if (room.unread == null) text_total_unread_messages.text = "!"
if (room.unread != null) text_total_unread_messages.text = room.unread if (room.unread != null) text_total_unread_messages.text = room.unread
if (room.mentions) text_total_unread_messages.text = "@${room.unread}" if (room.mentions) text_total_unread_messages.text = "@${room.unread}"
......
...@@ -31,7 +31,6 @@ import chat.rocket.core.model.ChatRoom ...@@ -31,7 +31,6 @@ import chat.rocket.core.model.ChatRoom
import chat.rocket.core.model.Message import chat.rocket.core.model.Message
import chat.rocket.core.model.Myself import chat.rocket.core.model.Myself
import chat.rocket.core.model.Room import chat.rocket.core.model.Room
import chat.rocket.core.model.attachment.Attachment
import chat.rocket.core.model.userId import chat.rocket.core.model.userId
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
...@@ -237,7 +236,8 @@ class DatabaseManager(val context: Application, val serverUrl: String) { ...@@ -237,7 +236,8 @@ class DatabaseManager(val context: Application, val serverUrl: String) {
reaction, reaction,
message.id, message.id,
size, size,
reactionValue.joinToString() reactionValue.first.joinToString(),
reactionValue.second.joinToString()
) )
) )
} }
...@@ -383,17 +383,14 @@ class DatabaseManager(val context: Application, val serverUrl: String) { ...@@ -383,17 +383,14 @@ class DatabaseManager(val context: Application, val serverUrl: String) {
} }
} }
private fun mapLastMessageText(message: Message?): String? = message?.run { private fun mapLastMessageText(message: Message?): String? = message?.let { lastMessage ->
if (this.message.isEmpty() && attachments?.isNotEmpty() == true) { if (lastMessage.message.isEmpty() && lastMessage.attachments?.isNotEmpty() == true) {
message.attachments?.let { mapAttachmentText(it[0]) } context.getString(R.string.msg_sent_attachment)
} else { } else {
this.message lastMessage.message
} }
} }
private fun mapAttachmentText(attachment: Attachment): String =
context.getString(R.string.msg_sent_attachment)
private suspend fun updateSubscription(data: Subscription): ChatRoomEntity? { private suspend fun updateSubscription(data: Subscription): ChatRoomEntity? {
return retryDB("getRoom(${data.roomId}") { chatRoomDao().getSync(data.roomId) }?.let { current -> return retryDB("getRoom(${data.roomId}") { chatRoomDao().getSync(data.roomId) }?.let { current ->
with(data) { with(data) {
......
...@@ -19,13 +19,20 @@ import chat.rocket.android.emoji.internal.db.StringListConverter ...@@ -19,13 +19,20 @@ import chat.rocket.android.emoji.internal.db.StringListConverter
@Database( @Database(
entities = [ entities = [
UserEntity::class, ChatRoomEntity::class, MessageEntity::class, UserEntity::class,
MessageFavoritesRelation::class, MessageMentionsRelation::class, ChatRoomEntity::class,
MessageChannels::class, AttachmentEntity::class, MessageEntity::class,
AttachmentFieldEntity::class, AttachmentActionEntity::class, UrlEntity::class, MessageFavoritesRelation::class,
ReactionEntity::class, MessagesSync::class MessageMentionsRelation::class,
MessageChannels::class,
AttachmentEntity::class,
AttachmentFieldEntity::class,
AttachmentActionEntity::class,
UrlEntity::class,
ReactionEntity::class,
MessagesSync::class
], ],
version = 12, version = 13,
exportSchema = true exportSchema = true
) )
@TypeConverters(StringListConverter::class) @TypeConverters(StringListConverter::class)
......
...@@ -8,11 +8,13 @@ import androidx.room.Relation ...@@ -8,11 +8,13 @@ import androidx.room.Relation
interface BaseMessageEntity interface BaseMessageEntity
@Entity(tableName = "messages", @Entity(
foreignKeys = [ tableName = "messages",
ForeignKey(entity = UserEntity::class, parentColumns = ["id"], childColumns = ["senderId"]), foreignKeys = [
ForeignKey(entity = UserEntity::class, parentColumns = ["id"], childColumns = ["editedBy"]) ForeignKey(entity = UserEntity::class, parentColumns = ["id"], childColumns = ["senderId"]),
]) ForeignKey(entity = UserEntity::class, parentColumns = ["id"], childColumns = ["editedBy"])
]
)
data class MessageEntity( data class MessageEntity(
@PrimaryKey val id: String, @PrimaryKey val id: String,
val roomId: String, val roomId: String,
...@@ -33,36 +35,47 @@ data class MessageEntity( ...@@ -33,36 +35,47 @@ data class MessageEntity(
val unread: Boolean? = null val unread: Boolean? = null
) : BaseMessageEntity ) : BaseMessageEntity
@Entity(tableName = "message_favorites", @Entity(
primaryKeys = ["messageId", "userId"], tableName = "message_favorites",
foreignKeys = [ primaryKeys = ["messageId", "userId"],
ForeignKey(entity = MessageEntity::class, parentColumns = ["id"], foreignKeys = [
childColumns = ["messageId"], onDelete = ForeignKey.CASCADE), ForeignKey(
ForeignKey(entity = UserEntity::class, parentColumns = ["id"], childColumns = ["userId"]) entity = MessageEntity::class, parentColumns = ["id"],
]) childColumns = ["messageId"], onDelete = ForeignKey.CASCADE
),
ForeignKey(entity = UserEntity::class, parentColumns = ["id"], childColumns = ["userId"])
]
)
data class MessageFavoritesRelation( data class MessageFavoritesRelation(
val messageId: String, val messageId: String,
val userId: String val userId: String
) : BaseMessageEntity ) : BaseMessageEntity
@Entity(tableName = "message_mentions", @Entity(
primaryKeys = ["messageId", "userId"], tableName = "message_mentions",
foreignKeys = [ primaryKeys = ["messageId", "userId"],
ForeignKey(entity = MessageEntity::class, parentColumns = ["id"], foreignKeys = [
childColumns = ["messageId"], onDelete = ForeignKey.CASCADE), ForeignKey(
ForeignKey(entity = UserEntity::class, parentColumns = ["id"], childColumns = ["userId"]) entity = MessageEntity::class, parentColumns = ["id"],
]) childColumns = ["messageId"], onDelete = ForeignKey.CASCADE
),
ForeignKey(entity = UserEntity::class, parentColumns = ["id"], childColumns = ["userId"])
]
)
data class MessageMentionsRelation( data class MessageMentionsRelation(
val messageId: String, val messageId: String,
val userId: String val userId: String
) : BaseMessageEntity ) : BaseMessageEntity
@Entity(tableName = "message_channels", @Entity(
primaryKeys = ["messageId", "roomId"], tableName = "message_channels",
foreignKeys = [ primaryKeys = ["messageId", "roomId"],
ForeignKey(entity = MessageEntity::class, parentColumns = ["id"], foreignKeys = [
childColumns = ["messageId"], onDelete = ForeignKey.CASCADE) ForeignKey(
] entity = MessageEntity::class, parentColumns = ["id"],
childColumns = ["messageId"], onDelete = ForeignKey.CASCADE
)
]
) )
data class MessageChannels( data class MessageChannels(
val messageId: String, val messageId: String,
...@@ -95,8 +108,6 @@ data class PartialMessage( ...@@ -95,8 +108,6 @@ data class PartialMessage(
override fun toString(): String { override fun toString(): String {
return "PartialMessage(message=$message, senderName=$senderName, senderUsername=$senderUsername, editName=$editName, editUsername=$editUsername, urls=$urls, attachments=$attachments, reactions=$reactions, channels=$channels)" return "PartialMessage(message=$message, senderName=$senderName, senderUsername=$senderUsername, editName=$editName, editUsername=$editUsername, urls=$urls, attachments=$attachments, reactions=$reactions, channels=$channels)"
} }
} }
data class FullMessage( data class FullMessage(
......
...@@ -5,18 +5,22 @@ import androidx.room.ForeignKey ...@@ -5,18 +5,22 @@ import androidx.room.ForeignKey
import androidx.room.Index import androidx.room.Index
import androidx.room.PrimaryKey import androidx.room.PrimaryKey
@Entity(tableName = "reactions", @Entity(
foreignKeys = [ tableName = "reactions",
ForeignKey(entity = MessageEntity::class, parentColumns = ["id"], foreignKeys = [
childColumns = ["messageId"], onDelete = ForeignKey.CASCADE) ForeignKey(
], entity = MessageEntity::class,
indices = [ parentColumns = ["id"],
Index(value = ["messageId"]) childColumns = ["messageId"],
] onDelete = ForeignKey.CASCADE
)
],
indices = [Index(value = ["messageId"])]
) )
data class ReactionEntity( data class ReactionEntity(
@PrimaryKey val reaction: String, @PrimaryKey val reaction: String,
val messageId: String, val messageId: String,
val count: Int, val count: Int,
val usernames: String val usernames: String,
val names: String
) : BaseMessageEntity ) : BaseMessageEntity
\ No newline at end of file
...@@ -233,14 +233,14 @@ class DirectoryFragment : Fragment(), DirectoryView { ...@@ -233,14 +233,14 @@ class DirectoryFragment : Fragment(), DirectoryView {
private fun updateSortByTitle() { private fun updateSortByTitle() {
if (isSortByChannels) { if (isSortByChannels) {
text_sort_by.text = getString(R.string.msg_channels) text_sort_by.text = getString(R.string.msg_channels)
DrawableHelper.compoundLeftAndRightDrawable( DrawableHelper.compoundStartAndEndDrawable(
text_sort_by, text_sort_by,
hashtagDrawable, hashtagDrawable,
arrowDownDrawable arrowDownDrawable
) )
} else { } else {
text_sort_by.text = getString(R.string.msg_users) text_sort_by.text = getString(R.string.msg_users)
DrawableHelper.compoundLeftAndRightDrawable( DrawableHelper.compoundStartAndEndDrawable(
text_sort_by, text_sort_by,
userDrawable, userDrawable,
arrowDownDrawable arrowDownDrawable
......
...@@ -11,7 +11,7 @@ import android.widget.TextView ...@@ -11,7 +11,7 @@ import android.widget.TextView
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import chat.rocket.android.R import chat.rocket.android.R
import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import kotlinx.android.synthetic.main.bottom_seet_fragment_directory_sorting.* import kotlinx.android.synthetic.main.bottom_sheet_fragment_directory_sorting.*
fun showDirectorySortingBottomSheetFragment( fun showDirectorySortingBottomSheetFragment(
isSortByChannels: Boolean, isSortByChannels: Boolean,
...@@ -59,7 +59,7 @@ class DirectorySortingBottomSheetFragment : BottomSheetDialogFragment() { ...@@ -59,7 +59,7 @@ class DirectorySortingBottomSheetFragment : BottomSheetDialogFragment() {
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? = ): View? =
inflater.inflate(R.layout.bottom_seet_fragment_directory_sorting, container, false) inflater.inflate(R.layout.bottom_sheet_fragment_directory_sorting, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
...@@ -69,7 +69,6 @@ class DirectorySortingBottomSheetFragment : BottomSheetDialogFragment() { ...@@ -69,7 +69,6 @@ class DirectorySortingBottomSheetFragment : BottomSheetDialogFragment() {
override fun onCancel(dialog: DialogInterface?) { override fun onCancel(dialog: DialogInterface?) {
super.onCancel(dialog) super.onCancel(dialog)
directoryFragment.updateSorting(isSortByChannels, isSearchForGlobalUsers)
} }
private fun setupView() { private fun setupView() {
...@@ -87,34 +86,37 @@ class DirectorySortingBottomSheetFragment : BottomSheetDialogFragment() { ...@@ -87,34 +86,37 @@ class DirectorySortingBottomSheetFragment : BottomSheetDialogFragment() {
checkSelection(text_channels, hashtagDrawable) checkSelection(text_channels, hashtagDrawable)
uncheckSelection(text_users, userDrawable) uncheckSelection(text_users, userDrawable)
isSortByChannels = true isSortByChannels = true
directoryFragment.updateSorting(isSortByChannels, isSearchForGlobalUsers)
} }
text_users.setOnClickListener { text_users.setOnClickListener {
checkSelection(text_users, userDrawable) checkSelection(text_users, userDrawable)
uncheckSelection(text_channels, hashtagDrawable) uncheckSelection(text_channels, hashtagDrawable)
isSortByChannels = false isSortByChannels = false
directoryFragment.updateSorting(isSortByChannels, isSearchForGlobalUsers)
} }
switch_global_users.setOnCheckedChangeListener { _, isChecked -> switch_global_users.setOnCheckedChangeListener { _, isChecked ->
isSearchForGlobalUsers = isChecked isSearchForGlobalUsers = isChecked
directoryFragment.updateSorting(isSortByChannels, isSearchForGlobalUsers)
} }
} }
private fun checkSelection(textView: TextView, leftDrawable: Drawable) { private fun checkSelection(textView: TextView, startDrawable: Drawable) {
context?.let { context?.let {
DrawableHelper.compoundLeftAndRightDrawable( DrawableHelper.compoundStartAndEndDrawable(
textView, textView,
leftDrawable, startDrawable,
checkDrawable checkDrawable
) )
} }
} }
private fun uncheckSelection(textView: TextView, leftDrawable: Drawable) { private fun uncheckSelection(textView: TextView, startDrawable: Drawable) {
context?.let { context?.let {
DrawableHelper.compoundLeftDrawable( DrawableHelper.compoundStartDrawable(
textView, textView,
leftDrawable startDrawable
) )
} }
} }
......
...@@ -27,7 +27,7 @@ class MainActivity : AppCompatActivity(), HasActivityInjector, ...@@ -27,7 +27,7 @@ class MainActivity : AppCompatActivity(), HasActivityInjector,
@Inject @Inject
lateinit var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity> lateinit var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
@Inject @Inject
lateinit var fagmentDispatchingAndroidInjector: DispatchingAndroidInjector<Fragment> lateinit var fragmentDispatchingAndroidInjector: DispatchingAndroidInjector<Fragment>
@Inject @Inject
lateinit var presenter: MainPresenter lateinit var presenter: MainPresenter
...@@ -56,7 +56,7 @@ class MainActivity : AppCompatActivity(), HasActivityInjector, ...@@ -56,7 +56,7 @@ class MainActivity : AppCompatActivity(), HasActivityInjector,
activityDispatchingAndroidInjector activityDispatchingAndroidInjector
override fun supportFragmentInjector(): AndroidInjector<Fragment> = override fun supportFragmentInjector(): AndroidInjector<Fragment> =
fagmentDispatchingAndroidInjector fragmentDispatchingAndroidInjector
override fun updateLanguage(language: String, country: String?) { override fun updateLanguage(language: String, country: String?) {
val locale: Locale = if (country != null) { val locale: Locale = if (country != null) {
......
...@@ -116,7 +116,7 @@ fun PublicSettings.messageReadReceiptStoreUsers(): Boolean = this[MESSAGE_READ_R ...@@ -116,7 +116,7 @@ fun PublicSettings.messageReadReceiptStoreUsers(): Boolean = this[MESSAGE_READ_R
fun PublicSettings.uploadMimeTypeFilter(): Array<String>? { fun PublicSettings.uploadMimeTypeFilter(): Array<String>? {
val values = this[UPLOAD_WHITELIST_MIMETYPES]?.value as String? val values = this[UPLOAD_WHITELIST_MIMETYPES]?.value as String?
if (!values.isNullOrBlank()) { if (!values.isNullOrBlank()) {
return values!!.split(",").mapToTypedArray { it.trim() } return values.split(",").mapToTypedArray { it.trim() }
} }
return null return null
} }
......
...@@ -89,7 +89,8 @@ class DatabaseMessageMapper(private val dbManager: DatabaseManager) { ...@@ -89,7 +89,8 @@ class DatabaseMessageMapper(private val dbManager: DatabaseManager) {
val map = Reactions() val map = Reactions()
reactions.forEach { reaction -> reactions.forEach { reaction ->
val usernames = reaction.usernames.split(",").map { it.trim() } val usernames = reaction.usernames.split(",").map { it.trim() }
map[reaction.reaction] = usernames val names = reaction.names.split(",").map { it.trim() }
map[reaction.reaction] = Pair(usernames, names)
} }
return map return map
......
package chat.rocket.android.server.infrastructure package chat.rocket.android.server.infrastructure
import android.content.SharedPreferences import android.content.SharedPreferences
import java.util.*
private const val CURRENT_LANGUAGE = "current_language" private const val CURRENT_LANGUAGE = "current_language"
private const val CURRENT_LANGUAGE_COUNTRY = "current_language_country" private const val CURRENT_LANGUAGE_COUNTRY = "current_language_country"
...@@ -16,10 +17,10 @@ class SharedPrefsCurrentLanguageRepository(private val preferences: SharedPrefer ...@@ -16,10 +17,10 @@ class SharedPrefsCurrentLanguageRepository(private val preferences: SharedPrefer
} }
override fun getLanguage(): String? { override fun getLanguage(): String? {
return preferences.getString(CURRENT_LANGUAGE, "") return preferences.getString(CURRENT_LANGUAGE, Locale.getDefault().language)
} }
override fun getCountry(): String? { override fun getCountry(): String? {
return preferences.getString(CURRENT_LANGUAGE_COUNTRY, "") return preferences.getString(CURRENT_LANGUAGE_COUNTRY, Locale.getDefault().country)
} }
} }
package chat.rocket.android.settings.presentation package chat.rocket.android.settings.presentation
import android.content.Context
import android.os.Build
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.db.DatabaseManagerFactory import chat.rocket.android.db.DatabaseManagerFactory
import chat.rocket.android.helper.UserHelper import chat.rocket.android.helper.UserHelper
import chat.rocket.android.main.presentation.MainNavigator import chat.rocket.android.main.presentation.MainNavigator
import chat.rocket.android.server.domain.AnalyticsTrackingInteractor import chat.rocket.android.server.domain.AnalyticsTrackingInteractor
import chat.rocket.android.server.domain.GetCurrentLanguageInteractor
import chat.rocket.android.server.domain.GetCurrentServerInteractor import chat.rocket.android.server.domain.GetCurrentServerInteractor
import chat.rocket.android.server.domain.PermissionsInteractor import chat.rocket.android.server.domain.PermissionsInteractor
import chat.rocket.android.server.domain.RemoveAccountInteractor import chat.rocket.android.server.domain.RemoveAccountInteractor
...@@ -27,6 +28,7 @@ import chat.rocket.core.internal.rest.serverInfo ...@@ -27,6 +28,7 @@ import chat.rocket.core.internal.rest.serverInfo
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import timber.log.Timber import timber.log.Timber
import java.util.*
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Named import javax.inject.Named
...@@ -40,11 +42,11 @@ class SettingsPresenter @Inject constructor( ...@@ -40,11 +42,11 @@ class SettingsPresenter @Inject constructor(
private val tokenRepository: TokenRepository, private val tokenRepository: TokenRepository,
private val permissions: PermissionsInteractor, private val permissions: PermissionsInteractor,
private val rocketChatClientFactory: RocketChatClientFactory, private val rocketChatClientFactory: RocketChatClientFactory,
private val saveLanguageInteractor: SaveCurrentLanguageInteractor,
getCurrentServerInteractor: GetCurrentServerInteractor, getCurrentServerInteractor: GetCurrentServerInteractor,
removeAccountInteractor: RemoveAccountInteractor, removeAccountInteractor: RemoveAccountInteractor,
databaseManagerFactory: DatabaseManagerFactory, databaseManagerFactory: DatabaseManagerFactory,
connectionManagerFactory: ConnectionManagerFactory, connectionManagerFactory: ConnectionManagerFactory
private val saveLanguageInteractor: SaveCurrentLanguageInteractor
) : CheckServerPresenter( ) : CheckServerPresenter(
strategy = strategy, strategy = strategy,
factory = rocketChatClientFactory, factory = rocketChatClientFactory,
...@@ -93,7 +95,6 @@ class SettingsPresenter @Inject constructor( ...@@ -93,7 +95,6 @@ class SettingsPresenter @Inject constructor(
fun enableAnalyticsTracking(isEnabled: Boolean) { fun enableAnalyticsTracking(isEnabled: Boolean) {
analyticsTrackingInteractor.save(isEnabled) analyticsTrackingInteractor.save(isEnabled)
} }
fun logout() { fun logout() {
...@@ -127,6 +128,14 @@ class SettingsPresenter @Inject constructor( ...@@ -127,6 +128,14 @@ class SettingsPresenter @Inject constructor(
} }
} }
fun getCurrentLocale(context: Context): Locale {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
context.resources.configuration.locales.get(0)
} else {
context.resources.configuration.locale
}
}
fun saveLocale(language: String, country: String? = null) { fun saveLocale(language: String, country: String? = null) {
saveLanguageInteractor.save(language, country) saveLanguageInteractor.save(language, country)
} }
......
...@@ -35,8 +35,28 @@ internal const val TAG_SETTINGS_FRAGMENT = "SettingsFragment" ...@@ -35,8 +35,28 @@ internal const val TAG_SETTINGS_FRAGMENT = "SettingsFragment"
fun newInstance(): Fragment = SettingsFragment() fun newInstance(): Fragment = SettingsFragment()
class SettingsFragment : Fragment(), SettingsView, AppLanguageView { class SettingsFragment : Fragment(), SettingsView, AppLanguageView {
@Inject lateinit var analyticsManager: AnalyticsManager @Inject
@Inject lateinit var presenter: SettingsPresenter lateinit var analyticsManager: AnalyticsManager
@Inject
lateinit var presenter: SettingsPresenter
private val locales = arrayListOf(
"en",
"ar",
"de",
"es",
"fa",
"fr",
"hi,IN",
"it",
"ja",
"pt,BR",
"pt,PT",
"ru,RU",
"tr",
"uk",
"zh,CN",
"zh,TW"
)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
...@@ -163,28 +183,33 @@ class SettingsFragment : Fragment(), SettingsView, AppLanguageView { ...@@ -163,28 +183,33 @@ class SettingsFragment : Fragment(), SettingsView, AppLanguageView {
private fun changeLanguage() { private fun changeLanguage() {
context?.let { context?.let {
val selectedLocale = presenter.getCurrentLocale(it)
var localeIndex = -1
locales.forEachIndexed { index, locale ->
val array = locale.split(",")
val language = array[0]
val country = if (array.size > 1) array[1] else ""
// If language and country are specified, return the respective locale, else return
// the first locale found if the language is as specified regardless of the country.
if (language == selectedLocale.language) {
if (country == selectedLocale.country) {
localeIndex = index
return@forEachIndexed
} else if (localeIndex == -1) {
localeIndex = index
}
}
}
AlertDialog.Builder(it) AlertDialog.Builder(it)
.setTitle(R.string.title_choose_language) .setTitle(R.string.title_choose_language)
.setSingleChoiceItems( .setSingleChoiceItems(
resources.getStringArray(R.array.languages), -1 resources.getStringArray(R.array.languages), localeIndex
) { dialog, option -> ) { dialog, option ->
when (option) { val array = locales[option].split(",")
0 -> updateLanguage("en") if (array.size > 1) {
1 -> updateLanguage("ar") updateLanguage(array[0], array[1])
2 -> updateLanguage("de") } else {
3 -> updateLanguage("es") updateLanguage(array[0])
4 -> updateLanguage("fa")
5 -> updateLanguage("fr")
6 -> updateLanguage("hi", "IN")
7 -> updateLanguage("it")
8 -> updateLanguage("ja")
9 -> updateLanguage("pt", "BR")
10 -> updateLanguage("pt", "PT")
11 -> updateLanguage("ru", "RU")
12 -> updateLanguage("tr")
13 -> updateLanguage("uk")
14 -> updateLanguage("zh", "CN")
15 -> updateLanguage("zh", "TW")
} }
dialog.dismiss() dialog.dismiss()
} }
...@@ -231,4 +256,4 @@ class SettingsFragment : Fragment(), SettingsView, AppLanguageView { ...@@ -231,4 +256,4 @@ class SettingsFragment : Fragment(), SettingsView, AppLanguageView {
.show() .show()
} }
} }
} }
\ No newline at end of file
...@@ -143,21 +143,21 @@ class SortingAndGroupingBottomSheetFragment : BottomSheetDialogFragment(), Sorti ...@@ -143,21 +143,21 @@ class SortingAndGroupingBottomSheetFragment : BottomSheetDialogFragment(), Sorti
text_sort_by.text = getString(R.string.msg_sort_by_placeholder, text.toLowerCase()) text_sort_by.text = getString(R.string.msg_sort_by_placeholder, text.toLowerCase())
} }
private fun checkSelection(textView: TextView, @DrawableRes leftDrawable: Int) { private fun checkSelection(textView: TextView, @DrawableRes startDrawable: Int) {
context?.let { context?.let {
DrawableHelper.compoundLeftAndRightDrawable( DrawableHelper.compoundStartAndEndDrawable(
textView, textView,
DrawableHelper.getDrawableFromId(leftDrawable, it), DrawableHelper.getDrawableFromId(startDrawable, it),
DrawableHelper.getDrawableFromId(R.drawable.ic_check, it) DrawableHelper.getDrawableFromId(R.drawable.ic_check, it)
) )
} }
} }
private fun uncheckSelection(textView: TextView, @DrawableRes leftDrawable: Int) { private fun uncheckSelection(textView: TextView, @DrawableRes startDrawable: Int) {
context?.let { context?.let {
DrawableHelper.compoundLeftDrawable( DrawableHelper.compoundStartDrawable(
textView, textView,
DrawableHelper.getDrawableFromId(leftDrawable, it) DrawableHelper.getDrawableFromId(startDrawable, it)
) )
} }
} }
......
<vector android:height="24dp" android:viewportHeight="100" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="100" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:width="24dp"
<path android:fillColor="#ededed" android:pathData="M50,100q-24.66,0 -49.32,0c-0.57,0 -0.68,-0.11 -0.68,-0.68Q0,50 0,0.68C0,0.11 0.11,0 0.68,0Q50,0 99.32,0c0.57,0 0.68,0.11 0.68,0.68q0,49.32 0,98.64c0,0.57 -0.11,0.68 -0.68,0.68Q74.66,100 50,100Z"/> android:height="24dp"
<path android:fillColor="#afafae" android:pathData="M49.42,90C41.72,90 34,90 26.34,90a13.82,13.82 0,0 1,-8.55 -2.75A11.18,11.18 0,0 1,13.22 79a46.76,46.76 0,0 1,3 -21.44,17.06 17.06,0 0,1 6.56,-8.48 15.67,15.67 0,0 1,7.3 -2.28,4.52 4.52,0 0,1 2.84,1c1.62,1 3.18,2.14 4.86,3.05a23.24,23.24 0,0 0,20.34 1.5A25.39,25.39 0,0 0,65 48.51c2.81,-2.26 5.65,-1.76 8.61,-0.71 3.73,1.32 6.24,4 8.11,7.39A35.18,35.18 0,0 1,85.31 67,54.2 54.2,0 0,1 86,77.31a12.47,12.47 0,0 1,-4 9.28,12.65 12.65,0 0,1 -7.33,3.22c-3.9,0.4 -7.82,0.13 -11.73,0.17C58.41,90 53.92,90 49.42,90Z"/> android:viewportWidth="100"
<path android:fillColor="#afafae" android:pathData="M69.35,30.28c0.4,10.36 -8.74,20 -19.89,19.93s-19.92,-9.58 -19.89,-20 8.81,-19.93 20,-19.88C60.64,10.35 69.77,19.87 69.35,30.28Z"/> android:viewportHeight="100">
<path
android:fillColor="#ededed"
android:pathData="M50,100q-24.66,0 -49.32,0c-0.57,0 -0.68,-0.11 -0.68,-0.68Q0,50 0,0.68C0,0.11 0.11,0 0.68,0Q50,0 99.32,0c0.57,0 0.68,0.11 0.68,0.68q0,49.32 0,98.64c0,0.57 -0.11,0.68 -0.68,0.68Q74.66,100 50,100Z" />
<path
android:fillColor="#afafae"
android:pathData="M49.42,90C41.72,90 34,90 26.34,90a13.82,13.82 0,0 1,-8.55 -2.75A11.18,11.18 0,0 1,13.22 79a46.76,46.76 0,0 1,3 -21.44,17.06 17.06,0 0,1 6.56,-8.48 15.67,15.67 0,0 1,7.3 -2.28,4.52 4.52,0 0,1 2.84,1c1.62,1 3.18,2.14 4.86,3.05a23.24,23.24 0,0 0,20.34 1.5A25.39,25.39 0,0 0,65 48.51c2.81,-2.26 5.65,-1.76 8.61,-0.71 3.73,1.32 6.24,4 8.11,7.39A35.18,35.18 0,0 1,85.31 67,54.2 54.2,0 0,1 86,77.31a12.47,12.47 0,0 1,-4 9.28,12.65 12.65,0 0,1 -7.33,3.22c-3.9,0.4 -7.82,0.13 -11.73,0.17C58.41,90 53.92,90 49.42,90Z" />
<path
android:fillColor="#afafae"
android:pathData="M69.35,30.28c0.4,10.36 -8.74,20 -19.89,19.93s-19.92,-9.58 -19.89,-20 8.81,-19.93 20,-19.88C60.64,10.35 69.77,19.87 69.35,30.28Z" />
</vector> </vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp" android:width="24dp"
android:height="24dp" android:height="24dp"
android:tint="@color/actionMenuColor"
android:viewportHeight="24.0" android:viewportHeight="24.0"
android:viewportWidth="24.0"> android:viewportWidth="24.0">
<path <path
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="832.000000dp" android:width="832.0dp"
android:height="220.000000dp" android:height="220.0dp"
android:viewportWidth="832.000000" android:viewportWidth="832.0"
android:viewportHeight="220.000000"> android:viewportHeight="220.0">
<group <group
android:translateY="220.000000" android:translateY="220"
android:scaleX="0.100000" android:scaleX="0.1"
android:scaleY="-0.100000"> android:scaleY="-0.1">
<path <path
android:fillColor="#04436A" android:fillColor="#04436A"
android:strokeWidth="1" android:strokeWidth="1"
......
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp" android:width="24dp"
android:height="24dp" android:height="24dp"
android:tint="#FFFFFF" android:autoMirrored="true"
android:viewportHeight="24.0" android:viewportHeight="24.0"
android:viewportWidth="24.0"> android:viewportWidth="24.0">
<path <path
android:fillColor="#FF000000" android:fillColor="#FFFFFFFF"
android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z" /> android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z" />
</vector> </vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="18dp"
android:viewportWidth="20"
android:viewportHeight="18">
<path
android:fillColor="#1D74F5"
android:fillType="nonZero"
android:pathData="M10,10m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0"
android:strokeWidth="1"
android:strokeColor="#00000000" />
<path
android:fillColor="#1D74F5"
android:fillType="nonZero"
android:pathData="M7,0L5.17,2L2,2C0.9,2 0,2.9 0,4L0,16C0,17.1 0.9,18 2,18L18,18C19.1,18 20,17.1 20,16L20,4C20,2.9 19.1,2 18,2L14.83,2L13,0L7,0ZM10,15C7.24,15 5,12.76 5,10C5,7.24 7.24,5 10,5C12.76,5 15,7.24 15,10C15,12.76 12.76,15 10,15Z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>
\ No newline at end of file
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF1D74F5"
android:pathData="M12,12m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0" />
<path
android:fillColor="#FF1D74F5"
android:pathData="M9,2L7.17,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2h-3.17L15,2L9,2zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z" />
</vector>
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
android:viewportWidth="17" android:viewportWidth="17"
android:viewportHeight="12"> android:viewportHeight="12">
<path <path
android:fillColor="#1D74F5" android:fillColor="#1D74F5"
android:fillType="nonZero" android:fillType="nonZero"
......
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp" android:width="24dp"
android:height="24dp" android:height="24dp"
android:tint="#1D74F5"
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24">
......
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp" android:width="24dp"
android:height="24dp" android:height="24dp"
android:tint="#999999"
android:viewportHeight="24.0" android:viewportHeight="24.0"
android:viewportWidth="24.0"> android:viewportWidth="24.0">
<path <path
......
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
android:height="16dp" android:height="16dp"
android:viewportWidth="16" android:viewportWidth="16"
android:viewportHeight="16"> android:viewportHeight="16">
<path <path
android:pathData="M3.7143,10.5714L3.7143,5.4286L0.8571,5.4286C0.3838,5.4286 0,5.0448 0,4.5714L0,4.5714C0,4.098 0.3838,3.7143 0.8571,3.7143L3.7143,3.7143L3.7143,0.8571C3.7143,0.3838 4.098,0 4.5714,0L4.5714,0C5.0448,0 5.4286,0.3838 5.4286,0.8571L5.4286,3.7143L10.5714,3.7143L10.5714,0.8571C10.5714,0.3838 10.9552,0 11.4286,0L11.4286,0C11.902,0 12.2857,0.3838 12.2857,0.8571L12.2857,3.7143L15.1429,3.7143C15.6162,3.7143 16,4.098 16,4.5714L16,4.5714C16,5.0448 15.6162,5.4286 15.1429,5.4286L12.2857,5.4286L12.2857,10.5714L15.1429,10.5714C15.6162,10.5714 16,10.9552 16,11.4286L16,11.4286C16,11.902 15.6162,12.2857 15.1429,12.2857L12.2857,12.2857L12.2857,15.1429C12.2857,15.6162 11.902,16 11.4286,16L11.4286,16C10.9552,16 10.5714,15.6162 10.5714,15.1429L10.5714,12.2857L5.4286,12.2857L5.4286,15.1429C5.4286,15.6162 5.0448,16 4.5714,16L4.5714,16C4.098,16 3.7143,15.6162 3.7143,15.1429L3.7143,12.2857L0.8571,12.2857C0.3838,12.2857 0,11.902 0,11.4286L0,11.4286C0,10.9552 0.3838,10.5714 0.8571,10.5714L3.7143,10.5714ZM5.4286,10.5714L10.5714,10.5714L10.5714,5.4286L5.4286,5.4286L5.4286,10.5714Z" android:pathData="M3.7143,10.5714L3.7143,5.4286L0.8571,5.4286C0.3838,5.4286 0,5.0448 0,4.5714L0,4.5714C0,4.098 0.3838,3.7143 0.8571,3.7143L3.7143,3.7143L3.7143,0.8571C3.7143,0.3838 4.098,0 4.5714,0L4.5714,0C5.0448,0 5.4286,0.3838 5.4286,0.8571L5.4286,3.7143L10.5714,3.7143L10.5714,0.8571C10.5714,0.3838 10.9552,0 11.4286,0L11.4286,0C11.902,0 12.2857,0.3838 12.2857,0.8571L12.2857,3.7143L15.1429,3.7143C15.6162,3.7143 16,4.098 16,4.5714L16,4.5714C16,5.0448 15.6162,5.4286 15.1429,5.4286L12.2857,5.4286L12.2857,10.5714L15.1429,10.5714C15.6162,10.5714 16,10.9552 16,11.4286L16,11.4286C16,11.902 15.6162,12.2857 15.1429,12.2857L12.2857,12.2857L12.2857,15.1429C12.2857,15.6162 11.902,16 11.4286,16L11.4286,16C10.9552,16 10.5714,15.6162 10.5714,15.1429L10.5714,12.2857L5.4286,12.2857L5.4286,15.1429C5.4286,15.6162 5.0448,16 4.5714,16L4.5714,16C4.098,16 3.7143,15.6162 3.7143,15.1429L3.7143,12.2857L0.8571,12.2857C0.3838,12.2857 0,11.902 0,11.4286L0,11.4286C0,10.9552 0.3838,10.5714 0.8571,10.5714L3.7143,10.5714ZM5.4286,10.5714L10.5714,10.5714L10.5714,5.4286L5.4286,5.4286L5.4286,10.5714Z"
android:strokeWidth="1" android:strokeWidth="1"
android:fillColor="#CBCBCC" android:fillColor="#CBCBCC"
android:fillType="nonZero" android:fillType="nonZero"
android:strokeColor="#00000000"/> android:strokeColor="#00000000" />
</vector> </vector>
...@@ -3,14 +3,14 @@ ...@@ -3,14 +3,14 @@
android:height="12dp" android:height="12dp"
android:viewportWidth="12" android:viewportWidth="12"
android:viewportHeight="12"> android:viewportHeight="12">
<path <path
android:pathData="M1.5,5.5h9v6h-9z" android:pathData="M1.5,5.5h9v6h-9z"
android:strokeWidth="1" android:strokeWidth="1"
android:strokeColor="#787878" android:strokeColor="#787878"
android:fillType="evenOdd"/> android:fillType="evenOdd" />
<path <path
android:pathData="M2.5,5.5L9.5,5.5L9.5,4C9.5,2.067 7.933,0.5 6,0.5C4.067,0.5 2.5,2.067 2.5,4L2.5,5.5Z" android:pathData="M2.5,5.5L9.5,5.5L9.5,4C9.5,2.067 7.933,0.5 6,0.5C4.067,0.5 2.5,2.067 2.5,4L2.5,5.5Z"
android:strokeWidth="1" android:strokeWidth="1"
android:strokeColor="#787878" android:strokeColor="#787878"
android:fillType="evenOdd"/> android:fillType="evenOdd" />
</vector> </vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp" android:width="24dp"
android:height="24dp" android:height="24dp"
android:autoMirrored="true"
android:viewportHeight="20.0" android:viewportHeight="20.0"
android:viewportWidth="22.0"> android:viewportWidth="22.0">
<path <path
android:fillColor="#FF1D74F5" android:fillColor="#FF1D74F5"
android:fillType="nonZero"
android:pathData="M0.869,1.32C0.731,0.987 0.79,0.565 1.045,0.276C1.281,0.01 1.634,-0.079 1.967,0.076L20.645,9.134C20.939,9.29 21.136,9.645 21.136,10C21.155,10.377 20.939,10.71 20.645,10.866L1.967,19.924C1.634,20.079 1.281,19.99 1.045,19.724C0.79,19.435 0.712,19.036 0.869,18.68L4.263,10L0.869,1.32ZM18.193,10L3.262,2.741L5.832,9.29L9.953,9.334C10.404,9.312 10.777,9.734 10.777,10.266C10.796,10.777 10.423,11.199 9.953,11.199L5.636,11.199L3.262,17.259L18.193,10Z" /> android:pathData="M0.869,1.32C0.731,0.987 0.79,0.565 1.045,0.276C1.281,0.01 1.634,-0.079 1.967,0.076L20.645,9.134C20.939,9.29 21.136,9.645 21.136,10C21.155,10.377 20.939,10.71 20.645,10.866L1.967,19.924C1.634,20.079 1.281,19.99 1.045,19.724C0.79,19.435 0.712,19.036 0.869,18.68L4.263,10L0.869,1.32ZM18.193,10L3.262,2.741L5.832,9.29L9.953,9.334C10.404,9.312 10.777,9.734 10.777,10.266C10.796,10.777 10.423,11.199 9.953,11.199L5.636,11.199L3.262,17.259L18.193,10Z" />
</vector> </vector>
\ No newline at end of file
...@@ -3,23 +3,23 @@ ...@@ -3,23 +3,23 @@
android:height="20dp" android:height="20dp"
android:viewportWidth="20" android:viewportWidth="20"
android:viewportHeight="20"> android:viewportHeight="20">
<path <path
android:pathData="M18.976,9.783C15.808,6.408 12.812,4.75 10,4.75c-2.812,0 -5.808,1.658 -8.976,5.033C4.28,13.166 7.278,14.829 10,14.829c2.722,0 5.72,-1.663 8.976,-5.046z" android:pathData="M18.976,9.783C15.808,6.408 12.812,4.75 10,4.75c-2.812,0 -5.808,1.658 -8.976,5.033C4.28,13.166 7.278,14.829 10,14.829c2.722,0 5.72,-1.663 8.976,-5.046z"
android:strokeWidth="1.5" android:strokeWidth="1.5"
android:fillColor="#00000000" android:fillColor="#00000000"
android:fillType="evenOdd" android:fillType="evenOdd"
android:strokeColor="#9EA2A8"/> android:strokeColor="#9EA2A8" />
<path <path
android:pathData="M7.965,11.783a2.75,2.75 0,0 0,3.915 -3.661l-3.915,3.66z" android:pathData="M7.965,11.783a2.75,2.75 0,0 0,3.915 -3.661l-3.915,3.66z"
android:strokeWidth="1.5" android:strokeWidth="1.5"
android:fillColor="#00000000" android:fillColor="#00000000"
android:fillType="evenOdd" android:fillType="evenOdd"
android:strokeColor="#9EA2A8"/> android:strokeColor="#9EA2A8" />
<path <path
android:pathData="M3.025,15.047L16.105,3.14" android:pathData="M3.025,15.047L16.105,3.14"
android:strokeWidth="1.5" android:strokeWidth="1.5"
android:fillColor="#00000000" android:fillColor="#00000000"
android:fillType="evenOdd" android:fillType="evenOdd"
android:strokeColor="#9EA2A8" android:strokeColor="#9EA2A8"
android:strokeLineCap="round"/> android:strokeLineCap="round" />
</vector> </vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="15dp" android:width="16dp"
android:height="16dp" android:height="16dp"
android:viewportWidth="15" android:viewportWidth="16"
android:viewportHeight="16"> android:viewportHeight="16">
<group android:translateX="1">
<path <path
android:fillColor="#CBCBCC" android:fillColor="#CBCBCC"
android:fillType="nonZero" android:fillType="nonZero"
android:pathData="M1.5248,13.3289C1.7124,13.3993 1.9453,13.471 2.2276,13.5407C3.3824,13.8259 5.0297,14 7.25,14C9.4703,14 11.1176,13.8259 12.2724,13.5407C12.5547,13.471 12.7876,13.3993 12.9752,13.3289C12.8483,12.2275 12.2304,11.6229 11.0233,11.1185C10.8562,11.0486 10.6821,10.9818 10.4514,10.8975C10.5051,10.9171 10.0041,10.7357 9.8749,10.6871C8.6886,10.2409 8.125,9.817 8.1271,8.9552C8.1257,8.9352 8.1257,8.9352 8.1232,8.8835C8.1089,8.5412 8.1341,8.1482 8.2352,7.7544C8.3357,7.3629 8.5018,7.0212 8.7796,6.7313C9.4429,6.0859 9.75,5.4186 9.75,4.4169C9.75,2.7871 8.6092,1.5 7.25,1.5C5.8908,1.5 4.75,2.7871 4.75,4.4169C4.75,5.4177 5.0499,6.0675 5.7166,6.7436C5.9791,7.0111 6.1513,7.3472 6.2566,7.7298C6.3671,8.1314 6.3941,8.5324 6.3773,8.8838C6.3741,8.9408 6.3741,8.9408 6.375,8.8986C6.375,9.817 5.8114,10.2409 4.6251,10.6871C4.4959,10.7357 3.9949,10.9171 4.0486,10.8975C3.8179,10.9818 3.6438,11.0486 3.4767,11.1185C2.2696,11.6229 1.6517,12.2275 1.5248,13.3289ZM0,13.7878C0,11.6909 1.029,10.5156 2.8983,9.7344C3.0901,9.6543 3.2836,9.58 3.5339,9.4886C3.4888,9.505 3.978,9.3279 4.0971,9.2831C4.7164,9.0502 4.875,8.9309 4.8778,8.834C4.8775,8.8383 4.8775,8.8383 4.879,8.8121C4.8889,8.6053 4.8718,8.351 4.8104,8.1279C4.7676,7.9725 4.7093,7.8588 4.6472,7.7955C3.7195,6.8547 3.25,5.8375 3.25,4.4169C3.25,1.9963 5.0194,0 7.25,0C9.4806,0 11.25,1.9963 11.25,4.4169C11.25,5.8419 10.7679,6.8896 9.8447,7.7872C9.7867,7.8479 9.7298,7.9649 9.6881,8.1274C9.6297,8.3548 9.6132,8.6125 9.6219,8.8209C9.6231,8.8456 9.6231,8.8456 9.625,8.8986C9.625,8.9309 9.7836,9.0502 10.4029,9.2831C10.522,9.3279 11.0112,9.505 10.9661,9.4886C11.2164,9.58 11.4099,9.6543 11.6017,9.7344C13.471,10.5156 14.5,11.6909 14.5,13.7878L14.5,14.1647L14.1975,14.3896C13.9508,14.573 13.4546,14.7939 12.6319,14.997C11.351,15.3133 9.5847,15.5 7.25,15.5C4.9153,15.5 3.149,15.3133 1.8681,14.997C1.0454,14.7939 0.5492,14.573 0.3025,14.3896L0,14.1647L0,13.7878Z" android:pathData="M1.5248,13.3289C1.7124,13.3993 1.9453,13.471 2.2276,13.5407C3.3824,13.8259 5.0297,14 7.25,14C9.4703,14 11.1176,13.8259 12.2724,13.5407C12.5547,13.471 12.7876,13.3993 12.9752,13.3289C12.8483,12.2275 12.2304,11.6229 11.0233,11.1185C10.8562,11.0486 10.6821,10.9818 10.4514,10.8975C10.5051,10.9171 10.0041,10.7357 9.8749,10.6871C8.6886,10.2409 8.125,9.817 8.1271,8.9552C8.1257,8.9352 8.1257,8.9352 8.1232,8.8835C8.1089,8.5412 8.1341,8.1482 8.2352,7.7544C8.3357,7.3629 8.5018,7.0212 8.7796,6.7313C9.4429,6.0859 9.75,5.4186 9.75,4.4169C9.75,2.7871 8.6092,1.5 7.25,1.5C5.8908,1.5 4.75,2.7871 4.75,4.4169C4.75,5.4177 5.0499,6.0675 5.7166,6.7436C5.9791,7.0111 6.1513,7.3472 6.2566,7.7298C6.3671,8.1314 6.3941,8.5324 6.3773,8.8838C6.3741,8.9408 6.3741,8.9408 6.375,8.8986C6.375,9.817 5.8114,10.2409 4.6251,10.6871C4.4959,10.7357 3.9949,10.9171 4.0486,10.8975C3.8179,10.9818 3.6438,11.0486 3.4767,11.1185C2.2696,11.6229 1.6517,12.2275 1.5248,13.3289ZM0,13.7878C0,11.6909 1.029,10.5156 2.8983,9.7344C3.0901,9.6543 3.2836,9.58 3.5339,9.4886C3.4888,9.505 3.978,9.3279 4.0971,9.2831C4.7164,9.0502 4.875,8.9309 4.8778,8.834C4.8775,8.8383 4.8775,8.8383 4.879,8.8121C4.8889,8.6053 4.8718,8.351 4.8104,8.1279C4.7676,7.9725 4.7093,7.8588 4.6472,7.7955C3.7195,6.8547 3.25,5.8375 3.25,4.4169C3.25,1.9963 5.0194,0 7.25,0C9.4806,0 11.25,1.9963 11.25,4.4169C11.25,5.8419 10.7679,6.8896 9.8447,7.7872C9.7867,7.8479 9.7298,7.9649 9.6881,8.1274C9.6297,8.3548 9.6132,8.6125 9.6219,8.8209C9.6231,8.8456 9.6231,8.8456 9.625,8.8986C9.625,8.9309 9.7836,9.0502 10.4029,9.2831C10.522,9.3279 11.0112,9.505 10.9661,9.4886C11.2164,9.58 11.4099,9.6543 11.6017,9.7344C13.471,10.5156 14.5,11.6909 14.5,13.7878L14.5,14.1647L14.1975,14.3896C13.9508,14.573 13.4546,14.7939 12.6319,14.997C11.351,15.3133 9.5847,15.5 7.25,15.5C4.9153,15.5 3.149,15.3133 1.8681,14.997C1.0454,14.7939 0.5492,14.573 0.3025,14.3896L0,14.1647L0,13.7878Z"
android:strokeWidth="1" android:strokeWidth="1"
android:strokeColor="#00000000" /> android:strokeColor="#00000000" />
</group>
</vector> </vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="80dp" android:width="80dp"
android:height="45dp" android:height="45dp"
android:viewportWidth="80.0" android:viewportWidth="80.0"
android:viewportHeight="45.0"> android:viewportHeight="45.0">
<path <path
android:pathData="M0,0h80v45h-80z" android:pathData="M0,0h80v45h-80z"
android:strokeColor="#00000000" android:strokeColor="#00000000"
android:fillColor="#C3D1DA" android:fillColor="#C3D1DA"
android:strokeWidth="1"/> android:strokeWidth="1" />
<path <path
android:pathData="M43.99,16.75C44.34,16.75 44.64,16.87 44.88,17.12C45.13,17.36 45.25,17.66 45.25,18.01L45.25,26.74C45.25,27.09 45.13,27.39 44.88,27.63C44.64,27.88 44.34,28 43.99,28L35.26,28C34.91,28 34.61,27.88 34.37,27.63C34.12,27.39 34,27.09 34,26.74L34,18.01C34,17.66 34.12,17.36 34.37,17.12C34.61,16.87 34.91,16.75 35.26,16.75L43.99,16.75ZM43.99,26.74L43.99,18.01L35.26,18.01L35.26,26.74L43.99,26.74ZM40.86,22.55L43.05,25.51L36.2,25.51L37.9,23.28L39.13,24.78L40.86,22.55Z" android:pathData="M43.99,16.75C44.34,16.75 44.64,16.87 44.88,17.12C45.13,17.36 45.25,17.66 45.25,18.01L45.25,26.74C45.25,27.09 45.13,27.39 44.88,27.63C44.64,27.88 44.34,28 43.99,28L35.26,28C34.91,28 34.61,27.88 34.37,27.63C34.12,27.39 34,27.09 34,26.74L34,18.01C34,17.66 34.12,17.36 34.37,17.12C34.61,16.87 34.91,16.75 35.26,16.75L43.99,16.75ZM43.99,26.74L43.99,18.01L35.26,18.01L35.26,26.74L43.99,26.74ZM40.86,22.55L43.05,25.51L36.2,25.51L37.9,23.28L39.13,24.78L40.86,22.55Z"
android:strokeColor="#00000000" android:strokeColor="#00000000"
android:fillColor="#5D8298" android:fillColor="#5D8298"
android:strokeWidth="1"/> android:strokeWidth="1" />
</vector> </vector>
...@@ -6,5 +6,7 @@ ...@@ -6,5 +6,7 @@
<corners android:radius="4dp" /> <corners android:radius="4dp" />
<stroke android:color="#1D74F5" android:width="2dp" /> <stroke
android:width="2dp"
android:color="#1D74F5" />
</shape> </shape>
\ No newline at end of file
<shape xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"> android:shape="oval">
<solid android:color="@color/colorAccent" /> <solid android:color="@color/colorAccent" />
<size <size
android:width="24dp" android:width="24dp"
android:height="24dp" /> android:height="24dp" />
</shape> </shape>
\ No newline at end of file
...@@ -15,9 +15,11 @@ ...@@ -15,9 +15,11 @@
app:navigationIcon="?android:attr/homeAsUpIndicator" app:navigationIcon="?android:attr/homeAsUpIndicator"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ActionModeStyle"> app:theme="@style/ActionModeStyle">
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<TextView <TextView
android:id="@+id/text_change_password" android:id="@+id/text_change_password"
android:layout_width="wrap_content" android:layout_width="wrap_content"
......
...@@ -83,11 +83,11 @@ ...@@ -83,11 +83,11 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/view_divider_two" /> app:layout_constraintTop_toBottomOf="@+id/view_divider_two" />
<Switch <Switch
android:id="@+id/switch_global_users" android:id="@+id/switch_global_users"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:checked="false" android:checked="false"
app:layout_constraintBottom_toBottomOf="@+id/text_search_for_global_users" app:layout_constraintBottom_toBottomOf="@+id/text_search_for_global_users"
...@@ -108,5 +108,4 @@ ...@@ -108,5 +108,4 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_search_for_global_users" /> app:layout_constraintTop_toBottomOf="@+id/text_search_for_global_users" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<!--<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"-->
<!--xmlns:app="http://schemas.android.com/apk/res-auto"-->
<!--xmlns:tools="http://schemas.android.com/tools"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="wrap_content"-->
<!--android:fillViewport="true">-->
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="16dp">
<!--<com.google.android.material.appbar.AppBarLayout-->
<!--android:id="@+id/appBarLayout"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="wrap_content"-->
<!--android:background="@color/colorPrimary"-->
<!--android:theme="@style/Theme.AppCompat.Light.NoActionBar">-->
<!--<androidx.appcompat.widget.Toolbar-->
<!--android:id="@+id/toolbar"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="?attr/actionBarSize"-->
<!--app:layout_scrollFlags="scroll|enterAlways"-->
<!--app:navigationIcon="?android:attr/homeAsUpIndicator"-->
<!--app:popupTheme="@style/ThemeOverlay.AppCompat.Light"-->
<!--app:theme="@style/ActionModeStyle">-->
<!--<RelativeLayout-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="wrap_content">-->
<!--<TextView-->
<!--android:id="@+id/text_change_password"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="wrap_content"-->
<!--android:layout_alignParentStart="true"-->
<!--android:ellipsize="end"-->
<!--android:maxLines="1"-->
<!--android:text="@string/action_msg_report"-->
<!--android:textColor="@color/colorWhite"-->
<!--android:textSize="18sp"-->
<!--android:textStyle="bold" />-->
<!--</RelativeLayout>-->
<!--</androidx.appcompat.widget.Toolbar>-->
<!--</com.google.android.material.appbar.AppBarLayout>-->
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="24dp" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline_end"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_end="24dp" />
<!--<TextView-->
<!--android:id="@+id/text_view_report_label"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="wrap_content"-->
<!--android:text="Description"-->
<!--android:textColor="@color/darkGray"-->
<!--app:layout_constraintStart_toStartOf="@+id/guideline_start"-->
<!--app:layout_constraintTop_toTopOf="parent" />-->
<!--<TextView-->
<!--android:id="@+id/text_view_required"-->
<!--android:layout_width="0dp"-->
<!--android:layout_height="wrap_content"-->
<!--android:layout_marginStart="8dp"-->
<!--android:text="(required)"-->
<!--android:textColor="@color/darkGray"-->
<!--android:textSize="14sp"-->
<!--app:layout_constraintEnd_toEndOf="@+id/guideline_end"-->
<!--app:layout_constraintStart_toEndOf="@id/text_view_report_label"-->
<!--app:layout_constraintTop_toTopOf="parent" />-->
<EditText
android:id="@+id/edit_text_description"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:inputType="textCapSentences|textMultiLine"
android:maxLines="4"
android:overScrollMode="always"
android:scrollbarStyle="insideInset"
android:scrollbars="vertical"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="@+id/guideline_end"
app:layout_constraintStart_toStartOf="@+id/guideline_start"
app:layout_constraintTop_toTopOf="parent"
tools:text="Jot something untoward..." />
<TextView
android:id="@+id/text_view_error"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/required"
android:textColor="@color/colorRed"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="@+id/guideline_end"
app:layout_constraintStart_toStartOf="@+id/guideline_start"
app:layout_constraintTop_toBottomOf="@+id/edit_text_description"
tools:visibility="visible" />
<android.widget.Button
android:id="@+id/button_send_report"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:background="@drawable/rounded_color_accent"
android:fontFamily="sans-serif-medium"
android:text="@string/submit"
android:textColor="@android:color/white"
app:layout_constraintEnd_toEndOf="@+id/guideline_end"
app:layout_constraintStart_toStartOf="@+id/guideline_start"
app:layout_constraintTop_toBottomOf="@id/text_view_error" />1
</androidx.constraintlayout.widget.ConstraintLayout>
<!--</androidx.core.widget.NestedScrollView>-->
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/emoji_image_view"
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="48dp" android:layout_height="48dp"
android:layout_gravity="center"> android:layout_gravity="center"
android:padding="8dp"
<ImageView tools:src="@tools:sample/avatars" />
android:id="@+id/emoji_image_view" \ No newline at end of file
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_gravity="center"
tools:src="@tools:sample/avatars" />
</FrameLayout>
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
android:id="@+id/text_on_boarding_title" android:id="@+id/text_on_boarding_title"
style="@style/Authentication.TextView.Headline" style="@style/Authentication.TextView.Headline"
android:layout_marginTop="32dp" android:layout_marginTop="32dp"
android:gravity="center"
android:text="@string/msg_welcome_to_rocket_chat" android:text="@string/msg_welcome_to_rocket_chat"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
...@@ -33,6 +34,7 @@ ...@@ -33,6 +34,7 @@
<TextView <TextView
android:id="@+id/text_on_boarding_description" android:id="@+id/text_on_boarding_description"
style="@style/Authentication.TextView.Description" style="@style/Authentication.TextView.Description"
android:gravity="center"
android:text="@string/msg_team_communication" android:text="@string/msg_team_communication"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
...@@ -41,7 +43,7 @@ ...@@ -41,7 +43,7 @@
<RelativeLayout <RelativeLayout
android:id="@+id/connect_with_a_server_container" android:id="@+id/connect_with_a_server_container"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="60dp" android:layout_height="60sp"
android:layout_marginTop="32dp" android:layout_marginTop="32dp"
android:background="@drawable/rounded_border" android:background="@drawable/rounded_border"
android:foreground="?selectableItemBackground" android:foreground="?selectableItemBackground"
...@@ -84,7 +86,7 @@ ...@@ -84,7 +86,7 @@
<RelativeLayout <RelativeLayout
android:id="@+id/join_community_container" android:id="@+id/join_community_container"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="60dp" android:layout_height="60sp"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:background="@drawable/rounded_border" android:background="@drawable/rounded_border"
android:foreground="?selectableItemBackground" android:foreground="?selectableItemBackground"
...@@ -136,7 +138,7 @@ ...@@ -136,7 +138,7 @@
<RelativeLayout <RelativeLayout
android:id="@+id/create_server_container" android:id="@+id/create_server_container"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="60dp" android:layout_height="60sp"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:background="@drawable/rounded_color_accent" android:background="@drawable/rounded_color_accent"
android:foreground="?selectableItemBackground" android:foreground="?selectableItemBackground"
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
android:id="@+id/text_sign_in_to_your_server" android:id="@+id/text_sign_in_to_your_server"
style="@style/Authentication.TextView.Headline" style="@style/Authentication.TextView.Headline"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:gravity="center"
android:text="@string/title_sign_in_your_server" android:text="@string/title_sign_in_your_server"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
......
...@@ -21,7 +21,9 @@ ...@@ -21,7 +21,9 @@
style="@style/ChatDetails.Title.TextView" style="@style/ChatDetails.Title.TextView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
tools:text="#important" /> android:drawableStart="@drawable/ic_hashtag_black_12dp"
android:drawablePadding="@dimen/text_view_drawable_padding"
tools:text="important" />
<TextView <TextView
android:id="@+id/title_description" android:id="@+id/title_description"
......
...@@ -69,7 +69,7 @@ ...@@ -69,7 +69,7 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/image_avatar" app:layout_constraintStart_toEndOf="@+id/image_avatar"
app:layout_constraintTop_toBottomOf="@+id/text_display_name" app:layout_constraintTop_toBottomOf="@+id/text_display_name"
tools:text="visible" /> tools:text="online" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<TextView <TextView
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
tools:text="This is a multiline chat message from Bertie that will take more than just one line of text. I have sure that everything is amazing!" /> tools:text="This is a multiline chat message from Bertie that will take more than just one line of text. I have made sure that everything is amazing!" />
<View <View
android:id="@+id/quote_bar" android:id="@+id/quote_bar"
......
...@@ -62,16 +62,16 @@ ...@@ -62,16 +62,16 @@
android:layout_marginEnd="12dp" android:layout_marginEnd="12dp"
android:textDirection="locale" android:textDirection="locale"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/layout_unread_messages_badge" app:layout_constraintEnd_toStartOf="@+id/text_total_unread_messages"
app:layout_constraintStart_toStartOf="@+id/image_chat_icon" app:layout_constraintStart_toStartOf="@+id/image_chat_icon"
app:layout_constraintTop_toBottomOf="@+id/text_chat_name" app:layout_constraintTop_toBottomOf="@+id/text_chat_name"
tools:text="Filipe de Lima Brito: Type something that is very long and need at least two lines, or maybe even more" /> tools:text="Filipe de Lima Brito: Type something that is very long and need at least two lines, or maybe even more" />
<include <include
android:id="@+id/layout_unread_messages_badge" android:id="@+id/text_total_unread_messages"
layout="@layout/unread_messages_badge" layout="@layout/unread_messages_badge"
android:layout_width="21dp" android:layout_width="21sp"
android:layout_height="21dp" android:layout_height="21sp"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/text_last_message" /> app:layout_constraintTop_toTopOf="@+id/text_last_message" />
......
...@@ -156,7 +156,7 @@ ...@@ -156,7 +156,7 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/message_header" app:layout_constraintStart_toStartOf="@+id/message_header"
app:layout_constraintTop_toBottomOf="@+id/message_header" app:layout_constraintTop_toBottomOf="@+id/message_header"
tools:text="This is a multiline chat message from Bertie that will take more than just one line of text. I have sure that everything is amazing!" /> tools:text="This is a multiline chat message from Bertie that will take more than just one line of text. I have made sure that everything is amazing!" />
<Button <Button
android:id="@+id/button_join_video_call" android:id="@+id/button_join_video_call"
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:drawablePadding="20dp" android:drawablePadding="20dp"
android:drawableStart="@drawable/ic_camera" android:drawableStart="@drawable/ic_camera_24dp"
android:gravity="start|center" android:gravity="start|center"
android:text="@string/action_take_a_photo" /> android:text="@string/action_take_a_photo" />
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" style="@style/ChatList.Badge.TextView"
android:layout_height="match_parent"> android:layout_width="21sp"
android:layout_height="21sp"
<TextView android:background="@drawable/style_total_unread_messages"
android:id="@+id/text_total_unread_messages" android:visibility="gone"
style="@style/ChatList.Badge.TextView" tools:text="1"
android:layout_width="21dp" tools:visibility="visible" />
android:layout_height="21dp" \ No newline at end of file
android:background="@drawable/style_total_unread_messages"
android:visibility="gone"
tools:text="1"
tools:visibility="visible" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<!-- Titles --> <!-- Titles -->
...@@ -21,7 +20,7 @@ ...@@ -21,7 +20,7 @@
<string name="title_password">تغيير كلمة السر</string> <string name="title_password">تغيير كلمة السر</string>
<string name="title_update_profile">تحديث الملف الشخصي</string> <string name="title_update_profile">تحديث الملف الشخصي</string>
<string name="title_create_channel">إنشاء قناة</string> <string name="title_create_channel">إنشاء قناة</string>
<string name="title_choose_language">Choose Language</string> <!-- TODO Add translation --> <string name="title_choose_language">اختر اللغة</string>
<string name="title_license">الترخيص</string> <string name="title_license">الترخيص</string>
<string name="title_are_you_sure">هل أنت متأكد؟</string> <string name="title_are_you_sure">هل أنت متأكد؟</string>
<string name="title_channel_details">تفاصيل القناة</string> <string name="title_channel_details">تفاصيل القناة</string>
...@@ -34,7 +33,7 @@ ...@@ -34,7 +33,7 @@
<string name="action_use_this_username">استخدم هذا الاسم</string> <string name="action_use_this_username">استخدم هذا الاسم</string>
<string name="action_terms_of_service">شروط الخدمة</string> <string name="action_terms_of_service">شروط الخدمة</string>
<string name="action_privacy_policy">شروط الخدمة</string> <string name="action_privacy_policy">شروط الخدمة</string>
<string name="action_new_channel">New channel</string> <!-- TODO Translate --> <string name="action_new_channel">قناة جديدة</string>
<string name="action_search">بحث</string> <string name="action_search">بحث</string>
<string name="action_update">تحديث</string> <string name="action_update">تحديث</string>
<string name="action_settings">الإعدادات</string> <string name="action_settings">الإعدادات</string>
...@@ -58,44 +57,47 @@ ...@@ -58,44 +57,47 @@
<string name="action_create_server">إنشاء خادم جديد</string> <string name="action_create_server">إنشاء خادم جديد</string>
<string name="action_register">تسجيل</string> <string name="action_register">تسجيل</string>
<string name="action_confirm">تأكيد</string> <string name="action_confirm">تأكيد</string>
<string name="action_favorite">Favorite</string> <!-- TODO Translate --> <string name="action_favorite">تفضيل</string>
<string name="action_remove_favorite">Remove favorite</string> <!-- TODO Translate --> <string name="action_remove_favorite">إزالة التفضيل</string>
<!-- Settings messages --> <!-- Settings messages -->
<string name="msg_contact_us">Contact us</string> <!-- TODO Translate --> <string name="msg_contact_us">اتصل بنا</string>
<string name="msg_language">Language</string> <!-- TODO Translate --> <string name="msg_language">تغيير اللغة</string>
<string name="msg_review_this_app">Review this app</string> <!-- TODO Translate --> <string name="msg_review_this_app">قيم هذا التطبيق</string>
<string name="msg_share_this_app">Share this app</string> <!-- TODO Translate --> <string name="msg_share_this_app">شارك هذا التطبيق</string>
<string name="msg_administration">Administration</string> <!-- TODO Translate --> <string name="msg_administration">الادارة</string>
<string name="msg_license">License</string> <!-- TODO Translate --> <string name="msg_license">الرخصة</string>
<string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate --> <string name="msg_app_version">الإصدار: %1$s (%2$d)</string>
<string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate --> <string name="msg_server_version">إصدار الخادم: %1$s</string>
<string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate --> <string name="msg_send_analytics">إرسال التحليلات</string>
<string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate --> <string name="msg_send_analytics_tracking">إرسال تحليلات لمساعدة تطوير البرنامج</string>
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate --> <string name="msg_do_not_send_analytics_tracking">لا يتم إرسال تحليلات لمساعدة تطوير البرنامج</string>
<string name="msg_change_status">Change status</string> <!-- TODO Translate --> <string name="msg_not_applicable_since_it_is_a_foss_version">لا يمكن لأنه إصدار FOSS</string>
<string name="msg_logout_from_rocket_chat">تسجيل الخروج من Rocket.Chat</string>
<string name="msg_delete_account">حذف الحساب</string>
<string name="msg_change_status">تغيير الوضع</string>
<string-array name="languages"> <!-- TODO Add translations --> <string-array name="languages">
<item>English</item> <item>الإنجليزية</item>
<item>Arabic</item> <item>العربية</item>
<item>German</item> <item>الألمانية</item>
<item>Spanish</item> <item>الأسبانية</item>
<item>Persian</item> <item>الفارسية</item>
<item>French</item> <item>الفرنسية</item>
<item>Hindi (IN)</item> <item>الهندية (IN)</item>
<item>Italian</item> <item>الإيطالية</item>
<item>Japanese</item> <item>اليابانية</item>
<item>Portuguese (BR)</item> <item>البرتغالية (BR)</item>
<item>Portuguese (PT)</item> <item>البرتغالية (PT)</item>
<item>Russian (RU)</item> <item>الروسية (RU)</item>
<item>Turkish</item> <item>التركية</item>
<item>Ukrainian</item> <item>الأوكرانية</item>
<item>Chinese (CN)</item> <item>الصينية (CN)</item>
<item>Chinese (TW)</item> <item>الصينية (TW)</item>
</string-array> </string-array>
<!-- Regular information messages --> <!-- Regular information messages -->
<string name="msg_generic_error">نأسف حدث خطأ ما حاول مرة أخرى</string> <string name="msg_generic_error">نأسف حدث خطأ ما، حاول مرة أخرى</string>
<string name="msg_no_data_to_display">لا يوجد بيانات للعرض</string> <string name="msg_no_data_to_display">لا يوجد بيانات للعرض</string>
<string name="msg_check_this_out">تحقق من هذا</string> <string name="msg_check_this_out">تحقق من هذا</string>
<string name="msg_share_using">نشر بواسطة</string> <string name="msg_share_using">نشر بواسطة</string>
...@@ -112,14 +114,14 @@ ...@@ -112,14 +114,14 @@
<string name="msg_reset">إعادة تعيين</string> <string name="msg_reset">إعادة تعيين</string>
<string name="msg_check_your_email_to_reset_your_password">تم إرسال الإيميل راجع إيميلك لتحديث كلمة السر</string> <string name="msg_check_your_email_to_reset_your_password">تم إرسال الإيميل راجع إيميلك لتحديث كلمة السر</string>
<string name="msg_invalid_email">من فضلك أدخل عنوان بريد صحيح</string> <string name="msg_invalid_email">من فضلك أدخل عنوان بريد صحيح</string>
<string name="msg_new_user_agreement">بالاستمرار أنت توافق على \n%1$s و %2$s</string> <string name="msg_new_user_agreement">بالاستمرار أنت توافق على\n%1$s و %2$s</string>
<string name="msg_yesterday">أمس</string> <string name="msg_yesterday">أمس</string>
<string name="msg_today">اليوم</string> <string name="msg_today">اليوم</string>
<string name="msg_message">رسالة</string> <string name="msg_message">رسالة</string>
<string name="msg_video_call">Video call</string> <!-- TODO Translate --> <string name="msg_video_call">مكالمة فيديو</string>
<string name="msg_join_video_call">Join video call</string> <!-- TODO Translate --> <string name="msg_join_video_call">انضم إلى مكالمة الفيديو</string>
<string name="msg_this_room_is_read_only">هذه الغرفة للقراءة فقك</string> <string name="msg_this_room_is_read_only">هذه الغرفة للقراءة فقط</string>
<string name="msg_invalid_2fa_code">Invalid 2FA Code</string> <string name="msg_invalid_2fa_code">رمز 2FA غير صالح</string>
<string name="msg_invalid_file">ملف غير صالح</string> <string name="msg_invalid_file">ملف غير صالح</string>
<string name="msg_invalid_server_url">رابط خادم غير صحيح</string> <string name="msg_invalid_server_url">رابط خادم غير صحيح</string>
<string name="msg_content_description_log_in_using_facebook">تسجيل باستخدام فيسبوك</string> <string name="msg_content_description_log_in_using_facebook">تسجيل باستخدام فيسبوك</string>
...@@ -136,12 +138,12 @@ ...@@ -136,12 +138,12 @@
<string name="msg_you">أنت</string> <string name="msg_you">أنت</string>
<string name="msg_unknown">غير معرف</string> <string name="msg_unknown">غير معرف</string>
<string name="msg_email_address">عنوان بريد</string> <string name="msg_email_address">عنوان بريد</string>
<string name="msg_utc_offset">UTC offset</string> <string name="msg_utc_offset">التقديم عن UTC</string>
<string name="msg_new_password">إدخال كلمة سر جديدة</string> <string name="msg_new_password">إدخال كلمة سر جديدة</string>
<string name="msg_confirm_password">تأكيد كلمة السر</string> <string name="msg_confirm_password">تأكيد كلمة السر</string>
<string name="msg_channel_name">تغيير الاسم</string> <string name="msg_channel_name">اسم القناة</string>
<string name="msg_search">بحث</string> <string name="msg_search">بحث</string>
<string name="msg_unread_messages">لرسالة غير مقروءة</string> <string name="msg_unread_messages">رسائل غير مقروءة</string>
<string name="msg_preview_video">فيديو</string> <string name="msg_preview_video">فيديو</string>
<string name="msg_preview_audio">صوت</string> <string name="msg_preview_audio">صوت</string>
<string name="msg_preview_photo">صورة</string> <string name="msg_preview_photo">صورة</string>
...@@ -153,9 +155,9 @@ ...@@ -153,9 +155,9 @@
<string name="msg_ver_not_minimum">يبدو أن خادمك قديم %1$s من فضلك حدث الخادم للاستمرار</string> <string name="msg_ver_not_minimum">يبدو أن خادمك قديم %1$s من فضلك حدث الخادم للاستمرار</string>
<string name="msg_no_chat_title">لا توجد رسائل</string> <string name="msg_no_chat_title">لا توجد رسائل</string>
<string name="msg_no_chat_description">إبدأ المحادثة لترى الرسائل هنا</string> <string name="msg_no_chat_description">إبدأ المحادثة لترى الرسائل هنا</string>
<string name="msg_http_insecure">أنت تستخدم HTTP وهو غير آمن ونحن لا نحبذ ذلك.</string> <string name="msg_http_insecure">أنت تستخدم HTTP وهو غير آمن ونحن لا نحبذ ذلك.</string>
<string name="msg_error_checking_server_version">حدذ خطأ عند محاولة الوصول نسخة خادمك حاول مرة أخرى</string> <string name="msg_error_checking_server_version">حدث خطأ أثناء التحقق من إصدار الخادم الخاص بك، حاول مرة أخرى</string>
<string name="msg_invalid_server_protocol">النظام المستخدم غير مقبول حاول ب HTTPS</string> <string name="msg_invalid_server_protocol">النظام المستخدم غير مقبول، حاول ب HTTPS</string>
<string name="msg_image_saved_successfully">تم حفظ الصورة في المعرض</string> <string name="msg_image_saved_successfully">تم حفظ الصورة في المعرض</string>
<string name="msg_image_saved_failed">لم يتم حفظ الصورة</string> <string name="msg_image_saved_failed">لم يتم حفظ الصورة</string>
<string name="msg_edited">(معدلة)</string> <string name="msg_edited">(معدلة)</string>
...@@ -186,29 +188,29 @@ ...@@ -186,29 +188,29 @@
<string name="msg_no_announcement">لا يوجد ملف مضاف</string> <string name="msg_no_announcement">لا يوجد ملف مضاف</string>
<string name="msg_no_description">لا يوجد وصف مضاف</string> <string name="msg_no_description">لا يوجد وصف مضاف</string>
<string name="msg_send_email">أرسال بريد</string> <string name="msg_send_email">أرسال بريد</string>
<string name="msg_android_app_support">خدمة البرنامج </string> <string name="msg_android_app_support">خدمة البرنامج</string>
<string name="msg_unable_to_update_password">لا يمكن تحديث كلمة السر خطأ: %1$s</string> <string name="msg_unable_to_update_password">لا يمكن تحديث كلمة السر خطأ: %1$s</string>
<string name="msg_password_updated_successfully">تم تحديث كلمة السر</string> <string name="msg_password_updated_successfully">تم تحديث كلمة السر</string>
<plurals name="msg_reacted_with_"> <plurals name="msg_reacted_with_">
<item quantity="one">%1$s reacted with %2$s</item> <item quantity="one">%1$s تفاعل ب %2$s</item>
<item quantity="other">%1$s reacted with %2$s</item> <item quantity="other">%1$s تفاعل ب %2$s</item>
<item quantity="many">%1$s reacted with %2$s</item> <item quantity="many">%1$s تفاعلوا ب %2$s</item>
<item quantity="zero">%1$s reacted with %2$s</item> <item quantity="zero">%1$s تفاعل ب %2$s</item>
<item quantity="few">%1$s reacted with %2$s</item> <item quantity="few">%1$s تفاعلوا ب %2$s</item>
<item quantity="two">%1$s reacted with %2$s</item> <item quantity="two">%1$s تفاعلا ب %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Credentials saved successfully</string> <!-- TODO Translate --> <string name="msg_credentials_saved_successfully">تم حفظ البيانات بنجاح</string>
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation --> <string name="msg_camera_permission_denied">هناك حاجة إلى إذن الكاميرا لفتحها.</string>
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation --> <string name="msg_storage_permission_denied">هناك حاجة إلى إذن التخزين لفتح الرسم.</string>
<string name="msg_server">Server</string> <!-- TODO Translate --> <string name="msg_server">الخادم</string>
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate --> <string name="msg_add_new_server">إضافة خادم جديد</string>
<string name="msg_directory">Directory</string> <!-- TODO Translate --> <string name="msg_directory">الدليل</string>
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">خاص</string> <string name="msg_private_channel">خاص</string>
<string name="msg_public_channel">عام</string> <string name="msg_public_channel">عام</string>
<string name="msg_private_channel_description">أنت فقط والأشخاص المدعوون يمكنكم دخزل هذه القناة</string> <string name="msg_private_channel_description">أنت والأشخاص المدعوون فقط يمكنكم دخول هذه القناة</string>
<string name="msg_public_channel_description">الجميع يمكنه دخول هذه المجموعة</string> <string name="msg_public_channel_description">يمكن للجميع دخول هذه القناة</string>
<string name="msg_ready_only_channel">قناة للقراءة فقط</string> <string name="msg_ready_only_channel">قناة للقراءة فقط</string>
<string name="msg_ready_only_channel_description">المدير فقط يمكنه الكتابة</string> <string name="msg_ready_only_channel_description">المدير فقط يمكنه الكتابة</string>
<string name="msg_invite_members">دعوة عضو للقناة</string> <string name="msg_invite_members">دعوة عضو للقناة</string>
...@@ -222,42 +224,36 @@ ...@@ -222,42 +224,36 @@
<string name="msg_view_less">رؤية أقل</string> <string name="msg_view_less">رؤية أقل</string>
<string name="msg_muted_on_this_channel">لقد جعلت هذه القناة صامتة</string> <string name="msg_muted_on_this_channel">لقد جعلت هذه القناة صامتة</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">تتبع التحليلات</string>
<string name="msg_send_analytics_tracking">إرسال تحليل لمساعدة تطوير البرنامج</string>
<string name="msg_do_not_send_analytics_tracking">لا يتم إرسال تحليل لمساعدة تطوير البرنامج</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">لا يمكن لأنه إصدار FOSS</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">تم تغيير اسم الغرفة ل: %1$s بواسطة %2$s</string> <string name="message_room_name_changed">تم تغيير اسم الغرفة ل: %1$s بواسطة %2$s</string>
<string name="message_user_added_by">المستخدم %1$s أضيف بواسطة %2$s</string> <string name="message_user_added_by">المستخدم %1$s أضيف بواسطة %2$s</string>
<string name="message_user_removed_by">المستخدم %1$s حذف بواسطة %2$s</string> <string name="message_user_removed_by">المستخدم %1$s حذف بواسطة %2$s</string>
<string name="message_user_left">غادر القناة.</string> <string name="message_user_left">غادر القناة.</string>
<string name="message_user_joined_channel">إنضم للقناة</string> <string name="message_user_joined_channel">انضم للقناة</string>
<string name="message_welcome">أهلا %s</string> <string name="message_welcome">أهلا %s</string>
<string name="message_removed">تم حذف الرسالة</string> <string name="message_removed">تم حذف الرسالة</string>
<string name="message_pinned">تمميز رسالة:</string> <string name="message_pinned">تعلق رسالة:</string>
<string name="message_muted">المسخدم %1$s صامت بواسطة %2$s</string> <string name="message_muted">المسخدم %1$s صامت بواسطة %2$s</string>
<string name="message_unmuted">المستخدم %1$s غير صامت بواسطة %2$s</string> <string name="message_unmuted">المستخدم %1$s غير صامت بواسطة %2$s</string>
<string name="message_role_add">%1$s تم جعله %2$s بواسطة %3$s</string> <string name="message_role_add">%1$s تم جعله %2$s بواسطة %3$s</string>
<string name="message_role_removed">%1$s لم يعد %2$s بواسطة %3$s</string> <string name="message_role_removed">%1$s لم يعد %2$s بواسطة %3$s</string>
<string name="message_video_call_started">Video call started by %1$s</string> <!-- TODO Translate --> <string name="message_video_call_started">بدأت مكالمة الفيديو بواسطة %1$s</string>
<!-- Message actions --> <!-- Message actions -->
<string name="action_msg_reply">رد</string> <string name="action_msg_reply">رد</string>
<string name="action_info">Info</string> <!-- TODO Translate --> <string name="action_info">معلومات</string>
<string name="action_msg_edit">تعديل</string> <string name="action_msg_edit">تعديل</string>
<string name="action_msg_copy">نسخ</string> <string name="action_msg_copy">نسخ</string>
<string name="action_msg_quote">اقتباس</string> <string name="action_msg_quote">اقتباس</string>
<string name="action_msg_delete">حذف</string> <string name="action_msg_delete">حذف</string>
<string name="action_pin">Pin</string> <!-- TODO Translate --> <string name="action_pin">علق</string>
<string name="action_unpin">Unpin</string> <!-- TODO Translate --> <string name="action_unpin">إزالة التعليق</string>
<string name="action_star">Star</string> <!-- TODO Translate --> <string name="action_star">التمييز بنجمة</string>
<string name="action_unstar">Unstar</string> <!-- TODO Translate --> <string name="action_unstar">إزالة النجمة</string>
<string name="action_msg_share">نشر</string> <string name="action_msg_share">نشر</string>
<string name="action_title_editing">تعديل الرسالة</string> <string name="action_title_editing">تعديل الرسالة</string>
<string name="action_msg_add_reaction">إضافة تفاعل</string> <string name="action_msg_add_reaction">إضافة تفاعل</string>
<string name="action_msg_permalink">Permalink</string> <!-- TODO Translate --> <string name="action_msg_permalink">ربط رابط ثابت</string>
<string name="action_msg_report">إبلاغ</string> <string name="action_msg_report">إبلاغ</string>
<!-- Permission messages --> <!-- Permission messages -->
...@@ -273,18 +269,18 @@ ...@@ -273,18 +269,18 @@
<string name="title_members_list">الأعضاء</string> <string name="title_members_list">الأعضاء</string>
<!-- Mentions --> <!-- Mentions -->
<string name="msg_mentions">إشارة</string> <string name="msg_mentions">إشارات</string>
<string name="msg_no_mention">لا إشارة</string> <string name="msg_no_mention">لا يوجد إشارة</string>
<string name="msg_all_the_mentions_appear_here">الإشارات \nتظهر هنا</string> <string name="msg_all_the_mentions_appear_here">الإشارات\nتظهر هنا</string>
<!-- Pinned Messages --> <!-- Pinned Messages -->
<string name="title_pinned_messages">رسالة مميزة</string> <string name="title_pinned_messages">الرسائل المميزة</string>
<string name="no_pinned_messages">رسائل غير مميزة</string> <string name="no_pinned_messages">لا يوجد رسائل مميزة</string>
<string name="no_pinned_description">الرسائل المميزة\nتظهر هنا</string> <string name="no_pinned_description">الرسائل المميزة\nتظهر هنا</string>
<!-- Favorite Messages --> <!-- Favorite Messages -->
<string name="title_favorite_messages">الرسائل المفصلة</string> <string name="title_favorite_messages">الرسائل المفضلة</string>
<string name="no_favorite_messages">الرسائل غير المفضلة</string> <string name="no_favorite_messages">لا يوجد رسائل مفضلة</string>
<string name="no_favorite_description">الرسائل المفضلة\nتظهر هنا</string> <string name="no_favorite_description">الرسائل المفضلة\nتظهر هنا</string>
<!-- Files --> <!-- Files -->
...@@ -297,14 +293,14 @@ ...@@ -297,14 +293,14 @@
<string name="max_file_size_exceeded">تجاوز حجم الملف %1$d بايت الحد الأقصى لحجم التحميل وهو %2$d بايت</string> <string name="max_file_size_exceeded">تجاوز حجم الملف %1$d بايت الحد الأقصى لحجم التحميل وهو %2$d بايت</string>
<!-- Socket status --> <!-- Socket status -->
<string name="status_connected">اتصال</string> <string name="status_connected">متصل</string>
<string name="status_disconnected">قطع الاتصال</string> <string name="status_disconnected">غير متصل</string>
<string name="status_connecting">يتم الاتصال</string> <string name="status_connecting">يتم الاتصال</string>
<string name="status_authenticating">المصادقة</string> <string name="status_authenticating">يتم المصادقة</string>
<string name="status_disconnecting">يتم قطع الاتصال</string> <string name="status_disconnecting">يتم قطع الاتصال</string>
<string name="status_waiting">متصل في %d ثانية</string> <string name="status_waiting">يتم الاتصال في %d ثانية</string>
<!--Suggestions--> <!-- Suggestions -->
<string name="suggest_all_description">تنبيه كل من في الغرفة</string> <string name="suggest_all_description">تنبيه كل من في الغرفة</string>
<string name="suggest_here_description">تنبيه الأعضاء المتصلين</string> <string name="suggest_here_description">تنبيه الأعضاء المتصلين</string>
...@@ -316,10 +312,10 @@ ...@@ -316,10 +312,10 @@
<string name="Slash_TableUnflip_Description">عرض ┬─┬ ノ( ゜-゜ノ)</string> <string name="Slash_TableUnflip_Description">عرض ┬─┬ ノ( ゜-゜ノ)</string>
<string name="Create_A_New_Channel">إنشاء قناة جديدة</string> <string name="Create_A_New_Channel">إنشاء قناة جديدة</string>
<string name="Show_the_keyboard_shortcut_list">عرض اختصارات الكيبورد</string> <string name="Show_the_keyboard_shortcut_list">عرض اختصارات الكيبورد</string>
<string name="Invite_user_to_join_channel_all_from">دعوة أعضاء [#channel] للانضمام لهذه المجموعة</string> <string name="Invite_user_to_join_channel_all_from">دعوة أعضاء [#channel] للانضمام لهذه القناة</string>
<string name="Invite_user_to_join_channel_all_to">دعوة أعضاء هذه المجموعة للانضمام ل [#channel]</string> <string name="Invite_user_to_join_channel_all_to">دعوة أعضاء هذه القناة للانضمام ل [#channel]</string>
<string name="Archive">ارشيف</string> <string name="Archive">أرشيف</string>
<string name="Remove_someone_from_room">إوالة شخص من الغرفة</string> <string name="Remove_someone_from_room">إزالة شخص من الغرفة</string>
<string name="Leave_the_current_channel">مغادرة القناة الحالية</string> <string name="Leave_the_current_channel">مغادرة القناة الحالية</string>
<string name="Displays_action_text">عرض نص الاجراء</string> <string name="Displays_action_text">عرض نص الاجراء</string>
<string name="Direct_message_someone">رسالة مباشرة</string> <string name="Direct_message_someone">رسالة مباشرة</string>
...@@ -329,46 +325,48 @@ ...@@ -329,46 +325,48 @@
<string name="Unarchive">حذف من الأرشيف</string> <string name="Unarchive">حذف من الأرشيف</string>
<string name="Join_the_given_channel">الانضمام للقناة المعطاه</string> <string name="Join_the_given_channel">الانضمام للقناة المعطاه</string>
<string name="Guggy_Command_Description">صنع gif بناءا على النص المعطى</string> <string name="Guggy_Command_Description">صنع gif بناءا على النص المعطى</string>
<string name="Slash_Topic_Description">وضع الموضوع</string> <string name="Slash_Topic_Description">تعيين الموضوع</string>
<!-- Emoji message--> <!-- Emoji messages -->
<string name="msg_no_recent_emoji">لا يوجد ايموجيز </string> <string name="msg_no_recent_emoji">لا يوجد ايموجيز</string>
<string name="alert_title_default_skin_tone">نغمة الجلد الافتراضية</string> <string name="alert_title_default_skin_tone">لون البشرة الافتراضي</string>
<!-- Sort and group --> <!-- Sort and group -->
<string name="msg_sort_by_placeholder">Sort by %1$s</string> <!-- TODO Translate --> <string name="msg_sort_by_placeholder">ترتيب حسب %1$s</string>
<string name="msg_sort_by">Sort by</string> <!-- TODO Translate --> <string name="msg_sort_by">ترتيب حسب</string>
<string name="msg_sort_by_activity">Activity</string> <!-- TODO Translate --> <string name="msg_sort_by_activity">النشاط</string>
<string name="msg_sort_by_name">Name</string> <!-- TODO Translate --> <string name="msg_sort_by_name">الاسم</string>
<string name="msg_group_by_unread_on_top">Unread on top</string> <!-- TODO Translate --> <string name="msg_group_by_unread_on_top">غير مقروء على القمة</string>
<string name="msg_group_by_type">Group by type</string> <!-- TODO Translate --> <string name="msg_group_by_type">تجميع حسب النوع</string>
<string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate --> <string name="msg_group_by_favorites">تجميع حسب المفضلات</string>
<!--ChatRooms Headers--> <!-- ChatRooms Headers -->
<string name="header_favorite">Favorites</string> <!-- TODO Translate --> <string name="header_favorite">المفضلات</string>
<string name="msg_channels">القنوات</string> <string name="msg_channels">القنوات</string>
<string name="msg_users">Users</string> <!-- TODO Translate --> <string name="msg_users">المستخدمين</string>
<string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate --> <string name="msg_search_for_global_users">البحث عن المستخدمين عالميا</string>
<string name="msg_search_for_global_users_description">If you turn on, you can search for any user from others companies or servers.</string> <!-- TODO Translate --> <string name="msg_search_for_global_users_description">إذا قمت بالتشغيل، يمكنك البحث عن أي مستخدم من شركات أو خوادم أخرى.</string>
<string name="header_private_groups">المجموعات الخاصة</string> <string name="header_private_groups">المجموعات الخاصة</string>
<string name="header_direct_messages">الرسائل المباشرة</string> <string name="header_direct_messages">الرسائل المباشرة</string>
<string name="header_live_chats">محادثات حية</string> <string name="header_live_chats">المحادثات الحية</string>
<string name="header_unknown">غير معروف</string> <string name="header_unknown">غير معروف</string>
<!--Notifications--> <!-- Notifications -->
<string name="share_label">تعديل الرسالة المنشورة</string> <string name="share_label">تعديل الرسالة المنشورة</string>
<string name="notif_action_reply_hint">رد</string> <string name="notif_action_reply_hint">رد</string>
<string name="notif_error_sending">فشل الرد حاول مرة أخرى</string> <string name="notif_error_sending">فشل الرد، حاول مرة أخرى</string>
<string name="notif_success_sending">تم إرسال الرسالة ل %1$s!</string> <string name="notif_success_sending">تم إرسال الرسالة ل %1$s!</string>
<string name="read_by">تمت القراءة بواسطة</string> <string name="read_by">تمت القراءة بواسطة</string>
<string name="message_information_title">معلومات الرسالة</string> <string name="message_information_title">معلومات الرسالة</string>
<string name="message_room_changed_privacy">تم تغيير نوع الغرفة ل: %1$s بواسطة %2$s</string> <string name="message_room_changed_privacy">تم تغيير نوع الغرفة ل: %1$s بواسطة %2$s</string>
<!-- User Details --> <!-- User Details -->
<string name="timezone">المنظقة الزمنية</string> <string name="timezone">المنطقة الزمنية</string>
<string name="status">الوضع: %1$s</string>
<string name="user_detail_status">الوضع</string>
<!-- Report --> <!-- Report -->
<string name="submit">تأكيد</string> <string name="submit">تأكيد</string>
<string name="required">*مطلوب</string> <string name="required">*مطلوب</string>
<string name="report_sent">تم إرسال تقريرك!</string> <string name="report_sent">تم إرسال تقريرك!</string>
</resources> </resources>
\ No newline at end of file
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
<string name="title_authentication">Login Daten prüfen</string> <string name="title_authentication">Login Daten prüfen</string>
<string name="title_legal_terms">Legal Terms</string> <string name="title_legal_terms">Legal Terms</string>
<string name="title_chats">Chats</string> <string name="title_chats">Chats</string>
<string name="title_choose_language">Choose Language</string> <!-- TODO Add translation --> <string name="title_choose_language">Sprache wählen</string>
<string name="title_profile">Profil</string> <string name="title_profile">Profil</string>
<string name="title_members">Benutzer</string> <string name="title_members">Benutzer</string>
<string name="title_counted_members">Benutzer (%d)</string> <string name="title_counted_members">Benutzer (%d)</string>
...@@ -67,30 +67,33 @@ ...@@ -67,30 +67,33 @@
<string name="msg_share_this_app">Teile diese App</string> <string name="msg_share_this_app">Teile diese App</string>
<string name="msg_administration">Administration</string> <string name="msg_administration">Administration</string>
<string name="msg_license">Lizenz</string> <string name="msg_license">Lizenz</string>
<string name="msg_app_version">Version: %1$s (%2$d)</string> <string name="msg_app_version">Version: %1$s (%2$d)</string>
<string name="msg_server_version">Serverversion: %1$s</string> <string name="msg_server_version">Serverversion: %1$s</string>
<string name="msg_send_analytics">Analysesaten senden</string> <string name="msg_send_analytics">Analysesaten senden</string>
<string name="msg_send_analytics_tracking">Anonyme Statistiken senden um diese App weiter zu verbessern</string>
<string name="msg_do_not_send_analytics_tracking">KEINE anonymen Statistiken senden um diese App weiter zu verbessern</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Nicht anwendbar, da es sich um eine FOSS version handelt</string>
<string name="msg_logout_from_rocket_chat">Logout von Rocket.Chat</string> <string name="msg_logout_from_rocket_chat">Logout von Rocket.Chat</string>
<string name="msg_delete_account">Konto löschen</string> <string name="msg_delete_account">Konto löschen</string>
<string name="msg_change_status">Status ändern</string> <string name="msg_change_status">Status ändern</string>
<string-array name="languages"> <!-- TODO Add translations --> <string-array name="languages">
<item>English</item> <item>Englisch</item>
<item>Arabic</item> <item>Arabisch</item>
<item>German</item> <item>Deutsch</item>
<item>Spanish</item> <item>Spanisch</item>
<item>Persian</item> <item>Persisch</item>
<item>French</item> <item>Französisch</item>
<item>Hindi (IN)</item> <item>Hindi (IN)</item>
<item>Italian</item> <item>Italienisch</item>
<item>Japanese</item> <item>Japanisch</item>
<item>Portuguese (BR)</item> <item>Portugiesisch (BR)</item>
<item>Portuguese (PT)</item> <item>Portugiesisch (PT)</item>
<item>Russian (RU)</item> <item>Russisch (RU)</item>
<item>Turkish</item> <item>Türkisch</item>
<item>Ukrainian</item> <item>Ukrainisch</item>
<item>Chinese (CN)</item> <item>Chinesisch (CN)</item>
<item>Chinese (TW)</item> <item>Chinesisch (TW)</item>
</string-array> </string-array>
<!-- Regular information messages --> <!-- Regular information messages -->
...@@ -219,13 +222,6 @@ ...@@ -219,13 +222,6 @@
<string name="msg_send_email">E-Mail senden</string> <string name="msg_send_email">E-Mail senden</string>
<string name="msg_android_app_support">Android App-Unterstützung</string> <string name="msg_android_app_support">Android App-Unterstützung</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">Daten für Analysezwecke</string>
<string name="msg_send_analytics_tracking">Anonyme Statistiken senden um diese App weiter zu verbessern</string>
<string name="msg_do_not_send_analytics_tracking">KEINE anonymen Statistiken senden um diese App weiter zu verbessern</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Nicht anwendbar, da es sich um eine FOSS version handelt</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">Raum Namen geändert zu: %1$s von %2$s</string> <string name="message_room_name_changed">Raum Namen geändert zu: %1$s von %2$s</string>
<string name="message_user_added_by">Benutzer %1$s hinzugefügt von %2$s</string> <string name="message_user_added_by">Benutzer %1$s hinzugefügt von %2$s</string>
...@@ -243,7 +239,7 @@ ...@@ -243,7 +239,7 @@
<!-- Message actions --> <!-- Message actions -->
<string name="action_msg_reply">Antworten</string> <string name="action_msg_reply">Antworten</string>
<string name="action_info">Info</string> <string name="action_info">Info</string>
<string name="action_msg_edit">Bearbeiten</string> <string name="action_msg_edit">Bearbeiten</string>
<string name="action_msg_copy">Kopieren</string> <string name="action_msg_copy">Kopieren</string>
<string name="action_msg_quote">Zitieren</string> <string name="action_msg_quote">Zitieren</string>
...@@ -302,7 +298,7 @@ ...@@ -302,7 +298,7 @@
<string name="status_disconnecting">Trenne</string> <string name="status_disconnecting">Trenne</string>
<string name="status_waiting">Verbinde in %d Sekunden</string> <string name="status_waiting">Verbinde in %d Sekunden</string>
<!--Suggestions--> <!-- Suggestions -->
<string name="suggest_all_description">Benachrichtige alle in diesem Raum</string> <string name="suggest_all_description">Benachrichtige alle in diesem Raum</string>
<string name="suggest_here_description">Benachrichtige aktive Benutzer in diesem Raum</string> <string name="suggest_here_description">Benachrichtige aktive Benutzer in diesem Raum</string>
...@@ -329,7 +325,7 @@ ...@@ -329,7 +325,7 @@
<string name="Guggy_Command_Description">Erstelle ein Gif, basierend auf den eingegebenen Text</string> <string name="Guggy_Command_Description">Erstelle ein Gif, basierend auf den eingegebenen Text</string>
<string name="Slash_Topic_Description">Setze Topic</string> <string name="Slash_Topic_Description">Setze Topic</string>
<!-- Emoji message--> <!-- Emoji messages -->
<string name="msg_no_recent_emoji">Keine letzten Emojis</string> <string name="msg_no_recent_emoji">Keine letzten Emojis</string>
<string name="alert_title_default_skin_tone">Standard Hautton</string> <string name="alert_title_default_skin_tone">Standard Hautton</string>
...@@ -341,8 +337,8 @@ ...@@ -341,8 +337,8 @@
<string name="msg_group_by_unread_on_top">Ungelesen oben</string> <string name="msg_group_by_unread_on_top">Ungelesen oben</string>
<string name="msg_group_by_type">Gruppieren nach Typ</string> <string name="msg_group_by_type">Gruppieren nach Typ</string>
<string name="msg_group_by_favorites">Gruppieren nach Favoriten</string> <string name="msg_group_by_favorites">Gruppieren nach Favoriten</string>
<!--ChatRooms Headers--> <!-- ChatRooms Headers -->
<string name="header_favorite">Favoriten</string> <string name="header_favorite">Favoriten</string>
<string name="msg_channels">Räume</string> <string name="msg_channels">Räume</string>
<string name="msg_users">Benutzer</string> <string name="msg_users">Benutzer</string>
...@@ -353,7 +349,7 @@ ...@@ -353,7 +349,7 @@
<string name="header_live_chats">Live Chats</string> <string name="header_live_chats">Live Chats</string>
<string name="header_unknown">Unbekannt</string> <string name="header_unknown">Unbekannt</string>
<!--Notifications--> <!-- Notifications -->
<string name="share_label">Bearbeite geteilte Nachricht</string> <string name="share_label">Bearbeite geteilte Nachricht</string>
<string name="notif_action_reply_hint">Antworten</string> <string name="notif_action_reply_hint">Antworten</string>
<string name="notif_error_sending">Antworten fehlgeschlagen. Bitte versuchen Sie es noch einmal.</string> <string name="notif_error_sending">Antworten fehlgeschlagen. Bitte versuchen Sie es noch einmal.</string>
...@@ -364,7 +360,8 @@ ...@@ -364,7 +360,8 @@
<!-- User Details --> <!-- User Details -->
<string name="timezone">Zeitzone</string> <string name="timezone">Zeitzone</string>
<string name="status">Status: %1$s</string>
<string name="user_detail_status">Status</string>
<!-- Report --> <!-- Report -->
<string name="submit">Senden</string> <string name="submit">Senden</string>
<string name="required">*erforderlich</string> <string name="required">*erforderlich</string>
......
...@@ -70,6 +70,9 @@ ...@@ -70,6 +70,9 @@
<string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate --> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate --> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate --> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
<string name="msg_send_analytics_tracking">Envía estadísticas anónimas para ayudar a mejorar esta aplicación</string>
<string name="msg_do_not_send_analytics_tracking">No envíe estadísticas anónimas para ayudar a mejorar esta aplicación</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">No aplica ya que es una versión FOSS</string>
<string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate --> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate --> <string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate --> <string name="msg_change_status">Change status</string> <!-- TODO Translate -->
...@@ -215,12 +218,6 @@ ...@@ -215,12 +218,6 @@
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation --> <string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation --> <string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
<!-- Preferences messages -->
<string name="msg_analytics_tracking">Seguimiento analítico</string>
<string name="msg_send_analytics_tracking">Envía estadísticas anónimas para ayudar a mejorar esta aplicación</string>
<string name="msg_do_not_send_analytics_tracking">No envíe estadísticas anónimas para ayudar a mejorar esta aplicación</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">No aplica ya que es una versión FOSS</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">Nombre de la sala cambiado para: %1$s por %2$s</string> <string name="message_room_name_changed">Nombre de la sala cambiado para: %1$s por %2$s</string>
<string name="message_user_added_by">Usuario %1$s añadido por %2$s</string> <string name="message_user_added_by">Usuario %1$s añadido por %2$s</string>
...@@ -251,8 +248,7 @@ ...@@ -251,8 +248,7 @@
<string name="action_title_editing">Edición de mensaje</string> <string name="action_title_editing">Edición de mensaje</string>
<string name="action_msg_add_reaction">Añadir una reacción</string> <string name="action_msg_add_reaction">Añadir una reacción</string>
<string name="action_msg_permalink">Permalink</string> <!-- TODO Add translation --> <string name="action_msg_permalink">Permalink</string> <!-- TODO Add translation -->
<!-- TODO - Add proper translation --> <string name="action_msg_report">Report</string> <!-- TODO Add translation -->
<string name="action_msg_report">Report</string>
<!-- Permission messages --> <!-- Permission messages -->
<string name="permission_editing_not_allowed">La edición no és permitida</string> <string name="permission_editing_not_allowed">La edición no és permitida</string>
...@@ -299,7 +295,7 @@ ...@@ -299,7 +295,7 @@
<string name="status_disconnecting">Desconectando</string> <string name="status_disconnecting">Desconectando</string>
<string name="status_waiting">Conectando en %d segundos</string> <string name="status_waiting">Conectando en %d segundos</string>
<!--Suggestions--> <!-- Suggestions -->
<string name="suggest_all_description">Notificar a todos en esta sala</string> <string name="suggest_all_description">Notificar a todos en esta sala</string>
<string name="suggest_here_description">Notificar usuarios activos en esta sala</string> <string name="suggest_here_description">Notificar usuarios activos en esta sala</string>
...@@ -326,7 +322,7 @@ ...@@ -326,7 +322,7 @@
<string name="Guggy_Command_Description">Genera un gif basado en el texto proporcionado</string> <string name="Guggy_Command_Description">Genera un gif basado en el texto proporcionado</string>
<string name="Slash_Topic_Description">Establecer tema</string> <string name="Slash_Topic_Description">Establecer tema</string>
<!-- Emoji message--> <!-- Emoji messages -->
<string name="msg_no_recent_emoji">Sin emojis recientes</string> <string name="msg_no_recent_emoji">Sin emojis recientes</string>
<string name="alert_title_default_skin_tone">Tono de piel predeterminado</string> <string name="alert_title_default_skin_tone">Tono de piel predeterminado</string>
...@@ -339,18 +335,18 @@ ...@@ -339,18 +335,18 @@
<string name="msg_group_by_type">Group by type</string> <!-- TODO Translate --> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate --> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<!--ChatRooms Headers--> <!-- ChatRooms Headers -->
<string name="header_favorite">Favorites</string><!-- TODO - Add proper translation --> <string name="header_favorite">Favorites</string><!-- TODO - Add proper translation -->
<string name="msg_channels">Canales</string> <string name="msg_channels">Canales</string>
<string name="msg_users">Users</string> <!-- TODO Translate --> <string name="msg_users">Users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate --> <string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users_description">If you turn on, you can search for any user from others companies or servers.</string> <!-- TODO Translate --> <string name="msg_search_for_global_users_description">If you turn on, you can search for any user from other companies or servers.</string> <!-- TODO Translate -->
<string name="header_private_groups">Grupos privados</string> <string name="header_private_groups">Grupos privados</string>
<string name="header_direct_messages">Mensajes directos</string> <string name="header_direct_messages">Mensajes directos</string>
<string name="header_live_chats">Chats en vivo</string> <string name="header_live_chats">Chats en vivo</string>
<string name="header_unknown">Desconocido</string> <string name="header_unknown">Desconocido</string>
<!--Notifications--> <!-- Notifications -->
<string name="share_label">Edita mensaje compartido</string> <string name="share_label">Edita mensaje compartido</string>
<string name="notif_action_reply_hint">RESPUESTA</string> <string name="notif_action_reply_hint">RESPUESTA</string>
<string name="notif_error_sending">La respuesta ha fallado. Inténtalo de nuevo.</string> <string name="notif_error_sending">La respuesta ha fallado. Inténtalo de nuevo.</string>
...@@ -366,6 +362,8 @@ ...@@ -366,6 +362,8 @@
<!-- User Details --> <!-- User Details -->
<string name="timezone">Timezone</string> <!-- TODO - Add proper translation --> <string name="timezone">Timezone</string> <!-- TODO - Add proper translation -->
<string name="status">Status: %1$s</string> <!-- TODO Translate -->
<string name="user_detail_status">Status</string> <!-- TODO Translate -->
<!-- Report --> <!-- Report -->
<string name="submit">Submit</string> <!--TODO - Add proper translation--> <string name="submit">Submit</string> <!--TODO - Add proper translation-->
......
...@@ -70,6 +70,9 @@ ...@@ -70,6 +70,9 @@
<string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate --> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate --> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate --> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
<string name="msg_send_analytics_tracking">برای بهبود این کاره آمار ناشناس بفرستید</string>
<string name="msg_do_not_send_analytics_tracking">برای بهبود این کاره آمار ناشناس نفرستید</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">قابل اجرا نیست زیرا نسخه‌ی FOSS است</string>
<string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate --> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate --> <string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate --> <string name="msg_change_status">Change status</string> <!-- TODO Translate -->
...@@ -182,8 +185,8 @@ ...@@ -182,8 +185,8 @@
<string name="msg_continue_with_gitlab">ادامه دادن با <b>گیت‌لب</b></string> <string name="msg_continue_with_gitlab">ادامه دادن با <b>گیت‌لب</b></string>
<string name="msg_continue_with_wordpress">ادامه دادن با <b>وردپرس</b></string> <string name="msg_continue_with_wordpress">ادامه دادن با <b>وردپرس</b></string>
<string name="msg_two_factor_authentication">تایید هویت دو فاکتوره</string> <string name="msg_two_factor_authentication">تایید هویت دو فاکتوره</string>
<string name="msg_your_2fa_code">کد 2FA تان چیست؟</string> <string name="msg_your_2fa_code">کد 2FA تان چیست؟</string>
<string name="msg_permalink_copied">پیوند کپی شد</string> <string name="msg_permalink_copied">پیوند کپی شد</string>
<string name="msg_no_topic">No topic</string> <!-- TODO Add translation --> <string name="msg_no_topic">No topic</string> <!-- TODO Add translation -->
<string name="msg_no_announcement">No announcement</string> <!-- TODO Add translation --> <string name="msg_no_announcement">No announcement</string> <!-- TODO Add translation -->
<string name="msg_no_description">No description</string> <!-- TODO Add translation --> <string name="msg_no_description">No description</string> <!-- TODO Add translation -->
...@@ -220,12 +223,6 @@ ...@@ -220,12 +223,6 @@
<string name="msg_view_less">مشاهده‌ی کمتر</string> <string name="msg_view_less">مشاهده‌ی کمتر</string>
<string name="msg_muted_on_this_channel">آیا این کانال را بی‌صدا کردید؟</string> <string name="msg_muted_on_this_channel">آیا این کانال را بی‌صدا کردید؟</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">ردگیری تحلیلی</string>
<string name="msg_send_analytics_tracking">برای بهبود این کاره آمار ناشناس بفرستید</string>
<string name="msg_do_not_send_analytics_tracking">برای بهبود این کاره آمار ناشناس نفرستید</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">قابل اجرا نیست زیرا نسخه‌ی FOSS است</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">Room name changed to: %1$s by %2$s</string> <!-- TODO Add translation --> <string name="message_room_name_changed">Room name changed to: %1$s by %2$s</string> <!-- TODO Add translation -->
<string name="message_user_added_by">User %1$s added by %2$s</string> <!-- TODO Add translation --> <string name="message_user_added_by">User %1$s added by %2$s</string> <!-- TODO Add translation -->
...@@ -302,7 +299,7 @@ ...@@ -302,7 +299,7 @@
<string name="status_disconnecting">درحال قطع شده</string> <string name="status_disconnecting">درحال قطع شده</string>
<string name="status_waiting">Connecting in %d seconds</string> <!-- TODO Add translation --> <string name="status_waiting">Connecting in %d seconds</string> <!-- TODO Add translation -->
<!--Suggestions--> <!-- Suggestions -->
<string name="suggest_all_description">به همه در این اتاق خبر بده</string> <string name="suggest_all_description">به همه در این اتاق خبر بده</string>
<string name="suggest_here_description">به کاربران فعال در این اتاق خبر بده</string> <string name="suggest_here_description">به کاربران فعال در این اتاق خبر بده</string>
...@@ -329,7 +326,7 @@ ...@@ -329,7 +326,7 @@
<string name="Guggy_Command_Description">ساخت یک gif بر اساس متن آماده‌شده</string> <string name="Guggy_Command_Description">ساخت یک gif بر اساس متن آماده‌شده</string>
<string name="Slash_Topic_Description">تعیین موضوع</string> <string name="Slash_Topic_Description">تعیین موضوع</string>
<!-- Emoji message--> <!-- Emoji messages -->
<string name="msg_no_recent_emoji">هیچ ایموجی اخیری موجود نیست</string> <string name="msg_no_recent_emoji">هیچ ایموجی اخیری موجود نیست</string>
<string name="alert_title_default_skin_tone">مدل پوسته‌ی پیش‌فرض</string> <string name="alert_title_default_skin_tone">مدل پوسته‌ی پیش‌فرض</string>
...@@ -342,18 +339,18 @@ ...@@ -342,18 +339,18 @@
<string name="msg_group_by_type">Group by type</string> <!-- TODO Translate --> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate --> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<!--ChatRooms Headers--> <!-- ChatRooms Headers -->
<string name="header_favorite">Favorites</string><!-- TODO - Add proper translation --> <string name="header_favorite">Favorites</string><!-- TODO - Add proper translation -->
<string name="msg_channels">کانال‌ها</string> <string name="msg_channels">کانال‌ها</string>
<string name="msg_users">Users</string> <!-- TODO Translate --> <string name="msg_users">Users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate --> <string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users_description">If you turn on, you can search for any user from others companies or servers.</string> <!-- TODO Translate --> <string name="msg_search_for_global_users_description">If you turn on, you can search for any user from other companies or servers.</string> <!-- TODO Translate -->
<string name="header_private_groups">گروه‌های خصوصی</string> <string name="header_private_groups">گروه‌های خصوصی</string>
<string name="header_direct_messages">پیام‌های خصوصی</string> <string name="header_direct_messages">پیام‌های خصوصی</string>
<string name="header_live_chats">گفت‌وگوهای زنده</string> <string name="header_live_chats">گفت‌وگوهای زنده</string>
<string name="header_unknown">ناشناس</string> <string name="header_unknown">ناشناس</string>
<!--Notifications--> <!-- Notifications -->
<string name="share_label">ویراش پیام به اشتراک گذاشته شده</string> <string name="share_label">ویراش پیام به اشتراک گذاشته شده</string>
<string name="notif_action_reply_hint">جواب دادن</string> <string name="notif_action_reply_hint">جواب دادن</string>
<string name="notif_error_sending">جواب با شکست مواجه شد. لطفا دوباره تلاش کنید.</string> <string name="notif_error_sending">جواب با شکست مواجه شد. لطفا دوباره تلاش کنید.</string>
...@@ -363,7 +360,9 @@ ...@@ -363,7 +360,9 @@
<string name="message_room_changed_privacy">Room type changed to: %1$s by %2$s</string> <!-- TODO Add translation --> <string name="message_room_changed_privacy">Room type changed to: %1$s by %2$s</string> <!-- TODO Add translation -->
<!-- User Details --> <!-- User Details -->
<string name="timezone">منطقه‌ی زمانی</string> <string name="timezone">منطقه‌ زمانی</string>
<string name="status">Status: %1$s</string> <!-- TODO Translate -->
<string name="user_detail_status">Status</string> <!-- TODO Translate -->
<!-- Report --> <!-- Report -->
<string name="submit">واگذاری</string> <string name="submit">واگذاری</string>
......
...@@ -70,6 +70,9 @@ ...@@ -70,6 +70,9 @@
<string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate --> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate --> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate --> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
<string name="msg_send_analytics_tracking">Envoyer des statistiques anonymes pour aider à l\'amélioration de l\'application</string>
<string name="msg_do_not_send_analytics_tracking">Ne pas envoyer des statistiques anonymes pour aider à l\'amélioration de l\'application</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Ne s\'applique pas étant donné qu\'il s\'agit d\'une version FOSS</string>
<string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate --> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate --> <string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate --> <string name="msg_change_status">Change status</string> <!-- TODO Translate -->
...@@ -218,12 +221,6 @@ ...@@ -218,12 +221,6 @@
<string name="msg_member_not_found">Membre non trouvé</string> <string name="msg_member_not_found">Membre non trouvé</string>
<string name="msg_channel_created_successfully">Salon créé</string> <string name="msg_channel_created_successfully">Salon créé</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">Pistage à des fins d\'analyses</string>
<string name="msg_send_analytics_tracking">Envoyer des statistiques anonymes pour aider à l\'amélioration de l\'application</string>
<string name="msg_do_not_send_analytics_tracking">Ne pas envoyer des statistiques anonymes pour aider à l\'amélioration de l\'application</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Ne s\'applique pas étant donné qu\'il s\'agit d\'une version FOSS</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">Le nom du salon %1$s a été changé en %2$s</string> <string name="message_room_name_changed">Le nom du salon %1$s a été changé en %2$s</string>
<string name="message_user_added_by">Utilisateur %1$s ajouté par %2$s</string> <string name="message_user_added_by">Utilisateur %1$s ajouté par %2$s</string>
...@@ -300,7 +297,7 @@ ...@@ -300,7 +297,7 @@
<string name="status_disconnecting">Déconnexion</string> <string name="status_disconnecting">Déconnexion</string>
<string name="status_waiting">Connexion dans %d secondes</string> <string name="status_waiting">Connexion dans %d secondes</string>
<!--Suggestions--> <!-- Suggestions -->
<string name="suggest_all_description">Notifier tous les utilisateurs dans ce salon</string> <string name="suggest_all_description">Notifier tous les utilisateurs dans ce salon</string>
<string name="suggest_here_description">Notifier les utilisateurs actifs dans ce salon</string> <string name="suggest_here_description">Notifier les utilisateurs actifs dans ce salon</string>
...@@ -327,7 +324,7 @@ ...@@ -327,7 +324,7 @@
<string name="Guggy_Command_Description">Génère un gif basé sur le texte fourni</string> <string name="Guggy_Command_Description">Génère un gif basé sur le texte fourni</string>
<string name="Slash_Topic_Description">Définir le sujet</string> <string name="Slash_Topic_Description">Définir le sujet</string>
<!-- Emoji message--> <!-- Emoji messages -->
<string name="msg_no_recent_emoji">Aucun emoji récent</string> <string name="msg_no_recent_emoji">Aucun emoji récent</string>
<string name="alert_title_default_skin_tone">Tonalité de peau par défaut</string> <string name="alert_title_default_skin_tone">Tonalité de peau par défaut</string>
...@@ -340,18 +337,18 @@ ...@@ -340,18 +337,18 @@
<string name="msg_group_by_type">Group by type</string> <!-- TODO Translate --> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate --> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<!--ChatRooms Headers--> <!-- ChatRooms Headers -->
<string name="header_favorite">Favoris</string> <string name="header_favorite">Favoris</string>
<string name="msg_channels">Salons</string> <string name="msg_channels">Salons</string>
<string name="msg_users">Users</string> <!-- TODO Translate --> <string name="msg_users">Users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate --> <string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users_description">If you turn on, you can search for any user from others companies or servers.</string> <!-- TODO Translate --> <string name="msg_search_for_global_users_description">If you turn on, you can search for any user from other companies or servers.</string> <!-- TODO Translate -->
<string name="header_private_groups">Groupes privés</string> <string name="header_private_groups">Groupes privés</string>
<string name="header_direct_messages">Messages directs</string> <string name="header_direct_messages">Messages directs</string>
<string name="header_live_chats">Chats en direct</string> <string name="header_live_chats">Chats en direct</string>
<string name="header_unknown">Inconnu</string> <string name="header_unknown">Inconnu</string>
<!--Notifications--> <!-- Notifications -->
<string name="share_label">Modifier le message partagé</string> <string name="share_label">Modifier le message partagé</string>
<string name="notif_action_reply_hint">RÉPONDRE</string> <string name="notif_action_reply_hint">RÉPONDRE</string>
<string name="notif_error_sending">La réponse a échoué. Veuillez réessayer.</string> <string name="notif_error_sending">La réponse a échoué. Veuillez réessayer.</string>
...@@ -362,9 +359,10 @@ ...@@ -362,9 +359,10 @@
<string name="msg_sent_attachment">Envoyé un fichier</string> <string name="msg_sent_attachment">Envoyé un fichier</string>
<string name="message_room_changed_privacy">Changé de type de chambre : %1$s de %2$s</string> <string name="message_room_changed_privacy">Changé de type de chambre : %1$s de %2$s</string>
<!-- User Details --> <!-- User Details -->
<string name="timezone">Fuseau horaire</string> <string name="timezone">Fuseau horaire</string>
<string name="status">Status: %1$s</string> <!-- TODO Translate -->
<string name="user_detail_status">Status</string> <!-- TODO Translate -->
<!-- Report --> <!-- Report -->
<string name="submit">Soumettre</string> <string name="submit">Soumettre</string>
......
...@@ -70,6 +70,9 @@ ...@@ -70,6 +70,9 @@
<string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate --> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate --> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate --> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
<string name="msg_send_analytics_tracking">इस ऐप को बेहतर बनाने में मदद के लिए अज्ञात स्टेटिक्स भेजें</string>
<string name="msg_do_not_send_analytics_tracking">इस ऐप को बेहतर बनाने में मदद के लिए अनाम स्टेटिक न भेजें</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">लागू नहीं है क्योंकि यह एक FOSS संस्करण है</string>
<string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate --> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate --> <string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate --> <string name="msg_change_status">Change status</string> <!-- TODO Translate -->
...@@ -221,12 +224,6 @@ ...@@ -221,12 +224,6 @@
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate --> <string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<string name="msg_directory">Directory</string> <!-- TODO Translate --> <string name="msg_directory">Directory</string> <!-- TODO Translate -->
<!-- Preferences messages -->
<string name="msg_analytics_tracking">एनालिटिक्स ट्रैकिंग</string>
<string name="msg_send_analytics_tracking">इस ऐप को बेहतर बनाने में मदद के लिए अज्ञात स्टेटिक्स भेजें</string>
<string name="msg_do_not_send_analytics_tracking">इस ऐप को बेहतर बनाने में मदद के लिए अनाम स्टेटिक न भेजें</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">लागू नहीं है क्योंकि यह एक FOSS संस्करण है</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">%2$s ने रूम का नाम बदलकर %1$s किया</string> <string name="message_room_name_changed">%2$s ने रूम का नाम बदलकर %1$s किया</string>
<string name="message_user_added_by">उपयोगकर्ता %1$s द्वारा %2$s को जोड़ा गया</string> <string name="message_user_added_by">उपयोगकर्ता %1$s द्वारा %2$s को जोड़ा गया</string>
...@@ -303,7 +300,7 @@ ...@@ -303,7 +300,7 @@
<string name="status_disconnecting">डिसकनेक्टिंग</string> <string name="status_disconnecting">डिसकनेक्टिंग</string>
<string name="status_waiting">%d सेकेंड में कनेक्ट हो रहा है</string> <string name="status_waiting">%d सेकेंड में कनेक्ट हो रहा है</string>
<!--Suggestions--> <!-- Suggestions -->
<string name="suggest_all_description">इस कमरे में सभी को सूचित करें</string> <string name="suggest_all_description">इस कमरे में सभी को सूचित करें</string>
<string name="suggest_here_description">इस कमरे में सक्रिय उपयोगकर्ताओं को सूचित करना</string> <string name="suggest_here_description">इस कमरे में सक्रिय उपयोगकर्ताओं को सूचित करना</string>
...@@ -330,7 +327,7 @@ ...@@ -330,7 +327,7 @@
<string name="Guggy_Command_Description">दिए गए पाठ पर आधारित gif उत्पन्न करता</string> <string name="Guggy_Command_Description">दिए गए पाठ पर आधारित gif उत्पन्न करता</string>
<string name="Slash_Topic_Description">विषय सेट करें</string> <string name="Slash_Topic_Description">विषय सेट करें</string>
<!-- Emoji message--> <!-- Emoji messages -->
<string name="msg_no_recent_emoji"> कोई नया इमोजी नहीं</string> <string name="msg_no_recent_emoji"> कोई नया इमोजी नहीं</string>
<string name="alert_title_default_skin_tone">डिफ़ॉल्ट त्वचा टोन</string> <string name="alert_title_default_skin_tone">डिफ़ॉल्ट त्वचा टोन</string>
...@@ -343,18 +340,18 @@ ...@@ -343,18 +340,18 @@
<string name="msg_group_by_type">Group by type</string> <!-- TODO Translate --> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate --> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<!--ChatRooms Headers--> <!-- ChatRooms Headers -->
<string name="header_favorite">पसंदीदा</string> <string name="header_favorite">पसंदीदा</string>
<string name="msg_channels">चैनलों</string> <string name="msg_channels">चैनलों</string>
<string name="msg_users">Users</string> <!-- TODO Translate --> <string name="msg_users">Users</string> <!-- TODO Translate -->
<string name="header_private_groups">निजी समूहों</string> <string name="header_private_groups">निजी समूहों</string>
<string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate --> <string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users_description">If you turn on, you can search for any user from others companies or servers.</string> <!-- TODO Translate --> <string name="msg_search_for_global_users_description">If you turn on, you can search for any user from other companies or servers.</string> <!-- TODO Translate -->
<string name="header_direct_messages">प्रत्यक्ष संदेश</string> <string name="header_direct_messages">प्रत्यक्ष संदेश</string>
<string name="header_live_chats">लाइव चैट</string> <string name="header_live_chats">लाइव चैट</string>
<string name="header_unknown">अज्ञात</string> <string name="header_unknown">अज्ञात</string>
<!--Notifications--> <!-- Notifications -->
<string name="share_label">साझा संदेश संपादित करें</string> <string name="share_label">साझा संदेश संपादित करें</string>
<string name="notif_action_reply_hint">जवाब</string> <string name="notif_action_reply_hint">जवाब</string>
<string name="notif_error_sending">उत्तर विफल हुआ है। कृपया फिर से प्रयास करें।</string> <string name="notif_error_sending">उत्तर विफल हुआ है। कृपया फिर से प्रयास करें।</string>
...@@ -366,6 +363,8 @@ ...@@ -366,6 +363,8 @@
<!-- User Details --> <!-- User Details -->
<string name="timezone">समय क्षेत्र</string> <string name="timezone">समय क्षेत्र</string>
<string name="status">Status: %1$s</string> <!-- TODO Translate -->
<string name="user_detail_status">Status</string> <!-- TODO Translate -->
<!-- Report --> <!-- Report -->
<string name="submit">जमा करें</string> <string name="submit">जमा करें</string>
......
...@@ -70,6 +70,9 @@ ...@@ -70,6 +70,9 @@
<string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate --> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate --> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate --> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
<string name="msg_send_analytics_tracking">Invia statistiche anonime per migliorare questa app</string>
<string name="msg_do_not_send_analytics_tracking">Non inviare statiche anonime per migliorare questa app</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Non applicabile poiché è una versione FOSS</string>
<string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate --> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate --> <string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate --> <string name="msg_change_status">Change status</string> <!-- TODO Translate -->
...@@ -217,12 +220,6 @@ ...@@ -217,12 +220,6 @@
<string name="msg_view_less">vedere di meno</string> <string name="msg_view_less">vedere di meno</string>
<string name="msg_muted_on_this_channel">Sei disattivato su questo canale</string> <string name="msg_muted_on_this_channel">Sei disattivato su questo canale</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">Tracciamento Analitico</string>
<string name="msg_send_analytics_tracking">Invia statistiche anonime per migliorare questa app</string>
<string name="msg_do_not_send_analytics_tracking">Non inviare statiche anonime per migliorare questa app</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Non applicabile poiché è una versione FOSS</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">Nome della camera cambiato in: %1$s da %2$s</string> <string name="message_room_name_changed">Nome della camera cambiato in: %1$s da %2$s</string>
<string name="message_user_added_by">Utente %1$s aggiunto da %2$s</string> <string name="message_user_added_by">Utente %1$s aggiunto da %2$s</string>
...@@ -299,7 +296,7 @@ ...@@ -299,7 +296,7 @@
<string name="status_disconnecting">Disconessione</string> <string name="status_disconnecting">Disconessione</string>
<string name="status_waiting">Collegamento fra %d secondi</string> <string name="status_waiting">Collegamento fra %d secondi</string>
<!--Suggestions--> <!-- Suggestions -->
<string name="suggest_all_description">Notifica tutti in questa stanza</string> <string name="suggest_all_description">Notifica tutti in questa stanza</string>
<string name="suggest_here_description">Notifica gli utenti attivi di questa stanza</string> <string name="suggest_here_description">Notifica gli utenti attivi di questa stanza</string>
...@@ -326,7 +323,7 @@ ...@@ -326,7 +323,7 @@
<string name="Guggy_Command_Description">Genera una gif in base al testo fornito</string> <string name="Guggy_Command_Description">Genera una gif in base al testo fornito</string>
<string name="Slash_Topic_Description">Imposta argomento</string> <string name="Slash_Topic_Description">Imposta argomento</string>
<!-- Emoji message--> <!-- Emoji messages -->
<string name="msg_no_recent_emoji">No recent emojis</string> <string name="msg_no_recent_emoji">No recent emojis</string>
<string name="alert_title_default_skin_tone">Default skin tone</string> <string name="alert_title_default_skin_tone">Default skin tone</string>
...@@ -339,18 +336,18 @@ ...@@ -339,18 +336,18 @@
<string name="msg_group_by_type">Group by type</string> <!-- TODO Translate --> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate --> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<!--ChatRooms Headers--> <!-- ChatRooms Headers -->
<string name="header_favorite">Favorites</string><!-- TODO - Add proper translation --> <string name="header_favorite">Favorites</string><!-- TODO - Add proper translation -->
<string name="msg_channels">Canali</string> <string name="msg_channels">Canali</string>
<string name="msg_users">Users</string> <!-- TODO Translate --> <string name="msg_users">Users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate --> <string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users_description">If you turn on, you can search for any user from others companies or servers.</string> <!-- TODO Translate --> <string name="msg_search_for_global_users_description">If you turn on, you can search for any user from other companies or servers.</string> <!-- TODO Translate -->
<string name="header_private_groups">Gruppi Privati</string> <string name="header_private_groups">Gruppi Privati</string>
<string name="header_direct_messages">Messaggi Diretti</string> <string name="header_direct_messages">Messaggi Diretti</string>
<string name="header_live_chats">Stanza in diretta</string> <string name="header_live_chats">Stanza in diretta</string>
<string name="header_unknown">Sconosciuto</string> <string name="header_unknown">Sconosciuto</string>
<!--Notifications--> <!-- Notifications -->
<string name="share_label">Modifica messaggio condiviso</string> <string name="share_label">Modifica messaggio condiviso</string>
<string name="notif_action_reply_hint">Risposta</string> <string name="notif_action_reply_hint">Risposta</string>
<string name="notif_error_sending">La risposta è fallita. Per favore riprova.</string> <string name="notif_error_sending">La risposta è fallita. Per favore riprova.</string>
...@@ -361,6 +358,8 @@ ...@@ -361,6 +358,8 @@
<!-- User Details --> <!-- User Details -->
<string name="timezone">Fuso Orario</string> <string name="timezone">Fuso Orario</string>
<string name="status">Status: %1$s</string> <!-- TODO Translate -->
<string name="user_detail_status">Status</string> <!-- TODO Translate -->
<!-- Report --> <!-- Report -->
<string name="submit">Invia</string> <string name="submit">Invia</string>
......
...@@ -70,6 +70,9 @@ ...@@ -70,6 +70,9 @@
<string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate --> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate --> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate --> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
<string name="msg_send_analytics_tracking">アプリ改善のための匿名統計情報を送信する</string>
<string name="msg_do_not_send_analytics_tracking">アプリ改善のための匿名統計情報を送信しない</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">FOSSバージョンのため、適用できません</string>
<string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate --> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate --> <string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate --> <string name="msg_change_status">Change status</string> <!-- TODO Translate -->
...@@ -220,12 +223,6 @@ ...@@ -220,12 +223,6 @@
<string name="msg_send_email">Send email</string> <!-- TODO - Add proper translation --> <string name="msg_send_email">Send email</string> <!-- TODO - Add proper translation -->
<string name="msg_android_app_support">Android app support</string> <!-- TODO - Add proper translation --> <string name="msg_android_app_support">Android app support</string> <!-- TODO - Add proper translation -->
<!-- Preferences messages -->
<string name="msg_analytics_tracking">トラッキングの分析</string>
<string name="msg_send_analytics_tracking">アプリ改善のための匿名統計情報を送信する</string>
<string name="msg_do_not_send_analytics_tracking">アプリ改善のための匿名統計情報を送信しない</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">FOSSバージョンのため、適用できません</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">ルーム名を %1$s から %2$s へ変更しました。</string> <string name="message_room_name_changed">ルーム名を %1$s から %2$s へ変更しました。</string>
<string name="message_user_added_by">%1$s がユーザー %2$s を追加しました。</string> <string name="message_user_added_by">%1$s がユーザー %2$s を追加しました。</string>
...@@ -302,7 +299,7 @@ ...@@ -302,7 +299,7 @@
<string name="status_disconnecting">切断</string> <string name="status_disconnecting">切断</string>
<string name="status_waiting">%d 秒間接続中</string> <string name="status_waiting">%d 秒間接続中</string>
<!--Suggestions--> <!-- Suggestions -->
<string name="suggest_all_description">このルームの全員に通知</string> <string name="suggest_all_description">このルームの全員に通知</string>
<string name="suggest_here_description">この部屋のアクティブユーザーに通知する</string> <string name="suggest_here_description">この部屋のアクティブユーザーに通知する</string>
...@@ -329,7 +326,7 @@ ...@@ -329,7 +326,7 @@
<string name="Guggy_Command_Description">提供されたテキストに基づいてgifを生成する</string> <string name="Guggy_Command_Description">提供されたテキストに基づいてgifを生成する</string>
<string name="Slash_Topic_Description">設定トピック</string> <string name="Slash_Topic_Description">設定トピック</string>
<!-- Emoji message--> <!-- Emoji messages -->
<string name="msg_no_recent_emoji">最近の絵文字はありません</string> <string name="msg_no_recent_emoji">最近の絵文字はありません</string>
<string name="alert_title_default_skin_tone">デフォルトスキントークン</string> <string name="alert_title_default_skin_tone">デフォルトスキントークン</string>
...@@ -342,18 +339,18 @@ ...@@ -342,18 +339,18 @@
<string name="msg_group_by_type">Group by type</string> <!-- TODO Translate --> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate --> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<!--ChatRooms Headers--> <!-- ChatRooms Headers -->
<string name="header_favorite">Favorites</string><!-- TODO - Add proper translation --> <string name="header_favorite">Favorites</string><!-- TODO - Add proper translation -->
<string name="msg_channels">チャンネル</string> <string name="msg_channels">チャンネル</string>
<string name="msg_users">Users</string> <!-- TODO Translate --> <string name="msg_users">Users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate --> <string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users_description">If you turn on, you can search for any user from others companies or servers.</string> <!-- TODO Translate --> <string name="msg_search_for_global_users_description">If you turn on, you can search for any user from other companies or servers.</string> <!-- TODO Translate -->
<string name="header_private_groups">プライベートグループ</string> <string name="header_private_groups">プライベートグループ</string>
<string name="header_direct_messages">ダイレクトメッセージ</string> <string name="header_direct_messages">ダイレクトメッセージ</string>
<string name="header_live_chats">ライブチャット</string> <string name="header_live_chats">ライブチャット</string>
<string name="header_unknown">不明</string> <string name="header_unknown">不明</string>
<!--Notifications--> <!-- Notifications -->
<string name="share_label">共有メッセージの編集</string> <string name="share_label">共有メッセージの編集</string>
<string name="notif_action_reply_hint">返信</string> <string name="notif_action_reply_hint">返信</string>
<string name="notif_error_sending">送信に失敗しました。もう一度お試しください。</string> <string name="notif_error_sending">送信に失敗しました。もう一度お試しください。</string>
...@@ -365,6 +362,8 @@ ...@@ -365,6 +362,8 @@
<!-- User Details --> <!-- User Details -->
<string name="timezone">Timezone</string> <!--TODO - Add proper translation--> <string name="timezone">Timezone</string> <!--TODO - Add proper translation-->
<string name="status">Status: %1$s</string> <!-- TODO Translate -->
<string name="user_detail_status">Status</string> <!-- TODO Translate -->
<!-- Report --> <!-- Report -->
<string name="submit">Submit</string> <!--TODO - Add proper translation--> <string name="submit">Submit</string> <!--TODO - Add proper translation-->
......
...@@ -70,6 +70,9 @@ ...@@ -70,6 +70,9 @@
<string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate --> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate --> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate --> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
<string name="msg_send_analytics_tracking">Envie estatísticas anônimas para ajudar a melhorar este app</string>
<string name="msg_do_not_send_analytics_tracking">Não envie estatísticas anônimas para ajudar a melhorar este app</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Não aplicável devido a versão do aplicativo ser FOSS</string>
<string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate --> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate --> <string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate --> <string name="msg_change_status">Change status</string> <!-- TODO Translate -->
...@@ -219,12 +222,6 @@ ...@@ -219,12 +222,6 @@
<string name="msg_member_not_found">Membro não encontrado</string> <string name="msg_member_not_found">Membro não encontrado</string>
<string name="msg_channel_created_successfully">Chat criado com sucesso</string> <string name="msg_channel_created_successfully">Chat criado com sucesso</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">Rastreamento de análises</string>
<string name="msg_send_analytics_tracking">Envie estatísticas anônimas para ajudar a melhorar este app</string>
<string name="msg_do_not_send_analytics_tracking">Não envie estatísticas anônimas para ajudar a melhorar este app</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Não aplicável devido a versão do aplicativo ser FOSS</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">Nome da sala alterado para: %1$s por %2$s</string> <string name="message_room_name_changed">Nome da sala alterado para: %1$s por %2$s</string>
<string name="message_user_added_by">Usuário %1$s adicionado por %2$s</string> <string name="message_user_added_by">Usuário %1$s adicionado por %2$s</string>
...@@ -301,7 +298,7 @@ ...@@ -301,7 +298,7 @@
<string name="status_disconnecting">Desconectando</string> <string name="status_disconnecting">Desconectando</string>
<string name="status_waiting">Conectando em %d segundos</string> <string name="status_waiting">Conectando em %d segundos</string>
<!--Suggestions--> <!-- Suggestions -->
<string name="suggest_all_description">Notifica todos nesta sala</string> <string name="suggest_all_description">Notifica todos nesta sala</string>
<string name="suggest_here_description">Notifica usuários ativos nesta sala</string> <string name="suggest_here_description">Notifica usuários ativos nesta sala</string>
...@@ -328,7 +325,7 @@ ...@@ -328,7 +325,7 @@
<string name="Guggy_Command_Description">Gera um gif baseado no texto dado</string> <string name="Guggy_Command_Description">Gera um gif baseado no texto dado</string>
<string name="Slash_Topic_Description">Definir tópico</string> <string name="Slash_Topic_Description">Definir tópico</string>
<!-- Emoji message--> <!-- Emoji messages -->
<string name="msg_no_recent_emoji">Nenhum emoji recente</string> <string name="msg_no_recent_emoji">Nenhum emoji recente</string>
<string name="alert_title_default_skin_tone">Tom de pele padrão</string> <string name="alert_title_default_skin_tone">Tom de pele padrão</string>
...@@ -341,18 +338,18 @@ ...@@ -341,18 +338,18 @@
<string name="msg_group_by_type">Agrupar por tipo</string> <string name="msg_group_by_type">Agrupar por tipo</string>
<string name="msg_group_by_favorites">Agrupar por favoritos</string> <string name="msg_group_by_favorites">Agrupar por favoritos</string>
<!--ChatRooms Headers--> <!-- ChatRooms Headers -->
<string name="header_favorite">Favoritos</string> <string name="header_favorite">Favoritos</string>
<string name="msg_channels">Canais</string> <string name="msg_channels">Canais</string>
<string name="msg_users">Usuários</string> <string name="msg_users">Usuários</string>
<string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate --> <string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users_description">If you turn on, you can search for any user from others companies or servers.</string> <!-- TODO Translate --> <string name="msg_search_for_global_users_description">If you turn on, you can search for any user from other companies or servers.</string> <!-- TODO Translate -->
<string name="header_private_groups">Grupos Privados</string> <string name="header_private_groups">Grupos Privados</string>
<string name="header_direct_messages">Mensagens diretas</string> <string name="header_direct_messages">Mensagens diretas</string>
<string name="header_live_chats">Live Chats</string> <string name="header_live_chats">Live Chats</string>
<string name="header_unknown">Desconhecido</string> <string name="header_unknown">Desconhecido</string>
<!--Notifications--> <!-- Notifications -->
<string name="share_label">Editar mensagem compartilhada</string> <string name="share_label">Editar mensagem compartilhada</string>
<string name="notif_action_reply_hint">RESPONDER</string> <string name="notif_action_reply_hint">RESPONDER</string>
<string name="notif_error_sending">Falha ao enviar a mensagem.</string> <string name="notif_error_sending">Falha ao enviar a mensagem.</string>
...@@ -365,6 +362,8 @@ ...@@ -365,6 +362,8 @@
<!-- User Details --> <!-- User Details -->
<string name="timezone">Fuso horário</string> <string name="timezone">Fuso horário</string>
<string name="status">Status: %1$s</string> <!-- TODO Translate -->
<string name="user_detail_status">Status</string> <!-- TODO Translate -->
<!-- Report --> <!-- Report -->
<string name="submit">Enviar</string> <string name="submit">Enviar</string>
......
...@@ -57,6 +57,8 @@ ...@@ -57,6 +57,8 @@
<string name="action_create_server">Crie um novo servidor</string> <string name="action_create_server">Crie um novo servidor</string>
<string name="action_register">Registar</string> <string name="action_register">Registar</string>
<string name="action_confirm">Confirmar</string> <string name="action_confirm">Confirmar</string>
<string name="action_favorite">Marcar chat como favorito</string>
<string name="action_remove_favorite">Desmarcar chat como favorito</string>
<!-- Settings messages --> <!-- Settings messages -->
<string name="msg_contact_us">Contact us</string> <!-- TODO Translate --> <string name="msg_contact_us">Contact us</string> <!-- TODO Translate -->
...@@ -68,6 +70,9 @@ ...@@ -68,6 +70,9 @@
<string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate --> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate --> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate --> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
<string name="msg_send_analytics_tracking">Enviar estatísticas anónimas para ajudar a melhorar esta aplicação</string>
<string name="msg_do_not_send_analytics_tracking">Não enviar estatísticas anónimas para ajudar a melhorar esta aplicação</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Não aplicável, visto ser uma versão FOSS</string>
<string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate --> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate --> <string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate --> <string name="msg_change_status">Change status</string> <!-- TODO Translate -->
...@@ -109,10 +114,11 @@ ...@@ -109,10 +114,11 @@
<string name="msg_check_your_email_to_reset_your_password">E-mail enviado! Verifique a sua caixa de entrada para repor a sua palavra-passe.</string> <string name="msg_check_your_email_to_reset_your_password">E-mail enviado! Verifique a sua caixa de entrada para repor a sua palavra-passe.</string>
<string name="msg_invalid_email">Por favor introduza um endereço de e-mail válido</string> <string name="msg_invalid_email">Por favor introduza um endereço de e-mail válido</string>
<string name="msg_new_user_agreement">Ao prosseguir, você concorda com os nossos \n%1$s e %2$s</string> <string name="msg_new_user_agreement">Ao prosseguir, você concorda com os nossos \n%1$s e %2$s</string>
<string name="msg_more_than_ninety_nine_unread_messages" translatable="false">99+</string>
<string name="msg_yesterday">Ontem</string> <string name="msg_yesterday">Ontem</string>
<string name="msg_today">Hoje</string> <string name="msg_today">Hoje</string>
<string name="msg_message">Mensagem</string> <string name="msg_message">Mensagem</string>
<string name="msg_video_call">Video call</string> <!-- TODO Translate -->
<string name="msg_join_video_call">Join video call</string> <!-- TODO Translate -->
<string name="msg_this_room_is_read_only">Esta sala é apenas de leitura</string> <string name="msg_this_room_is_read_only">Esta sala é apenas de leitura</string>
<string name="msg_invalid_2fa_code">Código 2FA inválido</string> <string name="msg_invalid_2fa_code">Código 2FA inválido</string>
<string name="msg_invalid_file">Ficheiro inválido</string> <string name="msg_invalid_file">Ficheiro inválido</string>
...@@ -191,6 +197,7 @@ ...@@ -191,6 +197,7 @@
<item quantity="one">%1$s reagiu com %2$s</item> <item quantity="one">%1$s reagiu com %2$s</item>
<item quantity="other">%1$s reagiram com %2$s</item> <item quantity="other">%1$s reagiram com %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Credentials saved successfully</string> <!-- TODO Translate -->
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation --> <string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation --> <string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
<string name="msg_server">Server</string> <!-- TODO Translate --> <string name="msg_server">Server</string> <!-- TODO Translate -->
...@@ -215,12 +222,6 @@ ...@@ -215,12 +222,6 @@
<string name="msg_view_less">mostrar menos</string> <string name="msg_view_less">mostrar menos</string>
<string name="msg_muted_on_this_channel">Você está silenciado neste canal</string> <string name="msg_muted_on_this_channel">Você está silenciado neste canal</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">Acompanhamento de análise</string>
<string name="msg_send_analytics_tracking">Enviar estatísticas anónimas para ajudar a melhorar esta aplicação</string>
<string name="msg_do_not_send_analytics_tracking">Não enviar estatísticas anónimas para ajudar a melhorar esta aplicação</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Não aplicável, visto ser uma versão FOSS</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">Nome da sala alterado para: %1$s por %2$s</string> <string name="message_room_name_changed">Nome da sala alterado para: %1$s por %2$s</string>
<string name="message_user_added_by">Utilizador %1$s adicionado por %2$s</string> <string name="message_user_added_by">Utilizador %1$s adicionado por %2$s</string>
...@@ -234,8 +235,7 @@ ...@@ -234,8 +235,7 @@
<string name="message_unmuted">Utilizador %2$s removeu o silêncio de %1$s</string> <string name="message_unmuted">Utilizador %2$s removeu o silêncio de %1$s</string>
<string name="message_role_add">%3$s deu estatuto de %2$s a %1$s</string> <string name="message_role_add">%3$s deu estatuto de %2$s a %1$s</string>
<string name="message_role_removed">%3$s retirou o estatuto de %2$s a %1$s</string> <string name="message_role_removed">%3$s retirou o estatuto de %2$s a %1$s</string>
<string name="action_favorite">Marcar chat como favorito</string> <string name="message_video_call_started">Video call started by %1$s</string> <!-- TODO Translate -->
<string name="action_remove_favorite">Desmarcar chat como favorito</string>
<!-- Message actions --> <!-- Message actions -->
<string name="action_msg_reply">Responder</string> <string name="action_msg_reply">Responder</string>
...@@ -298,7 +298,7 @@ ...@@ -298,7 +298,7 @@
<string name="status_disconnecting">A desligar</string> <string name="status_disconnecting">A desligar</string>
<string name="status_waiting">A ligar dentro de %d segundos</string> <string name="status_waiting">A ligar dentro de %d segundos</string>
<!--Suggestions--> <!-- Suggestions -->
<string name="suggest_all_description">Notifica todos os utilizadores nesta sala</string> <string name="suggest_all_description">Notifica todos os utilizadores nesta sala</string>
<string name="suggest_here_description">Notifica os utilizadores activos nesta sala</string> <string name="suggest_here_description">Notifica os utilizadores activos nesta sala</string>
...@@ -325,7 +325,7 @@ ...@@ -325,7 +325,7 @@
<string name="Guggy_Command_Description">Gera um GIF baseado no texto fornecido</string> <string name="Guggy_Command_Description">Gera um GIF baseado no texto fornecido</string>
<string name="Slash_Topic_Description">Define o tópico</string> <string name="Slash_Topic_Description">Define o tópico</string>
<!-- Emoji message--> <!-- Emoji messages -->
<string name="msg_no_recent_emoji">Nenhum emojis recente</string> <string name="msg_no_recent_emoji">Nenhum emojis recente</string>
<string name="alert_title_default_skin_tone">Tom de pele padrão</string> <string name="alert_title_default_skin_tone">Tom de pele padrão</string>
...@@ -338,18 +338,18 @@ ...@@ -338,18 +338,18 @@
<string name="msg_group_by_type">Group by type</string> <!-- TODO Translate --> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate --> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<!--ChatRooms Headers--> <!-- ChatRooms Headers -->
<string name="header_favorite">Favoritos</string> <string name="header_favorite">Favoritos</string>
<string name="msg_channels">Canais</string> <string name="msg_channels">Canais</string>
<string name="msg_users">Users</string> <!-- TODO Translate --> <string name="msg_users">Users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate --> <string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users_description">If you turn on, you can search for any user from others companies or servers.</string> <!-- TODO Translate --> <string name="msg_search_for_global_users_description">If you turn on, you can search for any user from other companies or servers.</string> <!-- TODO Translate -->
<string name="header_private_groups">Grupos Privados</string> <string name="header_private_groups">Grupos Privados</string>
<string name="header_direct_messages">Mensagens Directas</string> <string name="header_direct_messages">Mensagens Directas</string>
<string name="header_live_chats">Chats ao Vivo</string> <string name="header_live_chats">Chats ao Vivo</string>
<string name="header_unknown">Desconhecido</string> <string name="header_unknown">Desconhecido</string>
<!--Notifications--> <!-- Notifications -->
<string name="share_label">Editar mensagem partilhada</string> <string name="share_label">Editar mensagem partilhada</string>
<string name="notif_action_reply_hint">RESPONDER</string> <string name="notif_action_reply_hint">RESPONDER</string>
<string name="notif_error_sending">A resposta falhou. Tente novamente.</string> <string name="notif_error_sending">A resposta falhou. Tente novamente.</string>
...@@ -358,11 +358,10 @@ ...@@ -358,11 +358,10 @@
<string name="message_information_title">Informação da Mensagem</string> <string name="message_information_title">Informação da Mensagem</string>
<string name="message_room_changed_privacy">Tipo de sala alterado para: %1$s por %2$s</string> <string name="message_room_changed_privacy">Tipo de sala alterado para: %1$s por %2$s</string>
<string name="foss" translatable="false">(FOSS)</string>
<!-- User Details --> <!-- User Details -->
<string name="timezone">Fuso Horário</string> <string name="timezone">Fuso Horário</string>
<string name="status">Estado: %1$s</string> <string name="status">Estado: %1$s</string>
<string name="user_detail_status">Status</string> <!-- TODO Translate -->
<!-- Report --> <!-- Report -->
<string name="submit">Enviar</string> <string name="submit">Enviar</string>
......
...@@ -70,6 +70,9 @@ ...@@ -70,6 +70,9 @@
<string name="msg_app_version">Версия программы: %1$s (%2$d)</string> <string name="msg_app_version">Версия программы: %1$s (%2$d)</string>
<string name="msg_server_version">Версия сервера: %1$s</string> <string name="msg_server_version">Версия сервера: %1$s</string>
<string name="msg_send_analytics">Отправка аналитики</string> <string name="msg_send_analytics">Отправка аналитики</string>
<string name="msg_send_analytics_tracking">Отправлять анонимную статистику для улучшения приложения.</string>
<string name="msg_do_not_send_analytics_tracking">Не отправлять анонимную статистику для улучшения приложения</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Не применимо, так как это FOSS версия</string>
<string name="msg_logout_from_rocket_chat">Выйти из Rocket.Chat</string> <string name="msg_logout_from_rocket_chat">Выйти из Rocket.Chat</string>
<string name="msg_delete_account">Удалить аккаунт</string> <string name="msg_delete_account">Удалить аккаунт</string>
<string name="msg_change_status">Изменить статус</string> <string name="msg_change_status">Изменить статус</string>
...@@ -217,12 +220,6 @@ ...@@ -217,12 +220,6 @@
<string name="msg_member_not_found">Пользователь не найден</string> <string name="msg_member_not_found">Пользователь не найден</string>
<string name="msg_channel_created_successfully">Канал создан успешно</string> <string name="msg_channel_created_successfully">Канал создан успешно</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">Отслеживание аналитики</string>
<string name="msg_send_analytics_tracking">Отправлять анонимную статистику для улучшения приложения.</string>
<string name="msg_do_not_send_analytics_tracking">Не отправлять анонимную статистику для улучшения приложения</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Не применимо, так как это FOSS версия</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">%2$s изменил название канала на %1$s</string> <string name="message_room_name_changed">%2$s изменил название канала на %1$s</string>
<string name="message_user_added_by">Пользователь %1$s добавлен пользователем %2$s</string> <string name="message_user_added_by">Пользователь %1$s добавлен пользователем %2$s</string>
...@@ -299,7 +296,7 @@ ...@@ -299,7 +296,7 @@
<string name="status_disconnecting">Отключаемся…</string> <string name="status_disconnecting">Отключаемся…</string>
<string name="status_waiting">Соединение через %d секунд</string> <string name="status_waiting">Соединение через %d секунд</string>
<!--Suggestions--> <!-- Suggestions -->
<string name="suggest_all_description">Уведомить всех в этом чате</string> <string name="suggest_all_description">Уведомить всех в этом чате</string>
<string name="suggest_here_description">Уведомить всех активных пользователей в этом чате</string> <string name="suggest_here_description">Уведомить всех активных пользователей в этом чате</string>
...@@ -326,7 +323,7 @@ ...@@ -326,7 +323,7 @@
<string name="Guggy_Command_Description">Создает gif на основе предоставленного текста</string> <string name="Guggy_Command_Description">Создает gif на основе предоставленного текста</string>
<string name="Slash_Topic_Description">Задать тему</string> <string name="Slash_Topic_Description">Задать тему</string>
<!-- Emoji message--> <!-- Emoji messages -->
<string name="msg_no_recent_emoji">Пусто</string> <string name="msg_no_recent_emoji">Пусто</string>
<string name="alert_title_default_skin_tone">Тон кожи по умолчанию</string> <string name="alert_title_default_skin_tone">Тон кожи по умолчанию</string>
...@@ -339,7 +336,7 @@ ...@@ -339,7 +336,7 @@
<string name="msg_group_by_type">Группировать по типу</string> <string name="msg_group_by_type">Группировать по типу</string>
<string name="msg_group_by_favorites">Группировать по избранному</string> <string name="msg_group_by_favorites">Группировать по избранному</string>
<!--ChatRooms Headers--> <!-- ChatRooms Headers -->
<string name="header_favorite">Избранные</string> <string name="header_favorite">Избранные</string>
<string name="msg_channels">Каналы</string> <string name="msg_channels">Каналы</string>
<string name="msg_users">Пользователи</string> <string name="msg_users">Пользователи</string>
...@@ -350,7 +347,7 @@ ...@@ -350,7 +347,7 @@
<string name="header_live_chats">Живые чаты</string> <string name="header_live_chats">Живые чаты</string>
<string name="header_unknown">Неизвестные</string> <string name="header_unknown">Неизвестные</string>
<!--Notifications--> <!-- Notifications -->
<string name="share_label">Редактировать сообщение</string> <string name="share_label">Редактировать сообщение</string>
<string name="notif_action_reply_hint">ОТВЕТИТЬ</string> <string name="notif_action_reply_hint">ОТВЕТИТЬ</string>
<string name="notif_error_sending">Не удалось ответить. Пожалуйста, попробуйте еще раз.</string> <string name="notif_error_sending">Не удалось ответить. Пожалуйста, попробуйте еще раз.</string>
...@@ -362,6 +359,8 @@ ...@@ -362,6 +359,8 @@
<!-- User Details --> <!-- User Details -->
<string name="timezone">Часовой пояс</string> <string name="timezone">Часовой пояс</string>
<string name="status">Статус: %1$s</string>
<string name="user_detail_status">Статус</string>
<!-- Report --> <!-- Report -->
<string name="submit">Отправить</string> <string name="submit">Отправить</string>
......
...@@ -70,6 +70,9 @@ ...@@ -70,6 +70,9 @@
<string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate --> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate --> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate --> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
<string name="msg_send_analytics_tracking">Uygulamanın gelişmesine katkıda bulunmak için anonim istatistik bilgisi gönder</string>
<string name="msg_do_not_send_analytics_tracking">Uygulamanın gelişmesine katkıda bulunmak için anonim istatistik bilgisi gönderme</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">FOSS sürümü olduğundan uygulanabilir değil</string>
<string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate --> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate --> <string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate --> <string name="msg_change_status">Change status</string> <!-- TODO Translate -->
...@@ -220,12 +223,6 @@ ...@@ -220,12 +223,6 @@
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate --> <string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<string name="msg_directory">Directory</string> <!-- TODO Translate --> <string name="msg_directory">Directory</string> <!-- TODO Translate -->
<!-- Preferences messages -->
<string name="msg_analytics_tracking">İstatistik takibi</string>
<string name="msg_send_analytics_tracking">Uygulamanın gelişmesine katkıda bulunmak için anonim istatistik bilgisi gönder</string>
<string name="msg_do_not_send_analytics_tracking">Uygulamanın gelişmesine katkıda bulunmak için anonim istatistik bilgisi gönderme</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">FOSS sürümü olduğundan uygulanabilir değil</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">Oda ismi %2$s\'dan %1$s\'a değiştirildi</string> <string name="message_room_name_changed">Oda ismi %2$s\'dan %1$s\'a değiştirildi</string>
<string name="message_user_added_by">%1$s kullanıcısı %2$s tarafından eklendi</string> <string name="message_user_added_by">%1$s kullanıcısı %2$s tarafından eklendi</string>
...@@ -303,7 +300,7 @@ ...@@ -303,7 +300,7 @@
<string name="status_disconnecting">Bağlantı kesiliyor</string> <string name="status_disconnecting">Bağlantı kesiliyor</string>
<string name="status_waiting">%d saniye içinde bağlanılacak</string> <string name="status_waiting">%d saniye içinde bağlanılacak</string>
<!--Suggestions--> <!-- Suggestions -->
<string name="suggest_all_description">Bu odadaki herkese bildir</string> <string name="suggest_all_description">Bu odadaki herkese bildir</string>
<string name="suggest_here_description">Bu odadaki aktif kullanıcılara bildir</string> <string name="suggest_here_description">Bu odadaki aktif kullanıcılara bildir</string>
...@@ -330,7 +327,7 @@ ...@@ -330,7 +327,7 @@
<string name="Guggy_Command_Description">Belirlenen yazıya göre gif oluşturur</string> <string name="Guggy_Command_Description">Belirlenen yazıya göre gif oluşturur</string>
<string name="Slash_Topic_Description">Konuyu belirle</string> <string name="Slash_Topic_Description">Konuyu belirle</string>
<!-- Emoji message--> <!-- Emoji messages -->
<string name="msg_no_recent_emoji">Son kullanılan emoji bulunmamaktadır</string> <string name="msg_no_recent_emoji">Son kullanılan emoji bulunmamaktadır</string>
<string name="alert_title_default_skin_tone">Varsayılan tasarım tonu</string> <string name="alert_title_default_skin_tone">Varsayılan tasarım tonu</string>
...@@ -343,18 +340,18 @@ ...@@ -343,18 +340,18 @@
<string name="msg_group_by_type">Group by type</string> <!-- TODO Translate --> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate --> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<!--ChatRooms Headers--> <!-- ChatRooms Headers -->
<string name="header_favorite">Favorites</string><!-- TODO - Add proper translation --> <string name="header_favorite">Favorites</string><!-- TODO - Add proper translation -->
<string name="msg_channels">Kanallar</string> <string name="msg_channels">Kanallar</string>
<string name="msg_users">Users</string> <!-- TODO Translate --> <string name="msg_users">Users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate --> <string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users_description">If you turn on, you can search for any user from others companies or servers.</string> <!-- TODO Translate --> <string name="msg_search_for_global_users_description">If you turn on, you can search for any user from other companies or servers.</string> <!-- TODO Translate -->
<string name="header_private_groups">Gizli Gruplar</string> <string name="header_private_groups">Gizli Gruplar</string>
<string name="header_direct_messages">Direkt Mesajlar</string> <string name="header_direct_messages">Direkt Mesajlar</string>
<string name="header_live_chats">Canlı Sohbetler</string> <string name="header_live_chats">Canlı Sohbetler</string>
<string name="header_unknown">Bilinmeyen</string> <string name="header_unknown">Bilinmeyen</string>
<!--Notifications--> <!-- Notifications -->
<string name="share_label">Paylaşılan mesajı düzenle</string> <string name="share_label">Paylaşılan mesajı düzenle</string>
<string name="notif_action_reply_hint">YANITLA</string> <string name="notif_action_reply_hint">YANITLA</string>
<string name="notif_error_sending">Yanıtlama başarısız oldu. Lütfen, tekrar deneyiniz.</string> <string name="notif_error_sending">Yanıtlama başarısız oldu. Lütfen, tekrar deneyiniz.</string>
...@@ -365,6 +362,8 @@ ...@@ -365,6 +362,8 @@
<!-- User Details --> <!-- User Details -->
<string name="timezone">Timezone</string> <!--TODO - Add proper translation--> <string name="timezone">Timezone</string> <!--TODO - Add proper translation-->
<string name="status">Status: %1$s</string> <!-- TODO Translate -->
<string name="user_detail_status">Status</string> <!-- TODO Translate -->
<!-- Report --> <!-- Report -->
<string name="submit">Submit</string> <!--TODO - Add proper translation--> <string name="submit">Submit</string> <!--TODO - Add proper translation-->
......
...@@ -70,6 +70,9 @@ ...@@ -70,6 +70,9 @@
<string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate --> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate --> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate --> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
<string name="msg_send_analytics_tracking">Надсилати анонімну статистику для покращення роботи програми</string>
<string name="msg_do_not_send_analytics_tracking">Не надсилати анонімну статистику для покращення роботи програми</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Недоступно у FOSS версії</string>
<string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate --> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate --> <string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate --> <string name="msg_change_status">Change status</string> <!-- TODO Translate -->
...@@ -216,12 +219,6 @@ ...@@ -216,12 +219,6 @@
<string name="msg_member_not_found">"Користувача не знайдено "</string> <string name="msg_member_not_found">"Користувача не знайдено "</string>
<string name="msg_channel_created_successfully">Канал був створений успішно</string> <string name="msg_channel_created_successfully">Канал був створений успішно</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">Збір аналітики</string>
<string name="msg_send_analytics_tracking">Надсилати анонімну статистику для покращення роботи програми</string>
<string name="msg_do_not_send_analytics_tracking">Не надсилати анонімну статистику для покращення роботи програми</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Недоступно у FOSS версії</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">%2$s змінив назву каналу на %1$s</string> <string name="message_room_name_changed">%2$s змінив назву каналу на %1$s</string>
<string name="message_user_added_by">Користувач %2$s додав користувача %1$s</string> <string name="message_user_added_by">Користувач %2$s додав користувача %1$s</string>
...@@ -298,7 +295,7 @@ ...@@ -298,7 +295,7 @@
<string name="status_disconnecting">Відключаємося…</string> <string name="status_disconnecting">Відключаємося…</string>
<string name="status_waiting">З\'єднання через %d секунд</string> <string name="status_waiting">З\'єднання через %d секунд</string>
<!--Suggestions--> <!-- Suggestions -->
<string name="suggest_all_description">Повідомити всіх у цьому чаті</string> <string name="suggest_all_description">Повідомити всіх у цьому чаті</string>
<string name="suggest_here_description">Повідомити всіх активних користувачів у цьому чаті</string> <string name="suggest_here_description">Повідомити всіх активних користувачів у цьому чаті</string>
...@@ -325,7 +322,7 @@ ...@@ -325,7 +322,7 @@
<string name="Guggy_Command_Description">Створює gif використовуючи наданий текст</string> <string name="Guggy_Command_Description">Створює gif використовуючи наданий текст</string>
<string name="Slash_Topic_Description">Встановити тему</string> <string name="Slash_Topic_Description">Встановити тему</string>
<!-- Emoji message--> <!-- Emoji messages -->
<string name="msg_no_recent_emoji">Пусто</string> <string name="msg_no_recent_emoji">Пусто</string>
<string name="alert_title_default_skin_tone">Тон шкіри за замовчуванням</string> <string name="alert_title_default_skin_tone">Тон шкіри за замовчуванням</string>
...@@ -338,18 +335,18 @@ ...@@ -338,18 +335,18 @@
<string name="msg_group_by_type">Group by type</string> <!-- TODO Translate --> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate --> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<!--ChatRooms Headers--> <!-- ChatRooms Headers -->
<string name="header_favorite">Favorites</string><!-- TODO - Add proper translation --> <string name="header_favorite">Favorites</string><!-- TODO - Add proper translation -->
<string name="msg_channels">Канали</string> <string name="msg_channels">Канали</string>
<string name="msg_users">Users</string> <!-- TODO Translate --> <string name="msg_users">Users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate --> <string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users_description">If you turn on, you can search for any user from others companies or servers.</string> <!-- TODO Translate --> <string name="msg_search_for_global_users_description">If you turn on, you can search for any user from other companies or servers.</string> <!-- TODO Translate -->
<string name="header_private_groups">Приватні канали</string> <string name="header_private_groups">Приватні канали</string>
<string name="header_direct_messages">Особисті повідомлення</string> <string name="header_direct_messages">Особисті повідомлення</string>
<string name="header_live_chats">Живі чати</string> <string name="header_live_chats">Живі чати</string>
<string name="header_unknown">Невідомі</string> <string name="header_unknown">Невідомі</string>
<!--Notifications--> <!-- Notifications -->
<string name="share_label">Редагувати повідомлення</string> <string name="share_label">Редагувати повідомлення</string>
<string name="notif_action_reply_hint">ВІДПОВІСТИ</string> <string name="notif_action_reply_hint">ВІДПОВІСТИ</string>
<string name="notif_error_sending">Не вдалося відповісти. Будь ласка, спробуйте ще раз.</string> <string name="notif_error_sending">Не вдалося відповісти. Будь ласка, спробуйте ще раз.</string>
...@@ -362,6 +359,8 @@ ...@@ -362,6 +359,8 @@
<!-- User Details --> <!-- User Details -->
<string name="timezone">Timezone</string> <string name="timezone">Timezone</string>
<string name="status">Status: %1$s</string> <!-- TODO Translate -->
<string name="user_detail_status">Status</string> <!-- TODO Translate -->
<!-- Report --> <!-- Report -->
<string name="submit">Submit</string> <!-- TODO - Add proper translation --> <string name="submit">Submit</string> <!-- TODO - Add proper translation -->
......
...@@ -70,6 +70,9 @@ ...@@ -70,6 +70,9 @@
<string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate --> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate --> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate --> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
<string name="msg_send_analytics_tracking">发送匿名统计信息来帮助改善App</string>
<string name="msg_do_not_send_analytics_tracking">不要发送匿名统计信息,我不想帮组改善App</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">不适用,因为这事开源软件</string>
<string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate --> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate --> <string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate --> <string name="msg_change_status">Change status</string> <!-- TODO Translate -->
...@@ -217,12 +220,6 @@ ...@@ -217,12 +220,6 @@
<string name="msg_view_less">显示更少</string> <string name="msg_view_less">显示更少</string>
<string name="msg_muted_on_this_channel">您被禁言了</string> <string name="msg_muted_on_this_channel">您被禁言了</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">跟踪分析</string>
<string name="msg_send_analytics_tracking">发送匿名统计信息来帮助改善App</string>
<string name="msg_do_not_send_analytics_tracking">不要发送匿名统计信息,我不想帮组改善App</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">不适用,因为这事开源软件</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">频道名改为: %1$s by %2$s</string> <string name="message_room_name_changed">频道名改为: %1$s by %2$s</string>
<string name="message_user_added_by">%2$s增加了用户%1$s </string> <string name="message_user_added_by">%2$s增加了用户%1$s </string>
...@@ -299,7 +296,7 @@ ...@@ -299,7 +296,7 @@
<string name="status_disconnecting">断线中</string> <string name="status_disconnecting">断线中</string>
<string name="status_waiting">连接持续了 %d 秒</string> <string name="status_waiting">连接持续了 %d 秒</string>
<!--Suggestions--> <!-- Suggestions -->
<string name="suggest_all_description">提醒频道内所有人</string> <string name="suggest_all_description">提醒频道内所有人</string>
<string name="suggest_here_description">提醒频道内在线的人</string> <string name="suggest_here_description">提醒频道内在线的人</string>
...@@ -326,7 +323,7 @@ ...@@ -326,7 +323,7 @@
<string name="Guggy_Command_Description">根据文本生成GIF</string> <string name="Guggy_Command_Description">根据文本生成GIF</string>
<string name="Slash_Topic_Description">设定主题</string> <string name="Slash_Topic_Description">设定主题</string>
<!-- Emoji message--> <!-- Emoji messages -->
<string name="msg_no_recent_emoji">没有最近的emojis</string> <string name="msg_no_recent_emoji">没有最近的emojis</string>
<string name="alert_title_default_skin_tone">默认皮肤颜色</string> <string name="alert_title_default_skin_tone">默认皮肤颜色</string>
...@@ -339,18 +336,18 @@ ...@@ -339,18 +336,18 @@
<string name="msg_group_by_type">Group by type</string> <!-- TODO Translate --> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate --> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<!--ChatRooms Headers--> <!-- ChatRooms Headers -->
<string name="header_favorite">Favorites</string><!-- TODO - Add proper translation --> <string name="header_favorite">Favorites</string><!-- TODO - Add proper translation -->
<string name="msg_channels">频道</string> <string name="msg_channels">频道</string>
<string name="msg_users">Users</string> <!-- TODO Translate --> <string name="msg_users">Users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate --> <string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users_description">If you turn on, you can search for any user from others companies or servers.</string> <!-- TODO Translate --> <string name="msg_search_for_global_users_description">If you turn on, you can search for any user from other companies or servers.</string> <!-- TODO Translate -->
<string name="header_private_groups">私人组</string> <string name="header_private_groups">私人组</string>
<string name="header_direct_messages">直接对话</string> <string name="header_direct_messages">直接对话</string>
<string name="header_live_chats">Live 对话</string> <string name="header_live_chats">Live 对话</string>
<string name="header_unknown">未知</string> <string name="header_unknown">未知</string>
<!--Notifications--> <!-- Notifications -->
<string name="share_label">编辑分享的消息</string> <string name="share_label">编辑分享的消息</string>
<string name="notif_action_reply_hint">回复</string> <string name="notif_action_reply_hint">回复</string>
<string name="notif_error_sending">回复失败,请重试.</string> <string name="notif_error_sending">回复失败,请重试.</string>
...@@ -359,11 +356,10 @@ ...@@ -359,11 +356,10 @@
<string name="message_information_title">消息信息</string> <string name="message_information_title">消息信息</string>
<string name="message_room_changed_privacy">频道类型更改为: %1$s by %2$s</string> <string name="message_room_changed_privacy">频道类型更改为: %1$s by %2$s</string>
<string name="foss" translatable="false">(开源)</string>
<!-- User Details --> <!-- User Details -->
<string name="timezone">时区</string> <string name="timezone">时区</string>
<string name="status" translatable="false">状态: %1$s</string> <string name="status">状态: %1$s</string>
<string name="user_detail_status">Status</string> <!-- TODO Translate -->
<!-- Report --> <!-- Report -->
<string name="submit">提交</string> <string name="submit">提交</string>
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
<string name="title_license">許可</string> <string name="title_license">許可</string>
<string name="title_are_you_sure">確定嗎?</string> <string name="title_are_you_sure">確定嗎?</string>
<string name="title_channel_details">頻道訊息</string> <string name="title_channel_details">頻道訊息</string>
<string name="title_choose_language">Choose Language</string> <!-- TODO Translate -->
<string name="title_topic">主題</string> <string name="title_topic">主題</string>
<string name="title_announcement">公告</string> <string name="title_announcement">公告</string>
<string name="title_description">描述</string> <string name="title_description">描述</string>
...@@ -69,6 +70,9 @@ ...@@ -69,6 +70,9 @@
<string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate --> <string name="msg_app_version">Version: %1$s (%2$d)</string> <!-- TODO Translate -->
<string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate --> <string name="msg_server_version">Server version: %1$s</string> <!-- TODO Translate -->
<string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate --> <string name="msg_send_analytics">Send analytics</string> <!-- TODO Translate -->
<string name="msg_send_analytics_tracking">發送匿名訊息來改善App</string>
<string name="msg_do_not_send_analytics_tracking">不要發送匿名訊息,我不想幫助這個App</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">不適用,因為這個軟體是Foss版本</string>
<string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate --> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <!-- TODO Translate -->
<string name="msg_delete_account">Delete account</string> <!-- TODO Translate --> <string name="msg_delete_account">Delete account</string> <!-- TODO Translate -->
<string name="msg_change_status">Change status</string> <!-- TODO Translate --> <string name="msg_change_status">Change status</string> <!-- TODO Translate -->
...@@ -197,12 +201,6 @@ ...@@ -197,12 +201,6 @@
<string name="msg_view_less">顯示更少</string> <string name="msg_view_less">顯示更少</string>
<string name="msg_muted_on_this_channel">您被禁言了</string> <string name="msg_muted_on_this_channel">您被禁言了</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">追蹤分析</string>
<string name="msg_send_analytics_tracking">發送匿名訊息來改善App</string>
<string name="msg_do_not_send_analytics_tracking">不要發送匿名訊息,我不想幫助這個App</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">不適用,因為這個軟體是Foss版本</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">頻道已經改名為: %1$s by %2$s</string> <string name="message_room_name_changed">頻道已經改名為: %1$s by %2$s</string>
<string name="message_user_added_by">%2$s增加了新的成員%1$s </string> <string name="message_user_added_by">%2$s增加了新的成員%1$s </string>
...@@ -279,7 +277,7 @@ ...@@ -279,7 +277,7 @@
<string name="status_disconnecting">斷線中</string> <string name="status_disconnecting">斷線中</string>
<string name="status_waiting">連線持續了 %d 秒</string> <string name="status_waiting">連線持續了 %d 秒</string>
<!--Suggestions--> <!-- Suggestions -->
<string name="suggest_all_description">提醒頻道內所有成員</string> <string name="suggest_all_description">提醒頻道內所有成員</string>
<string name="suggest_here_description">提醒頻道內所有在線上的成員</string> <string name="suggest_here_description">提醒頻道內所有在線上的成員</string>
...@@ -306,7 +304,7 @@ ...@@ -306,7 +304,7 @@
<string name="Guggy_Command_Description">根據輸入訊息產生GIF</string> <string name="Guggy_Command_Description">根據輸入訊息產生GIF</string>
<string name="Slash_Topic_Description">設定主題</string> <string name="Slash_Topic_Description">設定主題</string>
<!-- Emoji message--> <!-- Emoji messages -->
<string name="msg_no_recent_emoji">最近沒有使用emojis</string> <string name="msg_no_recent_emoji">最近沒有使用emojis</string>
<string name="alert_title_default_skin_tone">預設主題顏色</string> <string name="alert_title_default_skin_tone">預設主題顏色</string>
...@@ -319,18 +317,18 @@ ...@@ -319,18 +317,18 @@
<string name="msg_group_by_type">Group by type</string> <!-- TODO Translate --> <string name="msg_group_by_type">Group by type</string> <!-- TODO Translate -->
<string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate --> <string name="msg_group_by_favorites">Group by favorites</string> <!-- TODO Translate -->
<!--ChatRooms Headers--> <!-- ChatRooms Headers -->
<string name="header_favorite">Favorites</string><!-- TODO - Add proper translation --> <string name="header_favorite">Favorites</string><!-- TODO - Add proper translation -->
<string name="msg_channels">頻道</string> <string name="msg_channels">頻道</string>
<string name="msg_users">Users</string> <!-- TODO Translate --> <string name="msg_users">Users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate --> <string name="msg_search_for_global_users">Search for global users</string> <!-- TODO Translate -->
<string name="msg_search_for_global_users_description">If you turn on, you can search for any user from others companies or servers.</string> <!-- TODO Translate --> <string name="msg_search_for_global_users_description">If you turn on, you can search for any user from other companies or servers.</string> <!-- TODO Translate -->
<string name="header_private_groups">私人群組</string> <string name="header_private_groups">私人群組</string>
<string name="header_direct_messages">直接對話</string> <string name="header_direct_messages">直接對話</string>
<string name="header_live_chats">Live 對話</string> <string name="header_live_chats">Live 對話</string>
<string name="header_unknown">未知</string> <string name="header_unknown">未知</string>
<!--Notifications--> <!-- Notifications -->
<string name="share_label">編輯分享的訊息</string> <string name="share_label">編輯分享的訊息</string>
<string name="notif_action_reply_hint">回覆</string> <string name="notif_action_reply_hint">回覆</string>
<string name="notif_error_sending">回覆失敗,請重試.</string> <string name="notif_error_sending">回覆失敗,請重試.</string>
...@@ -339,11 +337,10 @@ ...@@ -339,11 +337,10 @@
<string name="message_information_title">消息訊息</string> <string name="message_information_title">消息訊息</string>
<string name="message_room_changed_privacy">頻道類型更改為: %1$s by %2$s</string> <string name="message_room_changed_privacy">頻道類型更改為: %1$s by %2$s</string>
<string name="foss" translatable="false">(FOSS)</string>
<!-- User Details --> <!-- User Details -->
<string name="timezone">時區</string> <string name="timezone">時區</string>
<string name="status" translatable="false">狀態: %1$s</string> <string name="status">狀態: %1$s</string>
<string name="user_detail_status">Status</string> <!-- TODO Translate -->
<!-- Report --> <!-- Report -->
<string name="submit">提交</string> <string name="submit">提交</string>
......
...@@ -82,6 +82,9 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -82,6 +82,9 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string name="msg_app_version">Version: %1$s (%2$d)</string> <string name="msg_app_version">Version: %1$s (%2$d)</string>
<string name="msg_server_version">Server version: %1$s</string> <string name="msg_server_version">Server version: %1$s</string>
<string name="msg_send_analytics">Send analytics</string> <string name="msg_send_analytics">Send analytics</string>
<string name="msg_send_analytics_tracking">Send anonymous statistics to help improve this app</string>
<string name="msg_do_not_send_analytics_tracking">Do not send anonymous statistics to help improve this app</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Not applicable since it is a FOSS version</string>
<string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string> <string name="msg_logout_from_rocket_chat">Logout from Rocket.Chat</string>
<string name="msg_delete_account">Delete account</string> <string name="msg_delete_account">Delete account</string>
<string name="msg_change_status">Change status</string> <string name="msg_change_status">Change status</string>
...@@ -233,12 +236,6 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -233,12 +236,6 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string name="msg_view_less">view less</string> <string name="msg_view_less">view less</string>
<string name="msg_muted_on_this_channel">You are muted on this channel</string> <string name="msg_muted_on_this_channel">You are muted on this channel</string>
<!-- Preferences messages -->
<string name="msg_analytics_tracking">Analytics tracking</string>
<string name="msg_send_analytics_tracking">Send anonymous statistics to help improve this app</string>
<string name="msg_do_not_send_analytics_tracking">Do not send anonymous statistics to help improve this app</string>
<string name="msg_not_applicable_since_it_is_a_foss_version">Not applicable since it is a FOSS version</string>
<!-- System messages --> <!-- System messages -->
<string name="message_room_name_changed">Room name changed to: %1$s by %2$s</string> <string name="message_room_name_changed">Room name changed to: %1$s by %2$s</string>
<string name="message_user_added_by">User %1$s added by %2$s</string> <string name="message_user_added_by">User %1$s added by %2$s</string>
...@@ -315,7 +312,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -315,7 +312,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string name="status_disconnecting">Disconnecting</string> <string name="status_disconnecting">Disconnecting</string>
<string name="status_waiting">Connecting in %d seconds</string> <string name="status_waiting">Connecting in %d seconds</string>
<!--Suggestions--> <!-- Suggestions -->
<string name="suggest_all_description">Notify all in this room</string> <string name="suggest_all_description">Notify all in this room</string>
<string name="suggest_here_description">Notify active users in this room</string> <string name="suggest_here_description">Notify active users in this room</string>
...@@ -342,7 +339,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -342,7 +339,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string name="Guggy_Command_Description">Generates a gif based upon the provided text</string> <string name="Guggy_Command_Description">Generates a gif based upon the provided text</string>
<string name="Slash_Topic_Description">Set topic</string> <string name="Slash_Topic_Description">Set topic</string>
<!-- Emoji message--> <!-- Emoji messages -->
<string name="msg_no_recent_emoji">No recent emojis</string> <string name="msg_no_recent_emoji">No recent emojis</string>
<string name="alert_title_default_skin_tone">Default skin tone</string> <string name="alert_title_default_skin_tone">Default skin tone</string>
...@@ -355,18 +352,18 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -355,18 +352,18 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string name="msg_group_by_type">Group by type</string> <string name="msg_group_by_type">Group by type</string>
<string name="msg_group_by_favorites">Group by favorites</string> <string name="msg_group_by_favorites">Group by favorites</string>
<!--ChatRooms Headers--> <!-- ChatRooms Headers -->
<string name="header_favorite">Favorites</string> <string name="header_favorite">Favorites</string>
<string name="msg_channels">Channels</string> <string name="msg_channels">Channels</string>
<string name="msg_users">Users</string> <string name="msg_users">Users</string>
<string name="msg_search_for_global_users">Search for global users</string> <string name="msg_search_for_global_users">Search for global users</string>
<string name="msg_search_for_global_users_description">If you turn on, you can search for any user from others companies or servers.</string> <string name="msg_search_for_global_users_description">If you turn on, you can search for any user from other companies or servers.</string>
<string name="header_private_groups">Private Groups</string> <string name="header_private_groups">Private Groups</string>
<string name="header_direct_messages">Direct Messages</string> <string name="header_direct_messages">Direct Messages</string>
<string name="header_live_chats">Live Chats</string> <string name="header_live_chats">Live Chats</string>
<string name="header_unknown">Unknown</string> <string name="header_unknown">Unknown</string>
<!--Notifications--> <!-- Notifications -->
<string name="share_label">Edit shared message</string> <string name="share_label">Edit shared message</string>
<string name="notif_action_reply_hint">REPLY</string> <string name="notif_action_reply_hint">REPLY</string>
<string name="notif_error_sending">Reply has failed. Please try again.</string> <string name="notif_error_sending">Reply has failed. Please try again.</string>
...@@ -379,8 +376,8 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -379,8 +376,8 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<!-- User Details --> <!-- User Details -->
<string name="timezone">Timezone</string> <string name="timezone">Timezone</string>
<string name="status" translatable="false">Status: %1$s</string> <string name="status">Status: %1$s</string>
<string name="user_detail_status" translatable="false">Status</string> <string name="user_detail_status">Status</string>
<!-- Report --> <!-- Report -->
<string name="submit">Submit</string> <string name="submit">Submit</string>
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
<item name="searchViewStyle">@style/ChatRoom.SearchView</item> <item name="searchViewStyle">@style/ChatRoom.SearchView</item>
<item name="actionModeBackground">@color/colorPrimary</item> <item name="actionModeBackground">@color/colorPrimary</item>
<item name="android:actionModeBackground">@color/colorPrimary</item> <item name="android:actionModeBackground">@color/colorPrimary</item>
<item name="android:textDirection">locale</item>
</style> </style>
<!-- Widget styles. --> <!-- Widget styles. -->
......
<lint> <lint>
<issue id="InvalidPackage"> <issue id="InvalidPackage">
<ignore path="**/dropbox*.jar"/> <!--For Jitsi --> <ignore path="**/dropbox*.jar"/> <!-- For Jitsi -->
</issue> </issue>
</lint> </lint>
\ No newline at end of file
...@@ -95,11 +95,11 @@ ...@@ -95,11 +95,11 @@
<property name="tokens" value="COMMA"/> <property name="tokens" value="COMMA"/>
<property name="option" value="EOL"/> <property name="option" value="EOL"/>
</module> </module>
<!-- TODO module name="PackageName"> <!-- TODO <module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/> <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
<message key="name.invalidPattern" <message key="name.invalidPattern"
value="Package name ''{0}'' must match pattern ''{1}''."/> value="Package name ''{0}'' must match pattern ''{1}''."/>
</module--> </module>-->
<module name="TypeName"> <module name="TypeName">
<message key="name.invalidPattern" <message key="name.invalidPattern"
value="Type name ''{0}'' must match pattern ''{1}''."/> value="Type name ''{0}'' must match pattern ''{1}''."/>
...@@ -162,16 +162,16 @@ ...@@ -162,16 +162,16 @@
</module> </module>
<module name="AbbreviationAsWordInName"> <module name="AbbreviationAsWordInName">
<property name="ignoreFinal" value="false"/> <property name="ignoreFinal" value="false"/>
<!-- TODO property name="allowedAbbreviationLength" value="1"/--> <!-- TODO <property name="allowedAbbreviationLength" value="1"/>-->
</module> </module>
<module name="OverloadMethodsDeclarationOrder"/> <module name="OverloadMethodsDeclarationOrder"/>
<module name="VariableDeclarationUsageDistance"/> <module name="VariableDeclarationUsageDistance"/>
<!-- TODO module name="CustomImportOrder"> <!-- TODO <module name="CustomImportOrder">
<property name="specialImportsRegExp" value="com.google"/> <property name="specialImportsRegExp" value="com.google"/>
<property name="sortImportsInGroupAlphabetically" value="true"/> <property name="sortImportsInGroupAlphabetically" value="true"/>
<property name="customImportOrderRules" <property name="customImportOrderRules"
value="STATIC###SPECIAL_IMPORTS###THIRD_PARTY_PACKAGE###STANDARD_JAVA_PACKAGE"/> value="STATIC###SPECIAL_IMPORTS###THIRD_PARTY_PACKAGE###STANDARD_JAVA_PACKAGE"/>
</module--> </module>-->
<module name="MethodParamPad"/> <module name="MethodParamPad"/>
<module name="OperatorWrap"> <module name="OperatorWrap">
<property name="option" value="NL"/> <property name="option" value="NL"/>
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
<rule ref="rulesets/java/naming.xml"> <rule ref="rulesets/java/naming.xml">
<exclude name="AbstractNaming" /> <exclude name="AbstractNaming" />
<exclude name="LongVariable" /> <exclude name="LongVariable" />
<!--exclude name="ShortMethodName" /--> <!--<exclude name="ShortMethodName" />-->
<exclude name="ShortVariable" /> <exclude name="ShortVariable" />
<exclude name="ShortClassName" /> <exclude name="ShortClassName" />
<!--<exclude name="VariableNamingConventions" />--> <!--<exclude name="VariableNamingConventions" />-->
......
...@@ -3,6 +3,6 @@ ...@@ -3,6 +3,6 @@
android:shape="oval"> android:shape="oval">
<solid android:color="@color/color_green" /> <solid android:color="@color/color_green" />
<corners android:radius="50dp" /> <corners android:radius="50dp" />
</shape> </shape>
\ No newline at end of file
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp" android:width="24dp"
android:height="24dp" android:height="24dp"
android:viewportWidth="24.0" android:autoMirrored="true"
android:viewportHeight="24.0"> android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path <path
android:fillColor="#FF000000" android:fillColor="#FF000000"
android:pathData="M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z"/> android:pathData="M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z" />
</vector> </vector>
...@@ -16,7 +16,6 @@ import androidx.appcompat.app.AppCompatActivity ...@@ -16,7 +16,6 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.edit import androidx.core.content.edit
import androidx.core.graphics.drawable.DrawableCompat import androidx.core.graphics.drawable.DrawableCompat
import androidx.viewpager.widget.ViewPager
import chat.rocket.android.emoji.internal.EmojiCategory import chat.rocket.android.emoji.internal.EmojiCategory
import chat.rocket.android.emoji.internal.EmojiPagerAdapter import chat.rocket.android.emoji.internal.EmojiPagerAdapter
import chat.rocket.android.emoji.internal.PREF_EMOJI_SKIN_TONE import chat.rocket.android.emoji.internal.PREF_EMOJI_SKIN_TONE
...@@ -27,7 +26,7 @@ import kotlinx.coroutines.GlobalScope ...@@ -27,7 +26,7 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class EmojiKeyboardPopup(context: Context, view: View) : OverKeyboardPopupWindow(context, view) { class EmojiKeyboardPopup(context: Context, view: View) : OverKeyboardPopupWindow(context, view) {
private lateinit var viewPager: ViewPager private lateinit var viewPager: EmojiViewPager
private lateinit var tabLayout: TabLayout private lateinit var tabLayout: TabLayout
private lateinit var searchView: View private lateinit var searchView: View
private lateinit var backspaceView: View private lateinit var backspaceView: View
...@@ -155,7 +154,7 @@ class EmojiKeyboardPopup(context: Context, view: View) : OverKeyboardPopupWindow ...@@ -155,7 +154,7 @@ class EmojiKeyboardPopup(context: Context, view: View) : OverKeyboardPopupWindow
val fragments = (it as AppCompatActivity).supportFragmentManager.fragments val fragments = (it as AppCompatActivity).supportFragmentManager.fragments
if (fragments.size == 0 || fragments[0] !is EmojiKeyboardListener) { if (fragments.size == 0 || fragments[0] !is EmojiKeyboardListener) {
// Since the app can arrive in an inconsistent state at this point, do not throw // Since the app can arrive in an inconsistent state at this point, do not throw
// throw IllegalStateException("activity/fragment should implement Listener interface") // throw IllegalStateException("activity/fragment should implement Listener interface")
null null
} else { } else {
fragments[0] as EmojiKeyboardListener fragments[0] as EmojiKeyboardListener
...@@ -177,8 +176,8 @@ class EmojiKeyboardPopup(context: Context, view: View) : OverKeyboardPopupWindow ...@@ -177,8 +176,8 @@ class EmojiKeyboardPopup(context: Context, view: View) : OverKeyboardPopupWindow
val tab = tabLayout.getTabAt(category.ordinal) val tab = tabLayout.getTabAt(category.ordinal)
val tabView = LayoutInflater.from(context).inflate(R.layout.emoji_picker_tab, null) val tabView = LayoutInflater.from(context).inflate(R.layout.emoji_picker_tab, null)
tab?.customView = tabView tab?.customView = tabView
val textView = tabView.findViewById(R.id.image_category) as ImageView val imageView = tabView.findViewById(R.id.image_category) as ImageView
textView.setImageResource(category.resourceIcon()) imageView.setImageResource(category.resourceIcon())
} }
val currentTab = if (EmojiRepository.getRecents().isEmpty()) { val currentTab = if (EmojiRepository.getRecents().isEmpty()) {
...@@ -186,7 +185,6 @@ class EmojiKeyboardPopup(context: Context, view: View) : OverKeyboardPopupWindow ...@@ -186,7 +185,6 @@ class EmojiKeyboardPopup(context: Context, view: View) : OverKeyboardPopupWindow
} else { } else {
EmojiCategory.RECENTS.ordinal EmojiCategory.RECENTS.ordinal
} }
viewPager.currentItem = currentTab viewPager.currentItem = currentTab
} }
} }
...@@ -203,7 +201,7 @@ class EmojiKeyboardPopup(context: Context, view: View) : OverKeyboardPopupWindow ...@@ -203,7 +201,7 @@ class EmojiKeyboardPopup(context: Context, view: View) : OverKeyboardPopupWindow
val start = message.getSpanStart(span) val start = message.getSpanStart(span)
val end = message.getSpanEnd(span) val end = message.getSpanEnd(span)
// Remove the span // Remove the span.
message.removeSpan(span) message.removeSpan(span)
// Remove the remaining emoticon text. // Remove the remaining emoticon text.
......
...@@ -7,9 +7,6 @@ import android.view.LayoutInflater ...@@ -7,9 +7,6 @@ import android.view.LayoutInflater
import android.view.Window import android.view.Window
import android.view.WindowManager import android.view.WindowManager
import android.widget.ImageView import android.widget.ImageView
import androidx.annotation.ColorInt
import androidx.core.content.ContextCompat
import androidx.core.content.edit
import chat.rocket.android.emoji.internal.EmojiCategory import chat.rocket.android.emoji.internal.EmojiCategory
import chat.rocket.android.emoji.internal.EmojiPagerAdapter import chat.rocket.android.emoji.internal.EmojiPagerAdapter
import chat.rocket.android.emoji.internal.PREF_EMOJI_SKIN_TONE import chat.rocket.android.emoji.internal.PREF_EMOJI_SKIN_TONE
...@@ -18,7 +15,6 @@ import kotlinx.coroutines.Dispatchers ...@@ -18,7 +15,6 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class EmojiPickerPopup(context: Context) : Dialog(context) { class EmojiPickerPopup(context: Context) : Dialog(context) {
var listener: EmojiKeyboardListener? = null var listener: EmojiKeyboardListener? = null
...@@ -60,15 +56,15 @@ class EmojiPickerPopup(context: Context) : Dialog(context) { ...@@ -60,15 +56,15 @@ class EmojiPickerPopup(context: Context) : Dialog(context) {
changeSkinTone(Fitzpatrick.valueOf(it)) changeSkinTone(Fitzpatrick.valueOf(it))
} }
pager_categories.adapter = adapter
pager_categories.offscreenPageLimit = EmojiCategory.values().size pager_categories.offscreenPageLimit = EmojiCategory.values().size
pager_categories.adapter = adapter
for (category in EmojiCategory.values()) { for (category in EmojiCategory.values()) {
val tab = tabs.getTabAt(category.ordinal) val tab = tabs.getTabAt(category.ordinal)
val tabView = LayoutInflater.from(context).inflate(R.layout.emoji_picker_tab, null) val tabView = LayoutInflater.from(context).inflate(R.layout.emoji_picker_tab, null)
tab?.customView = tabView tab?.customView = tabView
val textView = tabView.findViewById(R.id.image_category) as ImageView val imageView = tabView.findViewById(R.id.image_category) as ImageView
textView.setImageResource(category.resourceIcon()) imageView.setImageResource(category.resourceIcon())
} }
val currentTab = if (EmojiRepository.getRecents().isEmpty()) { val currentTab = if (EmojiRepository.getRecents().isEmpty()) {
......
package chat.rocket.android.emoji
import android.content.Context
import android.database.DataSetObserver
import android.os.Parcelable
import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup
import androidx.core.view.ViewCompat
import androidx.viewpager.widget.PagerAdapter
import androidx.viewpager.widget.ViewPager
class EmojiViewPager : ViewPager {
private var mLayoutDirection = ViewCompat.LAYOUT_DIRECTION_LTR
private val mPageChangeListeners = hashMapOf<OnPageChangeListener, ReversingOnPageChangeListener>()
private val isRtl: Boolean
get() = mLayoutDirection == ViewCompat.LAYOUT_DIRECTION_RTL
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
override fun onRtlPropertiesChanged(layoutDirection: Int) {
super.onRtlPropertiesChanged(layoutDirection)
val viewCompatLayoutDirection = if (layoutDirection == View.LAYOUT_DIRECTION_RTL) {
ViewCompat.LAYOUT_DIRECTION_RTL
} else {
ViewCompat.LAYOUT_DIRECTION_LTR
}
if (viewCompatLayoutDirection != mLayoutDirection) {
val adapter = super.getAdapter()
var position = 0
if (adapter != null) {
position = currentItem
}
mLayoutDirection = viewCompatLayoutDirection
if (adapter != null) {
adapter.notifyDataSetChanged()
currentItem = position
}
}
}
override fun setAdapter(adapter: PagerAdapter?) {
val adapter = if (adapter != null) {
ReversingAdapter(adapter)
} else {
adapter
}
super.setAdapter(adapter)
currentItem = 0
}
override fun getAdapter(): PagerAdapter? {
return super.getAdapter() as ReversingAdapter?
}
override fun getCurrentItem(): Int {
var item = super.getCurrentItem()
val adapter = super.getAdapter()
if (adapter != null && isRtl) {
item = adapter.count - item - 1
}
return item
}
override fun setCurrentItem(position: Int, smoothScroll: Boolean) {
val adapter = super.getAdapter()
val position = if (adapter != null && isRtl) {
adapter.count - position - 1
} else {
position
}
super.setCurrentItem(position, smoothScroll)
}
override fun setCurrentItem(position: Int) {
val adapter = super.getAdapter()
val position = if (adapter != null && isRtl) {
adapter.count - position - 1
} else {
position
}
super.setCurrentItem(position)
}
override fun setOnPageChangeListener(listener: OnPageChangeListener) {
super.setOnPageChangeListener(ReversingOnPageChangeListener(listener))
}
override fun addOnPageChangeListener(listener: OnPageChangeListener) {
val reversingListener = ReversingOnPageChangeListener(listener)
mPageChangeListeners.put(listener, reversingListener)
super.addOnPageChangeListener(reversingListener)
}
override fun removeOnPageChangeListener(listener: OnPageChangeListener) {
val reverseListener = mPageChangeListeners.remove(listener)
if (reverseListener != null) {
super.removeOnPageChangeListener(reverseListener)
}
}
override fun clearOnPageChangeListeners() {
super.clearOnPageChangeListeners()
mPageChangeListeners.clear()
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val heightMeasureSpec = if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED) {
var height = 0
for (i in 0 until childCount) {
val child = getChildAt(i)
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED))
val h = child.measuredHeight
if (h > height) {
height = h
}
}
MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
} else {
heightMeasureSpec
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
}
private inner class ReversingOnPageChangeListener(
private val mListener: OnPageChangeListener
) : OnPageChangeListener {
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
var position = position
var positionOffset = positionOffset
var positionOffsetPixels = positionOffsetPixels
val width = width
val adapter = super@EmojiViewPager.getAdapter()
if (adapter != null && isRtl) {
val count = adapter.count
var remainingWidth = (width * (1 - adapter.getPageWidth(position))).toInt() +
positionOffsetPixels
while (position < count && remainingWidth > 0) {
position += 1
remainingWidth -= (width * adapter.getPageWidth(position)).toInt()
}
position = count - position - 1
positionOffsetPixels = -remainingWidth
positionOffset = positionOffsetPixels / (width * adapter.getPageWidth(position))
}
mListener.onPageScrolled(position, positionOffset, positionOffsetPixels)
}
override fun onPageSelected(position: Int) {
val adapter = super@EmojiViewPager.getAdapter()
val position = if (adapter != null && isRtl) {
adapter.count - position - 1
} else {
position
}
mListener.onPageSelected(position)
}
override fun onPageScrollStateChanged(state: Int) {
mListener.onPageScrollStateChanged(state)
}
}
private inner class ReversingAdapter(private val adapter: PagerAdapter) : PagerAdapter() {
override fun isViewFromObject(view: View, obj: Any): Boolean {
return adapter.isViewFromObject(view, obj)
}
override fun getCount(): Int {
return adapter.count
}
override fun getItemPosition(obj: Any): Int {
var position = adapter.getItemPosition(obj)
if (isRtl) {
if (position == POSITION_UNCHANGED || position == POSITION_NONE) {
position = POSITION_NONE
} else {
position = getCount() - position - 1
}
}
return position
}
override fun getPageTitle(position: Int): CharSequence? {
return adapter.getPageTitle(position)
}
override fun getPageWidth(position: Int): Float {
return adapter.getPageWidth(position)
}
override fun instantiateItem(container: ViewGroup, position: Int): Any {
val position = if (isRtl) {
count - position - 1
} else {
position
}
return adapter.instantiateItem(container, position)
}
override fun instantiateItem(container: View, position: Int): Any {
val position = if (isRtl) {
count - position - 1
} else {
position
}
return adapter.instantiateItem(container, position)
}
override fun destroyItem(container: ViewGroup, position: Int, obj: Any) {
val position = if (isRtl) {
count - position - 1
} else {
position
}
adapter.destroyItem(container, position, obj)
}
override fun destroyItem(container: View, position: Int, obj: Any) {
val position = if (isRtl) {
count - position - 1
} else {
position
}
adapter.destroyItem(container, position, obj)
}
override fun setPrimaryItem(container: ViewGroup, position: Int, obj: Any) {
val position = if (isRtl) {
count - position - 1
} else {
position
}
adapter.setPrimaryItem(container, position, obj)
}
override fun setPrimaryItem(container: View, position: Int, obj: Any) {
val position = if (isRtl) {
count - position - 1
} else {
position
}
adapter.setPrimaryItem(container, position, obj)
}
override fun startUpdate(container: ViewGroup) {
adapter.startUpdate(container)
}
override fun startUpdate(container: View) {
adapter.startUpdate(container)
}
override fun finishUpdate(container: ViewGroup) {
adapter.finishUpdate(container)
}
override fun finishUpdate(container: View) {
adapter.finishUpdate(container)
}
override fun saveState(): Parcelable? {
return adapter.saveState()
}
override fun restoreState(state: Parcelable?, loader: ClassLoader?) {
adapter.restoreState(state, loader)
}
override fun notifyDataSetChanged() {
adapter.notifyDataSetChanged()
}
override fun registerDataSetObserver(observer: DataSetObserver) {
adapter.registerDataSetObserver(observer)
}
override fun unregisterDataSetObserver(observer: DataSetObserver) {
adapter.unregisterDataSetObserver(observer)
}
}
}
...@@ -2,14 +2,12 @@ ...@@ -2,14 +2,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp" android:width="24dp"
android:height="24dp" android:height="24dp"
android:autoMirrored="true"
android:viewportHeight="24" android:viewportHeight="24"
android:viewportWidth="24"> android:viewportWidth="24">
<path android:pathData="M0,0 L24,0 L24,24 L0,24 Z" /> <path android:pathData="M0,0 L24,0 L24,24 L0,24 Z" />
<path <path
android:fillColor="@color/colorEmojiIcon" android:fillColor="@color/colorEmojiIcon"
android:pathData="M22,3 L7,3 C6.31,3,5.77,3.35,5.41,3.88 L0,12 L5.41,20.11 android:pathData="M22,3 L7,3 C6.31,3,5.77,3.35,5.41,3.88 L0,12 L5.41,20.11 C5.77,20.64,6.31,21,7,21 L22,21 C23.1,21,24,20.1,24,19 L24,5 C24,3.9,23.1,3,22,3 Z M19,15.59 L17.59,17 L14,13.41 L10.41,17 L9,15.59 L12.59,12 L9,8.41 L10.41,7 L14,10.59 L17.59,7 L19,8.41 L15.41,12 L19,15.59 Z" />
C5.77,20.64,6.31,21,7,21 L22,21 C23.1,21,24,20.1,24,19 L24,5 C24,3.9,23.1,3,22,3
Z M19,15.59 L17.59,17 L14,13.41 L10.41,17 L9,15.59 L12.59,12 L9,8.41 L10.41,7
L14,10.59 L17.59,7 L19,8.41 L15.41,12 L19,15.59 Z" />
</vector> </vector>
\ No newline at end of file
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
app:tabGravity="fill" app:tabGravity="fill"
app:tabMode="scrollable" /> app:tabMode="scrollable" />
<androidx.viewpager.widget.ViewPager <chat.rocket.android.emoji.EmojiViewPager
android:id="@+id/pager_categories" android:id="@+id/pager_categories"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
app:tabMaxWidth="48dp" app:tabMaxWidth="48dp"
app:tabMode="scrollable" /> app:tabMode="scrollable" />
<androidx.viewpager.widget.ViewPager <chat.rocket.android.emoji.EmojiViewPager
android:id="@+id/pager_categories" android:id="@+id/pager_categories"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment