diff --git a/app/schemas/com.keylesspalace.tusky.db.AppDatabase/26.json b/app/schemas/com.keylesspalace.tusky.db.AppDatabase/26.json new file mode 100644 index 000000000..bd82fd4fd --- /dev/null +++ b/app/schemas/com.keylesspalace.tusky.db.AppDatabase/26.json @@ -0,0 +1,747 @@ +{ + "formatVersion": 1, + "database": { + "version": 26, + "identityHash": "14fb3d5743b7a89e8e62463e05f086ab", + "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)", + "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 + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "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, `notificationsFollowRequested` INTEGER NOT NULL, `notificationsReblogged` INTEGER NOT NULL, `notificationsFavorited` INTEGER NOT NULL, `notificationsPolls` INTEGER NOT NULL, `notificationsSubscriptions` 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, `alwaysOpenSpoiler` 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": "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": "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": "alwaysOpenSpoiler", + "columnName": "alwaysOpenSpoiler", + "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 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, `version` TEXT, 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": "version", + "columnName": "version", + "affinity": "TEXT", + "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, `bookmarked` 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, `muted` INTEGER, 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": "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": 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 + }, + { + "fieldPath": "muted", + "columnName": "muted", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "serverId", + "timelineUserId" + ], + "autoGenerate": false + }, + "indices": [ + { + "name": "index_TimelineStatusEntity_authorServerId_timelineUserId", + "unique": false, + "columnNames": [ + "authorServerId", + "timelineUserId" + ], + "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": { + "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_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_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.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.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": [] + } + ], + "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, '14fb3d5743b7a89e8e62463e05f086ab')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt index 1628d41d9..b7763bcd5 100644 --- a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt @@ -31,7 +31,6 @@ import android.widget.ImageView import androidx.appcompat.app.AlertDialog import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.content.ContextCompat -import androidx.core.content.edit import androidx.core.content.pm.ShortcutManagerCompat import androidx.emoji.text.EmojiCompat import androidx.emoji.text.EmojiCompat.InitCallback @@ -243,7 +242,6 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje // Flush old media that was cached for sharing deleteStaleCachedMedia(applicationContext.getExternalFilesDir("Tusky")) } - draftWarning() } override fun onResume() { @@ -417,7 +415,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje } }, primaryDrawerItem { - nameRes = R.string.action_access_saved_toot + nameRes = R.string.action_access_drafts iconRes = R.drawable.ic_notebook onClick = { val intent = DraftsActivity.newIntent(context) @@ -755,29 +753,6 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje header.setActiveProfile(accountManager.activeAccount!!.id) } - private fun draftWarning() { - val sharedPrefsKey = "show_draft_warning" - appDb.tootDao().savedTootCount() - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .autoDispose(this, Lifecycle.Event.ON_DESTROY) - .subscribe { draftCount -> - val showDraftWarning = preferences.getBoolean(sharedPrefsKey, true) - if (draftCount > 0 && showDraftWarning) { - AlertDialog.Builder(this) - .setMessage(R.string.new_drafts_warning) - .setNegativeButton("Don't show again") { _, _ -> - preferences.edit(commit = true) { - putBoolean(sharedPrefsKey, false) - } - } - .setPositiveButton(android.R.string.ok, null) - .show() - } - } - - } - override fun getActionButton(): FloatingActionButton? = binding.composeButton override fun androidInjector() = androidInjector diff --git a/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java b/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java deleted file mode 100644 index 63a32b174..000000000 --- a/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java +++ /dev/null @@ -1,209 +0,0 @@ -/* Copyright 2017 Andrew Dawson - * - * This file is a part of Tusky. - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 3 of the - * License, or (at your option) any later version. - * - * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - * Public License for more details. - * - * You should have received a copy of the GNU General Public License along with Tusky; if not, - * see . */ - -package com.keylesspalace.tusky; - -import android.content.Intent; -import android.os.AsyncTask; -import android.os.Bundle; -import android.view.View; - -import androidx.annotation.Nullable; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.Toolbar; -import androidx.lifecycle.Lifecycle; -import androidx.recyclerview.widget.DividerItemDecoration; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import com.keylesspalace.tusky.adapter.SavedTootAdapter; -import com.keylesspalace.tusky.appstore.EventHub; -import com.keylesspalace.tusky.appstore.StatusComposedEvent; -import com.keylesspalace.tusky.components.compose.ComposeActivity; -import com.keylesspalace.tusky.db.AppDatabase; -import com.keylesspalace.tusky.db.TootDao; -import com.keylesspalace.tusky.db.TootEntity; -import com.keylesspalace.tusky.di.Injectable; -import com.keylesspalace.tusky.util.SaveTootHelper; -import com.keylesspalace.tusky.view.BackgroundMessageView; - -import java.lang.ref.WeakReference; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; - -import javax.inject.Inject; - -import io.reactivex.android.schedulers.AndroidSchedulers; - -import static com.keylesspalace.tusky.components.compose.ComposeActivity.ComposeOptions; -import static com.uber.autodispose.AutoDispose.autoDisposable; -import static com.uber.autodispose.android.lifecycle.AndroidLifecycleScopeProvider.from; - -public final class SavedTootActivity extends BaseActivity implements SavedTootAdapter.SavedTootAction, - Injectable { - - // ui - private SavedTootAdapter adapter; - private BackgroundMessageView errorMessageView; - - private List toots = new ArrayList<>(); - @Nullable - private AsyncTask asyncTask; - - @Inject - EventHub eventHub; - @Inject - AppDatabase database; - @Inject - SaveTootHelper saveTootHelper; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - eventHub.getEvents() - .observeOn(AndroidSchedulers.mainThread()) - .ofType(StatusComposedEvent.class) - .as(autoDisposable(from(this, Lifecycle.Event.ON_DESTROY))) - .subscribe((__) -> this.fetchToots()); - - setContentView(R.layout.activity_saved_toot); - - Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - ActionBar bar = getSupportActionBar(); - if (bar != null) { - bar.setTitle(getString(R.string.title_drafts)); - bar.setDisplayHomeAsUpEnabled(true); - bar.setDisplayShowHomeEnabled(true); - } - - RecyclerView recyclerView = findViewById(R.id.recyclerView); - errorMessageView = findViewById(R.id.errorMessageView); - recyclerView.setHasFixedSize(true); - LinearLayoutManager layoutManager = new LinearLayoutManager(this); - recyclerView.setLayoutManager(layoutManager); - DividerItemDecoration divider = new DividerItemDecoration( - this, layoutManager.getOrientation()); - recyclerView.addItemDecoration(divider); - adapter = new SavedTootAdapter(this); - recyclerView.setAdapter(adapter); - } - - @Override - protected void onResume() { - super.onResume(); - fetchToots(); - } - - @Override - protected void onPause() { - super.onPause(); - if (asyncTask != null) asyncTask.cancel(true); - } - - private void fetchToots() { - asyncTask = new FetchPojosTask(this, database.tootDao()) - .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } - - private void setNoContent(int size) { - if (size == 0) { - errorMessageView.setup(R.drawable.elephant_friend_empty, R.string.no_saved_status, null); - errorMessageView.setVisibility(View.VISIBLE); - } else { - errorMessageView.setVisibility(View.GONE); - } - } - - @Override - public void delete(int position, TootEntity item) { - - saveTootHelper.deleteDraft(item); - - toots.remove(position); - // update adapter - if (adapter != null) { - adapter.removeItem(position); - setNoContent(toots.size()); - } - } - - @Override - public void click(int position, TootEntity item) { - Gson gson = new Gson(); - Type stringListType = new TypeToken>() {}.getType(); - List jsonUrls = gson.fromJson(item.getUrls(), stringListType); - List descriptions = gson.fromJson(item.getDescriptions(), stringListType); - - ComposeOptions composeOptions = new ComposeOptions( - /*scheduledTootUid*/null, - item.getUid(), - /*drafId*/null, - item.getText(), - jsonUrls, - descriptions, - /*mentionedUsernames*/null, - item.getInReplyToId(), - /*replyVisibility*/null, - item.getVisibility(), - item.getContentWarning(), - item.getInReplyToUsername(), - item.getInReplyToText(), - /*mediaAttachments*/null, - /*draftAttachments*/null, - /*scheduledAt*/null, - /*sensitive*/null, - /*poll*/null, - /* modifiedInitialState */ true - ); - Intent intent = ComposeActivity.startIntent(this, composeOptions); - startActivity(intent); - } - - static final class FetchPojosTask extends AsyncTask> { - - private final WeakReference activityRef; - private final TootDao tootDao; - - FetchPojosTask(SavedTootActivity activity, TootDao tootDao) { - this.activityRef = new WeakReference<>(activity); - this.tootDao = tootDao; - } - - @Override - protected List doInBackground(Void... voids) { - return tootDao.loadAll(); - } - - @Override - protected void onPostExecute(List pojos) { - super.onPostExecute(pojos); - SavedTootActivity activity = activityRef.get(); - if (activity == null) return; - - activity.toots.clear(); - activity.toots.addAll(pojos); - - // set ui - activity.setNoContent(pojos.size()); - activity.adapter.setItems(activity.toots); - activity.adapter.notifyDataSetChanged(); - } - } -} diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/SavedTootAdapter.java b/app/src/main/java/com/keylesspalace/tusky/adapter/SavedTootAdapter.java deleted file mode 100644 index af9c31d5d..000000000 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/SavedTootAdapter.java +++ /dev/null @@ -1,122 +0,0 @@ -/* Copyright 2017 Andrew Dawson - * - * This file is a part of Tusky. - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 3 of the - * License, or (at your option) any later version. - * - * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - * Public License for more details. - * - * You should have received a copy of the GNU General Public License along with Tusky; if not, - * see . */ - -package com.keylesspalace.tusky.adapter; - -import android.content.Context; -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageButton; -import android.widget.TextView; - -import com.keylesspalace.tusky.R; -import com.keylesspalace.tusky.db.TootEntity; - -import java.util.ArrayList; -import java.util.List; - -public class SavedTootAdapter extends RecyclerView.Adapter { - private List list; - private SavedTootAction handler; - - public SavedTootAdapter(Context context) { - super(); - list = new ArrayList<>(); - handler = (SavedTootAction) context; - } - - @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.item_saved_toot, parent, false); - return new TootViewHolder(view); - } - - @Override - public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { - TootViewHolder holder = (TootViewHolder) viewHolder; - holder.bind(getItem(position)); - } - - @Override - public int getItemCount() { - return list.size(); - } - - public void setItems(List newToot) { - list = new ArrayList<>(); - list.addAll(newToot); - } - - public void addItems(List newToot) { - int end = list.size(); - list.addAll(newToot); - notifyItemRangeInserted(end, newToot.size()); - } - - @Nullable - public TootEntity removeItem(int position) { - if (position < 0 || position >= list.size()) { - return null; - } - TootEntity toot = list.remove(position); - notifyItemRemoved(position); - return toot; - } - - private TootEntity getItem(int position) { - if (position >= 0 && position < list.size()) { - return list.get(position); - } - return null; - } - - // handler saved toot - public interface SavedTootAction { - void delete(int position, TootEntity item); - - void click(int position, TootEntity item); - } - - private class TootViewHolder extends RecyclerView.ViewHolder { - View view; - TextView content; - ImageButton suppr; - - TootViewHolder(View view) { - super(view); - this.view = view; - this.content = view.findViewById(R.id.content); - this.suppr = view.findViewById(R.id.suppr); - } - - void bind(final TootEntity item) { - suppr.setEnabled(true); - - if (item != null) { - content.setText(item.getText()); - - suppr.setOnClickListener(v -> { - v.setEnabled(false); - handler.delete(getBindingAdapterPosition(), item); - }); - view.setOnClickListener(v -> handler.click(getBindingAdapterPosition(), item)); - } - } - } -} 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 649ed1420..f71f26536 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 @@ -1013,7 +1013,6 @@ class ComposeActivity : BaseActivity(), data class ComposeOptions( // Let's keep fields var until all consumers are Kotlin var scheduledTootId: String? = null, - var savedTootUid: Int? = null, var draftId: Int? = null, var tootText: String? = null, var mediaUrls: List? = null, diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt index 71293511d..28019b1ae 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt @@ -45,14 +45,12 @@ class ComposeViewModel @Inject constructor( private val mediaUploader: MediaUploader, private val serviceClient: ServiceClient, private val draftHelper: DraftHelper, - private val saveTootHelper: SaveTootHelper, private val db: AppDatabase ) : RxAwareViewModel() { private var replyingStatusAuthor: String? = null private var replyingStatusContent: String? = null internal var startingText: String? = null - private var savedTootUid: Int = 0 private var draftId: Int = 0 private var scheduledTootId: String? = null private var startingContentWarning: String = "" @@ -216,9 +214,6 @@ class ComposeViewModel @Inject constructor( } fun deleteDraft() { - if (savedTootUid != 0) { - saveTootHelper.deleteDraft(savedTootUid) - } if (draftId != 0) { draftHelper.deleteDraftAndAttachments(draftId) .subscribe() @@ -291,7 +286,6 @@ class ComposeViewModel @Inject constructor( replyingStatusContent = null, replyingStatusAuthorUsername = null, accountId = accountManager.activeAccount!!.id, - savedTootUid = savedTootUid, draftId = draftId, idempotencyKey = randomAlphanumericString(16), retries = 0 @@ -406,20 +400,8 @@ class ComposeViewModel @Inject constructor( } // recreate media list - val loadedDraftMediaUris = composeOptions?.mediaUrls - val loadedDraftMediaDescriptions: List? = composeOptions?.mediaDescriptions val draftAttachments = composeOptions?.draftAttachments - if (loadedDraftMediaUris != null && loadedDraftMediaDescriptions != null) { - // when coming from SavedTootActivity - loadedDraftMediaUris.zip(loadedDraftMediaDescriptions) - .forEach { (uri, description) -> - pickMedia(uri.toUri()).observeForever { errorOrItem -> - if (errorOrItem.isRight() && description != null) { - updateDescription(errorOrItem.asRight().localId, description) - } - } - } - } else if (draftAttachments != null) { + if (draftAttachments != null) { // when coming from DraftActivity draftAttachments.forEach { attachment -> pickMedia(attachment.uri, attachment.description) } } else composeOptions?.mediaAttachments?.forEach { a -> @@ -432,7 +414,6 @@ class ComposeViewModel @Inject constructor( addUploadedMedia(a.id, mediaType, a.url.toUri(), a.description) } - savedTootUid = composeOptions?.savedTootUid ?: 0 draftId = composeOptions?.draftId ?: 0 scheduledTootId = composeOptions?.scheduledTootId startingText = composeOptions?.tootText diff --git a/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsActivity.kt index ddf8a8385..5f246905e 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsActivity.kt @@ -19,19 +19,15 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.util.Log -import android.view.Menu -import android.view.MenuItem import android.widget.LinearLayout import android.widget.Toast import androidx.activity.viewModels -import androidx.lifecycle.Lifecycle import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.snackbar.Snackbar import com.keylesspalace.tusky.BaseActivity import com.keylesspalace.tusky.R -import com.keylesspalace.tusky.SavedTootActivity import com.keylesspalace.tusky.components.compose.ComposeActivity import com.keylesspalace.tusky.databinding.ActivityDraftsBinding import com.keylesspalace.tusky.db.DraftEntity @@ -40,7 +36,6 @@ import com.keylesspalace.tusky.util.hide import com.keylesspalace.tusky.util.show import com.uber.autodispose.android.lifecycle.autoDispose import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.schedulers.Schedulers import retrofit2.HttpException import javax.inject.Inject @@ -54,8 +49,6 @@ class DraftsActivity : BaseActivity(), DraftActionListener { private lateinit var binding: ActivityDraftsBinding private lateinit var bottomSheet: BottomSheetBehavior - private var oldDraftsButton: MenuItem? = null - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -70,7 +63,7 @@ class DraftsActivity : BaseActivity(), DraftActionListener { setDisplayShowHomeEnabled(true) } - binding.draftsErrorMessageView.setup(R.drawable.elephant_friend_empty, R.string.no_saved_status) + binding.draftsErrorMessageView.setup(R.drawable.elephant_friend_empty, R.string.no_drafts) val adapter = DraftsAdapter(this) @@ -92,34 +85,6 @@ class DraftsActivity : BaseActivity(), DraftActionListener { } } - override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.drafts, menu) - oldDraftsButton = menu.findItem(R.id.action_old_drafts) - viewModel.showOldDraftsButton() - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .autoDispose(this, Lifecycle.Event.ON_DESTROY) - .subscribe { showOldDraftsButton -> - oldDraftsButton?.isVisible = showOldDraftsButton - } - return true - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - android.R.id.home -> { - onBackPressed() - return true - } - R.id.action_old_drafts -> { - val intent = Intent(this, SavedTootActivity::class.java) - startActivityWithSlideInAnimation(intent) - return true - } - } - return super.onOptionsItemSelected(item) - } - override fun onOpenDraft(draft: DraftEntity) { if (draft.inReplyToId != null) { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsViewModel.kt index f928b6d03..8beccfb74 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsViewModel.kt @@ -22,7 +22,6 @@ import com.keylesspalace.tusky.db.AppDatabase import com.keylesspalace.tusky.db.DraftEntity import com.keylesspalace.tusky.entity.Status import com.keylesspalace.tusky.network.MastodonApi -import io.reactivex.Observable import io.reactivex.Single import javax.inject.Inject @@ -37,11 +36,6 @@ class DraftsViewModel @Inject constructor( private val deletedDrafts: MutableList = mutableListOf() - fun showOldDraftsButton(): Observable { - return database.tootDao().savedTootCount() - .map { count -> count > 0 } - } - fun deleteDraft(draft: DraftEntity) { // this does not immediately delete media files to avoid unnecessary file operations // in case the user decides to restore the draft 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 d35fd3891..1a950feec 100644 --- a/app/src/main/java/com/keylesspalace/tusky/db/AppDatabase.java +++ b/app/src/main/java/com/keylesspalace/tusky/db/AppDatabase.java @@ -24,16 +24,17 @@ import androidx.sqlite.db.SupportSQLiteDatabase; import com.keylesspalace.tusky.TabDataKt; import com.keylesspalace.tusky.components.conversation.ConversationEntity; +import java.io.File; + /** * DB version & declare DAO */ -@Database(entities = { TootEntity.class, DraftEntity.class, AccountEntity.class, InstanceEntity.class, TimelineStatusEntity.class, +@Database(entities = { DraftEntity.class, AccountEntity.class, InstanceEntity.class, TimelineStatusEntity.class, TimelineAccountEntity.class, ConversationEntity.class - }, version = 25) + }, version = 26) public abstract class AppDatabase extends RoomDatabase { - public abstract TootDao tootDao(); public abstract AccountDao accountDao(); public abstract InstanceDao instanceDao(); public abstract ConversationsDao conversationDao(); @@ -365,4 +366,31 @@ public abstract class AppDatabase extends RoomDatabase { ); } }; + + public static class Migration25_26 extends Migration { + + private final File oldDraftDirectory; + + public Migration25_26(File oldDraftDirectory) { + super(25, 26); + this.oldDraftDirectory = oldDraftDirectory; + } + + @Override + public void migrate(@NonNull SupportSQLiteDatabase database) { + database.execSQL("DROP TABLE `TootEntity`"); + + if (oldDraftDirectory != null && oldDraftDirectory.isDirectory()) { + File[] oldDraftFiles = oldDraftDirectory.listFiles(); + if (oldDraftFiles != null) { + for (File file : oldDraftFiles) { + if (!file.isDirectory()) { + file.delete(); + } + } + } + + } + } + } } diff --git a/app/src/main/java/com/keylesspalace/tusky/db/TootDao.java b/app/src/main/java/com/keylesspalace/tusky/db/TootDao.java deleted file mode 100644 index f46c2753a..000000000 --- a/app/src/main/java/com/keylesspalace/tusky/db/TootDao.java +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright 2017 Andrew Dawson - * - * This file is a part of Tusky. - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 3 of the - * License, or (at your option) any later version. - * - * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - * Public License for more details. - * - * You should have received a copy of the GNU General Public License along with Tusky; if not, - * see . */ - -package com.keylesspalace.tusky.db; - -import androidx.room.Dao; -import androidx.room.Query; - -import java.util.List; - -import io.reactivex.Observable; - -/** - * Created by cto3543 on 28/06/2017. - * - * DAO to fetch and update toots in the DB. - */ - -@Dao -public interface TootDao { - - @Query("SELECT * FROM TootEntity ORDER BY uid DESC") - List loadAll(); - - @Query("DELETE FROM TootEntity WHERE uid = :uid") - int delete(int uid); - - @Query("SELECT * FROM TootEntity WHERE uid = :uid") - TootEntity find(int uid); - - @Query("SELECT COUNT(*) FROM TootEntity") - Observable savedTootCount(); -} \ No newline at end of file diff --git a/app/src/main/java/com/keylesspalace/tusky/db/TootEntity.java b/app/src/main/java/com/keylesspalace/tusky/db/TootEntity.java deleted file mode 100644 index b4b258d5c..000000000 --- a/app/src/main/java/com/keylesspalace/tusky/db/TootEntity.java +++ /dev/null @@ -1,151 +0,0 @@ -/* Copyright 2017 Andrew Dawson - * - * This file is a part of Tusky. - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 3 of the - * License, or (at your option) any later version. - * - * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - * Public License for more details. - * - * You should have received a copy of the GNU General Public License along with Tusky; if not, - * see . */ - -package com.keylesspalace.tusky.db; - -import com.google.gson.Gson; -import com.keylesspalace.tusky.entity.NewPoll; -import com.keylesspalace.tusky.entity.Status; - -import androidx.annotation.Nullable; -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.PrimaryKey; -import androidx.room.TypeConverter; -import androidx.room.TypeConverters; - -/** - * Toot model. - */ - -@Entity -@TypeConverters(TootEntity.Converters.class) -public class TootEntity { - @PrimaryKey(autoGenerate = true) - private final int uid; - - @ColumnInfo(name = "text") - private final String text; - - @ColumnInfo(name = "urls") - private final String urls; - - @ColumnInfo(name = "descriptions") - private final String descriptions; - - @ColumnInfo(name = "contentWarning") - private final String contentWarning; - - @ColumnInfo(name = "inReplyToId") - private final String inReplyToId; - - @Nullable - @ColumnInfo(name = "inReplyToText") - private final String inReplyToText; - - @Nullable - @ColumnInfo(name = "inReplyToUsername") - private final String inReplyToUsername; - - @ColumnInfo(name = "visibility") - private final Status.Visibility visibility; - - @Nullable - @ColumnInfo(name = "poll") - private final NewPoll poll; - - public TootEntity(int uid, String text, String urls, String descriptions, String contentWarning, String inReplyToId, - @Nullable String inReplyToText, @Nullable String inReplyToUsername, - Status.Visibility visibility, @Nullable NewPoll poll) { - this.uid = uid; - this.text = text; - this.urls = urls; - this.descriptions = descriptions; - this.contentWarning = contentWarning; - this.inReplyToId = inReplyToId; - this.inReplyToText = inReplyToText; - this.inReplyToUsername = inReplyToUsername; - this.visibility = visibility; - this.poll = poll; - } - - public String getText() { - return text; - } - - public String getContentWarning() { - return contentWarning; - } - - public int getUid() { - return uid; - } - - public String getUrls() { - return urls; - } - - public String getDescriptions() { - return descriptions; - } - - public String getInReplyToId() { - return inReplyToId; - } - - @Nullable - public String getInReplyToText() { - return inReplyToText; - } - - @Nullable - public String getInReplyToUsername() { - return inReplyToUsername; - } - - public Status.Visibility getVisibility() { - return visibility; - } - - @Nullable - public NewPoll getPoll() { - return poll; - } - - public static final class Converters { - - private static final Gson gson = new Gson(); - - @TypeConverter - public Status.Visibility visibilityFromInt(int number) { - return Status.Visibility.byNum(number); - } - - @TypeConverter - public int intFromVisibility(Status.Visibility visibility) { - return visibility == null ? Status.Visibility.UNKNOWN.getNum() : visibility.getNum(); - } - - @TypeConverter - public String pollToString(NewPoll poll) { - return gson.toJson(poll); - } - - @TypeConverter - public NewPoll stringToPoll(String poll) { - return gson.fromJson(poll, NewPoll.class); - } - } -} diff --git a/app/src/main/java/com/keylesspalace/tusky/di/ActivitiesModule.kt b/app/src/main/java/com/keylesspalace/tusky/di/ActivitiesModule.kt index 2e82d6407..cdf10224b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/di/ActivitiesModule.kt +++ b/app/src/main/java/com/keylesspalace/tusky/di/ActivitiesModule.kt @@ -79,9 +79,6 @@ abstract class ActivitiesModule { @ContributesAndroidInjector abstract fun contributesSplashActivity(): SplashActivity - @ContributesAndroidInjector - abstract fun contributesSavedTootActivity(): SavedTootActivity - @ContributesAndroidInjector(modules = [FragmentBuildersModule::class]) abstract fun contributesPreferencesActivity(): PreferencesActivity 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 13266851b..2a699ee33 100644 --- a/app/src/main/java/com/keylesspalace/tusky/di/AppModule.kt +++ b/app/src/main/java/com/keylesspalace/tusky/di/AppModule.kt @@ -82,7 +82,9 @@ class AppModule { AppDatabase.MIGRATION_13_14, AppDatabase.MIGRATION_14_15, AppDatabase.MIGRATION_15_16, AppDatabase.MIGRATION_16_17, AppDatabase.MIGRATION_17_18, AppDatabase.MIGRATION_18_19, AppDatabase.MIGRATION_19_20, AppDatabase.MIGRATION_20_21, AppDatabase.MIGRATION_21_22, - AppDatabase.MIGRATION_22_23, AppDatabase.MIGRATION_23_24, AppDatabase.MIGRATION_24_25) + AppDatabase.MIGRATION_22_23, AppDatabase.MIGRATION_23_24, AppDatabase.MIGRATION_24_25, + AppDatabase.Migration25_26(appContext.getExternalFilesDir("Tusky")) + ) .build() } diff --git a/app/src/main/java/com/keylesspalace/tusky/receiver/SendStatusBroadcastReceiver.kt b/app/src/main/java/com/keylesspalace/tusky/receiver/SendStatusBroadcastReceiver.kt index 911f58c1b..b0ecc4ad5 100644 --- a/app/src/main/java/com/keylesspalace/tusky/receiver/SendStatusBroadcastReceiver.kt +++ b/app/src/main/java/com/keylesspalace/tusky/receiver/SendStatusBroadcastReceiver.kt @@ -101,7 +101,6 @@ class SendStatusBroadcastReceiver : BroadcastReceiver() { replyingStatusContent = null, replyingStatusAuthorUsername = null, accountId = account.id, - savedTootUid = -1, draftId = -1, idempotencyKey = randomAlphanumericString(16), retries = 0 diff --git a/app/src/main/java/com/keylesspalace/tusky/service/SendTootService.kt b/app/src/main/java/com/keylesspalace/tusky/service/SendTootService.kt index c6b07bb72..460c83e5e 100644 --- a/app/src/main/java/com/keylesspalace/tusky/service/SendTootService.kt +++ b/app/src/main/java/com/keylesspalace/tusky/service/SendTootService.kt @@ -26,7 +26,6 @@ import com.keylesspalace.tusky.entity.NewPoll import com.keylesspalace.tusky.entity.NewStatus import com.keylesspalace.tusky.entity.Status import com.keylesspalace.tusky.network.MastodonApi -import com.keylesspalace.tusky.util.SaveTootHelper import dagger.android.AndroidInjection import kotlinx.parcelize.Parcelize import retrofit2.Call @@ -49,8 +48,6 @@ class SendTootService : Service(), Injectable { lateinit var database: AppDatabase @Inject lateinit var draftHelper: DraftHelper - @Inject - lateinit var saveTootHelper: SaveTootHelper private val tootsToSend = ConcurrentHashMap() private val sendCalls = ConcurrentHashMap>() @@ -162,9 +159,6 @@ class SendTootService : Service(), Injectable { if (response.isSuccessful) { // If the status was loaded from a draft, delete the draft and associated media files. - if (tootToSend.savedTootUid != 0) { - saveTootHelper.deleteDraft(tootToSend.savedTootUid) - } if (tootToSend.draftId != 0) { draftHelper.deleteDraftAndAttachments(tootToSend.draftId) .subscribe() @@ -332,7 +326,6 @@ data class TootToSend( val replyingStatusContent: String?, val replyingStatusAuthorUsername: String?, val accountId: Long, - val savedTootUid: Int, val draftId: Int, val idempotencyKey: String, var retries: Int diff --git a/app/src/main/java/com/keylesspalace/tusky/util/SaveTootHelper.java b/app/src/main/java/com/keylesspalace/tusky/util/SaveTootHelper.java deleted file mode 100644 index 29693550d..000000000 --- a/app/src/main/java/com/keylesspalace/tusky/util/SaveTootHelper.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.keylesspalace.tusky.util; - -import android.content.Context; -import android.net.Uri; -import android.util.Log; - -import androidx.annotation.NonNull; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import com.keylesspalace.tusky.db.AppDatabase; -import com.keylesspalace.tusky.db.TootDao; -import com.keylesspalace.tusky.db.TootEntity; - -import java.util.ArrayList; - -import javax.inject.Inject; - -public final class SaveTootHelper { - - private static final String TAG = "SaveTootHelper"; - - private TootDao tootDao; - private Context context; - private Gson gson = new Gson(); - - @Inject - public SaveTootHelper(@NonNull AppDatabase appDatabase, @NonNull Context context) { - this.tootDao = appDatabase.tootDao(); - this.context = context; - } - - public void deleteDraft(int tootId) { - TootEntity item = tootDao.find(tootId); - if (item != null) { - deleteDraft(item); - } - } - - public void deleteDraft(@NonNull TootEntity item) { - // Delete any media files associated with the status. - ArrayList uris = gson.fromJson(item.getUrls(), - new TypeToken>() { - }.getType()); - if (uris != null) { - for (String uriString : uris) { - Uri uri = Uri.parse(uriString); - if (context.getContentResolver().delete(uri, null, null) == 0) { - Log.e(TAG, String.format("Did not delete file %s.", uriString)); - } - } - } - // update DB - tootDao.delete(item.getUid()); - } - -} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_saved_toot.xml b/app/src/main/res/layout/activity_saved_toot.xml deleted file mode 100644 index 1771135e7..000000000 --- a/app/src/main/res/layout/activity_saved_toot.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/item_saved_toot.xml b/app/src/main/res/layout/item_saved_toot.xml deleted file mode 100644 index c95473f27..000000000 --- a/app/src/main/res/layout/item_saved_toot.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/drafts.xml b/app/src/main/res/menu/drafts.xml deleted file mode 100644 index bbc9202f4..000000000 --- a/app/src/main/res/menu/drafts.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index c2098f070..1e1d44fc9 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -101,7 +101,7 @@ موافقة رفض البحث - المسودات + المسودات كيفية عرض التبويق تحذير عن المحتوى لوحة مفاتيح الإيموجي @@ -473,7 +473,7 @@ أضيف إلى الفواصل المرجعية اختر قائمة القائمة - ليس لديك أية مسودات. + ليس لديك أية مسودات. ليس لديك أية منشورات مُبرمَجة للنشر. يجب أن يكون حجم الملفات الصوتية أقل مِن 40 ميغابايت. تُقدّر أدنى فترة لبرمجة النشر في ماستدون بـ 5 دقائق. diff --git a/app/src/main/res/values-ber/strings.xml b/app/src/main/res/values-ber/strings.xml index 9726d4ff0..b6d317b5a 100644 --- a/app/src/main/res/values-ber/strings.xml +++ b/app/src/main/res/values-ber/strings.xml @@ -28,7 +28,7 @@ ⴸ ⴰⵛⵓ ⵓⴸ ⵜⵜⵓⵎⵎⴰⵏⵜ\? ⵉⵙⵎⴻⵏⵢⵉⴼⴻⵏ ⴽⴽⴻⵙ - ⵉⵔⴻⵡⵡⴰⵢⴻⵏ + ⵉⵔⴻⵡⵡⴰⵢⴻⵏ ⵉⵎⵙⴻⵇⴷⴰⵛⴻⵏ ⵜⵙⵡⴰⵃⵍⴻⵎ ⵉⵛⵛⴰⵔⴻⵏ ⴰⵏⵜⴰ ⵝⵓⵎⵎⴰⵏⵜ\? diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 0056bfdb7..a3db937bc 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -320,7 +320,7 @@ Предупреждение за съдържание Видимост на публикация Планирани публикации - Чернови + Чернови Търсене Отхвърляне Приемане @@ -442,9 +442,6 @@ Възникна грешка. Черновата е изтрита Неуспешно зареждане на информация за отговор - Стари чернови - Функцията за чернови в Tusky е напълно преработена, за да бъде по-бърза, по-лесна за ползване и по-малко бъгава. -\n Все още можете да осъществите достъп до старите си чернови чрез бутон на екрана за нови чернови, но те ще бъдат премахнати при бъдеща актуализация! Тази публикация не успя да се изпрати! Наистина ли искате да изтриете списъка %s\? @@ -470,7 +467,7 @@ Mastodon има минимален интервал за планиране от 5 минути. Няма оповестявания. Нямате планирани състояния. - Нямате чернови. + Нямате чернови. Грешка при търсенето на публикация %s Редакция Избор %d diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index aa285d3d1..aec035d4b 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -236,7 +236,7 @@ ইমোজি কীবোর্ড সতর্কবার্তা টুট দৃশ্যমানতা - ড্রাফটগুলি + ড্রাফটগুলি অনুসন্ধান প্রত্যাখ্যান গ্রহণ @@ -331,7 +331,7 @@ আলাপ বন্ধ করো মাস্টোডনের সর্বনিম্ন ৫ মিনিটের সময়সূচীর বিরতি আছে। অডিও ফাইলগুলি অবশ্যই ৪০MB এর চেয়ে কম হওয়া উচিত। - তোমার কোনো খসড়া নেই। + তোমার কোনো খসড়া নেই। তোমার কোনো সময়সূচীত স্ট্যাটাস নেই। তালিকা তালিকা নির্বাচন করো diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index c13a880de..67a9225d0 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -102,7 +102,7 @@ গ্রহণ প্রত্যাখ্যান অনুসন্ধান - খসড়াগুলো + খসড়াগুলো টুট দৃশ্যমানতা সতর্কবার্তা ইমোজি কীবোর্ড @@ -473,7 +473,7 @@ ট্যাবের মাঝে সোয়াইপ সংকেত চালু করো টাইমলাইনে লিঙ্ক প্রিভিউ দেখাও তোমার কোনো সময়সূচীত স্ট্যাটাস নেই। - তোমার কোনো খসড়া নেই। + তোমার কোনো খসড়া নেই। মাস্টোডনের সর্বনিম্ন ৫ মিনিটের সময়সূচীর বিরতি আছে। শীর্ষস্থানীয় সরঞ্জামদণ্ডের শিরোনামটি লুকান \ No newline at end of file diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 8dbaf1218..fbad68d5c 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -80,7 +80,7 @@ D\'acord Rebutja Cerca - Esborranys + Esborranys S\'està baixant %1$s Copia l\'enllaç Comparteix l\'URL del toot a… @@ -433,7 +433,7 @@ S\'ha produït un error en cercar la publicació %s No tens cap estat planificat. Els fitxers d\'àudio han de ser de mida menor de 40MB. - No teniu cap esborrany. + No teniu cap esborrany. L\'interval mínim de planificació a Mastodon és de 5 minuts. Peticions de seguiment Mostra el diàleg de confirmació abans de promoure @@ -496,7 +496,6 @@ S\'ha esborrat el tut del qual en vau fer un esborrany de resposta S\'ha eliminat l\'esborrany No s\'ha pogut carregar la informació de la resposta - Esborranys antics No s\'ha pogut enviar aquest tut! Segur que voleu esborrar la llista %s\? diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 5fb07bed5..c5702f28c 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -34,7 +34,7 @@ ئاگاداری ناوەڕۆک بینینی توت توتی خشتەکراو - ڕەشنووسەکان + ڕەشنووسەکان گەڕان ڕەتکردنەوە ڕازیبون @@ -257,7 +257,7 @@ ماستۆدۆن کەمترین ماوەی خشتەی هەیە لە ٥ خولەک. هیچ ڕاگه یه نراوێک له بەرده رنه کەون. هیچ بارێکی خشتەکراوت نیە. - هیچ ڕەشنووسێکت نییە. + هیچ ڕەشنووسێکت نییە. هەڵە لە گەڕان بەدوای بابەت %s دەستکاریکردن هەڵبژاردنی %d diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 83cb9751d..0a6fa994e 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -101,7 +101,7 @@ Přijmout Zamítnout Hledat - Koncepty + Koncepty Viditelnost tootu Varování o obsahu Klávesnice s emoji @@ -465,7 +465,7 @@ Ukazovat náhledy k odkazům Mastodon neumožňuje pracovat s intervalem menším než 5 minut. Zatím zde nemáte žádné naplánované statusy. - Zatím zde nejsou žádné koncepty. + Zatím zde nejsou žádné koncepty. Možnost přetahování prstem pro přechod mezi kartami Seznam Přidat hashtag diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index c5a8af44b..c1a31d97b 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -92,7 +92,7 @@ Derbyn Gwrthod Chwilio - Drafftiau + Drafftiau Pwy all weld Tŵt Rhybudd cynnwys Bysellfwrdd emoji diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a67fafff0..9af9b790a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -101,7 +101,7 @@ Akzeptieren Ablehnen Suche - Entwürfe + Entwürfe Beitragssichtbarkeit Inhaltswarnung Emoji @@ -436,7 +436,7 @@ Liste auswählen Liste Fehler beim Nachschlagen von Post %s - Du hast keine Entwürfe. + Du hast keine Entwürfe. Du hast keine geplanten Beiträge. Das Datum des geplanten Toots muss mindestens 5 Minuten in der Zukunft liegen. Benachrichtigungen über neue Folgeanfragen @@ -480,9 +480,6 @@ Ankündigungen Der Beitrag auf den du antworten willst wurde gelöscht Entwurf gelöscht - Alte Entwürfe - Das \"Entwürfe\"-Feature in Tusky wurde komplett neu gestaltet um schneller und benutzerfreundlicher zu sein. -\nDu kannst deine alten Entwürfe noch hinter einem Button bei den neuen Entwürfen finden, aber sie werden mit einem zukünftigen Update gelöscht! Dieser Beitrag konnte nicht gesendet werden! Willst du die Liste %s wirklich löschen\? diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index b55353d49..59aa8fa9f 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -101,7 +101,7 @@ Rajtigi Rifuzi Serĉi - Malnetoj + Malnetoj Videblo de la mesaĝo Enhava averto Klavaro de emoĝioj @@ -438,7 +438,7 @@ Listo Eraro dum elserĉo de la mesaĝo %s Aŭdia dosiero devas esti malpli ol 40MB. - Vi ne havas iun ajn malneton. + Vi ne havas iun ajn malneton. Vi ne havas iun ajn planitan mesaĝon. Petoj de sekvado Kradvortoj diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 127a8ed02..7e6695499 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -99,7 +99,7 @@ Aceptar Rechazar Buscar - Borradores + Borradores Visibilidad del estado Aviso de contenido Teclado de emojis @@ -451,7 +451,7 @@ Seleccionar lista Lista Los ficheros de audio deben ser menores de 40MB. - No tienes ningún borrador. + No tienes ningún borrador. No tienes ningún estado programado. Mastodon tiene un intervalo de programación mínimo de 5 minutos. Solicitudes @@ -506,9 +506,6 @@ El toot al que redactaste una respuesta ha sido eliminado Borrador eliminado Error al cargar la información de respuesta - Borradores antiguos - La función de borrador en Tusky se ha rediseñado por completo para que sea más rápida, más fácil de usar y con menos errores. -\nAún puede acceder a sus borradores antiguos a través de un botón en la pantalla de borradores nuevos, ¡pero se eliminarán en una actualización futura! ¡Este toot no se pudo enviar! ¿Realmente quieres eliminar la lista %s\? Indefinido diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 2430e0644..df85128fa 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -93,7 +93,7 @@ Onartu Ukatu Bilatu - Zirriborroak + Zirriborroak Tutaren ikusgarritasuna Edukiaren abisua Emoji teklatua @@ -444,7 +444,7 @@ Audioak 40MB baino gutxiago izan behar ditu. Aukeratu zerrenda Zerrenda - Ez duzu zirriborrorik. + Ez duzu zirriborrorik. Ez duzu tut programaturik. Mastodonek gutxienez 5 minutuko programazio-tartea du. Eskakizunak diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 80c2911c4..5cd052072 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -93,7 +93,7 @@ پذیرش رد جست‌وجو - پیش‌نویس‌ها + پیش‌نویس‌ها نمایانی بوق هشدار محتوا صفحه‌کلید اموجی @@ -439,7 +439,7 @@ نشان‌شده گزینش فهرست فهرست - هیچ پیش‌نویسی ندارید. + هیچ پیش‌نویسی ندارید. هیچ وضعیت زمان‌بسته‌ای ندارید. ماستودون، بازهٔ زمان‌بندی‌ای با کمینهٔ ۵ دقیقه دارد. نمایش گفت‌وگوی تأیید، پیش از تقویت @@ -485,7 +485,6 @@ عدم اشتراک اشتراک پیش‌نویس حذف شد - پیش‌نویس‌های قدیمی فرستادن این بوق شکست خورد! نهفتن آمار کمی روی نمایه‌ها نهفتن آمار کمی روی فرسته‌ها @@ -509,8 +508,6 @@ \n - آمار پی‌گیر و فرسته روی نمایه‌ها \n \n فرستادن آگاهی‌ها تأثیر نمی‌پذیرد، ولی می‌توانید ترجیحات آگاهیتان را به صورت دستی بازبینی کنید. - ویژگی پیش‌نویس در تاسکی به صورت کامل بازطرّاحی شده تا سریع‌تر، کاربرپسندتر و کم‌مشکل‌تر باشد. -\n همجنان می‌توانید از طریق دکمه‌ای دز صفحهٔ پیش‌نویس‌های جدید، به پیش‌نویس‌های قدیمیتان دسترسی داشته باشید، ولی در به‌روز رسانی آینده برداشته خواهند شد! واقعاً می‌خواهید فهرست %s را حذف کنید؟ نمی‌توانید بیش از %1$d رسانه بارگذارید. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 41d01a443..df6461abd 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -101,7 +101,7 @@ Accepter Refuser Rechercher - Brouillons + Brouillons Visibilité du pouet Contenu sensible Clavier d’émojis @@ -456,7 +456,7 @@ Sélectionner la liste Liste Les fichiers audio doivent avoir moins de 40 Mo. - Vous n’avez aucun brouillon. + Vous n’avez aucun brouillon. Vous n’avez aucun pouet planifié. L’intervalle minimum de planification sur Mastodon est de 5 minutes. Demandes d\'abonnement diff --git a/app/src/main/res/values-ga/strings.xml b/app/src/main/res/values-ga/strings.xml index 18261a959..7ebc79bac 100644 --- a/app/src/main/res/values-ga/strings.xml +++ b/app/src/main/res/values-ga/strings.xml @@ -109,7 +109,7 @@ Rabhadh ábhair Infheictheacht tút Tútanna sceidealta - Dréachtaí + Dréachtaí Diúltaigh Glac Cealaigh @@ -463,7 +463,7 @@ Rogha %d Cuir in Eagar Earráid agus an post á lorg %s - Níl aon dréachtaí agat. + Níl aon dréachtaí agat. Níl aon stádas sceidealta agat. Tá eatramh sceidealaithe íosta 5 nóiméad ag Mastodon. Taispeáin réamhamhairc nasc in amlínte diff --git a/app/src/main/res/values-gd/strings.xml b/app/src/main/res/values-gd/strings.xml index 13d53a29b..ff23b95df 100644 --- a/app/src/main/res/values-gd/strings.xml +++ b/app/src/main/res/values-gd/strings.xml @@ -47,7 +47,7 @@ Sgrìobh Seall na brosnachaidhean Seall na brosnachaidhean - Dreachdan + Dreachdan Annsachdan Brathan Brathan @@ -58,10 +58,7 @@ Bha againn ris a’ phost a bha thu airson freagairt dha a thoirt air falbh Chaidh an dreach a sguabadh às Cha deach leinn fiosrachadh na freagairte a luchdadh - Seann-dreachdan - Chaidh dealbhadh gu tur ùr a chur air gleus nan dreachdan aig Tusky ach am biodh e nas luaithe, nas fhasa cleachdadh is nas lugha de bhugaichean ann. -\n Gheibh thu grèim air na seann-dreachdan agad fhathast le putan air sgrìn ùr nan dreachdan ach thèid an toirt air falbh le ùrachadh ri teachd! - Cha b’ urrainn dhuinn am post a chur! + Cha b’ urrainn dhuinn an dùd a chur! Ceanglachain Fuaim A bheil thu cinnteach gu bheil thu airson an liosta %s a sguabadh às\? @@ -108,7 +105,7 @@ Seall ro-sheallaidhean air ceanglaichean sna loidhnichean-ama Feumaidh co-dhiù 5 mionaidean a bhith eadar staidean sgeidealaichte air Mastodon. Chan eil staid sam bith air an sgeideal agad. - Chan eil dreachd sam bith agad. + Chan eil dreachd sam bith agad. Thachair mearachd le lorg a’ phuist %s Roghainn %d Iomadh roghainn diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index bbba46cfe..150a40785 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -3,7 +3,7 @@ Aviso sobre o contido Visibilidade do toot Toots programados - Borradores + Borradores Buscar Rexeitar Aceptar @@ -438,9 +438,6 @@ Que contas\? Borrador eliminado Fallou a carga da información da Resposta - Borradores antigos - Os borradores en Tusky foron redeseñados para ser máis rápidos, amigables para a usuaria e con menos fallos. -\nAínda podes acceder aos antigos borradores a través do botón na pantalla de novos borradores, pero eliminarémolo en futuras actualizacións! Fallou o envío do toot! Tes a certeza de querer eliminar a listaxe %s\? @@ -467,7 +464,7 @@ Mastodon ten un intervalo mínimo de 5 minutos para as programacións. Non hai anuncios. Non tes estados programados. - Non tes borradores. + Non tes borradores. Erro ao buscar publicación %s Editar Opción %d diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index dd1a60e86..ddd50890a 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -152,7 +152,7 @@ टूट दृश्यता अनुसूचित टूट स्वीकार करें - ड्राफ्ट + ड्राफ्ट अस्वीकार करें पूर्ववत करें संपादित करें @@ -257,7 +257,7 @@ और लोड करें टाइमलाइन में लिंक प्रीव्यू दिखाएं मास्टोडन का न्यूनतम शेड्यूलिंग अंतराल 5 मिनट है। - आपके पास कोई ड्राफ्ट नहीं है। + आपके पास कोई ड्राफ्ट नहीं है। %s पोस्ट खोजने में त्रुटि टैब के बीच स्विच करने के लिए स्वाइप जेस्चर को सक्षम करें सूचना फ़िल्टर दिखाएं diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index c76bc0650..4596127b4 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -99,7 +99,7 @@ Elfogadás Elutasítás Keresés - Piszkozatok + Piszkozatok Tülkök láthatósága Tartalom figyelmeztetés Emoji billentyűzet @@ -450,7 +450,7 @@ Lista kiválasztása Lista A hangfájloknak kisebbnek kell lenniük, mint 40 MB. - Nincs egy piszkozatod sem. + Nincs egy piszkozatod sem. Nincs egy ütemezett tülköd sem. A Mastodonban a legrövidebb ütemezhető időintervallum 5 perc. Követési kérelmek @@ -487,9 +487,6 @@ A Tülköt, melyre válaszul piszkozatot készítettél törölték Piszkozat törölve Nem sikerült a Válasz információit betölteni - Régi Piszkozatok - A Tusky piszkozat funkcióját teljesen újraterveztük, hogy gyorsabb, felhasználóbarátabb és hibamentesebb legyen. -\nTovábbra is elérheted a régi piszkozataidat egy gombbal az új piszkozatok képernyőjén, de ezeket egy későbbi frissítésben el fogjuk törölni! Ez a tülk nem küldődött el! Tényleg le akarod törölni a %s listát\? diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 1a23be14f..af8b146e6 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -115,7 +115,7 @@ Afturkalla Samþykkja Hafna - Drög + Drög Áætluð tíst Sýnileiki tísts Aðvörun vegna efnis @@ -416,7 +416,7 @@ Valkostur %d Breyta Villa við að fletta upp færslunni %s - Þú ert ekki með nein drög. + Þú ert ekki með nein drög. Þú ert ekki með neinar áætlaðar stöðufærslur. Hljóðskrár verða að vera minni en 40MB. Mastodon er með 5 mínútna lágmarksbil fyrir áætlaðar aðgerðir. @@ -475,8 +475,6 @@ Afþagga %s %s bað um að fylgjast með þér Tilkynningar - Gerð draga í Tusky hefur verið endurhönnuð til að verða fljótlegri, notendavænni og gallalaus. -\n Þú getur áfram nýtt eldri drög í gegnum sérstakan hnapp í glugganum fyrir drög, en sá eiginleiki verður fjarlægður í framtíðaruppfærslu! Sumar upplýsingar sem gætu haft áhrif á andlega vellíðan þína verða faldar. Þetta hefur áhrif á: \n \n - Eftirlæti/Endurbirtingar/Tilkynningar um fylgjendabeiðnir @@ -490,7 +488,6 @@ Tístið sem þú gerðir drög að svari við hefur veriið fjarlægt Eyddi drögum Mistókst að hlaða inn svarupplýsingum - Eldri drög Mistókst að senda þetta tíst! Viðhengi Hljóð diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 3c8093557..c84301b13 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -101,7 +101,7 @@ Accetta Rifiuta Cerca - Bozze + Bozze Visibilità dei toot Avviso per il contenuto Tastiera emoji @@ -454,7 +454,7 @@ Programma un toot RIpristina %1$s • %2$s - Non hai bozze. + Non hai bozze. %s persona %s persone diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 9185911c3..d602f37b8 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -98,7 +98,7 @@ 許可 拒否 検索 - 下書き + 下書き トゥートの公開範囲 注意書き 絵文字キーボード @@ -411,7 +411,7 @@ %sさんがあなたにフォローリクエストしました \@%sさんを通報しました 予約した投稿はありません。 - 下書きはありません。 + 下書きはありません。 項目 %d このアカウントは外部のサーバーにあります。匿名化された通報の複製をそちらにも送信しますか? 通報をサーバーのモデレーターに送信します。以下にこのアカウントを通報理由を入力できます: diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index ad5a99d92..d63c92792 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -40,14 +40,14 @@ Ldi deg uminig Bḍu Sgugem - Irewwayen + Irewwayen Sken-d ismenyifen Ismenyifen %1$s n usmenyaf %1$s n ismenyifen - Ur tesɛiḍ ara irewwayen. + Ur tesɛiḍ ara irewwayen. Tella-d tucḍa. Tilɣa D acu i ttummant\? diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index c955454a1..b4e2bf624 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -105,7 +105,7 @@ 수락 거절 검색 - 임시 저장 + 임시 저장 공개 범위 열람 주의 이모지 추가 diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 4f4a7868b..81a89d731 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -106,7 +106,7 @@ പിന്തുടാനുള്ള അപേക്ഷകൾ ബൂട്ട്‌സ് കാണിക്കുക മുന്‍നിശ്ചയിച്ച ടൂറ്റ്‌സ് - കരടുകൾ + കരടുകൾ തിരുത്ത് അറിയിപ്പുകൾ ടാബുകൾ diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 4ff5a90e0..8c5da5abe 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -101,7 +101,7 @@ Goedkeuren Afwijzen Zoeken - Concepten + Concepten Zichtbaarheid toot Tekstwaarschuwing Emojis @@ -456,8 +456,8 @@ Zoeken mislukt Poll Fout tijdens opzoeken toot %s - Je hebt nog geen concepten. - Je hebt nog geen ingeplande toots. + Je hebt nog geen concepten + Je hebt nog geen ingeplande toots Om in te plannen moet je in Mastodon een minimum interval van 5 minuten gebruiken. Volgverzoeken Hashtags diff --git a/app/src/main/res/values-no-rNB/strings.xml b/app/src/main/res/values-no-rNB/strings.xml index f6c9f86ba..40a7607c4 100644 --- a/app/src/main/res/values-no-rNB/strings.xml +++ b/app/src/main/res/values-no-rNB/strings.xml @@ -101,7 +101,7 @@ Aksepter Avvis Søk - Kladder + Kladder Toot-synlighet Innholdsadvarsel Emoji-tastatur @@ -441,7 +441,7 @@ Velg liste Liste Du har ingen planlagte statuser. - Du har ikke lagret noen kladder. + Du har ikke lagret noen kladder. Lydfiler må være mindre enn 40MB. Mastodon har et minimums planleggingsinterval på 5 minutter. Vis forhåndsvisning av linker i tidslinjer @@ -503,9 +503,6 @@ Tootet du kladdet et svar til har blitt fjernet Kladd slettet Lasting av svarinformasjon feilet - Gamle kladder - KladdfunksjonaLiteten i Tusky er skrevet om og er nå kjappere, mer brukervennlig, og med færre feil. -\nGamle kladder er fortsatt tilgjengelige via en knapp på den nye kladdskjermen, men de vil bli fjernet i en fremtidig oppdatering! Sending av toot feilet! Animer egendefinerte emojis Avslutt abonnementet diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 4de5640d6..101303192 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -91,7 +91,7 @@ Acceptar Regetar Cercar - Borrolhons + Borrolhons Visibilitat del tut Avis de contengut Clavièr Emoji @@ -450,7 +450,7 @@ Seleccionar la list Lista Los fichièrs àudio devon èsser inferiors a 40 Mo. - Avètz pas cap de borrolhon. + Avètz pas cap de borrolhon. Avètz pas cap de tut planificat. L’interval minimum de planificacion sus Mastodon e de 5 minutas. Demandas d’abonament diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 5ec0dbf5c..716e07a61 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -89,7 +89,7 @@ Akceptuj Odrzuć Szukaj - Szkice + Szkice Widoczność wpisu Ostrzeżenie o zawartości Klawiatura emoji @@ -461,7 +461,7 @@ Wybierz listę Lista Pliki audio muszą być mniejsze niż 40MB. - Nie masz żadnych szkiców. + Nie masz żadnych szkiców. Nie masz żadnych zaplanowanych wpisów. Mastodon umożliwia wysłanie minimalnie 5 minut od zaplanowania. Prośby o możliwość śledzenia diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index cf6cfdf2f..685049d0b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -94,7 +94,7 @@ Aceitar Rejeitar Pesquisar - Rascunhos + Rascunhos Privacidade do toot Aviso de Conteúdo Teclado de emojis @@ -449,7 +449,7 @@ Lista Sem toots agendados. O áudio deve ser menor que 40MB. - Sem rascunhos. + Sem rascunhos. Mastodon possui um intervalo mínimo de 5 minutos para agendar. Seguidores pendentes %s quer te seguir @@ -484,9 +484,6 @@ Erro ao enviar o toot! O toot em que se rascunhou uma resposta foi excluído Rascunho excluído - A função de rascunhos no Tusky foi totalmente redesenhada para ser mais rápida, mais fácil e com menos erros. -\nÉ possível acessar rascunhos antigos através de um botão na tela de novos rascunhos, mas serão removidos numa futura atualização! - Rascunhos antigos Não é possível anexar mais de %1$d arquivos de mídia. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index dd90ed48b..ef52a679b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -102,7 +102,7 @@ Принять Отклонить Поиск - Черновики + Черновики Видимость поста Предупреждение о контенте Эмодзи-клавиатура @@ -483,8 +483,8 @@ Список Аудиофайлы должны быть меньше 40МБ. Ошибка поиска поста %s - У вас нет черновиков. - У вас нет запланированных постов. + У вас нет черновиков. + У вас нет запланированный постов. Минимальный интервал планирования в Mastodon составляет 5 минут. Показывать диалог подтверждения перед продвижением Показывать предпросмотр ссылок в лентах diff --git a/app/src/main/res/values-sa/strings.xml b/app/src/main/res/values-sa/strings.xml index 168b1baf1..29994122c 100644 --- a/app/src/main/res/values-sa/strings.xml +++ b/app/src/main/res/values-sa/strings.xml @@ -131,7 +131,7 @@ विषयप्रत्यादेशः दौत्यसुदर्शता कालबद्धदौत्यानि - लेखविकर्षाः + लेखविकर्षाः अन्विष्यताम् अस्वीक्रियताम् स्वीक्रियताम् @@ -366,7 +366,7 @@ प्रकाशनंं नश्यताम् मूलदर्शकेभ्यः प्रकाश्यताम् %1$s मित्रमत्र प्रस्थितम्: - न लेखविकर्षास्ते सन्ति । + न लेखविकर्षास्ते सन्ति । %1$s उच्चैःस्थितायाः साधनशालकायाः शीर्षकं छाद्यताम् प्रकाशनात् प्राक् पुष्टिसंवादमञ्जूषा दर्शनीया diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 14af6584d..5b026442f 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -124,7 +124,7 @@ %1$s a %2$s Upraviť Hashtagy - Koncepty + Koncepty Upraviť Oznámenia Oznámenia diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 033c89b9b..f2f4487e0 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -96,7 +96,7 @@ Sprejmi Zavrni Iskanje - Osnutki + Osnutki Vidljivost tuta Opozorilo o vsebini Tipkovnica z emotikoni diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index dc62bf6d8..d94fee33c 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -101,7 +101,7 @@ Acceptera Avvisa Sök - Utkast + Utkast Toot synlighet Innehållsvarning Emoji-tangentbord @@ -457,7 +457,7 @@ Lista Du har inga schemalagda statusar. Ljudfiler måste vara mindre än 40MB. - Du har inga utkast. + Du har inga utkast. Mastodon har ett minimalt schemaläggningsintervall på 5 minuter. Tysta konversation Visa bekräftelse innan knuff diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 557911456..f197abf25 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -84,7 +84,7 @@ ஏற்கவும் நிராகரி தேடு - வரைவுகள் + வரைவுகள் Toot புலப்படும் தன்மை உள்ளடக்க எச்சரிக்கை Emoji விசைபலகை diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index f0554fe76..9d188dce4 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -321,7 +321,7 @@ เตือนเนื้อหา การมองเห็น Toot Toot แบบตั้งเวลา - ฉบับร่าง + ฉบับร่าง ปฏิเสธ ยอมรับ ยกเลิก @@ -447,7 +447,7 @@ แสดงตัวอย่างลิงก์ในไทม์ไลน์ Mastodon กำหนดเวลาขั้นต่ำ 5 นาที ไม่มีสถานะแบบตั้งเวลาใด ๆ - ไม่มีฉบับร่างใด ๆ + ไม่มีฉบับร่างใด ๆ การค้นหาโพสต์ %s เกิดข้อผิดผลาด แก้ไข ตัวเลือกที่ %d @@ -472,8 +472,6 @@ แจ้งเตือน Limit timeline แจ้งเตือน Review ใครบางคนที่ฉันได้ติดตาม ได้เผยแพร่โพสต์ใหม่ - ฟีเจอร์ฉบับร่างใน Tusky ได้รับการออกแบบใหม่ทั้งหมดเพื่อให้เร็วขึ้นเป็นมิตรกับผู้ใช้มากขึ้นและบั๊กน้อยลง -\n คุณยังสามารถเข้าถึงฉบับร่างเก่าผ่านปุ่มในหน้าฉบับร่างใหม่ แต่จะถูกลบออกในการอัปเดตในอนาคต! ซ่อนสถิติเชิงปริมาณในโปรไฟล์ ซ่อนสถิติเชิงปริมาณของโพสต์ สุขภาวะ @@ -482,7 +480,6 @@ โพสต์ที่คุณได้ร่างตอบไว้ ถูกลบแลัว ลบฉบับร่างแล้ว ล้มเหลวในการโหลดข้อมูลตอบกลับ - ฉบับร่างเก่า คุณต้องการลบลิสต์ %s ใช่ไหม\? คุณไม่สามารถอัปโหลดไฟล์แนบมากกว่า %1$d ได้ diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 87638c87f..0150203bb 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -99,7 +99,7 @@ Kabul et Reddet Ara - Taslaklar + Taslaklar Toot görünürlüğü İçerik uyarı İfade klavyesi @@ -443,7 +443,7 @@ Bildirilemedi Seçenek %d %s gönderisi aranırken hata oluştu - Hiç taslağınız yok. + Hiç taslağınız yok. Zamanlanmış durumunuz yok. Kendi kitlenize yükseltin Hashtags\'ler diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 6144773a8..93910a137 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -58,7 +58,7 @@ Посилання Попередження про вміст Заплановані дмухи - Чернетки + Чернетки Відхилити Прийняти Скасувати @@ -458,9 +458,6 @@ Дмух, для якого ви створили чернетку відповіді, вилучено Чернетку видалено Не вдалося завантажити дані відповіді - Старі чернетки - Функція чернетки в Tusky була повністю перероблена, щоб бути швидшою, зручнішою для користувачів і з меншою кількістю вад. -\n Ви все ще можете отримати доступ до своїх старих чернеток за допомогою кнопки на екрані нових чернеток, але вони будуть вилучені в майбутньому оновленні! Не вдалося надіслати цей дмух! Ви дійсно хочете видалити список %s\? @@ -481,7 +478,7 @@ Найкоротший час планування Mastodon становить 5 хвилин. Оголошень немає. Черга статусів порожня. - У вас немає чернеток. + У вас немає чернеток. Помилка пошуку допису %s Увімкнути перемикання між вкладками жестом проведення пальцем Показати фільтр сповіщень diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 23e9fd170..565891286 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -117,7 +117,7 @@ Nội dung nhạy cảm Công khai Tút đã lên lịch - Nháp + Nháp Từ chối Đồng ý Trở về @@ -315,7 +315,7 @@ Hiện xem trước của link Mastodon giới hạn tối thiểu 5 phút. Bạn không có tút đã lên lịch. - Bạn không có bản nháp nào. + Bạn không có bản nháp nào. Sửa Lựa chọn %d Cho phép chọn nhiều lựa chọn @@ -490,11 +490,8 @@ Đính kèm Âm thanh Tút bạn lên lịch đã bị hủy bỏ - Tút lên lịch cũ Tút lên lịch đã xóa Chưa tải được bình luận - Tính năng lên lịch đăng tút của Tusky được thiết kế lại hoàn toàn để nhanh hơn, thân thiện hơn và ít lỗi hơn. -\nBạn vẫn có thể xem lại bản nháp cũ nhưng chúng sẽ bị xóa bỏ trong bản cập nhật tương lai! Đăng tút không thành công! Emoji động Ngưng nhận thông báo diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index b1bd8df67..5f8f8f308 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -102,7 +102,7 @@ 接受 拒绝 搜索 - 草稿 + 草稿 设置嘟文可见范围 设置内容提醒 插入表情符号 @@ -454,7 +454,7 @@ 选择 %d 编辑 查找嘟文时出错 %s - 您没有草稿。 + 您没有草稿。 您没有任何定时嘟文。 Mastodon的最小预订时间为5分钟。 关注请求 @@ -492,9 +492,6 @@ 该草稿回复的原嘟文已被删除 草稿已删除 加载回复信息失败 - 旧草稿 - Tusky 的草稿功能已被重新设计,现在它更快、更友好,Bug也更少。 -\n 旧草稿依然可以通过新草稿页面的按钮查看,但他们将在未来版本中移除! 嘟文发送失败! 确认删除列表 %s? diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 94bb613b8..059d20319 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -102,7 +102,7 @@ 接受 拒絕 搜尋 - 草稿 + 草稿 設定嘟文可見範圍 設定敏感內容警告 插入表情符號 @@ -451,7 +451,6 @@ 你的草稿欲回覆的原嘟文已被刪除 草稿已刪除 載入回覆資訊失敗 - 舊的草稿 這條嘟文發送失敗! 你確定要刪除列表 %s? @@ -465,7 +464,7 @@ Mastodon 的最短發文間隔限制為 5 分鐘。 沒有公告。 你沒有任何已排程的嘟文。 - 你沒有任何草稿。 + 你沒有任何草稿。 尋找嘟文時發生錯誤 %s 選項 %d 多個選項 diff --git a/app/src/main/res/values-zh-rMO/strings.xml b/app/src/main/res/values-zh-rMO/strings.xml index 7fe854602..b26412b82 100644 --- a/app/src/main/res/values-zh-rMO/strings.xml +++ b/app/src/main/res/values-zh-rMO/strings.xml @@ -102,7 +102,7 @@ 接受 拒絕 搜尋 - 草稿 + 草稿 設定嘟文可見範圍 敏感內容警告 插入表情符號 diff --git a/app/src/main/res/values-zh-rSG/strings.xml b/app/src/main/res/values-zh-rSG/strings.xml index 23c149097..c0d4a621a 100644 --- a/app/src/main/res/values-zh-rSG/strings.xml +++ b/app/src/main/res/values-zh-rSG/strings.xml @@ -102,7 +102,7 @@ 接受 拒绝 搜索 - 草稿 + 草稿 设置嘟文可见范围 设置内容提醒信息 插入表情符号 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index ee1754389..ea38b585a 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -102,7 +102,7 @@ 接受 拒絕 搜尋 - 草稿 + 草稿 設定嘟文可見範圍 敏感內容警告 插入表情符號 @@ -440,8 +440,6 @@ 編輯 書籤 音檔必需小於40MB。 - Tusky 的草稿功能已重新設計,更快、更好用、更少問題。 -\n 你還是可以在草稿頁面中查看你的先前的舊草稿,但它們在未來的某次更新中將會被移除! 隱藏個人頁面中的狀態數量資訊 隱藏貼文上的狀態數量資訊 限制時間軸通知 @@ -463,7 +461,6 @@ 你的草稿欲回覆的原嘟文已被刪除 草稿已刪除 載入回覆資訊失敗 - 舊的草稿 這條嘟文發送失敗! 附件 錄音 @@ -508,7 +505,7 @@ 取消靜音對話 靜音對話 Mastodon 的最短發文間隔限制為 5 分鐘。 - 你沒有任何草稿。 + 你沒有任何草稿。 你沒有任何已排程的嘟文。 列表 選擇列表 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 52f777b5d..6dd78e760 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -127,7 +127,7 @@ Accept Reject Search - Drafts + Drafts Scheduled toots Toot visibility Content warning @@ -583,7 +583,7 @@ Edit Error looking up post %s - You don\'t have any drafts. + You don\'t have any drafts. You don\'t have any scheduled statuses. There are no announcements. Mastodon has a minimum scheduling interval of 5 minutes. @@ -611,13 +611,6 @@ Do you really want to delete the list %s? This toot failed to send! - - - The draft feature in Tusky has been completely redesigned to be faster, more user friendly and less buggy.\n - You can still access your old drafts via a button on the new drafts screen, - but they will be removed in a future update! - - Old Drafts Failed loading Reply information Draft deleted The Toot you drafted a reply to has been removed diff --git a/app/src/test/java/com/keylesspalace/tusky/ComposeActivityTest.kt b/app/src/test/java/com/keylesspalace/tusky/ComposeActivityTest.kt index bd9be3b21..e0b0d847a 100644 --- a/app/src/test/java/com/keylesspalace/tusky/ComposeActivityTest.kt +++ b/app/src/test/java/com/keylesspalace/tusky/ComposeActivityTest.kt @@ -31,7 +31,6 @@ import com.keylesspalace.tusky.entity.Account import com.keylesspalace.tusky.entity.Instance import com.keylesspalace.tusky.network.MastodonApi import com.keylesspalace.tusky.service.ServiceClient -import com.keylesspalace.tusky.util.SaveTootHelper import com.nhaarman.mockitokotlin2.any import io.reactivex.Single import io.reactivex.SingleObserver @@ -116,7 +115,6 @@ class ComposeActivityTest { mock(MediaUploader::class.java), mock(ServiceClient::class.java), mock(DraftHelper::class.java), - mock(SaveTootHelper::class.java), dbMock ) activity.intent = Intent(activity, ComposeActivity::class.java).apply {