diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml
index a09fe5dae..8dd9f6cf7 100644
--- a/app/lint-baseline.xml
+++ b/app/lint-baseline.xml
@@ -19,7 +19,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -30,7 +30,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -41,7 +41,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -84,6 +84,17 @@
column="21"/>
+
+
+
+
-
-
-
-
@@ -333,7 +333,7 @@
errorLine2=" ^">
@@ -355,7 +355,7 @@
errorLine2=" ^">
@@ -366,7 +366,7 @@
errorLine2=" ^">
@@ -388,7 +388,7 @@
errorLine2=" ^">
@@ -410,7 +410,7 @@
errorLine2=" ^">
@@ -421,7 +421,7 @@
errorLine2=" ^">
@@ -432,7 +432,7 @@
errorLine2=" ^">
@@ -443,7 +443,7 @@
errorLine2=" ^">
@@ -454,7 +454,7 @@
errorLine2=" ^">
@@ -465,7 +465,7 @@
errorLine2=" ^">
@@ -476,7 +476,7 @@
errorLine2=" ^">
@@ -487,7 +487,7 @@
errorLine2=" ^">
@@ -498,7 +498,7 @@
errorLine2=" ^">
@@ -509,7 +509,7 @@
errorLine2=" ^">
@@ -520,7 +520,7 @@
errorLine2=" ^">
@@ -531,7 +531,7 @@
errorLine2=" ^">
@@ -542,7 +542,7 @@
errorLine2=" ^">
@@ -553,7 +553,7 @@
errorLine2=" ^">
@@ -751,7 +751,7 @@
errorLine2=" ^">
@@ -762,7 +762,7 @@
errorLine2=" ^">
@@ -773,7 +773,7 @@
errorLine2=" ^">
@@ -784,7 +784,7 @@
errorLine2=" ^">
@@ -795,7 +795,7 @@
errorLine2=" ^">
@@ -817,7 +817,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -861,7 +861,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -872,7 +872,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1136,7 +1136,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1531,7 +1531,7 @@
errorLine1=" android:background="?android:attr/colorBackground">"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1928,7 +1928,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1939,7 +1939,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
@@ -1950,7 +1950,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
@@ -1961,7 +1961,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
@@ -1972,7 +1972,7 @@
errorLine2=" ~~~~~~~~~~~~">
@@ -1983,7 +1983,7 @@
errorLine2=" ~~~~~~~~~~~~~~">
@@ -1994,7 +1994,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -2005,7 +2005,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
@@ -2016,7 +2016,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
@@ -2027,7 +2027,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -2038,7 +2038,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
@@ -2049,7 +2049,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -2060,7 +2060,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -2071,7 +2071,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
@@ -2082,7 +2082,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -2093,7 +2093,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -2104,7 +2104,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -2115,7 +2115,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
@@ -2126,7 +2126,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -2137,7 +2137,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -2148,7 +2148,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -2159,7 +2159,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -2181,7 +2181,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -2192,7 +2192,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -2203,7 +2203,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -2533,7 +2533,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~">
@@ -2544,7 +2544,7 @@
errorLine2=" ~~~~~~~~~">
@@ -2555,7 +2555,7 @@
errorLine2=" ~~~~~~~~~">
@@ -2643,7 +2643,7 @@
errorLine2=" ~~~~~~~~~">
@@ -2654,7 +2654,7 @@
errorLine2=" ~~~~~~~~~">
@@ -2665,7 +2665,7 @@
errorLine2=" ~~~~~~~~~">
@@ -2676,7 +2676,7 @@
errorLine2=" ~~~~~~~~~">
@@ -3122,12 +3122,12 @@
+ message="Access to `private` method `forwardToComposeActivity` of class `MainActivity` requires synthetic accessor"
+ errorLine1=" forwardToComposeActivity(intent)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -3138,7 +3138,7 @@
errorLine2=" ~~~~~~~~~~~~~">
@@ -3149,7 +3149,7 @@
errorLine2=" ~~~~~~~">
@@ -3160,7 +3160,7 @@
errorLine2=" ~~~~~~~">
@@ -3171,7 +3171,7 @@
errorLine2=" ~~~~~~~">
@@ -3182,54 +3182,10 @@
errorLine2=" ~~~~~~~">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -3281,7 +3237,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~">
@@ -3292,7 +3248,7 @@
errorLine2=" ~~~~~~~">
@@ -3303,7 +3259,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~">
@@ -3314,7 +3270,7 @@
errorLine2=" ~~~~~~~">
@@ -3325,7 +3281,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~">
@@ -3336,7 +3292,7 @@
errorLine2=" ~~~~~~~">
@@ -3347,7 +3303,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~">
@@ -3358,18 +3314,40 @@
errorLine2=" ~~~~~~~">
+ message="Access to `private` method `primaryDrawerItem` of class `MainActivityKt` requires synthetic accessor"
+ errorLine1=" primaryDrawerItem {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+
+
+
+
+
+
+
+
@@ -3378,31 +3356,9 @@
message="Access to `private` method `setOnClick` of class `MainActivityKt` requires synthetic accessor"
errorLine1=" onClick = {"
errorLine2=" ~~~~~~~">
-
-
-
-
-
-
-
-
@@ -3413,7 +3369,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
@@ -3424,7 +3380,7 @@
errorLine2=" ~~~~~~~">
@@ -3435,7 +3391,51 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -3446,7 +3446,7 @@
errorLine2=" ~~~~~~~">
@@ -3457,7 +3457,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~">
@@ -3468,7 +3468,7 @@
errorLine2=" ~~~~~~~">
@@ -3479,7 +3479,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~">
@@ -3490,7 +3490,7 @@
errorLine2=" ~~~~~~~">
@@ -3501,7 +3501,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
@@ -3512,7 +3512,7 @@
errorLine2=" ~~~~~~~">
@@ -3523,7 +3523,7 @@
errorLine2=" ~~~~~~~">
@@ -3534,7 +3534,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -3545,7 +3545,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -3556,7 +3556,7 @@
errorLine2=" ~~~~~~~">
@@ -3567,7 +3567,7 @@
errorLine2=" ~~~~~~~">
@@ -3578,7 +3578,7 @@
errorLine2=" ~~~~~~~">
@@ -3589,7 +3589,7 @@
errorLine2=" ~~~~~~~">
@@ -3600,7 +3600,7 @@
errorLine2=" ~~~~~~~">
@@ -3611,7 +3611,7 @@
errorLine2=" ~~~~~~~">
@@ -3991,22 +3991,22 @@
@@ -4062,7 +4062,7 @@
errorLine2=" ~~~~~~~">
@@ -4073,7 +4073,7 @@
errorLine2=" ~~~~~~~~~~~~">
@@ -4084,7 +4084,7 @@
errorLine2=" ~~~~~~~~~~~~">
@@ -4095,7 +4095,7 @@
errorLine2=" ~~~~~~~">
@@ -4106,10 +4106,21 @@
errorLine2=" ~~~~~~~">
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
@@ -4194,7 +4194,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -4238,7 +4238,7 @@
errorLine2=" ~~~~~~~~~~">
@@ -4916,7 +4916,7 @@
errorLine2=" ~~~~~~~~">
@@ -4927,7 +4927,7 @@
errorLine2=" ~~~~~~~~">
@@ -4938,7 +4938,7 @@
errorLine2=" ~~~~~~~~">
@@ -4949,7 +4949,7 @@
errorLine2=" ~~~~~~~~">
@@ -4960,7 +4960,7 @@
errorLine2=" ~~~~~~~~">
@@ -4971,7 +4971,7 @@
errorLine2=" ~~~~~~~~">
@@ -5136,7 +5136,7 @@
errorLine2=" ~~~~~~~~">
@@ -5147,7 +5147,7 @@
errorLine2=" ~~~~~~~~">
@@ -5158,7 +5158,7 @@
errorLine2=" ~~~~~~~~">
@@ -5169,7 +5169,7 @@
errorLine2=" ~~~~~~~~">
@@ -5180,7 +5180,7 @@
errorLine2=" ~~~~~~~~">
@@ -5191,7 +5191,7 @@
errorLine2=" ~~~~~~~~">
@@ -5202,7 +5202,7 @@
errorLine2=" ~~~~~~~~">
@@ -5554,7 +5554,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -5983,7 +5983,7 @@
errorLine2=" ~~~~~~~~">
@@ -5994,7 +5994,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
@@ -6005,7 +6005,7 @@
errorLine2=" ~~~~~~~">
@@ -6016,7 +6016,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
@@ -6027,7 +6027,7 @@
errorLine2=" ~~~~~~~~~~~~">
@@ -6038,7 +6038,7 @@
errorLine2=" ~~~~~~~~~~~~~">
@@ -6049,7 +6049,7 @@
errorLine2=" ~~~~~~~">
@@ -6060,7 +6060,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
@@ -6071,7 +6071,7 @@
errorLine2=" ~~~~~~~~~~~~~">
@@ -6082,7 +6082,7 @@
errorLine2=" ~~~~~~~">
@@ -6093,7 +6093,7 @@
errorLine2=" ~~~~~~~">
@@ -6104,7 +6104,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
@@ -6115,7 +6115,7 @@
errorLine2=" ~~~~~~~~~~~~~">
@@ -6192,7 +6192,7 @@
errorLine2=" ~~~~">
@@ -6203,7 +6203,7 @@
errorLine2=" ~~~~~~">
@@ -6214,7 +6214,7 @@
errorLine2=" ~~~~~~~~~~~">
@@ -6225,7 +6225,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
@@ -6236,7 +6236,7 @@
errorLine2=" ~~~~~~">
@@ -6247,7 +6247,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
@@ -6258,7 +6258,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
@@ -6269,7 +6269,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
@@ -6280,7 +6280,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
@@ -6291,7 +6291,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~">
@@ -6302,7 +6302,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
@@ -6313,7 +6313,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~">
@@ -6324,7 +6324,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
@@ -6335,7 +6335,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
@@ -6346,7 +6346,7 @@
errorLine2=" ~~~~~~">
@@ -6357,7 +6357,7 @@
errorLine2=" ~~~~~~">
@@ -6368,7 +6368,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
@@ -6379,7 +6379,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
@@ -6390,7 +6390,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
@@ -6401,7 +6401,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
@@ -6412,7 +6412,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~">
@@ -6423,7 +6423,7 @@
errorLine2=" ~~~~~~~~~~~~">
@@ -6434,7 +6434,7 @@
errorLine2=" ~~~~~~~">
@@ -6445,7 +6445,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~">
@@ -6456,7 +6456,7 @@
errorLine2=" ~~~~~~~~~~~~">
@@ -6467,7 +6467,7 @@
errorLine2=" ~~~~~~~">
@@ -6478,7 +6478,7 @@
errorLine2=" ~~~~~~~~~~~~">
@@ -6489,7 +6489,7 @@
errorLine2=" ~~~~~~~">
@@ -6500,7 +6500,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
@@ -6511,7 +6511,7 @@
errorLine2=" ~~~~~~~~~~~~">
@@ -6522,7 +6522,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
@@ -6533,7 +6533,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
diff --git a/app/schemas/com.keylesspalace.tusky.db.AppDatabase/53.json b/app/schemas/com.keylesspalace.tusky.db.AppDatabase/53.json
new file mode 100644
index 000000000..824768cb5
--- /dev/null
+++ b/app/schemas/com.keylesspalace.tusky.db.AppDatabase/53.json
@@ -0,0 +1,1009 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 53,
+ "identityHash": "233a8680f540e9a89950da21532ce85d",
+ "entities": [
+ {
+ "tableName": "DraftEntity",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `accountId` INTEGER NOT NULL, `inReplyToId` TEXT, `content` TEXT, `contentWarning` TEXT, `sensitive` INTEGER NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT NOT NULL, `poll` TEXT, `failedToSend` INTEGER NOT NULL, `failedToSendNew` INTEGER NOT NULL, `scheduledAt` TEXT, `language` TEXT, `statusId` TEXT)",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "accountId",
+ "columnName": "accountId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "inReplyToId",
+ "columnName": "inReplyToId",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "content",
+ "columnName": "content",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "contentWarning",
+ "columnName": "contentWarning",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "sensitive",
+ "columnName": "sensitive",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "visibility",
+ "columnName": "visibility",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "attachments",
+ "columnName": "attachments",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "poll",
+ "columnName": "poll",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "failedToSend",
+ "columnName": "failedToSend",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "failedToSendNew",
+ "columnName": "failedToSendNew",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "scheduledAt",
+ "columnName": "scheduledAt",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "language",
+ "columnName": "language",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "statusId",
+ "columnName": "statusId",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": true,
+ "columnNames": [
+ "id"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "AccountEntity",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `domain` TEXT NOT NULL, `accessToken` TEXT NOT NULL, `clientId` TEXT, `clientSecret` TEXT, `isActive` INTEGER NOT NULL, `accountId` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `profilePictureUrl` TEXT NOT NULL, `notificationsEnabled` INTEGER NOT NULL, `notificationsMentioned` INTEGER NOT NULL, `notificationsFollowed` INTEGER NOT NULL, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` INTEGER NOT NULL, `notificationsSignUps` INTEGER NOT NULL, `notificationsUpdates` INTEGER NOT NULL, `notificationsReports` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `defaultPostLanguage` TEXT NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `alwaysOpenSpoiler` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `notificationMarkerId` TEXT NOT NULL DEFAULT '0', `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL, `oauthScopes` TEXT NOT NULL, `unifiedPushUrl` TEXT NOT NULL, `pushPubKey` TEXT NOT NULL, `pushPrivKey` TEXT NOT NULL, `pushAuth` TEXT NOT NULL, `pushServerKey` TEXT NOT NULL, `lastVisibleHomeTimelineStatusId` TEXT, `locked` INTEGER NOT NULL DEFAULT 0)",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "domain",
+ "columnName": "domain",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "accessToken",
+ "columnName": "accessToken",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "clientId",
+ "columnName": "clientId",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "clientSecret",
+ "columnName": "clientSecret",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "isActive",
+ "columnName": "isActive",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "accountId",
+ "columnName": "accountId",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "username",
+ "columnName": "username",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "displayName",
+ "columnName": "displayName",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "profilePictureUrl",
+ "columnName": "profilePictureUrl",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notificationsEnabled",
+ "columnName": "notificationsEnabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notificationsMentioned",
+ "columnName": "notificationsMentioned",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notificationsFollowed",
+ "columnName": "notificationsFollowed",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notificationsFollowRequested",
+ "columnName": "notificationsFollowRequested",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notificationsReblogged",
+ "columnName": "notificationsReblogged",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notificationsFavorited",
+ "columnName": "notificationsFavorited",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notificationsPolls",
+ "columnName": "notificationsPolls",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notificationsSubscriptions",
+ "columnName": "notificationsSubscriptions",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notificationsSignUps",
+ "columnName": "notificationsSignUps",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notificationsUpdates",
+ "columnName": "notificationsUpdates",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notificationsReports",
+ "columnName": "notificationsReports",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notificationSound",
+ "columnName": "notificationSound",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notificationVibration",
+ "columnName": "notificationVibration",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notificationLight",
+ "columnName": "notificationLight",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "defaultPostPrivacy",
+ "columnName": "defaultPostPrivacy",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "defaultMediaSensitivity",
+ "columnName": "defaultMediaSensitivity",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "defaultPostLanguage",
+ "columnName": "defaultPostLanguage",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "alwaysShowSensitiveMedia",
+ "columnName": "alwaysShowSensitiveMedia",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "alwaysOpenSpoiler",
+ "columnName": "alwaysOpenSpoiler",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "mediaPreviewEnabled",
+ "columnName": "mediaPreviewEnabled",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastNotificationId",
+ "columnName": "lastNotificationId",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notificationMarkerId",
+ "columnName": "notificationMarkerId",
+ "affinity": "TEXT",
+ "notNull": true,
+ "defaultValue": "'0'"
+ },
+ {
+ "fieldPath": "emojis",
+ "columnName": "emojis",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "tabPreferences",
+ "columnName": "tabPreferences",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "notificationsFilter",
+ "columnName": "notificationsFilter",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "oauthScopes",
+ "columnName": "oauthScopes",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "unifiedPushUrl",
+ "columnName": "unifiedPushUrl",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "pushPubKey",
+ "columnName": "pushPubKey",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "pushPrivKey",
+ "columnName": "pushPrivKey",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "pushAuth",
+ "columnName": "pushAuth",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "pushServerKey",
+ "columnName": "pushServerKey",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastVisibleHomeTimelineStatusId",
+ "columnName": "lastVisibleHomeTimelineStatusId",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "locked",
+ "columnName": "locked",
+ "affinity": "INTEGER",
+ "notNull": true,
+ "defaultValue": "0"
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": true,
+ "columnNames": [
+ "id"
+ ]
+ },
+ "indices": [
+ {
+ "name": "index_AccountEntity_domain_accountId",
+ "unique": true,
+ "columnNames": [
+ "domain",
+ "accountId"
+ ],
+ "orders": [],
+ "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_AccountEntity_domain_accountId` ON `${TABLE_NAME}` (`domain`, `accountId`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "InstanceEntity",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`instance` TEXT NOT NULL, `emojiList` TEXT, `maximumTootCharacters` INTEGER, `maxPollOptions` INTEGER, `maxPollOptionLength` INTEGER, `minPollDuration` INTEGER, `maxPollDuration` INTEGER, `charactersReservedPerUrl` INTEGER, `version` TEXT, `videoSizeLimit` INTEGER, `imageSizeLimit` INTEGER, `imageMatrixLimit` INTEGER, `maxMediaAttachments` INTEGER, `maxFields` INTEGER, `maxFieldNameLength` INTEGER, `maxFieldValueLength` INTEGER, PRIMARY KEY(`instance`))",
+ "fields": [
+ {
+ "fieldPath": "instance",
+ "columnName": "instance",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "emojiList",
+ "columnName": "emojiList",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "maximumTootCharacters",
+ "columnName": "maximumTootCharacters",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "maxPollOptions",
+ "columnName": "maxPollOptions",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "maxPollOptionLength",
+ "columnName": "maxPollOptionLength",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "minPollDuration",
+ "columnName": "minPollDuration",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "maxPollDuration",
+ "columnName": "maxPollDuration",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "charactersReservedPerUrl",
+ "columnName": "charactersReservedPerUrl",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "version",
+ "columnName": "version",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "videoSizeLimit",
+ "columnName": "videoSizeLimit",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "imageSizeLimit",
+ "columnName": "imageSizeLimit",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "imageMatrixLimit",
+ "columnName": "imageMatrixLimit",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "maxMediaAttachments",
+ "columnName": "maxMediaAttachments",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "maxFields",
+ "columnName": "maxFields",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "maxFieldNameLength",
+ "columnName": "maxFieldNameLength",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "maxFieldValueLength",
+ "columnName": "maxFieldValueLength",
+ "affinity": "INTEGER",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "instance"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "TimelineStatusEntity",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `editedAt` INTEGER, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `repliesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `language` TEXT, `filtered` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
+ "fields": [
+ {
+ "fieldPath": "serverId",
+ "columnName": "serverId",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "url",
+ "columnName": "url",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "timelineUserId",
+ "columnName": "timelineUserId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "authorServerId",
+ "columnName": "authorServerId",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "inReplyToId",
+ "columnName": "inReplyToId",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "inReplyToAccountId",
+ "columnName": "inReplyToAccountId",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "content",
+ "columnName": "content",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "createdAt",
+ "columnName": "createdAt",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "editedAt",
+ "columnName": "editedAt",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "emojis",
+ "columnName": "emojis",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "reblogsCount",
+ "columnName": "reblogsCount",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "favouritesCount",
+ "columnName": "favouritesCount",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "repliesCount",
+ "columnName": "repliesCount",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "reblogged",
+ "columnName": "reblogged",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "bookmarked",
+ "columnName": "bookmarked",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "favourited",
+ "columnName": "favourited",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "sensitive",
+ "columnName": "sensitive",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "spoilerText",
+ "columnName": "spoilerText",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "visibility",
+ "columnName": "visibility",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "attachments",
+ "columnName": "attachments",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "mentions",
+ "columnName": "mentions",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "tags",
+ "columnName": "tags",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "application",
+ "columnName": "application",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "reblogServerId",
+ "columnName": "reblogServerId",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "reblogAccountId",
+ "columnName": "reblogAccountId",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "poll",
+ "columnName": "poll",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "muted",
+ "columnName": "muted",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "expanded",
+ "columnName": "expanded",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "contentCollapsed",
+ "columnName": "contentCollapsed",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "contentShowing",
+ "columnName": "contentShowing",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "pinned",
+ "columnName": "pinned",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "card",
+ "columnName": "card",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "language",
+ "columnName": "language",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "filtered",
+ "columnName": "filtered",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "serverId",
+ "timelineUserId"
+ ]
+ },
+ "indices": [
+ {
+ "name": "index_TimelineStatusEntity_authorServerId_timelineUserId",
+ "unique": false,
+ "columnNames": [
+ "authorServerId",
+ "timelineUserId"
+ ],
+ "orders": [],
+ "createSql": "CREATE INDEX IF NOT EXISTS `index_TimelineStatusEntity_authorServerId_timelineUserId` ON `${TABLE_NAME}` (`authorServerId`, `timelineUserId`)"
+ }
+ ],
+ "foreignKeys": [
+ {
+ "table": "TimelineAccountEntity",
+ "onDelete": "NO ACTION",
+ "onUpdate": "NO ACTION",
+ "columns": [
+ "authorServerId",
+ "timelineUserId"
+ ],
+ "referencedColumns": [
+ "serverId",
+ "timelineUserId"
+ ]
+ }
+ ]
+ },
+ {
+ "tableName": "TimelineAccountEntity",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `timelineUserId` INTEGER NOT NULL, `localUsername` TEXT NOT NULL, `username` TEXT NOT NULL, `displayName` TEXT NOT NULL, `url` TEXT NOT NULL, `avatar` TEXT NOT NULL, `emojis` TEXT NOT NULL, `bot` INTEGER NOT NULL, PRIMARY KEY(`serverId`, `timelineUserId`))",
+ "fields": [
+ {
+ "fieldPath": "serverId",
+ "columnName": "serverId",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "timelineUserId",
+ "columnName": "timelineUserId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "localUsername",
+ "columnName": "localUsername",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "username",
+ "columnName": "username",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "displayName",
+ "columnName": "displayName",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "url",
+ "columnName": "url",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "avatar",
+ "columnName": "avatar",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "emojis",
+ "columnName": "emojis",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "bot",
+ "columnName": "bot",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "serverId",
+ "timelineUserId"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "ConversationEntity",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT NOT NULL, `order` INTEGER NOT NULL, `accounts` TEXT NOT NULL, `unread` INTEGER NOT NULL, `s_id` TEXT NOT NULL, `s_url` TEXT, `s_inReplyToId` TEXT, `s_inReplyToAccountId` TEXT, `s_account` TEXT NOT NULL, `s_content` TEXT NOT NULL, `s_createdAt` INTEGER NOT NULL, `s_editedAt` INTEGER, `s_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_repliesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_bookmarked` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_tags` TEXT, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_muted` INTEGER NOT NULL, `s_poll` TEXT, `s_language` TEXT, PRIMARY KEY(`id`, `accountId`))",
+ "fields": [
+ {
+ "fieldPath": "accountId",
+ "columnName": "accountId",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "order",
+ "columnName": "order",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "accounts",
+ "columnName": "accounts",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "unread",
+ "columnName": "unread",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.id",
+ "columnName": "s_id",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.url",
+ "columnName": "s_url",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "lastStatus.inReplyToId",
+ "columnName": "s_inReplyToId",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "lastStatus.inReplyToAccountId",
+ "columnName": "s_inReplyToAccountId",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "lastStatus.account",
+ "columnName": "s_account",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.content",
+ "columnName": "s_content",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.createdAt",
+ "columnName": "s_createdAt",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.editedAt",
+ "columnName": "s_editedAt",
+ "affinity": "INTEGER",
+ "notNull": false
+ },
+ {
+ "fieldPath": "lastStatus.emojis",
+ "columnName": "s_emojis",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.favouritesCount",
+ "columnName": "s_favouritesCount",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.repliesCount",
+ "columnName": "s_repliesCount",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.favourited",
+ "columnName": "s_favourited",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.bookmarked",
+ "columnName": "s_bookmarked",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.sensitive",
+ "columnName": "s_sensitive",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.spoilerText",
+ "columnName": "s_spoilerText",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.attachments",
+ "columnName": "s_attachments",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.mentions",
+ "columnName": "s_mentions",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.tags",
+ "columnName": "s_tags",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "lastStatus.showingHiddenContent",
+ "columnName": "s_showingHiddenContent",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.expanded",
+ "columnName": "s_expanded",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.collapsed",
+ "columnName": "s_collapsed",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.muted",
+ "columnName": "s_muted",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastStatus.poll",
+ "columnName": "s_poll",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "lastStatus.language",
+ "columnName": "s_language",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "autoGenerate": false,
+ "columnNames": [
+ "id",
+ "accountId"
+ ]
+ },
+ "indices": [],
+ "foreignKeys": []
+ }
+ ],
+ "views": [],
+ "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, '233a8680f540e9a89950da21532ce85d')"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java b/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java
index 62709d7c3..6cdc471a0 100644
--- a/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java
+++ b/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java
@@ -256,9 +256,8 @@ public abstract class BaseActivity extends AppCompatActivity implements Injectab
public void openAsAccount(@NonNull String url, @NonNull AccountEntity account) {
accountManager.setActiveAccount(account.getId());
- Intent intent = new Intent(this, MainActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
- intent.putExtra(MainActivity.REDIRECT_URL, url);
+ Intent intent = MainActivity.redirectIntent(this, account.getId(), url);
+
startActivity(intent);
finishWithoutSlideOutAnimation();
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt
index da060aa8a..e79fab251 100644
--- a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt
@@ -16,6 +16,8 @@
package com.keylesspalace.tusky
import android.Manifest
+import android.annotation.SuppressLint
+import android.app.NotificationManager
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
@@ -33,6 +35,7 @@ import android.view.KeyEvent
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
+import android.view.MenuItem.SHOW_AS_ACTION_NEVER
import android.view.View
import android.widget.ImageView
import androidx.activity.OnBackPressedCallback
@@ -41,9 +44,12 @@ import androidx.appcompat.content.res.AppCompatResources
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
+import androidx.core.content.IntentCompat
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.view.GravityCompat
import androidx.core.view.MenuProvider
+import androidx.core.view.forEach
+import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceManager
import androidx.viewpager2.widget.MarginPageTransformer
@@ -100,7 +106,6 @@ import com.keylesspalace.tusky.util.show
import com.keylesspalace.tusky.util.unsafeLazy
import com.keylesspalace.tusky.util.updateShortcut
import com.keylesspalace.tusky.util.viewBinding
-import com.keylesspalace.tusky.util.visible
import com.mikepenz.iconics.IconicsDrawable
import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial
import com.mikepenz.iconics.utils.colorInt
@@ -175,6 +180,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
/** Adapter for the different timeline tabs */
private lateinit var tabAdapter: MainPagerAdapter
+ @SuppressLint("RestrictedApi")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -182,30 +188,39 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
?: return // will be redirected to LoginActivity by BaseActivity
var showNotificationTab = false
- if (intent != null) {
+
+ // check for savedInstanceState in order to not handle intent events more than once
+ if (intent != null && savedInstanceState == null) {
+ val notificationId = intent.getIntExtra(NOTIFICATION_ID, -1)
+ if (notificationId != -1) {
+ // opened from a notification action, cancel the notification
+ val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
+ notificationManager.cancel(intent.getStringExtra(NOTIFICATION_TAG), notificationId)
+ }
+
/** there are two possibilities the accountId can be passed to MainActivity:
- * - from our code as long 'account_id'
+ * - from our code as Long Intent Extra TUSKY_ACCOUNT_ID
* - from share shortcuts as String 'android.intent.extra.shortcut.ID'
*/
- var accountId = intent.getLongExtra(NotificationHelper.ACCOUNT_ID, -1)
- if (accountId == -1L) {
+ var tuskyAccountId = intent.getLongExtra(TUSKY_ACCOUNT_ID, -1)
+ if (tuskyAccountId == -1L) {
val accountIdString = intent.getStringExtra(ShortcutManagerCompat.EXTRA_SHORTCUT_ID)
if (accountIdString != null) {
- accountId = accountIdString.toLong()
+ tuskyAccountId = accountIdString.toLong()
}
}
- val accountRequested = accountId != -1L
- if (accountRequested && accountId != activeAccount.id) {
- accountManager.setActiveAccount(accountId)
+ val accountRequested = tuskyAccountId != -1L
+ if (accountRequested && tuskyAccountId != activeAccount.id) {
+ accountManager.setActiveAccount(tuskyAccountId)
}
val openDrafts = intent.getBooleanExtra(OPEN_DRAFTS, false)
- if (canHandleMimeType(intent.type)) {
+ if (canHandleMimeType(intent.type) || intent.hasExtra(COMPOSE_OPTIONS)) {
// Sharing to Tusky from an external app
if (accountRequested) {
// The correct account is already active
- forwardShare(intent)
+ forwardToComposeActivity(intent)
} else {
// No account was provided, show the chooser
showAccountChooserDialog(
@@ -216,10 +231,10 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
val requestedId = account.id
if (requestedId == activeAccount.id) {
// The correct account is already active
- forwardShare(intent)
+ forwardToComposeActivity(intent)
} else {
// A different account was requested, restart the activity
- intent.putExtra(NotificationHelper.ACCOUNT_ID, requestedId)
+ intent.putExtra(TUSKY_ACCOUNT_ID, requestedId)
changeAccount(requestedId, intent)
}
}
@@ -229,10 +244,10 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
} else if (openDrafts) {
val intent = DraftsActivity.newIntent(this)
startActivity(intent)
- } else if (accountRequested && savedInstanceState == null) {
+ } else if (accountRequested && intent.hasExtra(NOTIFICATION_TYPE)) {
// user clicked a notification, show follow requests for type FOLLOW_REQUEST,
// otherwise show notification tab
- if (intent.getStringExtra(NotificationHelper.TYPE) == Notification.Type.FOLLOW_REQUEST.name) {
+ if (intent.getSerializableExtra(NOTIFICATION_TYPE) == Notification.Type.FOLLOW_REQUEST) {
val intent = AccountListActivity.newIntent(this, AccountListActivity.Type.FOLLOW_REQUESTS)
startActivityWithSlideInAnimation(intent)
} else {
@@ -242,7 +257,6 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
}
window.statusBarColor = Color.TRANSPARENT // don't draw a status bar, the DrawerLayout and the MaterialDrawerLayout have their own
setContentView(binding.root)
- setSupportActionBar(binding.mainToolbar)
glide = Glide.with(this)
@@ -251,8 +265,21 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
startActivity(composeIntent)
}
+ // Determine which of the three toolbars should be the supportActionBar (which hosts
+ // the options menu).
val hideTopToolbar = preferences.getBoolean(PrefKeys.HIDE_TOP_TOOLBAR, false)
- binding.mainToolbar.visible(!hideTopToolbar)
+ if (hideTopToolbar) {
+ when (preferences.getString(PrefKeys.MAIN_NAV_POSITION, "top")) {
+ "top" -> setSupportActionBar(binding.topNav)
+ "bottom" -> setSupportActionBar(binding.bottomNav)
+ }
+ binding.mainToolbar.hide()
+ // There's not enough space in the top/bottom bars to show the title as well.
+ supportActionBar?.setDisplayShowTitleEnabled(false)
+ } else {
+ setSupportActionBar(binding.mainToolbar)
+ binding.mainToolbar.show()
+ }
loadDrawerAvatar(activeAccount.profilePictureUrl, true)
@@ -263,7 +290,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
setupDrawer(
savedInstanceState,
addSearchButton = hideTopToolbar,
- addTrendingButton = !accountManager.activeAccount!!.tabPreferences.hasTab(TRENDING)
+ addTrendingTagsButton = !accountManager.activeAccount!!.tabPreferences.hasTab(TRENDING_TAGS)
)
/* Fetch user info while we're doing other things. This has to be done after setting up the
@@ -288,7 +315,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
is MainTabsChangedEvent -> {
refreshMainDrawerItems(
addSearchButton = hideTopToolbar,
- addTrendingButton = !event.newTabs.hasTab(TRENDING)
+ addTrendingTagsButton = !event.newTabs.hasTab(TRENDING_TAGS)
)
setupTabs(false)
@@ -350,6 +377,14 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
}
}
+ override fun onPrepareMenu(menu: Menu) {
+ super.onPrepareMenu(menu)
+
+ // If the main toolbar is hidden then there's no space in the top/bottomNav to show
+ // the menu items as icons, so forceably disable them
+ if (!binding.mainToolbar.isVisible) menu.forEach { it.setShowAsAction(SHOW_AS_ACTION_NEVER) }
+ }
+
override fun onMenuItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_search -> {
@@ -422,12 +457,19 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
}
}
- private fun forwardShare(intent: Intent) {
- val composeIntent = Intent(this, ComposeActivity::class.java)
- composeIntent.action = intent.action
- composeIntent.type = intent.type
- composeIntent.putExtras(intent)
- composeIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+ private fun forwardToComposeActivity(intent: Intent) {
+ val composeOptions = IntentCompat.getParcelableExtra(intent, COMPOSE_OPTIONS, ComposeActivity.ComposeOptions::class.java)
+
+ val composeIntent = if (composeOptions != null) {
+ ComposeActivity.startIntent(this, composeOptions)
+ } else {
+ Intent(this, ComposeActivity::class.java).apply {
+ action = intent.action
+ type = intent.type
+ putExtras(intent)
+ flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+ }
+ }
startActivity(composeIntent)
finish()
}
@@ -435,13 +477,13 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
private fun setupDrawer(
savedInstanceState: Bundle?,
addSearchButton: Boolean,
- addTrendingButton: Boolean
+ addTrendingTagsButton: Boolean
) {
val drawerOpenClickListener = View.OnClickListener { binding.mainDrawerLayout.open() }
binding.mainToolbar.setNavigationOnClickListener(drawerOpenClickListener)
- binding.topNavAvatar.setOnClickListener(drawerOpenClickListener)
- binding.bottomNavAvatar.setOnClickListener(drawerOpenClickListener)
+ binding.topNav.setNavigationOnClickListener(drawerOpenClickListener)
+ binding.bottomNav.setNavigationOnClickListener(drawerOpenClickListener)
header = AccountHeaderView(this).apply {
headerBackgroundScaleType = ImageView.ScaleType.CENTER_CROP
@@ -496,12 +538,12 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
})
binding.mainDrawer.apply {
- refreshMainDrawerItems(addSearchButton, addTrendingButton)
+ refreshMainDrawerItems(addSearchButton, addTrendingTagsButton)
setSavedInstance(savedInstanceState)
}
}
- private fun refreshMainDrawerItems(addSearchButton: Boolean, addTrendingButton: Boolean) {
+ private fun refreshMainDrawerItems(addSearchButton: Boolean, addTrendingTagsButton: Boolean) {
binding.mainDrawer.apply {
itemAdapter.clear()
tintStatusBar = true
@@ -618,7 +660,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
)
}
- if (addTrendingButton) {
+ if (addTrendingTagsButton) {
binding.mainDrawer.addItemsAtPosition(
5,
primaryDrawerItem {
@@ -876,112 +918,75 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
val hideTopToolbar = preferences.getBoolean(PrefKeys.HIDE_TOP_TOOLBAR, false)
val animateAvatars = preferences.getBoolean("animateGifAvatars", false)
- if (hideTopToolbar) {
+ val activeToolbar = if (hideTopToolbar) {
val navOnBottom = preferences.getString("mainNavPosition", "top") == "bottom"
-
- val avatarView = if (navOnBottom) {
- binding.bottomNavAvatar.show()
- binding.bottomNavAvatar
+ if (navOnBottom) {
+ binding.bottomNav
} else {
- binding.topNavAvatar.show()
- binding.topNavAvatar
- }
-
- if (animateAvatars) {
- Glide.with(this)
- .load(avatarUrl)
- .placeholder(R.drawable.avatar_default)
- .into(avatarView)
- } else {
- Glide.with(this)
- .asBitmap()
- .load(avatarUrl)
- .placeholder(R.drawable.avatar_default)
- .into(avatarView)
+ binding.topNav
}
} else {
- binding.bottomNavAvatar.hide()
- binding.topNavAvatar.hide()
+ binding.mainToolbar
+ }
- val navIconSize = resources.getDimensionPixelSize(R.dimen.avatar_toolbar_nav_icon_size)
+ val navIconSize = resources.getDimensionPixelSize(R.dimen.avatar_toolbar_nav_icon_size)
- if (animateAvatars) {
- glide.asDrawable()
- .load(avatarUrl)
- .transform(
- RoundedCorners(resources.getDimensionPixelSize(R.dimen.avatar_radius_36dp))
- )
- .apply {
- if (showPlaceholder) {
- placeholder(R.drawable.avatar_default)
+ if (animateAvatars) {
+ glide.asDrawable().load(avatarUrl).transform(RoundedCorners(resources.getDimensionPixelSize(R.dimen.avatar_radius_36dp)))
+ .apply {
+ if (showPlaceholder) placeholder(R.drawable.avatar_default)
+ }
+ .into(object : CustomTarget(navIconSize, navIconSize) {
+
+ override fun onLoadStarted(placeholder: Drawable?) {
+ placeholder?.let {
+ activeToolbar.navigationIcon = FixedSizeDrawable(it, navIconSize, navIconSize)
}
}
- .into(object : CustomTarget(navIconSize, navIconSize) {
- override fun onLoadStarted(placeholder: Drawable?) {
- if (placeholder != null) {
- binding.mainToolbar.navigationIcon =
- FixedSizeDrawable(placeholder, navIconSize, navIconSize)
- }
- }
+ override fun onResourceReady(
+ resource: Drawable,
+ transition: Transition?
+ ) {
+ if (resource is Animatable) resource.start()
+ activeToolbar.navigationIcon = FixedSizeDrawable(resource, navIconSize, navIconSize)
+ }
- override fun onResourceReady(
- resource: Drawable,
- transition: Transition?
- ) {
- if (resource is Animatable) {
- resource.start()
- }
- binding.mainToolbar.navigationIcon =
- FixedSizeDrawable(resource, navIconSize, navIconSize)
- }
-
- override fun onLoadCleared(placeholder: Drawable?) {
- if (placeholder != null) {
- binding.mainToolbar.navigationIcon =
- FixedSizeDrawable(placeholder, navIconSize, navIconSize)
- }
- }
- })
- } else {
- glide.asBitmap()
- .load(avatarUrl)
- .transform(
- RoundedCorners(resources.getDimensionPixelSize(R.dimen.avatar_radius_36dp))
- )
- .apply {
- if (showPlaceholder) {
- placeholder(R.drawable.avatar_default)
+ override fun onLoadCleared(placeholder: Drawable?) {
+ placeholder?.let {
+ activeToolbar.navigationIcon = FixedSizeDrawable(it, navIconSize, navIconSize)
}
}
- .into(object : CustomTarget(navIconSize, navIconSize) {
-
- override fun onLoadStarted(placeholder: Drawable?) {
- if (placeholder != null) {
- binding.mainToolbar.navigationIcon =
- FixedSizeDrawable(placeholder, navIconSize, navIconSize)
- }
+ })
+ } else {
+ glide.asBitmap().load(avatarUrl).transform(RoundedCorners(resources.getDimensionPixelSize(R.dimen.avatar_radius_36dp)))
+ .apply {
+ if (showPlaceholder) placeholder(R.drawable.avatar_default)
+ }
+ .into(object : CustomTarget(navIconSize, navIconSize) {
+ override fun onLoadStarted(placeholder: Drawable?) {
+ placeholder?.let {
+ activeToolbar.navigationIcon = FixedSizeDrawable(it, navIconSize, navIconSize)
}
+ }
- override fun onResourceReady(
- resource: Bitmap,
- transition: Transition?
- ) {
- binding.mainToolbar.navigationIcon = FixedSizeDrawable(
- BitmapDrawable(resources, resource),
- navIconSize,
- navIconSize
- )
- }
+ override fun onResourceReady(
+ resource: Bitmap,
+ transition: Transition?
+ ) {
+ activeToolbar.navigationIcon = FixedSizeDrawable(
+ BitmapDrawable(resources, resource),
+ navIconSize,
+ navIconSize
+ )
+ }
- override fun onLoadCleared(placeholder: Drawable?) {
- if (placeholder != null) {
- binding.mainToolbar.navigationIcon =
- FixedSizeDrawable(placeholder, navIconSize, navIconSize)
- }
+ override fun onLoadCleared(placeholder: Drawable?) {
+ placeholder?.let {
+ activeToolbar.navigationIcon = FixedSizeDrawable(it, navIconSize, navIconSize)
}
- })
- }
+ }
+ })
}
}
@@ -1043,8 +1048,75 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
private const val TAG = "MainActivity" // logging tag
private const val DRAWER_ITEM_ADD_ACCOUNT: Long = -13
private const val DRAWER_ITEM_ANNOUNCEMENTS: Long = 14
- const val REDIRECT_URL = "redirectUrl"
- const val OPEN_DRAFTS = "draft"
+ private const val REDIRECT_URL = "redirectUrl"
+ private const val OPEN_DRAFTS = "draft"
+ private const val TUSKY_ACCOUNT_ID = "tuskyAccountId"
+ private const val COMPOSE_OPTIONS = "composeOptions"
+ private const val NOTIFICATION_TYPE = "notificationType"
+ private const val NOTIFICATION_TAG = "notificationTag"
+ private const val NOTIFICATION_ID = "notificationId"
+
+ /**
+ * Switches the active account to the provided accountId and then stays on MainActivity
+ */
+ @JvmStatic
+ fun accountSwitchIntent(context: Context, tuskyAccountId: Long): Intent {
+ return Intent(context, MainActivity::class.java).apply {
+ putExtra(TUSKY_ACCOUNT_ID, tuskyAccountId)
+ }
+ }
+
+ /**
+ * Switches the active account to the accountId and takes the user to the correct place according to the notification they clicked
+ */
+ @JvmStatic
+ fun openNotificationIntent(context: Context, tuskyAccountId: Long, type: Notification.Type): Intent {
+ return accountSwitchIntent(context, tuskyAccountId).apply {
+ putExtra(NOTIFICATION_TYPE, type)
+ }
+ }
+
+ /**
+ * Switches the active account to the accountId and then opens ComposeActivity with the provided options
+ * @param tuskyAccountId the id of the Tusky account to open the screen with. Set to -1 for current account.
+ * @param notificationId optional id of the notification that should be cancelled when this intent is opened
+ * @param notificationTag optional tag of the notification that should be cancelled when this intent is opened
+ */
+ @JvmStatic
+ fun composeIntent(
+ context: Context,
+ options: ComposeActivity.ComposeOptions,
+ tuskyAccountId: Long = -1,
+ notificationTag: String? = null,
+ notificationId: Int = -1
+ ): Intent {
+ return accountSwitchIntent(context, tuskyAccountId).apply {
+ action = Intent.ACTION_SEND // so it can be opened via shortcuts
+ putExtra(COMPOSE_OPTIONS, options)
+ putExtra(NOTIFICATION_TAG, notificationTag)
+ putExtra(NOTIFICATION_ID, notificationId)
+ }
+ }
+
+ /**
+ * switches the active account to the accountId and then tries to resolve and show the provided url
+ */
+ @JvmStatic
+ fun redirectIntent(context: Context, tuskyAccountId: Long, url: String): Intent {
+ return accountSwitchIntent(context, tuskyAccountId).apply {
+ putExtra(REDIRECT_URL, url)
+ flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+ }
+ }
+
+ /**
+ * switches the active account to the provided accountId and then opens drafts
+ */
+ fun draftIntent(context: Context, tuskyAccountId: Long): Intent {
+ return accountSwitchIntent(context, tuskyAccountId).apply {
+ putExtra(OPEN_DRAFTS, true)
+ }
+ }
}
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/TabData.kt b/app/src/main/java/com/keylesspalace/tusky/TabData.kt
index 6bff4a82b..58969292f 100644
--- a/app/src/main/java/com/keylesspalace/tusky/TabData.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/TabData.kt
@@ -23,7 +23,7 @@ import com.keylesspalace.tusky.components.conversation.ConversationsFragment
import com.keylesspalace.tusky.components.notifications.NotificationsFragment
import com.keylesspalace.tusky.components.timeline.TimelineFragment
import com.keylesspalace.tusky.components.timeline.viewmodel.TimelineViewModel
-import com.keylesspalace.tusky.components.trending.TrendingFragment
+import com.keylesspalace.tusky.components.trending.TrendingTagsFragment
import java.util.Objects
/** this would be a good case for a sealed class, but that does not work nice with Room */
@@ -33,7 +33,7 @@ const val NOTIFICATIONS = "Notifications"
const val LOCAL = "Local"
const val FEDERATED = "Federated"
const val DIRECT = "Direct"
-const val TRENDING = "Trending"
+const val TRENDING_TAGS = "TrendingTags"
const val HASHTAG = "Hashtag"
const val LIST = "List"
@@ -92,11 +92,11 @@ fun createTabDataFromId(id: String, arguments: List = emptyList()): TabD
icon = R.drawable.ic_reblog_direct_24dp,
fragment = { ConversationsFragment.newInstance() }
)
- TRENDING -> TabData(
- id = TRENDING,
+ TRENDING_TAGS -> TabData(
+ id = TRENDING_TAGS,
text = R.string.title_public_trending_hashtags,
icon = R.drawable.ic_trending_up_24px,
- fragment = { TrendingFragment.newInstance() }
+ fragment = { TrendingTagsFragment.newInstance() }
)
HASHTAG -> TabData(
id = HASHTAG,
diff --git a/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt b/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt
index 096fe3363..5f85f7375 100644
--- a/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt
@@ -378,9 +378,9 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene
if (!currentTabs.contains(directMessagesTab)) {
addableTabs.add(directMessagesTab)
}
- val trendingTab = createTabDataFromId(TRENDING)
- if (!currentTabs.contains(trendingTab)) {
- addableTabs.add(trendingTab)
+ val trendingTagsTab = createTabDataFromId(TRENDING_TAGS)
+ if (!currentTabs.contains(trendingTagsTab)) {
+ addableTabs.add(trendingTagsTab)
}
addableTabs.add(createTabDataFromId(HASHTAG))
diff --git a/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.kt b/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.kt
index e7c646991..3c943863d 100644
--- a/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.kt
@@ -130,6 +130,12 @@ class TuskyApplication : Application(), HasAndroidInjector {
editor.remove(PrefKeys.MEDIA_PREVIEW_ENABLED)
}
+ if (oldVersion < 2023072401) {
+ // The notifications filter / clear options are shown on a menu, not a separate bar,
+ // the preference to display them is not needed.
+ editor.remove(PrefKeys.Deprecated.SHOW_NOTIFICATIONS_FILTER)
+ }
+
editor.putInt(PrefKeys.SCHEMA_VERSION, newVersion)
editor.apply()
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/components/account/AccountActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/account/AccountActivity.kt
index ea9075210..f5e962d8e 100644
--- a/app/src/main/java/com/keylesspalace/tusky/components/account/AccountActivity.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/components/account/AccountActivity.kt
@@ -772,13 +772,16 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, MenuProvide
loadedAccount?.let { loadedAccount ->
val muteDomain = menu.findItem(R.id.action_mute_domain)
domain = getDomain(loadedAccount.url)
- if (domain.isEmpty()) {
+ when {
// If we can't get the domain, there's no way we can mute it anyway...
- menu.removeItem(R.id.action_mute_domain)
- } else {
- if (blockingDomain) {
+ // If the account is from our own domain, muting it is no-op
+ domain.isEmpty() || viewModel.isFromOwnDomain -> {
+ menu.removeItem(R.id.action_mute_domain)
+ }
+ blockingDomain -> {
muteDomain.title = getString(R.string.action_unmute_domain, domain)
- } else {
+ }
+ else -> {
muteDomain.title = getString(R.string.action_mute_domain, domain)
}
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/components/account/AccountViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/account/AccountViewModel.kt
index 5b32e3404..b12e3923d 100644
--- a/app/src/main/java/com/keylesspalace/tusky/components/account/AccountViewModel.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/components/account/AccountViewModel.kt
@@ -19,6 +19,7 @@ import com.keylesspalace.tusky.util.Error
import com.keylesspalace.tusky.util.Loading
import com.keylesspalace.tusky.util.Resource
import com.keylesspalace.tusky.util.Success
+import com.keylesspalace.tusky.util.getDomain
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@@ -27,7 +28,7 @@ import javax.inject.Inject
class AccountViewModel @Inject constructor(
private val mastodonApi: MastodonApi,
private val eventHub: EventHub,
- private val accountManager: AccountManager
+ accountManager: AccountManager
) : ViewModel() {
val accountData = MutableLiveData>()
@@ -41,8 +42,13 @@ class AccountViewModel @Inject constructor(
lateinit var accountId: String
var isSelf = false
+ /** True if the viewed account has the same domain as the active account */
+ var isFromOwnDomain = false
+
private var noteUpdateJob: Job? = null
+ private val activeAccount = accountManager.activeAccount!!
+
init {
viewModelScope.launch {
eventHub.events.collect { event ->
@@ -65,6 +71,8 @@ class AccountViewModel @Inject constructor(
accountData.postValue(Success(account))
isDataLoading = false
isRefreshing.postValue(false)
+
+ isFromOwnDomain = getDomain(account.url) == activeAccount.domain
},
{ t ->
Log.w(TAG, "failed obtaining account", t)
@@ -298,7 +306,7 @@ class AccountViewModel @Inject constructor(
fun setAccountInfo(accountId: String) {
this.accountId = accountId
- this.isSelf = accountManager.activeAccount?.accountId == accountId
+ this.isSelf = activeAccount.accountId == accountId
reload(false)
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt
index f26279712..a2828f3a3 100644
--- a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt
@@ -16,7 +16,6 @@
package com.keylesspalace.tusky.components.compose
import android.Manifest
-import android.app.NotificationManager
import android.app.ProgressDialog
import android.content.ClipData
import android.content.Context
@@ -207,22 +206,7 @@ class ComposeActivity :
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- val notificationId = intent.getIntExtra(NOTIFICATION_ID_EXTRA, -1)
- if (notificationId != -1) {
- // ComposeActivity was opened from a notification, delete the notification
- val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
- notificationManager.cancel(notificationId)
- }
-
- // If started from an intent then compose as the account ID from the intent.
- // Otherwise use the active account. If null then the user is not logged in,
- // and return from the activity.
- val intentAccountId = intent.getLongExtra(ACCOUNT_ID_EXTRA, -1)
- activeAccount = if (intentAccountId != -1L) {
- accountManager.getAccountById(intentAccountId)
- } else {
- accountManager.activeAccount
- } ?: return
+ activeAccount = accountManager.activeAccount ?: return
val theme = preferences.getString("appTheme", APP_THEME_DEFAULT)
if (theme == "black") {
@@ -280,7 +264,7 @@ class ComposeActivity :
binding.composeScheduleView.setDateTime(composeOptions?.scheduledAt)
}
- setupLanguageSpinner(getInitialLanguages(composeOptions?.language, accountManager.activeAccount))
+ setupLanguageSpinner(getInitialLanguages(composeOptions?.language, activeAccount))
setupComposeField(preferences, viewModel.startingText)
setupContentWarningField(composeOptions?.contentWarning)
setupPollView()
@@ -1355,8 +1339,6 @@ class ComposeActivity :
private const val PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 1
internal const val COMPOSE_OPTIONS_EXTRA = "COMPOSE_OPTIONS"
- private const val NOTIFICATION_ID_EXTRA = "NOTIFICATION_ID"
- private const val ACCOUNT_ID_EXTRA = "ACCOUNT_ID"
private const val PHOTO_UPLOAD_URI_KEY = "PHOTO_UPLOAD_URI"
private const val VISIBILITY_KEY = "VISIBILITY"
private const val SCHEDULED_TIME_KEY = "SCHEDULE"
@@ -1364,26 +1346,15 @@ class ComposeActivity :
/**
* @param options ComposeOptions to configure the ComposeActivity
- * @param notificationId the id of the notification that starts the Activity
- * @param accountId the id of the account to compose with, null for the current account
* @return an Intent to start the ComposeActivity
*/
@JvmStatic
- @JvmOverloads
fun startIntent(
context: Context,
- options: ComposeOptions,
- notificationId: Int? = null,
- accountId: Long? = null
+ options: ComposeOptions
): Intent {
return Intent(context, ComposeActivity::class.java).apply {
putExtra(COMPOSE_OPTIONS_EXTRA, options)
- if (notificationId != null) {
- putExtra(NOTIFICATION_ID_EXTRA, notificationId)
- }
- if (accountId != null) {
- putExtra(ACCOUNT_ID_EXTRA, accountId)
- }
}
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationHelper.java b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationHelper.java
index 481098934..a0c5a8ed5 100644
--- a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationHelper.java
+++ b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationHelper.java
@@ -85,13 +85,6 @@ public class NotificationHelper {
/** Dynamic notification IDs start here */
private static int notificationId = NOTIFICATION_ID_PRUNE_CACHE + 1;
- /**
- * constants used in Intents
- */
- public static final String ACCOUNT_ID = "account_id";
-
- public static final String TYPE = APPLICATION_ID + ".notification.type";
-
private static final String TAG = "NotificationHelper";
public static final String REPLY_ACTION = "REPLY_ACTION";
@@ -325,11 +318,10 @@ public class NotificationHelper {
// Create a notification that summarises the other notifications in this group
// All notifications in this group have the same type, so get it from the first.
- String notificationType = members.get(0).getNotification().extras.getString(EXTRA_NOTIFICATION_TYPE);
+ Notification.Type notificationType = (Notification.Type)members.get(0).getNotification().extras.getSerializable(EXTRA_NOTIFICATION_TYPE);
+
+ Intent summaryResultIntent = MainActivity.openNotificationIntent(context, accountId, notificationType);
- Intent summaryResultIntent = new Intent(context, MainActivity.class);
- summaryResultIntent.putExtra(ACCOUNT_ID, (long) accountId);
- summaryResultIntent.putExtra(TYPE, notificationType);
TaskStackBuilder summaryStackBuilder = TaskStackBuilder.create(context);
summaryStackBuilder.addParentStack(MainActivity.class);
summaryStackBuilder.addNextIntent(summaryResultIntent);
@@ -373,10 +365,8 @@ public class NotificationHelper {
private static NotificationCompat.Builder newAndroidNotification(Context context, Notification body, AccountEntity account) {
- // we have to switch account here
- Intent eventResultIntent = new Intent(context, MainActivity.class);
- eventResultIntent.putExtra(ACCOUNT_ID, account.getId());
- eventResultIntent.putExtra(TYPE, body.getType().name());
+ Intent eventResultIntent = MainActivity.openNotificationIntent(context, account.getId(), body.getType());
+
TaskStackBuilder eventStackBuilder = TaskStackBuilder.create(context);
eventStackBuilder.addParentStack(MainActivity.class);
eventStackBuilder.addNextIntent(eventResultIntent);
@@ -464,12 +454,7 @@ public class NotificationHelper {
composeOptions.setLanguage(actionableStatus.getLanguage());
composeOptions.setKind(ComposeActivity.ComposeKind.NEW);
- Intent composeIntent = ComposeActivity.startIntent(
- context,
- composeOptions,
- notificationId,
- account.getId()
- );
+ Intent composeIntent = MainActivity.composeIntent(context, composeOptions, account.getId(), body.getId(), (int)account.getId());
composeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
diff --git a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsFragment.kt
index f26a46528..13d11eeb6 100644
--- a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsFragment.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsFragment.kt
@@ -28,7 +28,6 @@ import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
-import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.view.MenuProvider
import androidx.core.view.isVisible
import androidx.fragment.app.DialogFragment
@@ -46,7 +45,6 @@ import androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE
import androidx.recyclerview.widget.SimpleItemAnimator
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener
import at.connyduck.sparkbutton.helpers.Utils
-import com.google.android.material.appbar.AppBarLayout.ScrollingViewBehavior
import com.google.android.material.color.MaterialColors
import com.google.android.material.snackbar.Snackbar
import com.keylesspalace.tusky.R
@@ -123,21 +121,6 @@ class NotificationsFragment :
return inflater.inflate(R.layout.fragment_timeline_notifications, container, false)
}
- private fun updateFilterVisibility(showFilter: Boolean) {
- val params = binding.swipeRefreshLayout.layoutParams as CoordinatorLayout.LayoutParams
- if (showFilter) {
- binding.appBarOptions.setExpanded(true, false)
- binding.appBarOptions.visibility = View.VISIBLE
- // Set content behaviour to hide filter on scroll
- params.behavior = ScrollingViewBehavior()
- } else {
- binding.appBarOptions.setExpanded(false, false)
- binding.appBarOptions.visibility = View.GONE
- // Clear behaviour to hide app bar
- params.behavior = null
- }
- }
-
private fun confirmClearNotifications() {
AlertDialog.Builder(requireContext())
.setMessage(R.string.notification_clear_text)
@@ -215,8 +198,6 @@ class NotificationsFragment :
footer = NotificationsLoadStateAdapter { adapter.retry() }
)
- binding.buttonClear.setOnClickListener { confirmClearNotifications() }
- binding.buttonFilter.setOnClickListener { showFilterDialog() }
(binding.recyclerView.itemAnimator as SimpleItemAnimator?)!!.supportsChangeAnimations =
false
@@ -369,10 +350,10 @@ class NotificationsFragment :
}
}
- // Update filter option visibility from uiState
- launch {
- viewModel.uiState.collectLatest { updateFilterVisibility(it.showFilterOptions) }
- }
+ // Collect the uiState. Nothing is done with it, but if you don't collect it then
+ // accessing viewModel.uiState.value (e.g., when the filter dialog is created)
+ // returns an empty object.
+ launch { viewModel.uiState.collect() }
// Update status display from statusDisplayOptions. If the new options request
// relative time display collect the flow to periodically update the timestamp in the list gui elements.
@@ -439,10 +420,17 @@ class NotificationsFragment :
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.fragment_notifications, menu)
+ val iconColor = MaterialColors.getColor(binding.root, android.R.attr.textColorPrimary)
menu.findItem(R.id.action_refresh)?.apply {
icon = IconicsDrawable(requireContext(), GoogleMaterial.Icon.gmd_refresh).apply {
sizeDp = 20
- colorInt = MaterialColors.getColor(binding.root, android.R.attr.textColorPrimary)
+ colorInt = iconColor
+ }
+ }
+ menu.findItem(R.id.action_edit_notification_filter)?.apply {
+ icon = IconicsDrawable(requireContext(), GoogleMaterial.Icon.gmd_tune).apply {
+ sizeDp = 20
+ colorInt = iconColor
}
}
}
@@ -458,6 +446,14 @@ class NotificationsFragment :
viewModel.accept(InfallibleUiAction.LoadNewest)
true
}
+ R.id.action_edit_notification_filter -> {
+ showFilterDialog()
+ true
+ }
+ R.id.action_clear_notifications -> {
+ confirmClearNotifications()
+ true
+ }
else -> false
}
}
@@ -625,7 +621,6 @@ class NotificationsFragment :
override fun onReselect() {
if (isAdded) {
- binding.appBarOptions.setExpanded(true, false)
layoutManager.scrollToPosition(0)
}
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt
index 1f3f982b9..d06a8bbcf 100644
--- a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt
@@ -74,23 +74,18 @@ data class UiState(
/** Filtered notification types */
val activeFilter: Set = emptySet(),
- /** True if the UI to filter and clear notifications should be shown */
- val showFilterOptions: Boolean = false,
-
/** True if the FAB should be shown while scrolling */
val showFabWhileScrolling: Boolean = true
)
/** Preferences the UI reacts to */
data class UiPrefs(
- val showFabWhileScrolling: Boolean,
- val showFilter: Boolean
+ val showFabWhileScrolling: Boolean
) {
companion object {
/** Relevant preference keys. Changes to any of these trigger a display update */
val prefKeys = setOf(
- PrefKeys.FAB_HIDE,
- PrefKeys.SHOW_NOTIFICATIONS_FILTER
+ PrefKeys.FAB_HIDE
)
}
}
@@ -495,7 +490,6 @@ class NotificationsViewModel @Inject constructor(
uiState = combine(notificationFilter, getUiPrefs()) { filter, prefs ->
UiState(
activeFilter = filter.filter,
- showFilterOptions = prefs.showFilter,
showFabWhileScrolling = prefs.showFabWhileScrolling
)
}.stateIn(
@@ -544,8 +538,7 @@ class NotificationsViewModel @Inject constructor(
.onStart { emit(toPrefs()) }
private fun toPrefs() = UiPrefs(
- showFabWhileScrolling = !preferences.getBoolean(PrefKeys.FAB_HIDE, false),
- showFilter = preferences.getBoolean(PrefKeys.SHOW_NOTIFICATIONS_FILTER, true)
+ showFabWhileScrolling = !preferences.getBoolean(PrefKeys.FAB_HIDE, false)
)
companion object {
diff --git a/app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt
index e2d29d495..f6541f1fd 100644
--- a/app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt
@@ -208,13 +208,6 @@ class PreferencesFragment : PreferenceFragmentCompat(), Injectable {
isSingleLineTitle = false
}
- switchPreference {
- setDefaultValue(true)
- key = PrefKeys.SHOW_NOTIFICATIONS_FILTER
- setTitle(R.string.pref_title_show_notifications_filter)
- isSingleLineTitle = false
- }
-
switchPreference {
setDefaultValue(true)
key = PrefKeys.CONFIRM_REBLOGS
diff --git a/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingActivity.kt
index 3270e9c26..bdf2cdc79 100644
--- a/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingActivity.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingActivity.kt
@@ -48,7 +48,7 @@ class TrendingActivity : BaseActivity(), HasAndroidInjector {
if (supportFragmentManager.findFragmentById(R.id.fragmentContainer) == null) {
supportFragmentManager.commit {
- val fragment = TrendingFragment.newInstance()
+ val fragment = TrendingTagsFragment.newInstance()
replace(R.id.fragmentContainer, fragment)
}
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagsAdapter.kt
similarity index 99%
rename from app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingAdapter.kt
rename to app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagsAdapter.kt
index b40d67670..4137d200e 100644
--- a/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingAdapter.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagsAdapter.kt
@@ -24,7 +24,7 @@ import com.keylesspalace.tusky.databinding.ItemTrendingCellBinding
import com.keylesspalace.tusky.databinding.ItemTrendingDateBinding
import com.keylesspalace.tusky.viewdata.TrendingViewData
-class TrendingAdapter(
+class TrendingTagsAdapter(
private val onViewTag: (String) -> Unit
) : ListAdapter(TrendingDifferCallback) {
diff --git a/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagsFragment.kt
similarity index 86%
rename from app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingFragment.kt
rename to app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagsFragment.kt
index 3d12d74e4..c04caee6d 100644
--- a/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingFragment.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagsFragment.kt
@@ -33,8 +33,8 @@ import at.connyduck.sparkbutton.helpers.Utils
import com.keylesspalace.tusky.BaseActivity
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.StatusListActivity
-import com.keylesspalace.tusky.components.trending.viewmodel.TrendingViewModel
-import com.keylesspalace.tusky.databinding.FragmentTrendingBinding
+import com.keylesspalace.tusky.components.trending.viewmodel.TrendingTagsViewModel
+import com.keylesspalace.tusky.databinding.FragmentTrendingTagsBinding
import com.keylesspalace.tusky.di.Injectable
import com.keylesspalace.tusky.di.ViewModelFactory
import com.keylesspalace.tusky.interfaces.ActionButtonActivity
@@ -48,8 +48,8 @@ import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import javax.inject.Inject
-class TrendingFragment :
- Fragment(R.layout.fragment_trending),
+class TrendingTagsFragment :
+ Fragment(R.layout.fragment_trending_tags),
OnRefreshListener,
Injectable,
ReselectableFragment,
@@ -58,11 +58,11 @@ class TrendingFragment :
@Inject
lateinit var viewModelFactory: ViewModelFactory
- private val viewModel: TrendingViewModel by viewModels { viewModelFactory }
+ private val viewModel: TrendingTagsViewModel by viewModels { viewModelFactory }
- private val binding by viewBinding(FragmentTrendingBinding::bind)
+ private val binding by viewBinding(FragmentTrendingTagsBinding::bind)
- private val adapter = TrendingAdapter(::onViewTag)
+ private val adapter = TrendingTagsAdapter(::onViewTag)
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
@@ -111,8 +111,8 @@ class TrendingFragment :
spanSizeLookup = object : SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return when (adapter.getItemViewType(position)) {
- TrendingAdapter.VIEW_TYPE_HEADER -> columnCount
- TrendingAdapter.VIEW_TYPE_TAG -> 1
+ TrendingTagsAdapter.VIEW_TYPE_HEADER -> columnCount
+ TrendingTagsAdapter.VIEW_TYPE_TAG -> 1
else -> -1
}
}
@@ -139,15 +139,15 @@ class TrendingFragment :
(requireActivity() as BaseActivity).startActivityWithSlideInAnimation(StatusListActivity.newHashtagIntent(requireContext(), tag))
}
- private fun processViewState(uiState: TrendingViewModel.TrendingUiState) {
+ private fun processViewState(uiState: TrendingTagsViewModel.TrendingTagsUiState) {
Log.d(TAG, uiState.loadingState.name)
when (uiState.loadingState) {
- TrendingViewModel.LoadingState.INITIAL -> clearLoadingState()
- TrendingViewModel.LoadingState.LOADING -> applyLoadingState()
- TrendingViewModel.LoadingState.REFRESHING -> applyRefreshingState()
- TrendingViewModel.LoadingState.LOADED -> applyLoadedState(uiState.trendingViewData)
- TrendingViewModel.LoadingState.ERROR_NETWORK -> networkError()
- TrendingViewModel.LoadingState.ERROR_OTHER -> otherError()
+ TrendingTagsViewModel.LoadingState.INITIAL -> clearLoadingState()
+ TrendingTagsViewModel.LoadingState.LOADING -> applyLoadingState()
+ TrendingTagsViewModel.LoadingState.REFRESHING -> applyRefreshingState()
+ TrendingTagsViewModel.LoadingState.LOADED -> applyLoadedState(uiState.trendingViewData)
+ TrendingTagsViewModel.LoadingState.ERROR_NETWORK -> networkError()
+ TrendingTagsViewModel.LoadingState.ERROR_OTHER -> otherError()
}
}
@@ -247,8 +247,8 @@ class TrendingFragment :
}
companion object {
- private const val TAG = "TrendingFragment"
+ private const val TAG = "TrendingTagsFragment"
- fun newInstance() = TrendingFragment()
+ fun newInstance() = TrendingTagsFragment()
}
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/components/trending/viewmodel/TrendingViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/trending/viewmodel/TrendingTagsViewModel.kt
similarity index 84%
rename from app/src/main/java/com/keylesspalace/tusky/components/trending/viewmodel/TrendingViewModel.kt
rename to app/src/main/java/com/keylesspalace/tusky/components/trending/viewmodel/TrendingTagsViewModel.kt
index 67447b308..92f0a8c46 100644
--- a/app/src/main/java/com/keylesspalace/tusky/components/trending/viewmodel/TrendingViewModel.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/components/trending/viewmodel/TrendingTagsViewModel.kt
@@ -35,7 +35,7 @@ import kotlinx.coroutines.launch
import java.io.IOException
import javax.inject.Inject
-class TrendingViewModel @Inject constructor(
+class TrendingTagsViewModel @Inject constructor(
private val mastodonApi: MastodonApi,
private val eventHub: EventHub
) : ViewModel() {
@@ -43,13 +43,13 @@ class TrendingViewModel @Inject constructor(
INITIAL, LOADING, REFRESHING, LOADED, ERROR_NETWORK, ERROR_OTHER
}
- data class TrendingUiState(
+ data class TrendingTagsUiState(
val trendingViewData: List,
val loadingState: LoadingState
)
- val uiState: Flow get() = _uiState
- private val _uiState = MutableStateFlow(TrendingUiState(listOf(), LoadingState.INITIAL))
+ val uiState: Flow get() = _uiState
+ private val _uiState = MutableStateFlow(TrendingTagsUiState(listOf(), LoadingState.INITIAL))
init {
invalidate()
@@ -73,9 +73,9 @@ class TrendingViewModel @Inject constructor(
*/
fun invalidate(refresh: Boolean = false) = viewModelScope.launch {
if (refresh) {
- _uiState.value = TrendingUiState(emptyList(), LoadingState.REFRESHING)
+ _uiState.value = TrendingTagsUiState(emptyList(), LoadingState.REFRESHING)
} else {
- _uiState.value = TrendingUiState(emptyList(), LoadingState.LOADING)
+ _uiState.value = TrendingTagsUiState(emptyList(), LoadingState.LOADING)
}
val deferredFilters = async { mastodonApi.getFilters() }
@@ -85,7 +85,7 @@ class TrendingViewModel @Inject constructor(
val firstTag = tagResponse.firstOrNull()
_uiState.value = if (firstTag == null) {
- TrendingUiState(emptyList(), LoadingState.LOADED)
+ TrendingTagsUiState(emptyList(), LoadingState.LOADED)
} else {
val homeFilters = deferredFilters.await().getOrNull()?.filter { filter ->
filter.context.contains(Filter.Kind.HOME.kind)
@@ -100,15 +100,15 @@ class TrendingViewModel @Inject constructor(
.toViewData()
val header = TrendingViewData.Header(firstTag.start(), firstTag.end())
- TrendingUiState(listOf(header) + tags, LoadingState.LOADED)
+ TrendingTagsUiState(listOf(header) + tags, LoadingState.LOADED)
}
},
{ error ->
Log.w(TAG, "failed loading trending tags", error)
if (error is IOException) {
- _uiState.value = TrendingUiState(emptyList(), LoadingState.ERROR_NETWORK)
+ _uiState.value = TrendingTagsUiState(emptyList(), LoadingState.ERROR_NETWORK)
} else {
- _uiState.value = TrendingUiState(emptyList(), LoadingState.ERROR_OTHER)
+ _uiState.value = TrendingTagsUiState(emptyList(), LoadingState.ERROR_OTHER)
}
}
)
diff --git a/app/src/main/java/com/keylesspalace/tusky/db/AppDatabase.java b/app/src/main/java/com/keylesspalace/tusky/db/AppDatabase.java
index 86ce13cb1..d5e8c3e99 100644
--- a/app/src/main/java/com/keylesspalace/tusky/db/AppDatabase.java
+++ b/app/src/main/java/com/keylesspalace/tusky/db/AppDatabase.java
@@ -42,12 +42,12 @@ import java.io.File;
TimelineAccountEntity.class,
ConversationEntity.class
},
- version = 52,
+ version = 53,
autoMigrations = {
@AutoMigration(from = 48, to = 49),
@AutoMigration(from = 49, to = 50, spec = AppDatabase.MIGRATION_49_50.class),
@AutoMigration(from = 50, to = 51),
- @AutoMigration(from = 51, to = 52)
+ @AutoMigration(from = 51, to = 52),
}
)
public abstract class AppDatabase extends RoomDatabase {
@@ -674,4 +674,15 @@ public abstract class AppDatabase extends RoomDatabase {
@DeleteColumn(tableName = "AccountEntity", columnName = "activeNotifications")
static class MIGRATION_49_50 implements AutoMigrationSpec { }
+
+ /**
+ * TabData.TRENDING was renamed to TabData.TRENDING_TAGS, and the text
+ * representation was changed from "Trending" to "TrendingTags".
+ */
+ public static final Migration MIGRATION_52_53 = new Migration(52, 53) {
+ @Override
+ public void migrate(@NonNull SupportSQLiteDatabase database) {
+ database.execSQL("UPDATE `AccountEntity` SET `tabpreferences` = REPLACE(tabpreferences, 'Trending:', 'TrendingTags:')");
+ }
+ };
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/di/AppModule.kt b/app/src/main/java/com/keylesspalace/tusky/di/AppModule.kt
index bc2c7d753..0f65d6c25 100644
--- a/app/src/main/java/com/keylesspalace/tusky/di/AppModule.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/di/AppModule.kt
@@ -68,7 +68,7 @@ class AppModule {
AppDatabase.MIGRATION_38_39, AppDatabase.MIGRATION_39_40, AppDatabase.MIGRATION_40_41,
AppDatabase.MIGRATION_41_42, AppDatabase.MIGRATION_42_43, AppDatabase.MIGRATION_43_44,
AppDatabase.MIGRATION_44_45, AppDatabase.MIGRATION_45_46, AppDatabase.MIGRATION_46_47,
- AppDatabase.MIGRATION_47_48
+ AppDatabase.MIGRATION_47_48, AppDatabase.MIGRATION_52_53
)
.build()
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/di/FragmentBuildersModule.kt b/app/src/main/java/com/keylesspalace/tusky/di/FragmentBuildersModule.kt
index a5c24456c..7629cff9f 100644
--- a/app/src/main/java/com/keylesspalace/tusky/di/FragmentBuildersModule.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/di/FragmentBuildersModule.kt
@@ -32,7 +32,7 @@ import com.keylesspalace.tusky.components.search.fragments.SearchAccountsFragmen
import com.keylesspalace.tusky.components.search.fragments.SearchHashtagsFragment
import com.keylesspalace.tusky.components.search.fragments.SearchStatusesFragment
import com.keylesspalace.tusky.components.timeline.TimelineFragment
-import com.keylesspalace.tusky.components.trending.TrendingFragment
+import com.keylesspalace.tusky.components.trending.TrendingTagsFragment
import com.keylesspalace.tusky.components.viewthread.ViewThreadFragment
import com.keylesspalace.tusky.components.viewthread.edits.ViewEditsFragment
import com.keylesspalace.tusky.fragment.ViewVideoFragment
@@ -99,7 +99,7 @@ abstract class FragmentBuildersModule {
abstract fun listsForAccountFragment(): ListsForAccountFragment
@ContributesAndroidInjector
- abstract fun trendingFragment(): TrendingFragment
+ abstract fun trendingTagsFragment(): TrendingTagsFragment
@ContributesAndroidInjector
abstract fun viewVideoFragment(): ViewVideoFragment
diff --git a/app/src/main/java/com/keylesspalace/tusky/di/ViewModelFactory.kt b/app/src/main/java/com/keylesspalace/tusky/di/ViewModelFactory.kt
index af1972d5f..ae69e1dd9 100644
--- a/app/src/main/java/com/keylesspalace/tusky/di/ViewModelFactory.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/di/ViewModelFactory.kt
@@ -38,7 +38,7 @@ import com.keylesspalace.tusky.components.scheduled.ScheduledStatusViewModel
import com.keylesspalace.tusky.components.search.SearchViewModel
import com.keylesspalace.tusky.components.timeline.viewmodel.CachedTimelineViewModel
import com.keylesspalace.tusky.components.timeline.viewmodel.NetworkTimelineViewModel
-import com.keylesspalace.tusky.components.trending.viewmodel.TrendingViewModel
+import com.keylesspalace.tusky.components.trending.viewmodel.TrendingTagsViewModel
import com.keylesspalace.tusky.components.viewthread.ViewThreadViewModel
import com.keylesspalace.tusky.components.viewthread.edits.ViewEditsViewModel
import com.keylesspalace.tusky.viewmodel.AccountsInListViewModel
@@ -172,8 +172,8 @@ abstract class ViewModelModule {
@Binds
@IntoMap
- @ViewModelKey(TrendingViewModel::class)
- internal abstract fun trendingViewModel(viewModel: TrendingViewModel): ViewModel
+ @ViewModelKey(TrendingTagsViewModel::class)
+ internal abstract fun trendingTagsViewModel(viewModel: TrendingTagsViewModel): ViewModel
@Binds
@IntoMap
diff --git a/app/src/main/java/com/keylesspalace/tusky/service/SendStatusService.kt b/app/src/main/java/com/keylesspalace/tusky/service/SendStatusService.kt
index cf03115b3..3aaad1b70 100644
--- a/app/src/main/java/com/keylesspalace/tusky/service/SendStatusService.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/service/SendStatusService.kt
@@ -379,9 +379,7 @@ class SendStatusService : Service(), Injectable {
accountId: Long,
statusId: Int
): Notification {
- val intent = Intent(this, MainActivity::class.java)
- intent.putExtra(NotificationHelper.ACCOUNT_ID, accountId)
- intent.putExtra(MainActivity.OPEN_DRAFTS, true)
+ val intent = MainActivity.draftIntent(this, accountId)
val pendingIntent = PendingIntent.getActivity(
this,
diff --git a/app/src/main/java/com/keylesspalace/tusky/service/TuskyTileService.kt b/app/src/main/java/com/keylesspalace/tusky/service/TuskyTileService.kt
index 1e170da84..2bf761f9f 100644
--- a/app/src/main/java/com/keylesspalace/tusky/service/TuskyTileService.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/service/TuskyTileService.kt
@@ -19,6 +19,7 @@ import android.annotation.TargetApi
import android.content.Intent
import android.service.quicksettings.TileService
import com.keylesspalace.tusky.MainActivity
+import com.keylesspalace.tusky.components.compose.ComposeActivity
/**
* Small Addition that adds in a QuickSettings tile
@@ -29,11 +30,8 @@ import com.keylesspalace.tusky.MainActivity
class TuskyTileService : TileService() {
override fun onClick() {
- val intent = Intent(this, MainActivity::class.java).apply {
- addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- action = Intent.ACTION_SEND
- type = "text/plain"
- }
+ val intent = MainActivity.composeIntent(this, ComposeActivity.ComposeOptions())
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivityAndCollapse(intent)
}
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt
index 1a64f69b0..636c1fc69 100644
--- a/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt
@@ -41,7 +41,7 @@ enum class AppTheme(val value: String) {
*
* - Adding a new preference that does not change the interpretation of an existing preference
*/
-const val SCHEMA_VERSION = 2023022701
+const val SCHEMA_VERSION = 2023072401
object PrefKeys {
// Note: not all of these keys are actually used as SharedPreferences keys but we must give
@@ -61,7 +61,6 @@ object PrefKeys {
const val ANIMATE_GIF_AVATARS = "animateGifAvatars"
const val USE_BLURHASH = "useBlurhash"
const val SHOW_SELF_USERNAME = "showSelfUsername"
- const val SHOW_NOTIFICATIONS_FILTER = "showNotificationsFilter"
const val SHOW_CARDS_IN_TIMELINES = "showCardsInTimelines"
const val CONFIRM_REBLOGS = "confirmReblogs"
const val CONFIRM_FAVOURITES = "confirmFavourites"
@@ -104,4 +103,9 @@ object PrefKeys {
/** UI text scaling factor, stored as float, 100 = 100% = no scaling */
const val UI_TEXT_SCALE_RATIO = "uiTextScaleRatio"
+
+ /** Keys that are no longer used (e.g., the preference has been removed */
+ object Deprecated {
+ const val SHOW_NOTIFICATIONS_FILTER = "showNotificationsFilter"
+ }
}
diff --git a/app/src/main/java/com/keylesspalace/tusky/util/ShareShortcutHelper.kt b/app/src/main/java/com/keylesspalace/tusky/util/ShareShortcutHelper.kt
index 9d8e4b238..800671ead 100644
--- a/app/src/main/java/com/keylesspalace/tusky/util/ShareShortcutHelper.kt
+++ b/app/src/main/java/com/keylesspalace/tusky/util/ShareShortcutHelper.kt
@@ -29,7 +29,6 @@ import androidx.core.graphics.drawable.IconCompat
import com.bumptech.glide.Glide
import com.keylesspalace.tusky.MainActivity
import com.keylesspalace.tusky.R
-import com.keylesspalace.tusky.components.notifications.NotificationHelper
import com.keylesspalace.tusky.db.AccountEntity
import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.schedulers.Schedulers
@@ -72,7 +71,7 @@ fun updateShortcut(context: Context, account: AccountEntity) {
val intent = Intent(context, MainActivity::class.java).apply {
action = Intent.ACTION_SEND
type = "text/plain"
- putExtra(NotificationHelper.ACCOUNT_ID, account.id)
+ putExtra(ShortcutManagerCompat.EXTRA_SHORTCUT_ID, account.id.toString())
}
val shortcutInfo = ShortcutInfoCompat.Builder(context, account.id.toString())
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index dd22e156a..8082e0ce6 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -29,22 +29,14 @@
app:layout_scrollFlags="scroll|enterAlways"
app:navigationContentDescription="@string/action_open_drawer" />
-
-
-
+ android:layout_height="48dp"
+ android:orientation="horizontal"
+ app:contentInsetStart="0dp"
+ app:contentInsetStartWithNavigation="0dp"
+ app:navigationContentDescription="@string/action_open_drawer">
-
-
+
@@ -73,33 +64,16 @@
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:contentInsetStart="0dp"
+ app:contentInsetStartWithNavigation="0dp"
app:fabAlignmentMode="end">
-
-
-
-
-
-
-
+ android:layout_height="?attr/actionBarSize"
+ app:tabGravity="fill"
+ app:tabIndicatorGravity="top"
+ app:tabMode="fixed" />
@@ -132,4 +106,3 @@
android:fitsSystemWindows="true" />
-
diff --git a/app/src/main/res/layout/fragment_timeline_notifications.xml b/app/src/main/res/layout/fragment_timeline_notifications.xml
index 39be8fa8b..4d139b155 100644
--- a/app/src/main/res/layout/fragment_timeline_notifications.xml
+++ b/app/src/main/res/layout/fragment_timeline_notifications.xml
@@ -18,53 +18,10 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 8e4084305..4386af2cd 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -450,7 +450,6 @@
أعد تحويله إلى %s
فشل الابلاغ
فشلت عملية جلب المنشورات
- اعرض مصفاة الإشعارات
الكلمة كاملة
استطلاع رأي بالخيارات: %1$s, %2$s, %3$s, %4$s; %5$s
هل أنت متأكد من أنك تريد حجب كافة %s؟ سوف لن يكون باستطاعتك رؤية أي محتوى قادم من هذا النطاق بعد الآن ، لا في الخيوط الزمنية العامة ولا في إخطاراتك. سيتم إزالة متابِعيك الذين هم على هذا النطاق.
diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml
index e7cca1754..cf658d252 100644
--- a/app/src/main/res/values-be/strings.xml
+++ b/app/src/main/res/values-be/strings.xml
@@ -483,7 +483,6 @@
Дадатковыя каментары
Уліковыя запісы
Пошук не атрымаўся
- Паказаць фільтр апавяшчэнняў
Апытанне
1 дзень
3 дні
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index e17dec5f9..677f0f796 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -9,7 +9,6 @@
Продължителност
Анкета
Активиране на плъзгащия жест за превключване между раздели
- Показване на филтър за известия
Търсенето бе неуспешно
Акаунти
Акаунтът е от друг сървър. Да изпратите ли и там анонимно копие на доклада\?
diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml
index 35b9be7cc..445291bcb 100644
--- a/app/src/main/res/values-bn-rBD/strings.xml
+++ b/app/src/main/res/values-bn-rBD/strings.xml
@@ -362,7 +362,6 @@
অ্যাকাউন্টগুলো
যখন শব্দ বা বাক্যাংশটি শুধুমাত্র আলফানিউমেরিক হয় তখন এটি শুধুমাত্র তখনই প্রয়োগ করা হবে যদি এটি সম্পূর্ণ শব্দটির সাথে মেলে
সম্পূর্ণ শব্দ
- বিজ্ঞপ্তি ফিল্টার দেখান
পুরো ডোমেইন লুকান
আপনি কি সব %s ব্লক করতে চান\? আপনি যে ডোমেন থেকে কোনও পাবলিক টাইমলাইনে বা আপনার বিজ্ঞপ্তিগুলিতে সামগ্রী দেখতে পাবেন না। আপনার অনুসরণকারীদের সরানো হবে।
নিঃশব্দ %s
diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml
index a76961828..2e51f7447 100644
--- a/app/src/main/res/values-bn-rIN/strings.xml
+++ b/app/src/main/res/values-bn-rIN/strings.xml
@@ -389,7 +389,6 @@
পুরো ডোমেইন লুকান
সম্পূর্ণ শব্দ
যখন শব্দ বা বাক্যাংশটি শুধুমাত্র আলফানিউমেরিক হয় তখন এটি শুধুমাত্র তখনই প্রয়োগ করা হবে যদি এটি সম্পূর্ণ শব্দটির সাথে মেলে
- বিজ্ঞপ্তি ফিল্টার দেখান
সর্বদা সামগ্রী সতর্কতা সহ চিহ্নিত টুটগুলি প্রসারিত করুন
অক্কোউন্টগুলি
অনুসন্ধান করতে ব্যর্থ
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index bf7afb43f..04e6e49d0 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -397,7 +397,6 @@
Error obtenint els estats
L\'informe s\'enviarà al moderador del teu servidor. Pots afegir una explicació del motiu d\'aquest informe del compte a sota:
Comptes
- Mostrar el filtre de les notificacions
Estàs segur que vols bloquejar tot de %s\? No veuràs cap contingut de domini ni en els fils públics ni a les teves notificacions. Els teus seguidors d\'aquest domini seran eliminats.
Quan la paraula o la frase siguin només alfanumèrica , només s\'aplicarà si coincideix amb tota la paraula
\@%s reportat satisfactoriament
diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml
index 18429d3d9..3877a552e 100644
--- a/app/src/main/res/values-ckb/strings.xml
+++ b/app/src/main/res/values-ckb/strings.xml
@@ -261,7 +261,6 @@
ڕاپرسی
چالاککردنی ئاماژەکردنی لێدانی چالاک بۆ گۆڕین لە نێوان خشتەبەندەکان
تاسکی کۆد و سەرمایەکانی تێدایە لەم پڕۆژە کراوەی سەرچاوە:
- فلتەری ئاگانامەکان نیشان بدە
گەڕانەکە سەرکەوتوو نەبوو
ئەژمێرەکان
هەژمارەلە ڕاژەیەکی دیکەیە ترە. کۆپیەکی بێ سەروبەر بنێرە بۆ ڕاپۆرتەکە لەوێ؟
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 6daf4ec2f..b98f4fa9b 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -423,7 +423,6 @@
Stahování příspěvků selhalo
Nahlášení bude zasláno moderátorovi vašeho serveru. Níže můžete uvést, proč tento účet nahlašujete:
Tento účet je z jiného serveru. Chcete na něj také poslat anonymizovanou kopii nahlášení\?
- Zobrazit filtr oznámení
Anketa
5 minut
30 minut
diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml
index c5afd7893..eb6c33ba7 100644
--- a/app/src/main/res/values-cy/strings.xml
+++ b/app/src/main/res/values-cy/strings.xml
@@ -307,7 +307,6 @@
Ydych chi\'n siŵr eich bod chi am glirio\'ch holl hysbysiadau\'n barhaol\?
Ni all ffeiliau fideo a sain fod yn fwy na %s MB.
%s (🔗 %s)
- Dangos yr hidlydd hysbysiadau
Gwall wrth ddilyn #%s
Gwall wrth ddad-ddilyn #%s
Dad-dewi %s
@@ -732,4 +731,4 @@
Copïwyd fersiwn a gwybodaeth dyfais
Cuddio o\'r ffrwd cartref
Methodd chwarae: %s
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 1cf124cd9..3f0594c22 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -395,7 +395,6 @@
Melden fehlgeschlagen
Die Meldung wird an die Moderator*innen deines Servers geschickt. Du kannst hier eine Erklärung angeben, warum du dieses Konto meldest:
Dieses Konto ist von einem anderen Server. Soll eine anonymisierte Kopie der Meldung auch dorthin geschickt werden\?
- Benachrichtigungsfilter anzeigen
Umfrage
5 Minuten
30 Minuten
@@ -683,4 +682,4 @@
Version und Geräteinformationen kopieren
Nicht in der Startseite anzeigen
Das Hochladen ist fehlgeschlagen: %s
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index 13a210482..79ddf5905 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -403,7 +403,6 @@
Venigo de statusoj malsukcesis
La signalo estos sendita al la kontrolantoj de via servilo. Vi povas doni klarigon pri kial vi signalas ĉi tiun konton sube:
La konto estas en alia servilo. Ĉu sendi sennomigitan kopion de la signalo ankaŭ tien\?
- Montri filtrilon de sciigoj
Tuta vorto
Ŝlosilvorto aŭ frazo litercifera aplikiĝos, nur se ĝi kongruas kun la tuta vorto
Kontoj
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 553e39318..3ee91f012 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -431,7 +431,6 @@
Fallo al obtener estados
El reporte será enviado a un moderador de tu servidor. Puedes añadir una explicación de por qué estás reportando esta cuenta a continuación:
La cuenta es de otro servidor. ¿Enviar una copia anónima del reporte\?
- Mostrar filtro de notificaciones
Mostrar siempre publicaciones marcadas con avisos de contenido
Cuentas
Error al buscar
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index 4bef977f8..307c9508b 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -417,7 +417,6 @@
Kontua beste zerbitzari batekoa da. Bidali txostenaren kopia anonimatua hara ere\?
Kontuak
Bilaketa huts egin du
- Erakutsi jakinarazpenen iragazkia
Inkesta
5 minutu
30 minutu
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index 5ee4a154d..31570ad4f 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -398,7 +398,6 @@
شکست در واکشی فرستهها
حسابها
شکست در جستوجو
- نمایش پالایهٔ آگاهیها
نظرسنجی
۵ دقیقه
۳۰ دقیقه
@@ -684,4 +683,4 @@
اطّلاعات افزاره و نگارش رونوشت شد
نهفتن از خط زمانی خانگی
پخش شکست خورد: %s
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 6dcff090d..9fa13bffa 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -422,7 +422,6 @@
Êtes-vous sûr⋅e de vouloir bloquer %s en entier \? Vous ne verrez plus de contenu provenant de ce domaine, ni dans les fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.
Terminé
Le compte provient d’un autre serveur. Envoyez également une copie anonyme du rapport \?
- Montrer le filtre des notifications
Mot entier
Un mot-clé ou une phrase alphanumérique sera appliqué·e seulement s’il ou elle correspond au mot entier
Comptes
diff --git a/app/src/main/res/values-ga/strings.xml b/app/src/main/res/values-ga/strings.xml
index b453d522b..b5c65809c 100644
--- a/app/src/main/res/values-ga/strings.xml
+++ b/app/src/main/res/values-ga/strings.xml
@@ -439,7 +439,6 @@
Is ó fhreastalaí eile an cuntas. Seol cóip gan ainm den tuarascáil ansin freisin\?
Cuntais
Theip ar chuardach
- Taispeáin scagaire Fógraí
Cumasaigh gotha swipe aistriú idir cluaisíní
Vótaíocht
5 nóiméid
diff --git a/app/src/main/res/values-gd/strings.xml b/app/src/main/res/values-gd/strings.xml
index f1c320cf6..b423bb570 100644
--- a/app/src/main/res/values-gd/strings.xml
+++ b/app/src/main/res/values-gd/strings.xml
@@ -109,7 +109,6 @@
Cuir roghainn ris
Cunntas-bheachd
Cuir an comas gluasad grad-shlaighdidh airson leum a ghearradh o thaba gu taba
- Seall criathrag nam brathan
Dh’fhàillig leis an lorg
Cunntasan
Chaidh an cunntas a chlàradh air frithealaiche eile. A bheil thu airson lethbhreac dhen ghearan a chur dha-san gun ainm cuideachd\?
@@ -700,4 +699,4 @@
Chaidh lethbhreac de thionndadh is fiosrachadh an uidheim a dhèanamh
Falaich o loidhne-ama na dachaigh
Dh’fhàillig leis an luchdadh suas: %s
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 362b50d43..f74f3a961 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -128,7 +128,6 @@
Duración
Enquisa
Activar xestos de desprazamento para moverse entre lapelas
- Mostrar filtro das notificacións
Fallou a busca
Contas
A conta pertence a outro servidor. Queres enviar unha copia anónima da denuncia alí tamén\?
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index aa2a10716..7440ec91a 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -256,7 +256,6 @@
आपके पास कोई ड्राफ्ट नहीं है।
%s पोस्ट खोजने में त्रुटि
टैब के बीच स्विच करने के लिए स्वाइप जेस्चर को सक्षम करें
- सूचना फ़िल्टर दिखाएं
खोज करने में विफल
खाता किसी अन्य सर्वर से है। रिपोर्ट की अनाम प्रति वहां भी भेजें\?
रिपोर्ट आपके सर्वर मॉडरेटर को भेजी जाएगी। आप इस बारे में स्पष्टीकरण दे सकते हैं कि आप इस खाते को रिपोर्ट क्यों कर रहे हैं:
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 6433e7815..a15e30225 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -412,7 +412,6 @@
Sikertelen a bejegyzések letöltése
A bejelentést a szervered moderátorának küldjük el. Alább megadhatsz egy magyarázatot arra, hogy miért jelented be ezt a fiókot:
A fiók egy másik szerverről származik. Küldjünk oda is egy anonimizált másolatot a bejelentésről\?
- Értesítések szűrőjének mutatása
Tartalomfigyelmeztetéssel ellátott bejegyzések kinyitása mindig
Fiókok
Sikertelen keresés
diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml
index e738d6c78..ba1f04cec 100644
--- a/app/src/main/res/values-is/strings.xml
+++ b/app/src/main/res/values-is/strings.xml
@@ -396,7 +396,6 @@
Notandaaðgangurinn er af öðrum vefþjóni. Á einnig að senda nafnlaust afrit af kærunni þangað\?
Notandaaðgangar
Tókst ekki að leita
- Birta tilkynningasíu
Athuga
5 mínútur
30 mínútur
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 96ba59a8c..375a10d48 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -439,7 +439,6 @@
L\'utente è su un altro server. Mandare una copia della segnalazione anche lì\?
Utenti
Errore durante la ricerca
- Mostra il filtro delle notifiche
Sondaggio
5 minuti
30 minuti
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 87b3ed243..55ccd8ebf 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -389,7 +389,6 @@
投票終了
アカウント
検索に失敗しました
- 通知フィルターを表示
リセット
ブックマーク
ブックマーク
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 8b1039ed8..187a2bf98 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -402,7 +402,6 @@
게시물을 불러오지 못했습니다
인스턴스 관리자에게 신고합니다. 이 계정을 신고하려는 이유를 작성하실 수 있습니다:
이 유저는 다른 인스턴스에 속해 있습니다. 그 인스턴스에도 익명으로 신고 내용을 보내시겠습니까\?
- 알림 필터 보이기
%s(으)로 열기
계정
검색하지 못했습니다
diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml
index c8059b046..4845f82bf 100644
--- a/app/src/main/res/values-lv/strings.xml
+++ b/app/src/main/res/values-lv/strings.xml
@@ -425,7 +425,6 @@
Rādīt lietotājvārdu rīkjoslās
Pirms pastiprināšanas rādīt apstiprināšanas dialogu
Meklēšana neizdevās
- Rādīt paziņojumu filtru
Iespējot vilkšanas žestu, lai pārslēgtos starp cilnēm
Paslēpt augšējās rīkjoslas virsrakstu
iesniegts jauns ziņojums
diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml
index 21455f74d..e4e476aad 100644
--- a/app/src/main/res/values-nb-rNO/strings.xml
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -404,7 +404,6 @@
%s er ikke lenger skjult
Er du sikker på at du vil blokkere alt fra %s\? Du kommer ikke til å se innhold fra domenet i noen offentlige tidslinjer, eller i varslene dine. Kontoer som følger deg fra dette domenet vil bli fjernet.
Skjul hele domenet
- Vis varselfilter
Helt ord
Når nøkkelordet eller frasen kun inneholder bokstaver og tall, vil det bare brukes dersom det stemmer overens med hele ordet
Kontoer
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index b063d45b7..d883dc95e 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -411,7 +411,6 @@
Het ophalen van berichten is mislukt
Deze rapportage wordt naar jouw servermoderator(en) gestuurd. Je kunt hieronder een uitleg geven over waarom je het account wilt rapporteren:
Het account is van een andere server. Wil je ook een geanonimiseerde kopie van de rapportage daarnaartoe sturen\?
- Meldingenfilter tonen
Heel woord
Wanneer het trefwoord of zinsdeel alfanumeriek is, wordt het alleen gefilterd wanneer het hele woord overeenkomt
5 minuten
@@ -664,4 +663,4 @@
Versie en apparaatinformatie gekopieerd
De upload is mislukt: %s
Contact zoeken met je server duurde te lang
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml
index ec6b17199..135c3403b 100644
--- a/app/src/main/res/values-oc/strings.xml
+++ b/app/src/main/res/values-oc/strings.xml
@@ -411,7 +411,6 @@
%s es pas mai rescondut
Volètz vertadièrament blocar complètament %s \? Veiretz pas mai de contengut venent d’aqueste domeni, nimai los flux d’actualitat o las notificacion. Vòstres seguidors d’aqueste domeni seràn tirats.
Rescondre tot lo domeni
- Mostrar lo filtre de las notificacions
Mot complèt
Quand un mot clau o una frasa es solament alfanumeric, serà pas qu’aplicat se correspond al mot complèt
Totjorn desplegar las publicacions marcadas amb un avertiment de contengut
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 98aadf4bd..0db98aee8 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -440,7 +440,6 @@
To konto jest na innym serwerze. Czy przesłać anonimizowaną kopię zgłoszenia na ten serwer\?
Konta
Wyszukiwanie nie powidło się
- Pokaż filtr powiadomień
Głosowanie
5 minut
30 minut
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 04677e85a..93d1d7e37 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -422,7 +422,6 @@
%s desbloqueada
Tem certeza de que deseja bloquear tudo de %s\? Você não verá mais o conteúdo desta instância em nenhuma linha do tempo pública ou nas suas notificações. Seus seguidores desta instância serão removidos.
Bloquear instância
- Mostrar filtro de notificações
Toda palavra
Se for apenas alfanumérico, só se aplicará se combinar com a palavra inteira
Adicionar enquete
diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml
index 68ba08e5a..09e151eec 100644
--- a/app/src/main/res/values-pt-rPT/strings.xml
+++ b/app/src/main/res/values-pt-rPT/strings.xml
@@ -467,7 +467,6 @@
A conta está noutra instância. Quer enviar uma cópia anónima da denúncia para lá\?
Contas
Erro ao pesquisar
- Mostrar Filtro das Notificações
Ativar gesto de deslizar para alternar entre separadores
Votação
Duração
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index e08bc57ee..16f9409de 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -433,7 +433,6 @@
Не удалось получить статусы
Жалоба будет отправлена модератору вашего узла. Ниже вы можете добавить пояснение о причинах жалобы:
Этот аккаунт расположен на другом узле. Отправить анонимную копию жалобы туда\?
- Показать фильтр уведомлений
Создать опрос
Всегда разворачивать посты с предупреждением о содержимом
Аккаунты
diff --git a/app/src/main/res/values-sa/strings.xml b/app/src/main/res/values-sa/strings.xml
index 1538e9d72..988c7dc8e 100644
--- a/app/src/main/res/values-sa/strings.xml
+++ b/app/src/main/res/values-sa/strings.xml
@@ -378,7 +378,6 @@
५ निमेषाः
मतपेटिका
सारणहावभावस्य संयुतनं पीठिकापरिवर्तनार्थं कार्यम्
- सूचनाशोधकं दृश्यताम्
अन्वेषणे विफलता जाता
व्यक्तित्वविवरणलेखाः
अन्यजालवितारकादियं व्यक्तित्वविवरणलेखा । आवेदनस्य रक्षितप्रतिलिपिरपि प्रेष्यतां वा \?
diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml
index 2f1a461b9..68a0c636f 100644
--- a/app/src/main/res/values-si/strings.xml
+++ b/app/src/main/res/values-si/strings.xml
@@ -48,7 +48,6 @@
දර්ශන නාමය
මධ්යම
ශ්රව්ය
- දැනුම්දීම් පෙරහන පෙන්වන්න
දව. %d
නික්මෙන්න
පෙරහන සංස්කරණය
@@ -268,4 +267,4 @@
අතිරික්සුව
තත්. %d
%s (🔗 %s)
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index 5a0741fee..06019b9a8 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -407,7 +407,6 @@
Domena %s odrita
Ali ste prepričani, da želite blokirati vse iz domene %s\? Vsebine iz te domene ne boste videli v nobeni javni časovnici ali v obvestilih. Vaši sledilci iz te domene bodo odstranjeni.
Skrij celotno domeno
- Pokaži filtre obvestil
Cela beseda
Če je ključna beseda ali fraza samo alfanumerična, bo uporabljena le, če se ujema s celotno besedo
Računi
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 5b75bfbb8..fb4ca5673 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -418,7 +418,6 @@
Misslyckades att hämta status
Anmälan kommer att skickas till din servermoderator. Du kan beskriva varför du anmäler kontot nedan:
Kontot är från en annan server. Skicka en anonym kopia av anmälan dit också\?
- Visa notifikationsfilter
Helt ord
När nyckelordet eller frasen enbart är alfanumerisk, appliceras den om den matchar hela ordet
Expandera alltid inlägg med innehållsvarningar
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index 4f07e5498..a8eceb2f2 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -10,7 +10,6 @@
5 นาที
โพล
เปิดใช้งานการเลื่อนนิ้วเพื่อสลับระหว่างแท็บ
- แสดงตัวกรองการแจ้งเตือน
ค้นหาล้มเหลว
บัญชี
บัญชีนี้มาจากเซิร์ฟเวอร์อื่น ส่งสำเนารายงานที่ไม่ระบุชื่อไปที่นั่นด้วยหรือไม่\?
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 1d5b92ba9..124557bdd 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -395,7 +395,6 @@
Yayınlar getirilemedi
Bildirim sunucu yöneticinize gönderilecektir. Bu hesabı neden bildirdiğinizle ilgili açıklama yapabilirsiniz:
Hesap başka bir sunucudan. Raporun anonim bir kopyasını da oraya gönderilsin mi\?
- Bildirim süzgecini göster
Bahsedenler
Gönderi yazanını aç
Yeniden paylaşımları göster
@@ -684,4 +683,4 @@
Kopyalanan sürüm ve cihaz bilgileri
Anasayfa ağ akışından gizle
Oynatma başarısız oldu: %s
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 8a357a70a..8c5977c19 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -473,7 +473,6 @@
У вас немає чернеток.
Помилка пошуку допису %s
Увімкнути перемикання між вкладками жестом проведення пальцем
- Показати фільтр сповіщень
Не вдалося здійснити пошук
Обліковий запис з іншого сервера. Надіслати анонімізовану копію звіту й туди\?
Скаргу буде надіслано вашому модератору сервера. Ви можете надати пояснення, чому ви повідомляєте про цей обліковий запис знизу:
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index ac2402d6f..ffc70bee0 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -324,7 +324,6 @@
5 phút
Bình chọn
Vuốt qua lại giữa các tab
- Hiện bộ lọc thông báo
Không thể tìm thấy
Người
Người này thuộc máy chủ khác. Gửi luôn cho máy chủ đó\?
@@ -666,4 +665,4 @@
Thiết bị của bạn
Ẩn khỏi bảng tin
Không thể phát: %s
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index ad34676ef..61aec7198 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -421,7 +421,6 @@
该账户来自其他服务器。向那里发送一份匿名的报告副本?
账户
搜索失败
- 显示通知过滤器
投票
5 分钟
30 分钟
@@ -680,4 +679,4 @@
复制版本及设备信息
不出现在首页时间线中
播放失败了:%s
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml
index 887c5db6e..ccd2ba8bb 100644
--- a/app/src/main/res/values-zh-rHK/strings.xml
+++ b/app/src/main/res/values-zh-rHK/strings.xml
@@ -471,7 +471,6 @@
期間
投票
啟用在分頁間切換的滑動手勢
- 顯示通知過濾器
搜尋失敗
帳號
擷取狀態失敗
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 653bba4af..f14221020 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -426,7 +426,6 @@
無法獲取狀態
該報告將發送給您的伺服器管理員。 您可以在下面提供有關回報此帳戶的原因的說明:
該帳戶來自其他伺服器。向那裡發送一份匿名的報告副本?
- 顯示通知過濾器
話題
關注請求
編輯
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b43965fbc..2233b2dea 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -610,8 +610,8 @@
Error loading lists
Hide from the home timeline
List
- Clear
- Filter
+ Delete notifications
+ Filter notifications
Apply
Compose post
@@ -670,7 +670,6 @@
Accounts
Failed to search
- Show Notifications filter
Enable swipe gesture to switch between tabs
Show post statistics in timeline
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 2c1ab1c46..3c6d9810a 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -179,9 +179,4 @@
- @drawable/materialdrawer_shape_small
- false
-
-
diff --git a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestBase.kt b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestBase.kt
index 666d591cd..b99f64f64 100644
--- a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestBase.kt
+++ b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestBase.kt
@@ -99,7 +99,6 @@ abstract class NotificationsViewModelTestBase {
PrefKeys.CONFIRM_REBLOGS to true,
PrefKeys.CONFIRM_FAVOURITES to false,
PrefKeys.WELLBEING_HIDE_STATS_POSTS to false,
- PrefKeys.SHOW_NOTIFICATIONS_FILTER to true,
PrefKeys.FAB_HIDE to false
)
diff --git a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestUiState.kt b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestUiState.kt
index e295dda05..942fe717b 100644
--- a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestUiState.kt
+++ b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestUiState.kt
@@ -35,7 +35,6 @@ class NotificationsViewModelTestUiState : NotificationsViewModelTestBase() {
private val initialUiState = UiState(
activeFilter = setOf(Notification.Type.FOLLOW),
- showFilterOptions = true,
showFabWhileScrolling = true
)
@@ -64,23 +63,4 @@ class NotificationsViewModelTestUiState : NotificationsViewModelTestBase() {
assertThat(expectMostRecentItem().showFabWhileScrolling).isFalse()
}
}
-
- @Test
- fun `showFilterOptions depends on SHOW_NOTIFICATIONS_FILTER preference`() = runTest {
- // Prior
- viewModel.uiState.test {
- assertThat(expectMostRecentItem().showFilterOptions).isTrue()
- }
-
- // Given
- sharedPreferencesMap[PrefKeys.SHOW_NOTIFICATIONS_FILTER] = false
-
- // When
- eventHub.dispatch(PreferenceChangedEvent(PrefKeys.SHOW_NOTIFICATIONS_FILTER))
-
- // Then
- viewModel.uiState.test {
- assertThat(expectMostRecentItem().showFilterOptions).isFalse()
- }
- }
}