From e735e4843e5d8d87542d73999de229b4182679a7 Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Thu, 2 May 2019 19:44:35 +0200 Subject: [PATCH] Poll notifications (#1229) * show poll notifications in the app * show poll notifications in the app * allow filtering poll notifications in the poll fragment * show poll notifications in system notifications --- .../16.json | 680 ++++++++++++++++++ .../keylesspalace/tusky/TuskyApplication.java | 2 +- .../tusky/adapter/NotificationsAdapter.java | 31 +- .../tusky/adapter/StatusBaseViewHolder.java | 10 +- .../tusky/adapter/StatusViewHolder.java | 36 +- .../keylesspalace/tusky/db/AccountEntity.kt | 1 + .../keylesspalace/tusky/db/AppDatabase.java | 9 +- .../tusky/entity/Notification.kt | 5 +- .../com/keylesspalace/tusky/entity/Poll.kt | 11 +- .../tusky/fragment/NotificationsFragment.java | 13 +- .../NotificationPreferencesFragment.kt | 5 + .../tusky/util/NotificationHelper.java | 80 ++- app/src/main/res/drawable/ic_poll_24dp.xml | 9 + app/src/main/res/layout/item_status.xml | 6 +- app/src/main/res/values-ar/strings.xml | 16 +- app/src/main/res/values-ca/strings.xml | 16 +- app/src/main/res/values-cs/strings.xml | 20 +- app/src/main/res/values-cy/strings.xml | 16 +- app/src/main/res/values-de/strings.xml | 16 +- app/src/main/res/values-eo/strings.xml | 16 +- app/src/main/res/values-es/strings.xml | 16 +- app/src/main/res/values-eu/strings.xml | 16 +- app/src/main/res/values-fa/strings.xml | 16 +- app/src/main/res/values-fr/strings.xml | 16 +- app/src/main/res/values-hu/strings.xml | 16 +- app/src/main/res/values-it/strings.xml | 16 +- app/src/main/res/values-ja/strings.xml | 16 +- app/src/main/res/values-nl/strings.xml | 16 +- app/src/main/res/values-no-rNB/strings.xml | 20 +- app/src/main/res/values-oc/strings.xml | 16 +- app/src/main/res/values-pl/strings.xml | 16 +- app/src/main/res/values-pt-rBR/strings.xml | 16 +- app/src/main/res/values-ru/strings.xml | 16 +- app/src/main/res/values-sl/strings.xml | 20 +- app/src/main/res/values-sv/strings.xml | 20 +- app/src/main/res/values-ta/strings.xml | 16 +- app/src/main/res/values-tr/strings.xml | 16 +- app/src/main/res/values-zh-rCN/strings.xml | 16 +- app/src/main/res/values-zh-rHK/strings.xml | 16 +- app/src/main/res/values-zh-rMO/strings.xml | 16 +- app/src/main/res/values-zh-rSG/strings.xml | 16 +- app/src/main/res/values-zh-rTW/strings.xml | 16 +- app/src/main/res/values/strings.xml | 26 +- .../main/res/xml/notification_preferences.xml | 6 + 44 files changed, 1076 insertions(+), 318 deletions(-) create mode 100644 app/schemas/com.keylesspalace.tusky.db.AppDatabase/16.json create mode 100644 app/src/main/res/drawable/ic_poll_24dp.xml diff --git a/app/schemas/com.keylesspalace.tusky.db.AppDatabase/16.json b/app/schemas/com.keylesspalace.tusky.db.AppDatabase/16.json new file mode 100644 index 00000000..a4c44826 --- /dev/null +++ b/app/schemas/com.keylesspalace.tusky.db.AppDatabase/16.json @@ -0,0 +1,680 @@ +{ + "formatVersion": 1, + "database": { + "version": 16, + "identityHash": "821df8c72aa78a288b4ae9fe2df21dda", + "entities": [ + { + "tableName": "TootEntity", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `text` TEXT, `urls` TEXT, `descriptions` TEXT, `contentWarning` TEXT, `inReplyToId` TEXT, `inReplyToText` TEXT, `inReplyToUsername` TEXT, `visibility` INTEGER)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "text", + "columnName": "text", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "urls", + "columnName": "urls", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "descriptions", + "columnName": "descriptions", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "contentWarning", + "columnName": "contentWarning", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "inReplyToId", + "columnName": "inReplyToId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "inReplyToText", + "columnName": "inReplyToText", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "inReplyToUsername", + "columnName": "inReplyToUsername", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "visibility", + "columnName": "visibility", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "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, `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, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationSound` INTEGER NOT NULL, `notificationVibration` INTEGER NOT NULL, `notificationLight` INTEGER NOT NULL, `defaultPostPrivacy` INTEGER NOT NULL, `defaultMediaSensitivity` INTEGER NOT NULL, `alwaysShowSensitiveMedia` INTEGER NOT NULL, `mediaPreviewEnabled` INTEGER NOT NULL, `lastNotificationId` TEXT NOT NULL, `activeNotifications` TEXT NOT NULL, `emojis` TEXT NOT NULL, `tabPreferences` TEXT NOT NULL, `notificationsFilter` TEXT NOT NULL)", + "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": "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": "notificationsReblogged", + "columnName": "notificationsReblogged", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "notificationsFavorited", + "columnName": "notificationsFavorited", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "notificationsPolls", + "columnName": "notificationsPolls", + "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": "alwaysShowSensitiveMedia", + "columnName": "alwaysShowSensitiveMedia", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "mediaPreviewEnabled", + "columnName": "mediaPreviewEnabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lastNotificationId", + "columnName": "lastNotificationId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "activeNotifications", + "columnName": "activeNotifications", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "emojis", + "columnName": "emojis", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "tabPreferences", + "columnName": "tabPreferences", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "notificationsFilter", + "columnName": "notificationsFilter", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_AccountEntity_domain_accountId", + "unique": true, + "columnNames": [ + "domain", + "accountId" + ], + "createSql": "CREATE UNIQUE INDEX `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, 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 + } + ], + "primaryKey": { + "columnNames": [ + "instance" + ], + "autoGenerate": false + }, + "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, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT, `visibility` INTEGER, `attachments` TEXT, `mentions` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` 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": "emojis", + "columnName": "emojis", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "reblogsCount", + "columnName": "reblogsCount", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "favouritesCount", + "columnName": "favouritesCount", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "reblogged", + "columnName": "reblogged", + "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": false + }, + { + "fieldPath": "visibility", + "columnName": "visibility", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "attachments", + "columnName": "attachments", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "mentions", + "columnName": "mentions", + "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 + } + ], + "primaryKey": { + "columnNames": [ + "serverId", + "timelineUserId" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_TimelineStatusEntity_authorServerId_timelineUserId", + "unique": false, + "columnNames": [ + "authorServerId", + "timelineUserId" + ], + "createSql": "CREATE INDEX `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, 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 + } + ], + "primaryKey": { + "columnNames": [ + "serverId", + "timelineUserId" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "ConversationEntity", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` TEXT 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_emojis` TEXT NOT NULL, `s_favouritesCount` INTEGER NOT NULL, `s_favourited` INTEGER NOT NULL, `s_sensitive` INTEGER NOT NULL, `s_spoilerText` TEXT NOT NULL, `s_attachments` TEXT NOT NULL, `s_mentions` TEXT NOT NULL, `s_showingHiddenContent` INTEGER NOT NULL, `s_expanded` INTEGER NOT NULL, `s_collapsible` INTEGER NOT NULL, `s_collapsed` INTEGER NOT NULL, `s_poll` TEXT, PRIMARY KEY(`id`, `accountId`))", + "fields": [ + { + "fieldPath": "accountId", + "columnName": "accountId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "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.emojis", + "columnName": "s_emojis", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "lastStatus.favouritesCount", + "columnName": "s_favouritesCount", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lastStatus.favourited", + "columnName": "s_favourited", + "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.showingHiddenContent", + "columnName": "s_showingHiddenContent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lastStatus.expanded", + "columnName": "s_expanded", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lastStatus.collapsible", + "columnName": "s_collapsible", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lastStatus.collapsed", + "columnName": "s_collapsed", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lastStatus.poll", + "columnName": "s_poll", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id", + "accountId" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + } + ], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"821df8c72aa78a288b4ae9fe2df21dda\")" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java b/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java index c7b37e59..736ae75b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java +++ b/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java @@ -74,7 +74,7 @@ public class TuskyApplication extends Application implements HasActivityInjector AppDatabase.MIGRATION_5_6, AppDatabase.MIGRATION_6_7, AppDatabase.MIGRATION_7_8, AppDatabase.MIGRATION_8_9, AppDatabase.MIGRATION_9_10, AppDatabase.MIGRATION_10_11, AppDatabase.MIGRATION_11_12, AppDatabase.MIGRATION_12_13, AppDatabase.MIGRATION_10_13, - AppDatabase.MIGRATION_13_14, AppDatabase.MIGRATION_14_15) + AppDatabase.MIGRATION_13_14, AppDatabase.MIGRATION_14_15, AppDatabase.MIGRATION_15_16) .build(); accountManager = new AccountManager(appDatabase); serviceLocator = new ServiceLocator() { diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/NotificationsAdapter.java b/app/src/main/java/com/keylesspalace/tusky/adapter/NotificationsAdapter.java index d554e60e..8e95ebf6 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/NotificationsAdapter.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/NotificationsAdapter.java @@ -68,7 +68,7 @@ public class NotificationsAdapter extends RecyclerView.Adapter { } - private static final int VIEW_TYPE_MENTION = 0; + private static final int VIEW_TYPE_STATUS = 0; private static final int VIEW_TYPE_STATUS_NOTIFICATION = 1; private static final int VIEW_TYPE_FOLLOW = 2; private static final int VIEW_TYPE_PLACEHOLDER = 3; @@ -77,6 +77,7 @@ public class NotificationsAdapter extends RecyclerView.Adapter { private static final InputFilter[] COLLAPSE_INPUT_FILTER = new InputFilter[]{SmartLengthInputFilter.INSTANCE}; private static final InputFilter[] NO_INPUT_FILTER = new InputFilter[0]; + private String accountId; private StatusActionListener statusListener; private NotificationActionListener notificationActionListener; private boolean mediaPreviewEnabled; @@ -84,10 +85,12 @@ public class NotificationsAdapter extends RecyclerView.Adapter { private BidiFormatter bidiFormatter; private AdapterDataSource dataSource; - public NotificationsAdapter(AdapterDataSource dataSource, + public NotificationsAdapter(String accountId, + AdapterDataSource dataSource, StatusActionListener statusListener, NotificationActionListener notificationActionListener) { - super(); + + this.accountId = accountId; this.dataSource = dataSource; this.statusListener = statusListener; this.notificationActionListener = notificationActionListener; @@ -101,7 +104,7 @@ public class NotificationsAdapter extends RecyclerView.Adapter { public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); switch (viewType) { - case VIEW_TYPE_MENTION: { + case VIEW_TYPE_STATUS: { View view = inflater .inflate(R.layout.item_status, parent, false); return new StatusViewHolder(view, useAbsoluteTime); @@ -159,17 +162,20 @@ public class NotificationsAdapter extends RecyclerView.Adapter { } NotificationViewData.Concrete concreteNotificaton = (NotificationViewData.Concrete) notification; - Notification.Type type = concreteNotificaton.getType(); - switch (type) { - case MENTION: { + switch (viewHolder.getItemViewType()) { + case VIEW_TYPE_STATUS: { StatusViewHolder holder = (StatusViewHolder) viewHolder; StatusViewData.Concrete status = concreteNotificaton.getStatusViewData(); holder.setupWithStatus(status, statusListener, mediaPreviewEnabled, payloadForHolder); + if(concreteNotificaton.getType() == Notification.Type.POLL) { + holder.setPollInfo(accountId.equals(concreteNotificaton.getAccount().getId())); + } else { + holder.hideStatusInfo(); + } break; } - case FAVOURITE: - case REBLOG: { + case VIEW_TYPE_STATUS_NOTIFICATION: { StatusNotificationViewHolder holder = (StatusNotificationViewHolder) viewHolder; StatusViewData.Concrete statusViewData = concreteNotificaton.getStatusViewData(); if (payloadForHolder == null) { @@ -200,7 +206,7 @@ public class NotificationsAdapter extends RecyclerView.Adapter { } break; } - case FOLLOW: { + case VIEW_TYPE_FOLLOW: { if (payloadForHolder == null) { FollowViewHolder holder = (FollowViewHolder) viewHolder; holder.setMessage(concreteNotificaton.getAccount(), bidiFormatter); @@ -225,8 +231,9 @@ public class NotificationsAdapter extends RecyclerView.Adapter { if (notification instanceof NotificationViewData.Concrete) { NotificationViewData.Concrete concrete = ((NotificationViewData.Concrete) notification); switch (concrete.getType()) { - case MENTION: { - return VIEW_TYPE_MENTION; + case MENTION: + case POLL: { + return VIEW_TYPE_STATUS; } case FAVOURITE: case REBLOG: { diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java index e3df2a4f..4c5aceff 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java @@ -815,13 +815,13 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { for(int i = 0; i < Status.MAX_POLL_OPTIONS; i++) { if(i < options.size()) { - long percent = calculatePollPercent(options.get(i).getVotesCount(), poll.getVotesCount()); + int percent = options.get(i).getPercent(poll.getVotesCount()); String pollOptionText = pollResults[i].getContext().getString(R.string.poll_option_format, percent, options.get(i).getTitle()); pollResults[i].setText(CustomEmojiHelper.emojifyText(HtmlUtils.fromHtml(pollOptionText), emojis, pollResults[i])); pollResults[i].setVisibility(View.VISIBLE); - int level = (int) percent * 100; + int level = percent * 100; pollResults[i].getBackground().setLevel(level); @@ -920,10 +920,4 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { } } - private static long calculatePollPercent(int votes, int totalVotes) { - if(votes == 0) { - return 0; - } - return Math.round(votes / (double) totalVotes * 100); - } } diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusViewHolder.java index f96c869a..f28fcdaa 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusViewHolder.java @@ -29,18 +29,19 @@ import com.keylesspalace.tusky.viewdata.StatusViewData; import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; + import at.connyduck.sparkbutton.helpers.Utils; public class StatusViewHolder extends StatusBaseViewHolder { private static final InputFilter[] COLLAPSE_INPUT_FILTER = new InputFilter[]{SmartLengthInputFilter.INSTANCE}; private static final InputFilter[] NO_INPUT_FILTER = new InputFilter[0]; - private TextView rebloggedBar; + private TextView statusInfo; private ToggleButton contentCollapseButton; StatusViewHolder(View itemView, boolean useAbsoluteTime) { super(itemView, useAbsoluteTime); - rebloggedBar = itemView.findViewById(R.id.status_reblogged); + statusInfo = itemView.findViewById(R.id.status_info); contentCollapseButton = itemView.findViewById(R.id.button_toggle_content); } @@ -71,7 +72,7 @@ public class StatusViewHolder extends StatusBaseViewHolder { @Override protected void setupWithStatus(StatusViewData.Concrete status, final StatusActionListener listener, boolean mediaPreviewEnabled, @Nullable Object payloads) { - if (status == null || payloads==null) { + if (status == null || payloads == null) { if (status == null) { showContent(false); } else { @@ -81,30 +82,39 @@ public class StatusViewHolder extends StatusBaseViewHolder { String rebloggedByDisplayName = status.getRebloggedByUsername(); if (rebloggedByDisplayName == null) { - hideRebloggedByDisplayName(); + hideStatusInfo(); } else { setRebloggedByDisplayName(rebloggedByDisplayName); + statusInfo.setOnClickListener(v -> listener.onOpenReblog(getAdapterPosition())); } - rebloggedBar.setOnClickListener(v -> listener.onOpenReblog(getAdapterPosition()));} - } - else{ + } + } else { super.setupWithStatus(status, listener, mediaPreviewEnabled, payloads); } } private void setRebloggedByDisplayName(final String name) { - Context context = rebloggedBar.getContext(); + Context context = statusInfo.getContext(); String boostedText = context.getString(R.string.status_boosted_format, name); - rebloggedBar.setText(boostedText); - rebloggedBar.setVisibility(View.VISIBLE); + statusInfo.setText(boostedText); + statusInfo.setVisibility(View.VISIBLE); } - private void hideRebloggedByDisplayName() { - if (rebloggedBar == null) { + // don't use this on the same ViewHolder as setRebloggedByDisplayName, will cause recycling issues as paddings are changed + void setPollInfo(final boolean ownPoll) { + statusInfo.setText(ownPoll ? R.string.poll_ended_created : R.string.poll_ended_voted); + statusInfo.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_poll_24dp, 0, 0, 0); + statusInfo.setCompoundDrawablePadding(Utils.dpToPx(statusInfo.getContext(), 10)); + statusInfo.setPaddingRelative(Utils.dpToPx(statusInfo.getContext(), 28), 0, 0, 0); + statusInfo.setVisibility(View.VISIBLE); + } + + void hideStatusInfo() { + if (statusInfo == null) { return; } - rebloggedBar.setVisibility(View.GONE); + statusInfo.setVisibility(View.GONE); } private void setupCollapsedState(final StatusViewData.Concrete status, final StatusActionListener listener) { diff --git a/app/src/main/java/com/keylesspalace/tusky/db/AccountEntity.kt b/app/src/main/java/com/keylesspalace/tusky/db/AccountEntity.kt index 7e5f9cf8..83b88e8f 100644 --- a/app/src/main/java/com/keylesspalace/tusky/db/AccountEntity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/db/AccountEntity.kt @@ -41,6 +41,7 @@ data class AccountEntity(@field:PrimaryKey(autoGenerate = true) var id: Long, var notificationsFollowed: Boolean = true, var notificationsReblogged: Boolean = true, var notificationsFavorited: Boolean = true, + var notificationsPolls: Boolean = true, var notificationSound: Boolean = true, var notificationVibration: Boolean = true, var notificationLight: Boolean = true, 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 fe93c752..ad3b3ec4 100644 --- a/app/src/main/java/com/keylesspalace/tusky/db/AppDatabase.java +++ b/app/src/main/java/com/keylesspalace/tusky/db/AppDatabase.java @@ -30,7 +30,7 @@ import androidx.annotation.NonNull; @Database(entities = {TootEntity.class, AccountEntity.class, InstanceEntity.class, TimelineStatusEntity.class, TimelineAccountEntity.class, ConversationEntity.class - }, version = 15) + }, version = 16) public abstract class AppDatabase extends RoomDatabase { public abstract TootDao tootDao(); @@ -279,4 +279,11 @@ public abstract class AppDatabase extends RoomDatabase { } }; + public static final Migration MIGRATION_15_16 = new Migration(15, 16) { + @Override + public void migrate(@NonNull SupportSQLiteDatabase database) { + database.execSQL("ALTER TABLE `AccountEntity` ADD COLUMN `notificationsPolls` INTEGER NOT NULL DEFAULT 1"); + } + }; + } \ No newline at end of file diff --git a/app/src/main/java/com/keylesspalace/tusky/entity/Notification.kt b/app/src/main/java/com/keylesspalace/tusky/entity/Notification.kt index 30d5499d..d9459ea8 100644 --- a/app/src/main/java/com/keylesspalace/tusky/entity/Notification.kt +++ b/app/src/main/java/com/keylesspalace/tusky/entity/Notification.kt @@ -30,7 +30,8 @@ data class Notification( MENTION("mention"), REBLOG("reblog"), FAVOURITE("favourite"), - FOLLOW("follow"); + FOLLOW("follow"), + POLL("poll"); companion object { @@ -42,7 +43,7 @@ data class Notification( } return UNKNOWN } - val asList = listOf(MENTION,REBLOG,FAVOURITE,FOLLOW) + val asList = listOf(MENTION, REBLOG, FAVOURITE, FOLLOW, POLL) } override fun toString(): String { diff --git a/app/src/main/java/com/keylesspalace/tusky/entity/Poll.kt b/app/src/main/java/com/keylesspalace/tusky/entity/Poll.kt index b5a1fa76..d1ae0c1c 100644 --- a/app/src/main/java/com/keylesspalace/tusky/entity/Poll.kt +++ b/app/src/main/java/com/keylesspalace/tusky/entity/Poll.kt @@ -2,6 +2,7 @@ package com.keylesspalace.tusky.entity import com.google.gson.annotations.SerializedName import java.util.* +import kotlin.math.roundToInt data class Poll( val id: String, @@ -30,4 +31,12 @@ data class Poll( data class PollOption( val title: String, @SerializedName("votes_count") val votesCount: Int -) \ No newline at end of file +) { + fun getPercent(totalVotes: Int): Int { + return if (votesCount == 0) { + 0 + } else { + (votesCount / totalVotes.toDouble() * 100).roundToInt() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/NotificationsFragment.java b/app/src/main/java/com/keylesspalace/tusky/fragment/NotificationsFragment.java index c3ae4d2c..897ffd28 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/NotificationsFragment.java +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/NotificationsFragment.java @@ -222,7 +222,8 @@ public class NotificationsFragment extends SFragment implements recyclerView.addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.VERTICAL)); - adapter = new NotificationsAdapter(dataSource, this, this); + adapter = new NotificationsAdapter(accountManager.getActiveAccount().getAccountId(), + dataSource, this, this); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); alwaysShowSensitiveMedia = accountManager.getActiveAccount().getAlwaysShowSensitiveMedia(); boolean mediaPreviewEnabled = accountManager.getActiveAccount().getMediaPreviewEnabled(); @@ -652,13 +653,15 @@ public class NotificationsFragment extends SFragment implements private String getNotificationText(Notification.Type type) { switch (type) { case MENTION: - return getString(R.string.filter_mentions); + return getString(R.string.notification_mention_name); case FAVOURITE: - return getString(R.string.filter_favorites); + return getString(R.string.notification_favourite_name); case REBLOG: - return getString(R.string.filter_boosts); + return getString(R.string.notification_boost_name); case FOLLOW: - return getString(R.string.filter_follows); + return getString(R.string.notification_follow_name); + case POLL: + return getString(R.string.notification_poll_name); default: return "Unknown"; } diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/NotificationPreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/NotificationPreferencesFragment.kt index 4c62e0fa..da175fd0 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/NotificationPreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/NotificationPreferencesFragment.kt @@ -62,6 +62,10 @@ class NotificationPreferencesFragment : PreferenceFragmentCompat(), Preference.O favoritedPref.isChecked = activeAccount.notificationsFavorited favoritedPref.onPreferenceChangeListener = this + val pollsPref = requirePreference("notificationFilterPolls") as SwitchPreference + pollsPref.isChecked = activeAccount.notificationsPolls + pollsPref.onPreferenceChangeListener = this + val soundPref = requirePreference("notificationAlertSound") as SwitchPreference soundPref.isChecked = activeAccount.notificationSound soundPref.onPreferenceChangeListener = this @@ -94,6 +98,7 @@ class NotificationPreferencesFragment : PreferenceFragmentCompat(), Preference.O "notificationFilterFollows" -> activeAccount.notificationsFollowed = newValue as Boolean "notificationFilterReblogs" -> activeAccount.notificationsReblogged = newValue as Boolean "notificationFilterFavourites" -> activeAccount.notificationsFavorited = newValue as Boolean + "notificationFilterPolls" -> activeAccount.notificationsPolls = newValue as Boolean "notificationAlertSound" -> activeAccount.notificationSound = newValue as Boolean "notificationAlertVibrate" -> activeAccount.notificationVibration = newValue as Boolean "notificationAlertLight" -> activeAccount.notificationLight = newValue as Boolean diff --git a/app/src/main/java/com/keylesspalace/tusky/util/NotificationHelper.java b/app/src/main/java/com/keylesspalace/tusky/util/NotificationHelper.java index 49bb6553..21841212 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/NotificationHelper.java +++ b/app/src/main/java/com/keylesspalace/tusky/util/NotificationHelper.java @@ -35,6 +35,8 @@ import androidx.core.app.RemoteInput; import androidx.core.app.TaskStackBuilder; import androidx.core.content.ContextCompat; import androidx.core.text.BidiFormatter; + +import android.text.TextUtils; import android.util.Log; import com.bumptech.glide.Glide; @@ -48,6 +50,8 @@ import com.keylesspalace.tusky.R; import com.keylesspalace.tusky.db.AccountEntity; import com.keylesspalace.tusky.db.AccountManager; import com.keylesspalace.tusky.entity.Notification; +import com.keylesspalace.tusky.entity.Poll; +import com.keylesspalace.tusky.entity.PollOption; import com.keylesspalace.tusky.entity.Status; import com.keylesspalace.tusky.receiver.NotificationClearBroadcastReceiver; import com.keylesspalace.tusky.receiver.SendStatusBroadcastReceiver; @@ -105,6 +109,7 @@ public class NotificationHelper { public static final String CHANNEL_FOLLOW = "CHANNEL_FOLLOW"; public static final String CHANNEL_BOOST = "CHANNEL_BOOST"; public static final String CHANNEL_FAVOURITE = "CHANNEL_FAVOURITE"; + public static final String CHANNEL_POLL = "CHANNEL_POLL"; /** * time in minutes between notification checks @@ -159,12 +164,12 @@ public class NotificationHelper { notificationId++; - builder.setContentTitle(titleForType(context, body, bidiFormatter)) - .setContentText(bodyForType(body)); + builder.setContentTitle(titleForType(context, body, bidiFormatter, account)) + .setContentText(bodyForType(body, context)); - if (body.getType() == Notification.Type.MENTION) { + if (body.getType() == Notification.Type.MENTION || body.getType() == Notification.Type.POLL) { builder.setStyle(new NotificationCompat.BigTextStyle() - .bigText(bodyForType(body))); + .bigText(bodyForType(body, context))); } //load the avatar synchronously @@ -337,21 +342,25 @@ public class NotificationHelper { CHANNEL_MENTION + account.getIdentifier(), CHANNEL_FOLLOW + account.getIdentifier(), CHANNEL_BOOST + account.getIdentifier(), - CHANNEL_FAVOURITE + account.getIdentifier()}; + CHANNEL_FAVOURITE + account.getIdentifier(), + CHANNEL_POLL + account.getIdentifier(), + }; int[] channelNames = { - R.string.notification_channel_mention_name, - R.string.notification_channel_follow_name, - R.string.notification_channel_boost_name, - R.string.notification_channel_favourite_name + R.string.notification_mention_name, + R.string.notification_follow_name, + R.string.notification_boost_name, + R.string.notification_favourite_name, + R.string.notification_poll_name }; int[] channelDescriptions = { - R.string.notification_channel_mention_descriptions, - R.string.notification_channel_follow_description, - R.string.notification_channel_boost_description, - R.string.notification_channel_favourite_description + R.string.notification_mention_descriptions, + R.string.notification_follow_description, + R.string.notification_boost_description, + R.string.notification_favourite_description, + R.string.notification_poll_description }; - List channels = new ArrayList<>(4); + List channels = new ArrayList<>(5); NotificationChannelGroup channelGroup = new NotificationChannelGroup(account.getIdentifier(), account.getFullName()); @@ -472,8 +481,13 @@ public class NotificationHelper { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + String channelId = getChannelId(account, notification); + if(channelId == null) { + // unknown notificationtype + return false; + } //noinspection ConstantConditions - NotificationChannel channel = notificationManager.getNotificationChannel(getChannelId(account, notification)); + NotificationChannel channel = notificationManager.getNotificationChannel(channelId); return channel.getImportance() > NotificationManager.IMPORTANCE_NONE; } @@ -486,14 +500,15 @@ public class NotificationHelper { return account.getNotificationsReblogged(); case FAVOURITE: return account.getNotificationsFavorited(); + case POLL: + return account.getNotificationsPolls(); default: return false; } } - private static String getChannelId(AccountEntity account, Notification notification) { + private static @Nullable String getChannelId(AccountEntity account, Notification notification) { switch (notification.getType()) { - default: case MENTION: return CHANNEL_MENTION + account.getIdentifier(); case FOLLOW: @@ -502,6 +517,10 @@ public class NotificationHelper { return CHANNEL_BOOST + account.getIdentifier(); case FAVOURITE: return CHANNEL_FAVOURITE + account.getIdentifier(); + case POLL: + return CHANNEL_POLL + account.getIdentifier(); + default: + return null; } } @@ -554,7 +573,7 @@ public class NotificationHelper { } @Nullable - private static String titleForType(Context context, Notification notification, BidiFormatter bidiFormatter) { + private static String titleForType(Context context, Notification notification, BidiFormatter bidiFormatter, AccountEntity account) { String accountName = bidiFormatter.unicodeWrap(notification.getAccount().getName()); switch (notification.getType()) { case MENTION: @@ -569,22 +588,43 @@ public class NotificationHelper { case REBLOG: return String.format(context.getString(R.string.notification_reblog_format), accountName); + case POLL: + if(notification.getStatus().getAccount().getId().equals(account.getAccountId())) { + return context.getString(R.string.poll_ended_created); + } else { + return context.getString(R.string.poll_ended_voted); + } } return null; } - private static String bodyForType(Notification notification) { + private static String bodyForType(Notification notification, Context context) { switch (notification.getType()) { case FOLLOW: return "@" + notification.getAccount().getUsername(); case MENTION: case FAVOURITE: case REBLOG: - if (notification.getStatus().getSensitive()) { + if (!TextUtils.isEmpty(notification.getStatus().getSpoilerText())) { return notification.getStatus().getSpoilerText(); } else { return notification.getStatus().getContent().toString(); } + case POLL: + if (!TextUtils.isEmpty(notification.getStatus().getSpoilerText())) { + return notification.getStatus().getSpoilerText(); + } else { + StringBuilder builder = new StringBuilder(notification.getStatus().getContent()); + builder.append('\n'); + Poll poll = notification.getStatus().getPoll(); + for(PollOption option: poll.getOptions()) { + int percent = option.getPercent(poll.getVotesCount()); + CharSequence optionText = HtmlUtils.fromHtml(context.getString(R.string.poll_option_format, percent, option.getTitle())); + builder.append(optionText); + builder.append('\n'); + } + return builder.toString(); + } } return null; } diff --git a/app/src/main/res/drawable/ic_poll_24dp.xml b/app/src/main/res/drawable/ic_poll_24dp.xml new file mode 100644 index 00000000..5e55dc5a --- /dev/null +++ b/app/src/main/res/drawable/ic_poll_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/item_status.xml b/app/src/main/res/layout/item_status.xml index f9adcade..ac2a70b6 100644 --- a/app/src/main/res/layout/item_status.xml +++ b/app/src/main/res/layout/item_status.xml @@ -13,7 +13,7 @@ android:paddingRight="14dp"> إخفاء الوسائط المعينة كحساسة اظهار الوسائط المعينة كمحتوى حساس دائمًا إخفاء كافة الوسائط دائما - إشارات جديدة - الإخطارات عندما يشار إليك - متابِعون جدد - إخطارات عند تلقي متابعين جدد - الترقيات - إخطارات عندما يقوم أحدهم بترقية تبويقاتي - المفضلة - الإشعار عندما يقوم أحدهم بإضافة تبويقاتك إلى مفضلاته + إشارات جديدة + الإخطارات عندما يشار إليك + متابِعون جدد + إخطارات عند تلقي متابعين جدد + الترقيات + إخطارات عندما يقوم أحدهم بترقية تبويقاتي + المفضلة + الإشعار عندما يقوم أحدهم بإضافة تبويقاتك إلى مفضلاته %s أشار إليك %1$s, %2$s, %3$s و %4$d أخرى %1$s, %2$s, و %3$s diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 6168ba6d..cef9095b 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -168,14 +168,14 @@ Mida de text de l\'estat - Mencions noves - Notificacions sobre mencions noves - Seguidors nous - Notificacions sobre nous seguidors - Retoots - Notificacions si retootejents els teus toots - Preferits - Notificacions si marquen com a preferits els teus toots + Mencions noves + Notificacions sobre mencions noves + Seguidors nous + Notificacions sobre nous seguidors + Retoots + Notificacions si retootejents els teus toots + Preferits + Notificacions si marquen com a preferits els teus toots %s et mencionen diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 8553a117..8c59a941 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -218,14 +218,14 @@ Skrýt média označená jako citlivá Vždy zobrazovat média označená jako citlivá Vždy skrývat všechna média - Nové zmínky - Oznámení o nových zmínkách - Noví sledující - Oznámení o nových sledujících - Boosty - Oznámení, když jsou vaše tooty boostnuty - Oblíbení - Oznámení, když jsou vaše tooty označeny jako oblíbené + Nové zmínky + Oznámení o nových zmínkách + Noví sledující + Oznámení o nových sledujících + Boosty + Oznámení, když jsou vaše tooty boostnuty + Oblíbení + Oznámení, když jsou vaše tooty označeny jako oblíbené %s vás zmínil/a %1$s, %2$s, %3$s a dalších %4$d %1$s, %2$s a %3$s @@ -386,10 +386,6 @@ Vymazat Filtrovat - \@string/notification_channel_favourite_name - \@string/notification_channel_boost_name - \@string/notification_channel_follow_name - \@string/notification_channel_mention_name Použít Zobrazovat indikátor pro roboty diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index ed1e2539..0bd4b057 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -183,14 +183,14 @@ Canolig Mawr Mwyaf - Yn sôn amdanoch o\'r newydd - Hysbysiadau sôn amdanoch o\'r newydd - Dilynwyr Newydd - Hysbysiadau am ddilynwyr newydd - Hybiadau - Hysbysiadau pan gaiff eich tŵtiau eu hybu - Ffefrynnau - Hysbysiadau pan fo\'r tŵtiau wedi\'u marcio fel ffefryn + Yn sôn amdanoch o\'r newydd + Hysbysiadau sôn amdanoch o\'r newydd + Dilynwyr Newydd + Hysbysiadau am ddilynwyr newydd + Hybiadau + Hysbysiadau pan gaiff eich tŵtiau eu hybu + Ffefrynnau + Hysbysiadau pan fo\'r tŵtiau wedi\'u marcio fel ffefryn Soniodd %s amdanoch %1$s, %2$s, %3$s a %4$d eraill %1$s, %2$s, a %3$s diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index be5bdffd..d7a1fdf8 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -215,14 +215,14 @@ Verberge Medien welche als heikel makiert sind Medien, die als sensibel markiert sind, immer anzeigen Medien immer verstecken - Neue Erwähnungen - Benachrichtigungen über neue Erwähnungen - Neue Folgende - Benachrichtigunen über neue Folgende - Geteilte Beiträge - Benachrichtigungen wenn deine Beiträge geteilt werden - Favorisierte Beiträge - Benachrichtigungen wenn deine Beiträge favorisiert werden + Neue Erwähnungen + Benachrichtigungen über neue Erwähnungen + Neue Folgende + Benachrichtigunen über neue Folgende + Geteilte Beiträge + Benachrichtigungen wenn deine Beiträge geteilt werden + Favorisierte Beiträge + Benachrichtigungen wenn deine Beiträge favorisiert werden %s hat dich erwähnt %1$s, %2$s, %3$s und %4$d andere %1$s, %2$s, und %3$s diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index a30f2da9..0edbc711 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -214,14 +214,14 @@ Kaŝi aŭdovidaĵojn markitajn kiel tiklaj Ĉiam montri aŭdovidaĵojn markitajn kiel tiklaj Ĉiam kaŝi ĉiujn aŭdovidaĵojn - Novaj mencioj - Sciigoj pri novajn menciojn - Novaj sekvantoj - Sciigoj pri novajn sekvantojn - Diskonigoj - Sciigoj kiam viaj mesaĝoj estas diskonigita - Stelumoj - Sciigoj kiam viaj mesaĝoj estas stelumitaj + Novaj mencioj + Sciigoj pri novajn menciojn + Novaj sekvantoj + Sciigoj pri novajn sekvantojn + Diskonigoj + Sciigoj kiam viaj mesaĝoj estas diskonigita + Stelumoj + Sciigoj kiam viaj mesaĝoj estas stelumitaj %s menciis vin %1$s, %2$s, %3$s kaj %4$d aliaj %1$s, %2$s, kaj %3$s diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3f85b38b..144c6b72 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -201,14 +201,14 @@ Ocultar medios marcados como sensibles Mostrar siempre los medios marcados como sensibles Ocultar siempre todos los medios - Nuevas menciones - Notificaciones de nuevas menciones - Nuevos seguidores - Notificaciones de nuevos seguidores - Compartidos - Notificaciones de estados que fueron compartidos - Favoritos - Notificaciones de estados que recibieron favorito + Nuevas menciones + Notificaciones de nuevas menciones + Nuevos seguidores + Notificaciones de nuevos seguidores + Compartidos + Notificaciones de estados que fueron compartidos + Favoritos + Notificaciones de estados que recibieron favorito %s te mencionó %1$s, %2$s, %3$s y %4$d otros %1$s, %2$s, y %3$s diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 5d1b6d87..27542c30 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -187,14 +187,14 @@ Ezkutatu eduki mingarri gisa markatutako multimedia Beti erakutsi eduki mingarri gisa markatutako multimedia Beti ezkutatu multimedia guztiak - Aipamen berriak - Aipamen berrien jakinarazpenak - Jarritzaile berriak - Jarraitzaile berrien jakinarazpenak - Bultzadak - Bultzatutako tuten jakinarazpenak - Gogokoak - Gogokoen jakinarazpenak + Aipamen berriak + Aipamen berrien jakinarazpenak + Jarritzaile berriak + Jarraitzaile berrien jakinarazpenak + Bultzadak + Bultzatutako tuten jakinarazpenak + Gogokoak + Gogokoen jakinarazpenak %s-k aipatu zaitu %1$s, %2$s, %3$s eta beste %4$d %1$s, %2$s eta %3$s diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 0307df0f..1309f053 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -183,14 +183,14 @@ رسانه‌های نشان‌گذاری شده به عنوان حساس را پنهان کن رسانه‌های نشانه‌گذاری شده به عنوان حساس را همواره نشان بده همه رسانه‌ها را همواره پنهان کن - صدا زدن جدید - هشدار در مورد صدازدن جدید - دنبال‌کننده‌های جدید - هشدارها درمورد دنبال‌کنندگان جدید - تقویت - وقتی بوق‌های شما تقویت شد هشدار بده - مورد علاقه‌ها - هشدارها، زمانی که بوق‌های شما مورد علاقه قرار گرفت + صدا زدن جدید + هشدار در مورد صدازدن جدید + دنبال‌کننده‌های جدید + هشدارها درمورد دنبال‌کنندگان جدید + تقویت + وقتی بوق‌های شما تقویت شد هشدار بده + مورد علاقه‌ها + هشدارها، زمانی که بوق‌های شما مورد علاقه قرار گرفت %s شما را صدا زد %1$s, %2$s, %3$s و %4$d دیگر %1$s, %2$s, و %3$s diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d0506e93..6373960d 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -218,14 +218,14 @@ Masquer les médias marqués comme sensibles Toujours afficher les médias marqués comme sensibles Toujours masquer tous les médias - Nouvelles mentions - Notifications pour les nouvelles mentions - Nouveaux abonnés - Notifications pour les nouveaux abonnés - Boosts - Notifications quand vos pouets sont boostés - Favoris - Notifications quand vos pouets sont mis en favoris + Nouvelles mentions + Notifications pour les nouvelles mentions + Nouveaux abonnés + Notifications pour les nouveaux abonnés + Boosts + Notifications quand vos pouets sont boostés + Favoris + Notifications quand vos pouets sont mis en favoris %s vous a mentionné %1$s, %2$s, %3$s et %4$d autres %1$s, %2$s et %3$s diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 3cc8b1f7..eeee5f8f 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -203,14 +203,14 @@ Rejtsd el az érzékenynek jelölt médiát Mindig mutasd az érzékenynek jelölt médiát Mindig rejtsd el a média tartalmakat - Új említések - Értesítések új említések esetén - Új követők - Értesítések az új követők esetén - Rebloggok - Értesítések posztjaid rebloggolása esetén - Kedvencek - Értesítések mikor Tülköléseid kedvencnek jelölik + Új említések + Értesítések új említések esetén + Új követők + Értesítések az új követők esetén + Rebloggok + Értesítések posztjaid rebloggolása esetén + Kedvencek + Értesítések mikor Tülköléseid kedvencnek jelölik %s megemített téged %1$s, %2$s, %3$s és még %4$d %1$s, %2$s meg %3$s diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 6113b151..dfcc4070 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -214,14 +214,14 @@ Nascondi media segnati come sensibili Mostra sempre media segnati come sensibili Nascondi sempre tutti i media - Nuove Menzioni - Notifiche quando qualcuno ti menziona - Nuove persone che ti seguono - Notifiche su nuove persone che ti seguono - Boost - Notifiche quando i tuoi toot vengono boostati - Preferiti - Notifiche quando i tuoi toot vengono segnati come preferiti + Nuove Menzioni + Notifiche quando qualcuno ti menziona + Nuove persone che ti seguono + Notifiche su nuove persone che ti seguono + Boost + Notifiche quando i tuoi toot vengono boostati + Preferiti + Notifiche quando i tuoi toot vengono segnati come preferiti %s ti ha menzionato %1$s, %2$s, %3$s e %4$d altri %1$s, %2$s e %3$s diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index dd84b528..30a44ced 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -206,14 +206,14 @@ 閲覧注意としてマークされたメディアは隠す 閲覧注意としてマークされたメディアも常に表示する 全てのメディアを常に隠す - 新しい返信 - 新しい返信の通知 - 新しいフォロワー - 新しいフォロワーの通知 - ブースト - あなたのトゥートがブーストされたときの通知 - お気に入り - あなたのトゥートがお気に入りに登録されたときの通知 + 新しい返信 + 新しい返信の通知 + 新しいフォロワー + 新しいフォロワーの通知 + ブースト + あなたのトゥートがブーストされたときの通知 + お気に入り + あなたのトゥートがお気に入りに登録されたときの通知 %sさんが返信しました %1$sさん、%2$sさん、%3$sさんと他%4$d人 %1$sさん、%2$sさん、%3$sさん diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index c1d2cdb3..b9006d34 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -213,14 +213,14 @@ Als gevoelig gemarkeerde media verbergen Als gevoelig gemarkeerde media altijd verbergen Media altijd verbergen - Nieuwe vermeldingen - Meldingen over nieuwe vermeldingen - Nieuwe volgers - Meldingen over nieuwe volgers - Boosts - Meldingen wanneer jouw toots worden geboost - Favorieten - Meldingen wanneer jouw toots als favoriet worden gemarkeerd + Nieuwe vermeldingen + Meldingen over nieuwe vermeldingen + Nieuwe volgers + Meldingen over nieuwe volgers + Boosts + Meldingen wanneer jouw toots worden geboost + Favorieten + Meldingen wanneer jouw toots als favoriet worden gemarkeerd %s vermeldde jou %1$s, %2$s, %3$s en %4$d anderen %1$s, %2$s en %3$s diff --git a/app/src/main/res/values-no-rNB/strings.xml b/app/src/main/res/values-no-rNB/strings.xml index 61c603ea..059e07c3 100644 --- a/app/src/main/res/values-no-rNB/strings.xml +++ b/app/src/main/res/values-no-rNB/strings.xml @@ -229,12 +229,12 @@ Mediavisning - Nye følgere - Varsler om nye følgere - Boosts - Varsler når tootene dine blir boostet - Favoritter - Varsler når tootene dine blir favorisert + Nye følgere + Varsler om nye følgere + Boosts + Varsler når tootene dine blir boostet + Favoritter + Varsler når tootene dine blir favorisert %s nevnte deg @@ -302,8 +302,8 @@ Slett konto fra listen Standard synlighet for toots - Nye omtaler - Varsler om nye omtaler + Nye omtaler + Varsler om nye omtaler Tusky er fri og åpen kildekode. Applikasjonen er lisensiert under GNU General Public License versjon 3. Du kan se lisensen her: https://www.gnu.org/licenses/gpl-3.0.en.html Hjemmeside: \n https://tusky.app @@ -400,10 +400,6 @@ Emneord Slett Filter - \@string/notification_channel_favourite_name - \@string/notification_channel_boost_name - \@string/notification_channel_follow_name - \@string/notification_channel_mention_name Bruk Skriv Toot diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index ffc24d25..1dc7c7f2 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -178,14 +178,14 @@ Mejana Granda Grandassa - Mencions nòvas - Notificacions de mencions noves - Seguidors nòus - Notificacions de nòus seguidors - Retuts - Notificacions de compartiment de vòstres tuts - Preferits - Notificacions s’agradan vòstres tuts + Mencions nòvas + Notificacions de mencions noves + Seguidors nòus + Notificacions de nòus seguidors + Retuts + Notificacions de compartiment de vòstres tuts + Preferits + Notificacions s’agradan vòstres tuts %s vos mencionan %1$s, %2$s, %3$s e %4$d mai %1$s, %2$s e %3$s diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index d68d6ba6..68eea60d 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -177,14 +177,14 @@ Średni Duży Ogromny - Nowe wspomnienia - Powiadomienia o nowych wspomnieniach - Nowi śledzący - Powiadomienia o nowych śledzących - Podbicia - Powiadomienia o podbiciu wpisów - Ulubione - Powiadomienia o dodaniu wpisów do ulubionych + Nowe wspomnienia + Powiadomienia o nowych wspomnieniach + Nowi śledzący + Powiadomienia o nowych śledzących + Podbicia + Powiadomienia o podbiciu wpisów + Ulubione + Powiadomienia o dodaniu wpisów do ulubionych %s wspomniał o Tobie %1$s, %2$s, %3$s i %4$d innych %1$s, %2$s, i %3$s diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 8824c145..31c8351b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -197,14 +197,14 @@ Maior Ocultar mídia marcada como sensível - Novas Menções - Notificações sobre novas menções - Novos Seguidores - Notificações sobre novos seguidores - Compartilhamentos - Notificações quando seus toots forem compartilhados - Favoritos - Notificações quando seus toots forem favoritados + Novas Menções + Notificações sobre novas menções + Novos Seguidores + Notificações sobre novos seguidores + Compartilhamentos + Notificações quando seus toots forem compartilhados + Favoritos + Notificações quando seus toots forem favoritados %s mencionou você %1$s, %2$s, %3$s e %4$d outros %1$s, %2$s, e %3$s diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e69814ef..7cde6b41 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -229,14 +229,14 @@ Всегда показывать чувствительные медиафайлы Всегда скрывать все медиафайлы - Новые упоминания - Уведомлять о новых упоминаниях - Новые подписчики - Уведомлять о новых подписчиках - Продвижения - Уведомлять, если кто-то продвинул ваши сообщения - Избранное - Уведомлять, когда ваши сообщения отмечают как «избранные» + Новые упоминания + Уведомлять о новых упоминаниях + Новые подписчики + Уведомлять о новых подписчиках + Продвижения + Уведомлять, если кто-то продвинул ваши сообщения + Избранное + Уведомлять, когда ваши сообщения отмечают как «избранные» %s упомянул(а) Вас diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index c3a86ca8..f2f73450 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -227,14 +227,14 @@ Prikaz medijev - Nove omembe - Obvestila o novih omembah - Novi sledilci - Obvestila o novih sledilcih - Spodbude - Obvestila, ko so vaši tuti spodbujeni - Priljubljeni - Obvestila, ko so vaši tuti vzljubljeni + Nove omembe + Obvestila o novih omembah + Novi sledilci + Obvestila o novih sledilcih + Spodbude + Obvestila, ko so vaši tuti spodbujeni + Priljubljeni + Obvestila, ko so vaši tuti vzljubljeni %s vas je omenil-a @@ -403,10 +403,6 @@ Ključnik Počisti Filter - \@string/notification_channel_favourite_name - \@string/notification_channel_boost_name - \@string/notification_channel_follow_name - \@string/notification_channel_mention_name Uporabi Sestavi tut diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 9c330775..240bc193 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -215,14 +215,14 @@ Dölj media som markerat känsligt Visa alltid media som markerat känsligt Dölj alltid media - Nya omnämnanden - Notifieringar om nya omnämnanden - Nya följare - Notifieringar för nya följare - Knuffar - Notifieringar när dina toots blir knuffade - Favoriter - Notifieringar när dina toots blir markerade som favoriter + Nya omnämnanden + Notifieringar om nya omnämnanden + Nya följare + Notifieringar för nya följare + Knuffar + Notifieringar när dina toots blir knuffade + Favoriter + Notifieringar när dina toots blir markerade som favoriter %s omnämnde dig %1$s, %2$s, %3$s och %4$d andra %1$s, %2$s, och %3$s @@ -385,10 +385,6 @@ Rensa Filtrera - \@string/notification_channel_favourite_name - \@string/notification_channel_boost_name - \@string/notification_channel_follow_name - \@string/notification_channel_mention_name Utför Visa robotindikator diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 28d4f144..2f32da17 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -163,14 +163,14 @@ பட்டியலிடப்படாதவர்களுக்கு பின்பற்றுபவர்களுக்கு மட்டும் நிலை உரை அளவு - புதிய குறிப்புகள் - புதிய குறிப்புகள் பற்றிய அறிவிப்புகள் - புதிய பின்பற்றுபவர்கள் - புதிய பின்தொடர்பவர்களைப் பற்றிய அறிவிப்புகள் - ஊக்கியாக - எமது toot மேலேற்றும் போது தெரிவி. - பிடித்தவைகள் - எமது toot பிடித்தவையானால் தெரிவி. + புதிய குறிப்புகள் + புதிய குறிப்புகள் பற்றிய அறிவிப்புகள் + புதிய பின்பற்றுபவர்கள் + புதிய பின்தொடர்பவர்களைப் பற்றிய அறிவிப்புகள் + ஊக்கியாக + எமது toot மேலேற்றும் போது தெரிவி. + பிடித்தவைகள் + எமது toot பிடித்தவையானால் தெரிவி. %s தங்களை குறிபிட்டுள்ளார் %1$s, %2$s, %3$s மற்றும் %4$d மற்றவர்கள் %1$s, %2$s, மற்றும் %3$s diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 32b045c8..a840efeb 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -200,14 +200,14 @@ Hassas olarak işaretlenmiş medyayı gizle Hassas olarak işaretlenmiş medyayı göster Tüm medyayı gizle - Yeni Bahsedilenler - Yeni bahsedilenler hakkında bildirim - Yeni Takipçiler - Yeni takipçiler hakkında bildirim - Yükseltilenler - Tootların yükseltildiğinde bildirimler - Favoriler - Tootların favori olarak işaretlendiğinde + Yeni Bahsedilenler + Yeni bahsedilenler hakkında bildirim + Yeni Takipçiler + Yeni takipçiler hakkında bildirim + Yükseltilenler + Tootların yükseltildiğinde bildirimler + Favoriler + Tootların favori olarak işaretlendiğinde %s senden bahsetti %1$s, %2$s, %3$s ve %4$d daha %1$s, %2$s ve %3$s diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 172ebe0c..e3a26a67 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -194,14 +194,14 @@ 自动隐藏敏感媒体 总是显示敏感媒体 总是隐藏所有媒体 - 被提及 - 当有用户在嘟文中提及我时 - 关注者 - 当有用户关注我时 - 转嘟 - 当有用户转嘟了我的嘟文时 - 收藏 - 当有用户收藏了我的嘟文时 + 被提及 + 当有用户在嘟文中提及我时 + 关注者 + 当有用户关注我时 + 转嘟 + 当有用户转嘟了我的嘟文时 + 收藏 + 当有用户收藏了我的嘟文时 %s 提及了你 %1$s, %2$s, %3$s 和 %4$d 人 %1$s, %2$s, 和 %3$s diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 99ed28e0..27b9019e 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -183,14 +183,14 @@ 自動隱藏敏感媒體 總是顯示敏感媒體 總是隱藏所有媒體 - 被提及 - 當有使用者在嘟文中提及我時 - 關注者 - 當有使用者關注我時 - 轉嘟 - 當有使用者轉嘟了我的嘟文時 - 收藏 - 當有使用者收藏了我的嘟文時 + 被提及 + 當有使用者在嘟文中提及我時 + 關注者 + 當有使用者關注我時 + 轉嘟 + 當有使用者轉嘟了我的嘟文時 + 收藏 + 當有使用者收藏了我的嘟文時 %s 提及了你 %1$s, %2$s, %3$s 和 %4$d 人 %1$s, %2$s, 和 %3$s diff --git a/app/src/main/res/values-zh-rMO/strings.xml b/app/src/main/res/values-zh-rMO/strings.xml index 99ed28e0..27b9019e 100644 --- a/app/src/main/res/values-zh-rMO/strings.xml +++ b/app/src/main/res/values-zh-rMO/strings.xml @@ -183,14 +183,14 @@ 自動隱藏敏感媒體 總是顯示敏感媒體 總是隱藏所有媒體 - 被提及 - 當有使用者在嘟文中提及我時 - 關注者 - 當有使用者關注我時 - 轉嘟 - 當有使用者轉嘟了我的嘟文時 - 收藏 - 當有使用者收藏了我的嘟文時 + 被提及 + 當有使用者在嘟文中提及我時 + 關注者 + 當有使用者關注我時 + 轉嘟 + 當有使用者轉嘟了我的嘟文時 + 收藏 + 當有使用者收藏了我的嘟文時 %s 提及了你 %1$s, %2$s, %3$s 和 %4$d 人 %1$s, %2$s, 和 %3$s diff --git a/app/src/main/res/values-zh-rSG/strings.xml b/app/src/main/res/values-zh-rSG/strings.xml index 29c41434..83e0f209 100644 --- a/app/src/main/res/values-zh-rSG/strings.xml +++ b/app/src/main/res/values-zh-rSG/strings.xml @@ -185,14 +185,14 @@ 自动隐藏敏感媒体 总是显示敏感媒体 总是隐藏所有媒体 - 被提及 - 当有用户在嘟文中提及我时 - 关注者 - 当有用户关注我时 - 转嘟 - 当有用户转嘟了我的嘟文时 - 被收藏 - 当有用户收藏了我的嘟文时 + 被提及 + 当有用户在嘟文中提及我时 + 关注者 + 当有用户关注我时 + 转嘟 + 当有用户转嘟了我的嘟文时 + 被收藏 + 当有用户收藏了我的嘟文时 %s 提及了你 %1$s, %2$s, %3$s 和 %4$d 人 %1$s, %2$s, 和 %3$s diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 99ed28e0..27b9019e 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -183,14 +183,14 @@ 自動隱藏敏感媒體 總是顯示敏感媒體 總是隱藏所有媒體 - 被提及 - 當有使用者在嘟文中提及我時 - 關注者 - 當有使用者關注我時 - 轉嘟 - 當有使用者轉嘟了我的嘟文時 - 收藏 - 當有使用者收藏了我的嘟文時 + 被提及 + 當有使用者在嘟文中提及我時 + 關注者 + 當有使用者關注我時 + 轉嘟 + 當有使用者轉嘟了我的嘟文時 + 收藏 + 當有使用者收藏了我的嘟文時 %s 提及了你 %1$s, %2$s, %3$s 和 %4$d 人 %1$s, %2$s, 和 %3$s diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 51815334..243053f5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -200,6 +200,7 @@ followed my posts are boosted my posts are favourited + polls have ended Appearance App Theme Timelines @@ -249,14 +250,16 @@ Always show media marked as sensitive Always hide all media - New Mentions - Notifications about new mentions - New Followers - Notifications about new followers - Boosts - Notifications when your toots get boosted - Favourites - Notifications when your toots get marked as favourite + New Mentions + Notifications about new mentions + New Followers + Notifications about new followers + Boosts + Notifications when your toots get boosted + Favourites + Notifications when your toots get marked as favourite + Polls + Notifications about polls that have ended %s mentioned you @@ -462,10 +465,6 @@ Hashtag Clear Filter - @string/notification_channel_favourite_name - @string/notification_channel_boost_name - @string/notification_channel_follow_name - @string/notification_channel_mention_name Apply Compose Toot @@ -490,5 +489,8 @@ Vote + A poll you have voted in has ended + A poll you created has ended + diff --git a/app/src/main/res/xml/notification_preferences.xml b/app/src/main/res/xml/notification_preferences.xml index 91e0b5fc..e2e53697 100644 --- a/app/src/main/res/xml/notification_preferences.xml +++ b/app/src/main/res/xml/notification_preferences.xml @@ -39,6 +39,12 @@ android:title="@string/pref_title_notification_filter_favourites" app:iconSpaceReserved="false" /> + +