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