diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bfd73ed0..4e4d603a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,6 +51,13 @@ android:configChanges="orientation" android:exported="true" /> + + when (menuItem.itemId) { R.id.more_apps_from_us -> launchMoreAppsFromUsIntent() + R.id.show_recycle_bin -> launchRecycleBin() R.id.show_archived -> launchArchivedConversations() R.id.settings -> launchSettings() R.id.about -> launchAbout() @@ -176,6 +179,7 @@ class MainActivity : SimpleActivity() { private fun refreshMenuItems() { main_menu.getToolbar().menu.apply { findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(R.bool.hide_google_relations) + findItem(R.id.show_recycle_bin).isVisible = config.useRecycleBin } } @@ -548,6 +552,11 @@ class MainActivity : SimpleActivity() { } } + private fun launchRecycleBin() { + hideKeyboard() + startActivity(Intent(applicationContext, RecycleBinConversationsActivity::class.java)) + } + private fun launchArchivedConversations() { hideKeyboard() startActivity(Intent(applicationContext, ArchivedConversationsActivity::class.java)) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/RecycleBinConversationsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/RecycleBinConversationsActivity.kt new file mode 100644 index 00000000..22429285 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/RecycleBinConversationsActivity.kt @@ -0,0 +1,163 @@ +package com.simplemobiletools.smsmessenger.activities + +import android.annotation.SuppressLint +import android.content.Intent +import android.os.Bundle +import com.simplemobiletools.commons.dialogs.ConfirmationDialog +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.smsmessenger.R +import com.simplemobiletools.smsmessenger.adapters.ConversationsAdapter +import com.simplemobiletools.smsmessenger.adapters.RecycleBinConversationsAdapter +import com.simplemobiletools.smsmessenger.extensions.* +import com.simplemobiletools.smsmessenger.helpers.* +import com.simplemobiletools.smsmessenger.models.Conversation +import com.simplemobiletools.smsmessenger.models.Events +import kotlinx.android.synthetic.main.activity_recycle_bin_conversations.* +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode + +class RecycleBinConversationsActivity : SimpleActivity() { + private var bus: EventBus? = null + + @SuppressLint("InlinedApi") + override fun onCreate(savedInstanceState: Bundle?) { + isMaterialActivity = true + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_recycle_bin_conversations) + setupOptionsMenu() + + updateMaterialActivityViews(recycle_bin_coordinator, conversations_list, useTransparentNavigation = true, useTopSearchMenu = false) + setupMaterialScrollListener(conversations_list, recycle_bin_toolbar) + + loadRecycleBinConversations() + } + + override fun onResume() { + super.onResume() + setupToolbar(recycle_bin_toolbar, NavigationIcon.Arrow) + updateMenuColors() + + loadRecycleBinConversations() + } + + override fun onDestroy() { + super.onDestroy() + bus?.unregister(this) + } + + private fun setupOptionsMenu() { + recycle_bin_toolbar.inflateMenu(R.menu.recycle_bin_menu) + + recycle_bin_toolbar.setOnMenuItemClickListener { menuItem -> + when (menuItem.itemId) { + R.id.empty_recycle_bin -> removeAll() + else -> return@setOnMenuItemClickListener false + } + return@setOnMenuItemClickListener true + } + } + + private fun updateOptionsMenu(conversations: ArrayList) { + recycle_bin_toolbar.menu.apply { + findItem(R.id.empty_recycle_bin).isVisible = conversations.isNotEmpty() + } + } + + private fun updateMenuColors() { + updateStatusbarColor(getProperBackgroundColor()) + } + + private fun loadRecycleBinConversations() { + ensureBackgroundThread { + val conversations = try { + conversationsDB.getAllWithMessagesInRecycleBin().toMutableList() as ArrayList + } catch (e: Exception) { + ArrayList() + } + + runOnUiThread { + setupConversations(conversations) + } + } + + bus = EventBus.getDefault() + try { + bus!!.register(this) + } catch (e: Exception) { + } + } + + private fun removeAll() { + ConfirmationDialog(this, "", R.string.empty_recycle_bin_messages_confirmation, R.string.yes, R.string.no) { + ensureBackgroundThread { + emptyMessagesRecycleBin() + loadRecycleBinConversations() + } + } + } + + private fun getOrCreateConversationsAdapter(): RecycleBinConversationsAdapter { + var currAdapter = conversations_list.adapter + if (currAdapter == null) { + hideKeyboard() + currAdapter = RecycleBinConversationsAdapter( + activity = this, + recyclerView = conversations_list, + onRefresh = { notifyDatasetChanged() }, + itemClick = { handleConversationClick(it) } + ) + + conversations_list.adapter = currAdapter + if (areSystemAnimationsEnabled) { + conversations_list.scheduleLayoutAnimation() + } + } + return currAdapter as RecycleBinConversationsAdapter + } + + private fun setupConversations(conversations: ArrayList) { + val sortedConversations = conversations.sortedWith( + compareByDescending { config.pinnedConversations.contains(it.threadId.toString()) } + .thenByDescending { it.date } + ).toMutableList() as ArrayList + + showOrHidePlaceholder(conversations.isEmpty()) + updateOptionsMenu(conversations) + + try { + getOrCreateConversationsAdapter().apply { + updateConversations(sortedConversations) + } + } catch (ignored: Exception) { + } + } + + private fun showOrHidePlaceholder(show: Boolean) { + conversations_fastscroller.beGoneIf(show) + no_conversations_placeholder.beVisibleIf(show) + no_conversations_placeholder.text = getString(R.string.no_conversations_found) + } + + @SuppressLint("NotifyDataSetChanged") + private fun notifyDatasetChanged() { + getOrCreateConversationsAdapter().notifyDataSetChanged() + } + + private fun handleConversationClick(any: Any) { + Intent(this, ThreadActivity::class.java).apply { + val conversation = any as Conversation + putExtra(THREAD_ID, conversation.threadId) + putExtra(THREAD_TITLE, conversation.title) + putExtra(WAS_PROTECTION_HANDLED, true) + putExtra(IS_RECYCLE_BIN, true) + startActivity(this) + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun refreshMessages(event: Events.RefreshMessages) { + loadRecycleBinConversations() + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt index 12c845f6..329bcb06 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt @@ -14,6 +14,8 @@ import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.dialogs.ExportMessagesDialog import com.simplemobiletools.smsmessenger.extensions.config +import com.simplemobiletools.smsmessenger.extensions.emptyMessagesRecycleBin +import com.simplemobiletools.smsmessenger.extensions.messagesDB import com.simplemobiletools.smsmessenger.helpers.* import com.simplemobiletools.smsmessenger.models.* import kotlinx.android.synthetic.main.activity_settings.* @@ -24,6 +26,7 @@ import kotlin.system.exitProcess class SettingsActivity : SimpleActivity() { private var blockedNumbersAtPause = -1 + private var recycleBinMessages = 0 private val messagesFileType = "application/json" private val messageImportFileTypes = listOf("application/json", "application/xml", "text/xml") @@ -57,6 +60,8 @@ class SettingsActivity : SimpleActivity() { setupGroupMessageAsMMS() setupLockScreenVisibility() setupMMSFileSizeLimit() + setupUseRecycleBin() + setupEmptyRecycleBin() setupAppPasswordProtection() setupMessagesExport() setupMessagesImport() @@ -71,6 +76,7 @@ class SettingsActivity : SimpleActivity() { settings_general_settings_label, settings_outgoing_messages_label, settings_notifications_label, + settings_recycle_bin_label, settings_security_label, settings_migrating_label ).forEach { @@ -321,6 +327,45 @@ class SettingsActivity : SimpleActivity() { } } + private fun setupUseRecycleBin() { + updateRecycleBinButtons() + settings_use_recycle_bin.isChecked = config.useRecycleBin + settings_use_recycle_bin_holder.setOnClickListener { + settings_use_recycle_bin.toggle() + config.useRecycleBin = settings_use_recycle_bin.isChecked + updateRecycleBinButtons() + } + } + + private fun updateRecycleBinButtons() { + settings_empty_recycle_bin_holder.beVisibleIf(config.useRecycleBin) + } + + private fun setupEmptyRecycleBin() { + ensureBackgroundThread { + recycleBinMessages = messagesDB.getArchivedCount() + runOnUiThread { + settings_empty_recycle_bin_size.text = + resources.getQuantityString(R.plurals.delete_messages, recycleBinMessages, recycleBinMessages) + } + } + + settings_empty_recycle_bin_holder.setOnClickListener { + if (recycleBinMessages == 0) { + toast(R.string.recycle_bin_empty) + } else { + ConfirmationDialog(this, "", R.string.empty_recycle_bin_messages_confirmation, R.string.yes, R.string.no) { + ensureBackgroundThread { + emptyMessagesRecycleBin() + } + recycleBinMessages = 0 + settings_empty_recycle_bin_size.text = + resources.getQuantityString(R.plurals.delete_messages, recycleBinMessages, recycleBinMessages) + } + } + } + } + private fun setupAppPasswordProtection() { settings_app_password_protection.isChecked = config.isAppPasswordProtectionOn settings_app_password_protection_holder.setOnClickListener { diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index c5194b56..1f867c88 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -105,6 +105,7 @@ class ThreadActivity : SimpleActivity() { private var allMessagesFetched = false private var oldestMessageDate = -1 private var wasProtectionHandled = false + private var isRecycleBin = false private var isScheduledMessage: Boolean = false private var messageToResend: Long? = null @@ -141,6 +142,7 @@ class ThreadActivity : SimpleActivity() { intent.getStringExtra(THREAD_TITLE)?.let { thread_toolbar.title = it } + isRecycleBin = intent.getBooleanExtra(IS_RECYCLE_BIN, false) wasProtectionHandled = intent.getBooleanExtra(WAS_PROTECTION_HANDLED, false) bus = EventBus.getDefault() @@ -164,6 +166,7 @@ class ThreadActivity : SimpleActivity() { setupAttachmentPickerView() setupKeyboardListener() hideAttachmentPicker() + maybeSetupRecycleBinView() } override fun onResume() { @@ -248,20 +251,21 @@ class ThreadActivity : SimpleActivity() { val firstPhoneNumber = participants.firstOrNull()?.phoneNumbers?.firstOrNull()?.value thread_toolbar.menu.apply { findItem(R.id.delete).isVisible = threadItems.isNotEmpty() - findItem(R.id.archive).isVisible = threadItems.isNotEmpty() && conversation?.isArchived == false - findItem(R.id.unarchive).isVisible = threadItems.isNotEmpty() && conversation?.isArchived == true - findItem(R.id.rename_conversation).isVisible = participants.size > 1 && conversation != null - findItem(R.id.conversation_details).isVisible = conversation != null + findItem(R.id.restore).isVisible = threadItems.isNotEmpty() && isRecycleBin + findItem(R.id.archive).isVisible = threadItems.isNotEmpty() && conversation?.isArchived == false && !isRecycleBin + findItem(R.id.unarchive).isVisible = threadItems.isNotEmpty() && conversation?.isArchived == true && !isRecycleBin + findItem(R.id.rename_conversation).isVisible = participants.size > 1 && conversation != null && !isRecycleBin + findItem(R.id.conversation_details).isVisible = conversation != null && !isRecycleBin findItem(R.id.block_number).title = addLockedLabelIfNeeded(R.string.block_number) - findItem(R.id.block_number).isVisible = isNougatPlus() - findItem(R.id.dial_number).isVisible = participants.size == 1 && !isSpecialNumber() - findItem(R.id.manage_people).isVisible = !isSpecialNumber() - findItem(R.id.mark_as_unread).isVisible = threadItems.isNotEmpty() + findItem(R.id.block_number).isVisible = isNougatPlus() && !isRecycleBin + findItem(R.id.dial_number).isVisible = participants.size == 1 && !isSpecialNumber() && !isRecycleBin + findItem(R.id.manage_people).isVisible = !isSpecialNumber() && !isRecycleBin + findItem(R.id.mark_as_unread).isVisible = threadItems.isNotEmpty() && !isRecycleBin // allow saving number in cases when we dont have it stored yet and it is a casual readable number findItem(R.id.add_number_to_contact).isVisible = participants.size == 1 && participants.first().name == firstPhoneNumber && firstPhoneNumber.any { it.isDigit() - } + } && !isRecycleBin } } @@ -274,6 +278,7 @@ class ThreadActivity : SimpleActivity() { when (menuItem.itemId) { R.id.block_number -> tryBlocking() R.id.delete -> askConfirmDelete() + R.id.restore -> askConfirmRestoreAll() R.id.archive -> archiveConversation() R.id.unarchive -> unarchiveConversation() R.id.rename_conversation -> renameConversation() @@ -308,7 +313,15 @@ class ThreadActivity : SimpleActivity() { private fun setupCachedMessages(callback: () -> Unit) { ensureBackgroundThread { messages = try { - messagesDB.getThreadMessages(threadId).toMutableList() as ArrayList + if (isRecycleBin) { + messagesDB.getThreadMessagesFromRecycleBin(threadId) + } else { + if (config.useRecycleBin) { + messagesDB.getNonRecycledThreadMessages(threadId) + } else { + messagesDB.getThreadMessages(threadId) + } + }.toMutableList() as ArrayList } catch (e: Exception) { ArrayList() } @@ -343,7 +356,13 @@ class ThreadActivity : SimpleActivity() { privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) val cachedMessagesCode = messages.clone().hashCode() - messages = getMessages(threadId, true) + if (!isRecycleBin) { + messages = getMessages(threadId, true) + if (config.useRecycleBin) { + val recycledMessages = messagesDB.getThreadMessagesFromRecycleBin(threadId).map { it.id } + messages = messages.filter { !recycledMessages.contains(it.id) }.toMutableList() as ArrayList + } + } val hasParticipantWithoutName = participants.any { contact -> contact.phoneNumbers.map { it.normalizedNumber }.contains(contact.name) @@ -391,8 +410,10 @@ class ThreadActivity : SimpleActivity() { participants.add(contact) } - messages.chunked(30).forEach { currentMessages -> - messagesDB.insertMessages(*currentMessages.toTypedArray()) + if (!isRecycleBin) { + messages.chunked(30).forEach { currentMessages -> + messagesDB.insertMessages(*currentMessages.toTypedArray()) + } } setupAttachmentSizes() @@ -411,7 +432,8 @@ class ThreadActivity : SimpleActivity() { activity = this, recyclerView = thread_messages_list, itemClick = { handleItemClick(it) }, - deleteMessages = { deleteMessages(it) } + isRecycleBin = isRecycleBin, + deleteMessages = { messages, toRecycleBin, fromRecycleBin -> deleteMessages(messages, toRecycleBin, fromRecycleBin) } ) thread_messages_list.adapter = currAdapter @@ -501,7 +523,7 @@ class ThreadActivity : SimpleActivity() { } } - private fun deleteMessages(messagesToRemove: List) { + private fun deleteMessages(messagesToRemove: List, toRecycleBin: Boolean, fromRecycleBin: Boolean) { val deletePosition = threadItems.indexOf(messagesToRemove.first()) messages.removeAll(messagesToRemove.toSet()) threadItems = getThreadItems() @@ -523,7 +545,13 @@ class ThreadActivity : SimpleActivity() { deleteScheduledMessage(messageId) cancelScheduleSendPendingIntent(messageId) } else { - deleteMessage(messageId, message.isMMS) + if (toRecycleBin) { + moveMessageToRecycleBin(messageId) + } else if (fromRecycleBin) { + restoreMessageFromRecycleBin(messageId) + } else { + deleteMessage(messageId, message.isMMS) + } } } updateLastConversationMessage(threadId) @@ -793,7 +821,7 @@ class ThreadActivity : SimpleActivity() { } private fun maybeDisableShortCodeReply() { - if (isSpecialNumber()) { + if (isSpecialNumber() && !isRecycleBin) { thread_send_message_holder.beGone() reply_disabled_info_holder.beVisible() val textColor = getProperTextColor() @@ -923,7 +951,23 @@ class ThreadActivity : SimpleActivity() { val confirmationMessage = R.string.delete_whole_conversation_confirmation ConfirmationDialog(this, getString(confirmationMessage)) { ensureBackgroundThread { - deleteConversation(threadId) + if (isRecycleBin) { + emptyMessagesRecycleBinForConversation(threadId) + } else { + deleteConversation(threadId) + } + runOnUiThread { + refreshMessages() + finish() + } + } + } + } + + private fun askConfirmRestoreAll() { + ConfirmationDialog(this, getString(R.string.restore_confirmation)) { + ensureBackgroundThread { + restoreAllMessagesFromRecycleBinForConversation(threadId) runOnUiThread { refreshMessages() finish() @@ -1486,6 +1530,10 @@ class ThreadActivity : SimpleActivity() { @Subscribe(threadMode = ThreadMode.ASYNC) fun refreshMessages(event: Events.RefreshMessages) { + if (isRecycleBin) { + return + } + refreshedSinceSent = true allMessagesFetched = false oldestMessageDate = -1 @@ -1508,6 +1556,10 @@ class ThreadActivity : SimpleActivity() { val scheduledMessages = messagesDB.getScheduledThreadMessages(threadId) .filterNot { it.isScheduled && it.millis() < System.currentTimeMillis() } addAll(scheduledMessages) + if (config.useRecycleBin) { + val recycledMessages = messagesDB.getThreadMessagesFromRecycleBin(threadId).toSet() + removeAll(recycledMessages) + } } messages.filter { !it.isScheduled && !it.isReceivedMessage() && it.id > lastMaxId }.forEach { latestMessage -> @@ -1748,6 +1800,12 @@ class ThreadActivity : SimpleActivity() { animateAttachmentButton(rotation = -135f) } + private fun maybeSetupRecycleBinView() { + if (isRecycleBin) { + thread_send_message_holder.beGone() + } + } + private fun hideAttachmentPicker() { attachment_picker_divider.beGone() attachment_picker_holder.apply { diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/RecycleBinConversationsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/RecycleBinConversationsAdapter.kt new file mode 100644 index 00000000..2f1c3542 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/RecycleBinConversationsAdapter.kt @@ -0,0 +1,108 @@ +package com.simplemobiletools.smsmessenger.adapters + +import android.view.Menu +import com.simplemobiletools.commons.dialogs.ConfirmationDialog +import com.simplemobiletools.commons.extensions.notificationManager +import com.simplemobiletools.commons.helpers.ensureBackgroundThread +import com.simplemobiletools.commons.views.MyRecyclerView +import com.simplemobiletools.smsmessenger.R +import com.simplemobiletools.smsmessenger.activities.SimpleActivity +import com.simplemobiletools.smsmessenger.extensions.deleteConversation +import com.simplemobiletools.smsmessenger.extensions.restoreAllMessagesFromRecycleBinForConversation +import com.simplemobiletools.smsmessenger.helpers.refreshMessages +import com.simplemobiletools.smsmessenger.models.Conversation + +class RecycleBinConversationsAdapter( + activity: SimpleActivity, recyclerView: MyRecyclerView, onRefresh: () -> Unit, itemClick: (Any) -> Unit +) : BaseConversationsAdapter(activity, recyclerView, onRefresh, itemClick) { + override fun getActionMenuId() = R.menu.cab_recycle_bin_conversations + + override fun prepareActionMode(menu: Menu) {} + + override fun actionItemPressed(id: Int) { + if (selectedKeys.isEmpty()) { + return + } + + when (id) { + R.id.cab_delete -> askConfirmDelete() + R.id.cab_restore -> askConfirmRestore() + R.id.cab_select_all -> selectAll() + } + } + + private fun askConfirmDelete() { + val itemsCnt = selectedKeys.size + val items = resources.getQuantityString(R.plurals.delete_conversations, itemsCnt, itemsCnt) + + val baseString = R.string.deletion_confirmation + val question = String.format(resources.getString(baseString), items) + + ConfirmationDialog(activity, question) { + ensureBackgroundThread { + deleteConversations() + } + } + } + + private fun deleteConversations() { + if (selectedKeys.isEmpty()) { + return + } + + val conversationsToRemove = currentList.filter { selectedKeys.contains(it.hashCode()) } as ArrayList + conversationsToRemove.forEach { + activity.deleteConversation(it.threadId) + activity.notificationManager.cancel(it.threadId.hashCode()) + } + + removeConversationsFromList(conversationsToRemove) + } + + private fun askConfirmRestore() { + val itemsCnt = selectedKeys.size + val items = resources.getQuantityString(R.plurals.delete_conversations, itemsCnt, itemsCnt) + + val baseString = R.string.restore_confirmation + val question = String.format(resources.getString(baseString), items) + + ConfirmationDialog(activity, question) { + ensureBackgroundThread { + restoreConversations() + } + } + } + + private fun restoreConversations() { + if (selectedKeys.isEmpty()) { + return + } + + val conversationsToRemove = currentList.filter { selectedKeys.contains(it.hashCode()) } as ArrayList + conversationsToRemove.forEach { + activity.restoreAllMessagesFromRecycleBinForConversation(it.threadId) + } + + removeConversationsFromList(conversationsToRemove) + } + + private fun removeConversationsFromList(removedConversations: List) { + val newList = try { + currentList.toMutableList().apply { removeAll(removedConversations) } + } catch (ignored: Exception) { + currentList.toMutableList() + } + + activity.runOnUiThread { + if (newList.none { selectedKeys.contains(it.hashCode()) }) { + refreshMessages() + finishActMode() + } else { + submitList(newList) + if (newList.isEmpty()) { + refreshMessages() + } + } + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt index 82da0e28..67fae1e3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadAdapter.kt @@ -33,6 +33,7 @@ import com.simplemobiletools.smsmessenger.activities.NewConversationActivity import com.simplemobiletools.smsmessenger.activities.SimpleActivity import com.simplemobiletools.smsmessenger.activities.ThreadActivity import com.simplemobiletools.smsmessenger.activities.VCardViewerActivity +import com.simplemobiletools.smsmessenger.dialogs.DeleteConfirmationDialog import com.simplemobiletools.smsmessenger.dialogs.MessageDetailsDialog import com.simplemobiletools.smsmessenger.dialogs.SelectTextDialog import com.simplemobiletools.smsmessenger.extensions.* @@ -58,7 +59,8 @@ class ThreadAdapter( activity: SimpleActivity, recyclerView: MyRecyclerView, itemClick: (Any) -> Unit, - val deleteMessages: (messages: List) -> Unit + val isRecycleBin: Boolean, + val deleteMessages: (messages: List, toRecycleBin: Boolean, fromRecycleBin: Boolean) -> Unit ) : MyRecyclerViewListAdapter(activity, recyclerView, ThreadItemDiffCallback(), itemClick) { private var fontSize = activity.getTextSize() @@ -84,6 +86,7 @@ class ThreadAdapter( findItem(R.id.cab_forward_message).isVisible = isOneItemSelected findItem(R.id.cab_select_text).isVisible = isOneItemSelected && hasText findItem(R.id.cab_properties).isVisible = isOneItemSelected + findItem(R.id.cab_restore).isVisible = isRecycleBin } } @@ -99,6 +102,7 @@ class ThreadAdapter( R.id.cab_forward_message -> forwardMessage() R.id.cab_select_text -> selectText() R.id.cab_delete -> askConfirmDelete() + R.id.cab_restore -> askConfirmRestore() R.id.cab_select_all -> selectAll() R.id.cab_properties -> showMessageDetails() } @@ -203,14 +207,43 @@ class ThreadAdapter( return } - val baseString = R.string.deletion_confirmation + val baseString = if (activity.config.useRecycleBin && !isRecycleBin) { + R.string.move_to_recycle_bin_confirmation + } else { + R.string.deletion_confirmation + } + val question = String.format(resources.getString(baseString), items) + + DeleteConfirmationDialog(activity, question, activity.config.useRecycleBin && !isRecycleBin) { skipRecycleBin -> + ensureBackgroundThread { + val messagesToRemove = getSelectedItems() + if (messagesToRemove.isNotEmpty()) { + val toRecycleBin = !skipRecycleBin && activity.config.useRecycleBin && !isRecycleBin + deleteMessages(messagesToRemove.filterIsInstance(), toRecycleBin, false) + } + } + } + } + + private fun askConfirmRestore() { + val itemsCnt = selectedKeys.size + + // not sure how we can get UnknownFormatConversionException here, so show the error and hope that someone reports it + val items = try { + resources.getQuantityString(R.plurals.delete_messages, itemsCnt, itemsCnt) + } catch (e: Exception) { + activity.showErrorToast(e) + return + } + + val baseString = R.string.restore_confirmation val question = String.format(resources.getString(baseString), items) ConfirmationDialog(activity, question) { ensureBackgroundThread { - val messagesToRemove = getSelectedItems() - if (messagesToRemove.isNotEmpty()) { - deleteMessages(messagesToRemove.filterIsInstance()) + val messagesToRestore = getSelectedItems() + if (messagesToRestore.isNotEmpty()) { + deleteMessages(messagesToRestore.filterIsInstance(), false, true) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt index 25d29328..55b5c701 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt @@ -14,7 +14,7 @@ import com.simplemobiletools.smsmessenger.interfaces.MessageAttachmentsDao import com.simplemobiletools.smsmessenger.interfaces.MessagesDao import com.simplemobiletools.smsmessenger.models.* -@Database(entities = [Conversation::class, Attachment::class, MessageAttachment::class, Message::class], version = 8) +@Database(entities = [Conversation::class, Attachment::class, MessageAttachment::class, Message::class, RecycleBinMessage::class], version = 8) @TypeConverters(Converters::class) abstract class MessagesDatabase : RoomDatabase() { @@ -118,6 +118,8 @@ abstract class MessagesDatabase : RoomDatabase() { override fun migrate(database: SupportSQLiteDatabase) { database.apply { execSQL("ALTER TABLE conversations ADD COLUMN archived INTEGER NOT NULL DEFAULT 0") + execSQL("CREATE TABLE IF NOT EXISTS `recycle_bin_messages` (`id` INTEGER NOT NULL PRIMARY KEY, `deleted_ts` INTEGER NOT NULL)") + execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `index_recycle_bin_messages_id` ON `recycle_bin_messages` (`id`)") } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/dialogs/DeleteConfirmationDialog.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/dialogs/DeleteConfirmationDialog.kt new file mode 100644 index 00000000..f72a7513 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/dialogs/DeleteConfirmationDialog.kt @@ -0,0 +1,39 @@ +package com.simplemobiletools.smsmessenger.dialogs + +import android.app.Activity +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.extensions.beGoneIf +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.smsmessenger.R +import kotlinx.android.synthetic.main.dialog_delete_confirmation.view.delete_remember_title +import kotlinx.android.synthetic.main.dialog_delete_confirmation.view.skip_the_recycle_bin_checkbox + +class DeleteConfirmationDialog( + private val activity: Activity, + private val message: String, + private val showSkipRecycleBinOption: Boolean, + private val callback: (skipRecycleBin: Boolean) -> Unit +) { + + private var dialog: AlertDialog? = null + val view = activity.layoutInflater.inflate(R.layout.dialog_delete_confirmation, null)!! + + init { + view.delete_remember_title.text = message + view.skip_the_recycle_bin_checkbox.beGoneIf(!showSkipRecycleBinOption) + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.yes) { _, _ -> dialogConfirmed() } + .setNegativeButton(R.string.no, null) + .apply { + activity.setupDialogStuff(view, this) { alertDialog -> + dialog = alertDialog + } + } + } + + private fun dialogConfirmed() { + dialog?.dismiss() + callback(view.skip_the_recycle_bin_checkbox.isChecked) + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index d4de6138..de7d6855 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -657,6 +657,55 @@ fun Context.deleteConversation(threadId: Long) { messagesDB.deleteThreadMessages(threadId) } +fun Context.checkAndDeleteOldRecycleBinMessages(callback: (() -> Unit)? = null) { + if (config.useRecycleBin && config.lastRecycleBinCheck < System.currentTimeMillis() - DAY_SECONDS * 1000) { + config.lastRecycleBinCheck = System.currentTimeMillis() + ensureBackgroundThread { + try { + for (message in messagesDB.getOldRecycleBinMessages(System.currentTimeMillis() - MONTH_SECONDS * 1000L)) { + deleteMessage(message.id, message.isMMS) + } + callback?.invoke() + } catch (e: Exception) { + } + } + } +} + +fun Context.emptyMessagesRecycleBin() { + val messages = messagesDB.getAllRecycleBinMessages() + for (message in messages) { + deleteMessage(message.id, message.isMMS) + } +} + +fun Context.emptyMessagesRecycleBinForConversation(threadId: Long) { + val messages = messagesDB.getThreadMessagesFromRecycleBin(threadId) + for (message in messages) { + deleteMessage(message.id, message.isMMS) + } +} + +fun Context.restoreAllMessagesFromRecycleBinForConversation(threadId: Long) { + messagesDB.deleteThreadMessagesFromRecycleBin(threadId) +} + +fun Context.moveMessageToRecycleBin(id: Long) { + try { + messagesDB.insertRecycleBinEntry(RecycleBinMessage(id, System.currentTimeMillis())) + } catch (e: Exception) { + showErrorToast(e) + } +} + +fun Context.restoreMessageFromRecycleBin(id: Long) { + try { + messagesDB.deleteFromRecycleBin(id) + } catch (e: Exception) { + showErrorToast(e) + } +} + fun Context.updateConversationArchivedStatus(threadId: Long, archived: Boolean) { val uri = Threads.CONTENT_URI val values = ContentValues().apply { diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt index 284f83ca..88eb740a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt @@ -104,11 +104,11 @@ class Config(context: Context) : BaseConfig(context) { get() = prefs.getInt(SOFT_KEYBOARD_HEIGHT, context.getDefaultKeyboardHeight()) set(keyboardHeight) = prefs.edit().putInt(SOFT_KEYBOARD_HEIGHT, keyboardHeight).apply() - var useArchive: Boolean - get() = prefs.getBoolean(USE_ARCHIVE, false) - set(useArchive) = prefs.edit().putBoolean(USE_ARCHIVE, useArchive).apply() + var useRecycleBin: Boolean + get() = prefs.getBoolean(USE_RECYCLE_BIN, false) + set(useRecycleBin) = prefs.edit().putBoolean(USE_RECYCLE_BIN, useRecycleBin).apply() - var lastArchiveCheck: Long - get() = prefs.getLong(LAST_ARCHIVE_CHECK, 0L) - set(lastArchiveCheck) = prefs.edit().putLong(LAST_ARCHIVE_CHECK, lastArchiveCheck).apply() + var lastRecycleBinCheck: Long + get() = prefs.getLong(LAST_RECYCLE_BIN_CHECK, 0L) + set(lastRecycleBinCheck) = prefs.edit().putLong(LAST_RECYCLE_BIN_CHECK, lastRecycleBinCheck).apply() } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt index 039758ef..390ee5b6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt @@ -40,8 +40,9 @@ const val SCHEDULED_MESSAGE_ID = "scheduled_message_id" const val SOFT_KEYBOARD_HEIGHT = "soft_keyboard_height" const val IS_MMS = "is_mms" const val MESSAGE_ID = "message_id" -const val USE_ARCHIVE = "use_archive" -const val LAST_ARCHIVE_CHECK = "last_archive_check" +const val USE_RECYCLE_BIN = "use_recycle_bin" +const val LAST_RECYCLE_BIN_CHECK = "last_recycle_bin_check" +const val IS_RECYCLE_BIN = "is_recycle_bin" private const val PATH = "com.simplemobiletools.smsmessenger.action." const val MARK_AS_READ = PATH + "mark_as_read" diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt index 43b502ad..e5e1259a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt @@ -2,17 +2,33 @@ package com.simplemobiletools.smsmessenger.interfaces import androidx.room.* import com.simplemobiletools.smsmessenger.models.Conversation +import com.simplemobiletools.smsmessenger.models.ConversationWithSnippetOverride @Dao interface ConversationsDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertOrUpdate(conversation: Conversation): Long - @Query("SELECT * FROM conversations WHERE archived = 0") - fun getNonArchived(): List + @Query("SELECT (SELECT body FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NULL AND messages.thread_id = conversations.thread_id ORDER BY messages.date DESC LIMIT 1) as new_snippet, * FROM conversations WHERE archived = 0") + fun getNonArchivedWithLatestSnippet(): List - @Query("SELECT * FROM conversations WHERE archived = 1") - fun getAllArchived(): List + fun getNonArchived(): List { + return getNonArchivedWithLatestSnippet().map { it.toConversation() } + } + + @Query("SELECT (SELECT body FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NULL AND messages.thread_id = conversations.thread_id ORDER BY messages.date DESC LIMIT 1) as new_snippet, * FROM conversations WHERE archived = 1") + fun getAllArchivedWithLatestSnippet(): List + + fun getAllArchived(): List { + return getAllArchivedWithLatestSnippet().map { it.toConversation() } + } + + @Query("SELECT (SELECT body FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NOT NULL AND messages.thread_id = conversations.thread_id ORDER BY messages.date DESC LIMIT 1) as new_snippet, * FROM conversations WHERE (SELECT COUNT(*) FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NOT NULL AND messages.thread_id = conversations.thread_id) > 0") + fun getAllWithMessagesInRecycleBinWithLatestSnippet(): List + + fun getAllWithMessagesInRecycleBin(): List { + return getAllWithMessagesInRecycleBinWithLatestSnippet().map { it.toConversation() } + } @Query("SELECT * FROM conversations WHERE thread_id = :threadId") fun getConversationWithThreadId(threadId: Long): Conversation? diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt index 7036167b..3287ab64 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/MessagesDao.kt @@ -1,9 +1,7 @@ package com.simplemobiletools.smsmessenger.interfaces -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query +import androidx.room.* +import com.simplemobiletools.smsmessenger.models.RecycleBinMessage import com.simplemobiletools.smsmessenger.models.Message @Dao @@ -11,6 +9,9 @@ interface MessagesDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertOrUpdate(message: Message) + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertRecycleBinEntry(recycleBinMessage: RecycleBinMessage) + @Insert(onConflict = OnConflictStrategy.IGNORE) fun insertOrIgnore(message: Message): Long @@ -20,15 +21,30 @@ interface MessagesDao { @Query("SELECT * FROM messages") fun getAll(): List + @Query("SELECT messages.* FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NOT NULL") + fun getAllRecycleBinMessages(): List + + @Query("SELECT messages.* FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NOT NULL AND recycle_bin_messages.deleted_ts < :timestamp") + fun getOldRecycleBinMessages(timestamp: Long): List + @Query("SELECT * FROM messages WHERE thread_id = :threadId") fun getThreadMessages(threadId: Long): List - @Query("SELECT * FROM messages WHERE thread_id = :threadId AND is_scheduled = 1") + @Query("SELECT messages.* FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NULL AND thread_id = :threadId") + fun getNonRecycledThreadMessages(threadId: Long): List + + @Query("SELECT messages.* FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NOT NULL AND thread_id = :threadId") + fun getThreadMessagesFromRecycleBin(threadId: Long): List + + @Query("SELECT messages.* FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NULL AND thread_id = :threadId AND is_scheduled = 1") fun getScheduledThreadMessages(threadId: Long): List @Query("SELECT * FROM messages WHERE thread_id = :threadId AND id = :messageId AND is_scheduled = 1") fun getScheduledMessageWithId(threadId: Long, messageId: Long): Message + @Query("SELECT COUNT(*) FROM recycle_bin_messages") + fun getArchivedCount(): Int + @Query("SELECT * FROM messages WHERE body LIKE :text") fun getMessagesWithText(text: String): List @@ -44,11 +60,29 @@ interface MessagesDao { @Query("UPDATE messages SET status = :status WHERE id = :id") fun updateStatus(id: Long, status: Int): Int + @Transaction + fun delete(id: Long) { + deleteFromMessages(id) + deleteFromRecycleBin(id) + } + @Query("DELETE FROM messages WHERE id = :id") - fun delete(id: Long) + fun deleteFromMessages(id: Long) + + @Query("DELETE FROM recycle_bin_messages WHERE id = :id") + fun deleteFromRecycleBin(id: Long) + + @Transaction + fun deleteThreadMessages(threadId: Long) { + deleteThreadMessagesFromRecycleBin(threadId) + deleteAllThreadMessages(threadId) + } @Query("DELETE FROM messages WHERE thread_id = :threadId") - fun deleteThreadMessages(threadId: Long) + fun deleteAllThreadMessages(threadId: Long) + + @Query("DELETE FROM recycle_bin_messages WHERE id IN (SELECT id FROM messages WHERE thread_id = :threadId)") + fun deleteThreadMessagesFromRecycleBin(threadId: Long) @Query("DELETE FROM messages") fun deleteAll() diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/ConversationWithSnippetOverride.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/ConversationWithSnippetOverride.kt new file mode 100644 index 00000000..ede5e4e5 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/ConversationWithSnippetOverride.kt @@ -0,0 +1,16 @@ +package com.simplemobiletools.smsmessenger.models + +import androidx.room.ColumnInfo +import androidx.room.Embedded + +data class ConversationWithSnippetOverride( + @ColumnInfo(name = "new_snippet") val snippet: String?, + @Embedded val conversation: Conversation +) { + fun toConversation() = + if (snippet == null) { + conversation + } else { + conversation.copy(snippet = snippet) + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/RecycleBinMessage.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/RecycleBinMessage.kt new file mode 100644 index 00000000..e8c1dbe6 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/RecycleBinMessage.kt @@ -0,0 +1,15 @@ +package com.simplemobiletools.smsmessenger.models + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Index +import androidx.room.PrimaryKey + +@Entity( + tableName = "recycle_bin_messages", + indices = [(Index(value = ["id"], unique = true))] +) +data class RecycleBinMessage( + @PrimaryKey val id: Long, + @ColumnInfo(name = "deleted_ts") var deletedTS: Long +) diff --git a/app/src/main/res/layout/activity_recycle_bin_conversations.xml b/app/src/main/res/layout/activity_recycle_bin_conversations.xml new file mode 100644 index 00000000..b6ab593c --- /dev/null +++ b/app/src/main/res/layout/activity_recycle_bin_conversations.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 8d733d2c..7efcba0b 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -361,6 +361,55 @@ android:id="@+id/settings_outgoing_messages_divider" layout="@layout/divider" /> + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/cab_recycle_bin_conversations.xml b/app/src/main/res/menu/cab_recycle_bin_conversations.xml new file mode 100644 index 00000000..80915403 --- /dev/null +++ b/app/src/main/res/menu/cab_recycle_bin_conversations.xml @@ -0,0 +1,22 @@ + + + + + + diff --git a/app/src/main/res/menu/cab_thread.xml b/app/src/main/res/menu/cab_thread.xml index a1150743..1c615d95 100644 --- a/app/src/main/res/menu/cab_thread.xml +++ b/app/src/main/res/menu/cab_thread.xml @@ -31,6 +31,11 @@ android:icon="@drawable/ic_info_vector" android:title="@string/properties" app:showAsAction="ifRoom" /> + + + + + + diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 2a9569d1..91ce932b 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -71,9 +71,16 @@ لم يتم العثور على محادثات مؤرشفة تم إفراغ الأرشيف بنجاح هل أنت متأكد من أنك تريد إفراغ الأرشيف؟ ستفقد جميع المحادثات المؤرشفة نهائيا. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly هل أنت متأكد أنك تريد حذف كافة رسائل هذه المحادثة؟ هل أنت متأكد من أنك تريد أرشفة %s؟ + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? محادثة %d @@ -140,4 +147,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index bd02cd1d..127c919c 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Are you sure you want to delete all messages of this conversation\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversation diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 8f90fdea..ce65f7bb 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -69,9 +69,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Выдаліць усе паведамленні ў гэтай размове\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d размову diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index aed7a4c7..ceb2fbad 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Сигурни ли сте, че искате да изтриете всички съобщения от този разговор\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d разговор @@ -128,4 +135,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ 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 abe4148d..f033a4ee 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -67,9 +67,16 @@ No s\'ha trobat cap conversa arxivada L\'arxiu s\'ha buidat correctament Segur que voleu buidar l\'arxiu\? Totes les converses arxivades es perdran permanentment. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Confirmeu que voleu suprimir tots els missatges d\'aquesta conversa\? Segur que voleu arxivar %s\? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversa @@ -128,4 +135,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-cr/strings.xml b/app/src/main/res/values-cr/strings.xml index bd02cd1d..127c919c 100644 --- a/app/src/main/res/values-cr/strings.xml +++ b/app/src/main/res/values-cr/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Are you sure you want to delete all messages of this conversation\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversation diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index c1b25ede..26e59c1c 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -68,9 +68,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Opravdu chcete smazat všechny zprávy v této konverzaci\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d konverzace diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 74a7367a..0132705d 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Er du sikker på, at du vil slette alle beskeder i denne samtale\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d samtale diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index e0d82f23..8bace036 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -67,9 +67,16 @@ Es wurden keine archivierten Unterhaltungen gefunden Das Archiv wurde erfolgreich geleert Das Archiv wirklich leeren\? Alle archivierten Unterhaltungen sind dann unwiederbringlich gelöscht. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Sollen wirklich alle Nachrichten dieser Unterhaltung gelöscht werden\? %s wirklich archivieren\? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d Unterhaltung @@ -128,4 +135,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 9c6d8374..c65f272a 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -67,9 +67,16 @@ Δεν βρέθηκαν αρχειοθετημένες συνομιλίες Το αρχείο άδειασε με επιτυχία Είστε σίγουροι ότι θέλετε να αδειάσετε το αρχείο; Όλες οι αρχειοθετημένες συνομιλίες θα χαθούν οριστικά. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Είστε βέβαιοι ότι θέλετε να διαγράψετε όλα τα μηνύματα αυτής της συνομιλίας; Σίγουρα θέλετε να αρχειοθετήσετε %s; + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d συνομιλία diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 9471b0cf..92590242 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Are you sure you want to delete all messages of this conversation\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d konversacio diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 0cb42d20..f40d133b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -68,9 +68,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly ¿Estás seguro que quieres eliminar todos los mensajes en esta conversación\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversación diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index b53d4e90..5c5bb2c5 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -67,9 +67,16 @@ Arhiveeritud vestlusi ei leidu Arhiiv on edukalt tühjendatud Kas kindlasti soovid arhiivi tühjendada\? Kõik arhiveeritud vestlused lähevad jäädavalt kaotsi. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Kas oled kindel, et soovid kustutada kõik selle vestluse sõnumid\? Kas sa oled kindel, et soovid lisada „%s“ arhiivi\? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d vestlus @@ -128,4 +135,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 50db49b9..4915c82d 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Haluatko varmasti poistaa kaikki tämän keskustelun viestit\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d keskustelu diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 4b6d0866..d5238a29 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -68,9 +68,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Voulez-vous vraiment supprimer tous les messages de cette conversation \? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversation diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 55c2d34f..c234ab52 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Ten a certeza de que desexa eliminar todas as mensaxes desta conversa\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversa diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index bd02cd1d..127c919c 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Are you sure you want to delete all messages of this conversation\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversation diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 9ea37bbb..cb85ea64 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -68,9 +68,16 @@ Nema arhiviranih razgovora Arhiv je uspješno ispražnjen Jeste li ste sigurni da želite isprazniti arhiv? Svi arhivirani razgovori će biti obrisani. + + Vrati + Vrati sve poruke + Stvarno želiš isprazniti koš za smeće? Poruke će biti trajno izgubljene. + Preskoči koš za smeće, izbriši poruke odmah Stvarno želiš izbrisati sve poruke ovog razgovora\? Stvarno želiš arhivirati %s? + Stvarno želiš vratiti sve poruke iz ovog razgovora? + Stvarno želiš vratiti %s? %d razgovor diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 561bc61c..3b7b431a 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Biztos, hogy törli az összes üzenetet ebből a beszélgetésből\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d beszélgetést diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index e828d21a..3b2f6d81 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -66,9 +66,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Apakah Anda yakin ingin menghapus semua pesan dari percakapan ini\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d percakapan diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 0c633ffb..59f1a2d0 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Are you sure you want to delete all messages of this conversation\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversation diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index bcab8d2d..c0cc6c00 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -68,9 +68,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Vuoi davvero eliminare tutti i messaggi di questa conversazione\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversazione diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 2d69ad38..03266073 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -69,9 +69,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly האם אתה בטוח שברצונך למחוק את כל ההודעות של השיחה הזו\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? שיחה %d diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 3bca3c5c..5850378a 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -66,9 +66,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly 本当にこの会話のすべてのメッセージを削除しますか? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d 件の会話 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index b39d4791..b0e5553b 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Ar tikrai norite ištrinti visas šio pokalbio žinutes\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d pokalbis diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 048f6e81..ab93481a 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -68,9 +68,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Are you sure you want to delete all messages of this conversation\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversation diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index bd02cd1d..127c919c 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Are you sure you want to delete all messages of this conversation\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversation diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index a2b65c0b..b0d9ab8b 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly ഈ സംഭാഷണത്തിലെ എല്ലാ സന്ദേശങ്ങളും ഇല്ലാതാക്കണമെന്ന് തീർച്ചയാണോ\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d സംഭാഷണം diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index bc53dedd..1878d6b6 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Er du sikker på at du vil slette alle meldinger fra denne konversasjonen\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d konversasjon diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 90a3c782..5a9f79e1 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -67,9 +67,16 @@ Geen gearchiveerde gesprekken gevonden Archief is gewist Het archief wissen\? Alle gearchiveerde gesprekken zullen permanent verwijderd worden. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Alle berichten in dit gesprek verwijderen\? %s archiveren\? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d gesprek @@ -128,4 +135,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index 7003cda7..4b31393b 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly تسیں پکے اے، سارے سنیہے مٹاؤ؟ Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversation diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 7a64c240..f9220f44 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -69,9 +69,16 @@ Nie znaleziono zarchiwizowanych rozmów Archiwum zostało opróżnione Czy opróżnić archiwum\? Wszystkie zarchiwizowane rozmowy zostaną utracone bezpowrotnie. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Czy usunąć wszystkie wiadomości z tej rozmowy\? Czy zarchiwizować %s\? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d rozmowę @@ -134,4 +141,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 83f82477..8dfed8f3 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -68,9 +68,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Tem certeza que quer deletar todas as mensagens dessa conversa\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversa diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index c53faab3..edcffa5a 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -68,9 +68,16 @@ Não existem conversas arquivadas O arquivo foi limpo com sucesso Tem a certeza de que pretende limpar o arquivo\? Todas as conversas arquivadas serão eliminadas. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Tem a certeza de que pretende apagar todas as mensagens desta conversa\? Tem a certeza de que pretende arquivar %s\? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversa @@ -131,4 +138,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 50279ed5..c9c67e74 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -68,9 +68,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Sunteți sigur că doriți să ștergeți toate mesajele din această conversație\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversaţie diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 9a810549..c1ec88df 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -69,9 +69,16 @@ Нет архивных переписок Архив успешно очищен Очистить архив\? Все архивные переписки будут безвозвратно потеряны. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Удалить все сообщения в этой переписке\? Архивировать %s\? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d переписку @@ -134,4 +141,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 8cf9d7f6..e7dbfe21 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -68,9 +68,16 @@ Nenašli sa žiadne archivované konverzácie Archív bol úspešne vyprázdnený Ste si istý, že chcete vyprázdniť archív? Všetky archivované konverzácie budú navždy odstránené. + + Obnoviť + Obnoviť všetky správy + Ste si istý, že chcete vysypať odpadkový kôš? Správy budú navždy stratené. + Vynechať odpadkový kôš, priamo vymazať správy Ste si istý, že chcete odstrániť všetky správy tejto konverzácie\? Ste si istý, že chcete archivovať %s? + Ste si istý, že chcete obnoviť všetky správy tejto konverzácie? + Ste si istý, že chcete obnoviť %s? %d konverzáciu diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 3aed45a2..03bb8e60 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -69,9 +69,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Ste prepričani, da želite izbrisati vsa sporočila tega pogovora\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d pogovor diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 28dd969a..3af12aeb 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -68,9 +68,16 @@ Нема архивираних разговора Архива је успјешно испражнјена Да ли сте сигурни да желите да испразните архиву? Све архивиране поруке ће бити избрисане. + + Врати + Врати све поруке + Да ли сте сигурни да желите испразнити канту за отпазке? Поруке ће бити трајно обрисане. + Прескочи канту за отпатке, обриши поруке директно Да ли сте сигурни да желите да избришете све поруке ове конверзације\? Да ли сте сигурни да желите да архивирате %s? + Да ли сте сигурни да желите да вратите све поруке ове конверзације? + Да ли сте сигурни да желите да вратите %s? %d разговор diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index dd34deab..191c6c60 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -67,9 +67,16 @@ Inga arkiverade konversationer hittades Arkivet har tömts Är du säker på att du vill tömma arkivet\? Alla arkiverade konversationer tas bort permanent. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Är du säker på att du vill ta bort alla meddelanden i konversationen\? Är du säker på att du vill arkivera %s\? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d konversation @@ -128,4 +135,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 6a4da8d0..23f7c822 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly இந்த உரையாடலின் அனைத்து செய்திகளையும் நிச்சயமாக நீக்க விரும்புகிறீர்களா\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d உரையாடல் diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 46511b66..9bb49374 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -66,9 +66,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Are you sure you want to delete all messages of this conversation\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversation diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index d1780fda..ebe56539 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -67,9 +67,16 @@ Arşivlenen görüşme bulunamadı Arşiv başarıyla boşaltıldı Arşivi boşaltmak istediğinizden emin misiniz\? Arşivlenen tüm görüşmeler kalıcı olarak kaybolacak. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Bu görüşmenin tüm mesajlarını silmek istediğinizden emin misiniz\? %s arşivlemek istediğinizden emin misiniz\? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d görüşme @@ -128,4 +135,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index e85d92fd..7e98ea27 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -69,9 +69,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Справді видалити всі повідомлення у цьому листуванні\? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d листування diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index ef44420b..1947b36c 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -66,9 +66,16 @@ 尚未找到已归档对话 已成功清空归档 你确定要清空归档吗?所有已归档对话将永久丢失。 + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly 您确定要删除此对话的所有消息吗\? 你确定要归档 %s 吗? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d 个对话 @@ -125,4 +132,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 9b174550..136da6ab 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -66,9 +66,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly 您確定要刪除此對話中的所有訊息嗎? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversation diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cb057590..730ed6ab 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -67,9 +67,16 @@ No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + + Restore + Restore all messages + Are you sure you want to empty the Recycle Bin? The messages will be permanently lost. + Skip the Recycle Bin, delete messages directly Are you sure you want to delete all messages of this conversation? Are you sure you want to archive %s? + Are you sure you want to restore all messages of this conversation? + Are you sure you want to restore %s? %d conversation