diff --git a/app/build.gradle b/app/build.gradle
index 9fc60274..24c62f3e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -66,7 +66,7 @@ android {
}
dependencies {
- implementation 'com.github.SimpleMobileTools:Simple-Commons:b4cc381943'
+ implementation 'com.github.SimpleMobileTools:Simple-Commons:8814cd2d4b'
implementation 'org.greenrobot:eventbus:3.3.1'
implementation 'com.github.tibbi:IndicatorFastScroll:4524cd0b61'
implementation 'com.github.tibbi:android-smsmms:5657799572'
@@ -76,7 +76,7 @@ dependencies {
implementation 'androidx.lifecycle:lifecycle-process:2.5.1'
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1"
- kapt "androidx.room:room-compiler:2.5.1"
- implementation "androidx.room:room-runtime:2.5.1"
- annotationProcessor "androidx.room:room-compiler:2.5.1"
+ kapt "androidx.room:room-compiler:2.5.2"
+ implementation "androidx.room:room-runtime:2.5.2"
+ annotationProcessor "androidx.room:room-compiler:2.5.2"
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index aa49b1c0..bfd73ed0 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.empty_archive -> removeAll()
+ else -> return@setOnMenuItemClickListener false
+ }
+ return@setOnMenuItemClickListener true
+ }
+ }
+
+ private fun updateOptionsMenu(conversations: ArrayList) {
+ archive_toolbar.menu.apply {
+ findItem(R.id.empty_archive).isVisible = conversations.isNotEmpty()
+ }
+ }
+
+ private fun updateMenuColors() {
+ updateStatusbarColor(getProperBackgroundColor())
+ }
+
+ private fun loadArchivedConversations() {
+ ensureBackgroundThread {
+ val conversations = try {
+ conversationsDB.getAllArchived().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_archive_confirmation, R.string.yes, R.string.no) {
+ removeAllArchivedConversations {
+ loadArchivedConversations()
+ }
+ }
+ }
+
+ private fun getOrCreateConversationsAdapter(): ArchivedConversationsAdapter {
+ var currAdapter = conversations_list.adapter
+ if (currAdapter == null) {
+ hideKeyboard()
+ currAdapter = ArchivedConversationsAdapter(
+ activity = this,
+ recyclerView = conversations_list,
+ onRefresh = { notifyDatasetChanged() },
+ itemClick = { handleConversationClick(it) }
+ )
+
+ conversations_list.adapter = currAdapter
+ if (areSystemAnimationsEnabled) {
+ conversations_list.scheduleLayoutAnimation()
+ }
+ }
+ return currAdapter as ArchivedConversationsAdapter
+ }
+
+ 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_archived_conversations)
+ }
+
+ @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)
+ startActivity(this)
+ }
+ }
+
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ fun refreshMessages(event: Events.RefreshMessages) {
+ loadArchivedConversations()
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt
index 07f056c0..3f12776f 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt
@@ -164,6 +164,7 @@ class MainActivity : SimpleActivity() {
main_menu.getToolbar().setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.more_apps_from_us -> launchMoreAppsFromUsIntent()
+ R.id.show_archived -> launchArchivedConversations()
R.id.settings -> launchSettings()
R.id.about -> launchAbout()
else -> return@setOnMenuItemClickListener false
@@ -233,7 +234,10 @@ class MainActivity : SimpleActivity() {
handlePermission(PERMISSION_READ_CONTACTS) {
handleNotificationPermission { granted ->
if (!granted) {
- PermissionRequiredDialog(this, R.string.allow_notifications_incoming_messages)
+ PermissionRequiredDialog(
+ activity = this,
+ textId = R.string.allow_notifications_incoming_messages,
+ positiveActionCallback = { openNotificationSettings() })
}
}
@@ -271,15 +275,21 @@ class MainActivity : SimpleActivity() {
private fun getCachedConversations() {
ensureBackgroundThread {
val conversations = try {
- conversationsDB.getAll().toMutableList() as ArrayList
+ conversationsDB.getNonArchived().toMutableList() as ArrayList
} catch (e: Exception) {
ArrayList()
}
+ val archived = try {
+ conversationsDB.getAllArchived()
+ } catch (e: Exception) {
+ listOf()
+ }
+
updateUnreadCountBadge(conversations)
runOnUiThread {
setupConversations(conversations, cached = true)
- getNewConversations(conversations)
+ getNewConversations((conversations + archived).toMutableList() as ArrayList)
}
conversations.forEach {
clearExpiredScheduledMessages(it.threadId)
@@ -333,7 +343,7 @@ class MainActivity : SimpleActivity() {
}
}
- val allConversations = conversationsDB.getAll() as ArrayList
+ val allConversations = conversationsDB.getNonArchived() as ArrayList
runOnUiThread {
setupConversations(allConversations)
}
@@ -538,6 +548,11 @@ class MainActivity : SimpleActivity() {
}
}
+ private fun launchArchivedConversations() {
+ hideKeyboard()
+ startActivity(Intent(applicationContext, ArchivedConversationsActivity::class.java))
+ }
+
private fun launchSettings() {
hideKeyboard()
startActivity(Intent(applicationContext, SettingsActivity::class.java))
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 62e03a05..82e2003a 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt
@@ -2,6 +2,7 @@ package com.simplemobiletools.smsmessenger.activities
import android.annotation.SuppressLint
import android.app.Activity
+import android.app.AlarmManager
import android.content.ActivityNotFoundException
import android.content.Intent
import android.content.res.ColorStateList
@@ -44,6 +45,7 @@ import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.FeatureLockedDialog
+import com.simplemobiletools.commons.dialogs.PermissionRequiredDialog
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
@@ -51,6 +53,7 @@ import com.simplemobiletools.commons.models.PhoneNumber
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.commons.models.SimpleContact
import com.simplemobiletools.commons.views.MyRecyclerView
+import com.simplemobiletools.smsmessenger.BuildConfig
import com.simplemobiletools.smsmessenger.R
import com.simplemobiletools.smsmessenger.adapters.AttachmentsAdapter
import com.simplemobiletools.smsmessenger.adapters.AutoCompleteTextViewAdapter
@@ -244,6 +247,8 @@ 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.block_number).title = addLockedLabelIfNeeded(R.string.block_number)
@@ -268,6 +273,8 @@ class ThreadActivity : SimpleActivity() {
when (menuItem.itemId) {
R.id.block_number -> tryBlocking()
R.id.delete -> askConfirmDelete()
+ R.id.archive -> archiveConversation()
+ R.id.unarchive -> unarchiveConversation()
R.id.rename_conversation -> renameConversation()
R.id.conversation_details -> showConversationDetails()
R.id.add_number_to_contact -> addNumberToContact()
@@ -710,6 +717,25 @@ class ThreadActivity : SimpleActivity() {
setupScheduleSendUi()
}
+ private fun askForExactAlarmPermissionIfNeeded(callback: () -> Unit = {}) {
+ if (isSPlus()) {
+ val alarmManager: AlarmManager = getSystemService(ALARM_SERVICE) as AlarmManager
+ if (alarmManager.canScheduleExactAlarms()) {
+ callback()
+ } else {
+ PermissionRequiredDialog(
+ activity = this,
+ textId = R.string.allow_alarm_scheduled_messages,
+ positiveActionCallback = {
+ openRequestExactAlarmSettings(BuildConfig.APPLICATION_ID)
+ },
+ )
+ }
+ } else {
+ callback()
+ }
+ }
+
private fun setupAttachmentSizes() {
messages.filter { it.attachment != null }.forEach { message ->
message.attachment!!.attachments.forEach {
@@ -888,7 +914,8 @@ class ThreadActivity : SimpleActivity() {
}
private fun askConfirmDelete() {
- ConfirmationDialog(this, getString(R.string.delete_whole_conversation_confirmation)) {
+ val confirmationMessage = R.string.delete_whole_conversation_confirmation
+ ConfirmationDialog(this, getString(confirmationMessage)) {
ensureBackgroundThread {
deleteConversation(threadId)
runOnUiThread {
@@ -899,6 +926,26 @@ class ThreadActivity : SimpleActivity() {
}
}
+ private fun archiveConversation() {
+ ensureBackgroundThread {
+ updateConversationArchivedStatus(threadId, true)
+ runOnUiThread {
+ refreshMessages()
+ finish()
+ }
+ }
+ }
+
+ private fun unarchiveConversation() {
+ ensureBackgroundThread {
+ updateConversationArchivedStatus(threadId, false)
+ runOnUiThread {
+ refreshMessages()
+ finish()
+ }
+ }
+ }
+
private fun dialNumber() {
val phoneNumber = participants.first().phoneNumbers.first().normalizedNumber
dialNumber(phoneNumber)
@@ -1121,7 +1168,7 @@ class ThreadActivity : SimpleActivity() {
contacts = arrayListOf(contact),
showExportingToast = false,
) {
- if (it == VcfExporter.ExportResult.EXPORT_OK) {
+ if (it == ExportResult.EXPORT_OK) {
val vCardUri = getMyFileUri(outputFile)
runOnUiThread {
addAttachment(vCardUri)
@@ -1327,6 +1374,7 @@ class ThreadActivity : SimpleActivity() {
}
}
messagesDB.insertOrUpdate(message)
+ updateConversationArchivedStatus(message.threadId, false)
}
// show selected contacts, properly split to new lines when appropriate
@@ -1529,10 +1577,12 @@ class ThreadActivity : SimpleActivity() {
}
private fun launchScheduleSendDialog(originalDateTime: DateTime? = null) {
- ScheduleMessageDialog(this, originalDateTime) { newDateTime ->
- if (newDateTime != null) {
- scheduledDateTime = newDateTime
- showScheduleMessageDialog()
+ askForExactAlarmPermissionIfNeeded {
+ ScheduleMessageDialog(this, originalDateTime) { newDateTime ->
+ if (newDateTime != null) {
+ scheduledDateTime = newDateTime
+ showScheduleMessageDialog()
+ }
}
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ArchivedConversationsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ArchivedConversationsAdapter.kt
new file mode 100644
index 00000000..1fcccf05
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ArchivedConversationsAdapter.kt
@@ -0,0 +1,96 @@
+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.updateConversationArchivedStatus
+import com.simplemobiletools.smsmessenger.helpers.refreshMessages
+import com.simplemobiletools.smsmessenger.models.Conversation
+
+class ArchivedConversationsAdapter(
+ activity: SimpleActivity, recyclerView: MyRecyclerView, onRefresh: () -> Unit, itemClick: (Any) -> Unit
+) : BaseConversationsAdapter(activity, recyclerView, onRefresh, itemClick) {
+ override fun getActionMenuId() = R.menu.cab_archived_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_unarchive -> unarchiveConversation()
+ 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 unarchiveConversation() {
+ if (selectedKeys.isEmpty()) {
+ return
+ }
+
+ ensureBackgroundThread {
+ val conversationsToUnarchive = currentList.filter { selectedKeys.contains(it.hashCode()) } as ArrayList
+ conversationsToUnarchive.forEach {
+ activity.updateConversationArchivedStatus(it.threadId, false)
+ }
+
+ removeConversationsFromList(conversationsToUnarchive)
+ }
+ }
+
+ 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/BaseConversationsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/BaseConversationsAdapter.kt
new file mode 100644
index 00000000..17ba7623
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/BaseConversationsAdapter.kt
@@ -0,0 +1,183 @@
+package com.simplemobiletools.smsmessenger.adapters
+
+import android.graphics.Typeface
+import android.os.Parcelable
+import android.util.TypedValue
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
+import com.simplemobiletools.commons.adapters.MyRecyclerViewListAdapter
+import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.SimpleContactsHelper
+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.*
+import com.simplemobiletools.smsmessenger.models.Conversation
+import kotlinx.android.synthetic.main.item_conversation.view.*
+
+@Suppress("LeakingThis")
+abstract class BaseConversationsAdapter(
+ activity: SimpleActivity, recyclerView: MyRecyclerView, onRefresh: () -> Unit, itemClick: (Any) -> Unit
+) : MyRecyclerViewListAdapter(activity, recyclerView, ConversationDiffCallback(), itemClick, onRefresh),
+ RecyclerViewFastScroller.OnPopupTextUpdate {
+ private var fontSize = activity.getTextSize()
+ private var drafts = HashMap()
+
+ private var recyclerViewState: Parcelable? = null
+
+ init {
+ setupDragListener(true)
+ ensureBackgroundThread {
+ fetchDrafts(drafts)
+ }
+ setHasStableIds(true)
+
+ registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
+ override fun onChanged() = restoreRecyclerViewState()
+ override fun onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int) = restoreRecyclerViewState()
+ override fun onItemRangeInserted(positionStart: Int, itemCount: Int) = restoreRecyclerViewState()
+ })
+ }
+
+ fun updateFontSize() {
+ fontSize = activity.getTextSize()
+ notifyDataSetChanged()
+ }
+
+ fun updateConversations(newConversations: ArrayList, commitCallback: (() -> Unit)? = null) {
+ saveRecyclerViewState()
+ submitList(newConversations.toList(), commitCallback)
+ }
+
+ fun updateDrafts() {
+ ensureBackgroundThread {
+ val newDrafts = HashMap()
+ fetchDrafts(newDrafts)
+ if (drafts.hashCode() != newDrafts.hashCode()) {
+ drafts = newDrafts
+ activity.runOnUiThread {
+ notifyDataSetChanged()
+ }
+ }
+ }
+ }
+
+ override fun getSelectableItemCount() = itemCount
+
+ protected fun getSelectedItems() = currentList.filter { selectedKeys.contains(it.hashCode()) } as ArrayList
+
+ override fun getIsItemSelectable(position: Int) = true
+
+ override fun getItemSelectionKey(position: Int) = currentList.getOrNull(position)?.hashCode()
+
+ override fun getItemKeyPosition(key: Int) = currentList.indexOfFirst { it.hashCode() == key }
+
+ override fun onActionModeCreated() {}
+
+ override fun onActionModeDestroyed() {}
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_conversation, parent)
+
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ val conversation = getItem(position)
+ holder.bindView(conversation, allowSingleClick = true, allowLongClick = true) { itemView, _ ->
+ setupView(itemView, conversation)
+ }
+ bindViewHolder(holder)
+ }
+
+ override fun getItemId(position: Int) = getItem(position).threadId
+
+ override fun onViewRecycled(holder: ViewHolder) {
+ super.onViewRecycled(holder)
+ if (!activity.isDestroyed && !activity.isFinishing) {
+ Glide.with(activity).clear(holder.itemView.conversation_image)
+ }
+ }
+
+ private fun fetchDrafts(drafts: HashMap) {
+ drafts.clear()
+ for ((threadId, draft) in activity.getAllDrafts()) {
+ drafts[threadId] = draft
+ }
+ }
+
+ private fun setupView(view: View, conversation: Conversation) {
+ view.apply {
+ setupViewBackground(activity)
+ val smsDraft = drafts[conversation.threadId]
+ draft_indicator.beVisibleIf(smsDraft != null)
+ draft_indicator.setTextColor(properPrimaryColor)
+
+ pin_indicator.beVisibleIf(activity.config.pinnedConversations.contains(conversation.threadId.toString()))
+ pin_indicator.applyColorFilter(textColor)
+
+ conversation_frame.isSelected = selectedKeys.contains(conversation.hashCode())
+
+ conversation_address.apply {
+ text = conversation.title
+ setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 1.2f)
+ }
+
+ conversation_body_short.apply {
+ text = smsDraft ?: conversation.snippet
+ setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.9f)
+ }
+
+ conversation_date.apply {
+ text = conversation.date.formatDateOrTime(context, true, false)
+ setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.8f)
+ }
+
+ val style = if (conversation.read) {
+ conversation_body_short.alpha = 0.7f
+ if (conversation.isScheduled) Typeface.ITALIC else Typeface.NORMAL
+ } else {
+ conversation_body_short.alpha = 1f
+ if (conversation.isScheduled) Typeface.BOLD_ITALIC else Typeface.BOLD
+
+ }
+ conversation_address.setTypeface(null, style)
+ conversation_body_short.setTypeface(null, style)
+
+ arrayListOf(conversation_address, conversation_body_short, conversation_date).forEach {
+ it.setTextColor(textColor)
+ }
+
+ // at group conversations we use an icon as the placeholder, not any letter
+ val placeholder = if (conversation.isGroupConversation) {
+ SimpleContactsHelper(context).getColoredGroupIcon(conversation.title)
+ } else {
+ null
+ }
+
+ SimpleContactsHelper(context).loadContactImage(conversation.photoUri, conversation_image, conversation.title, placeholder)
+ }
+ }
+
+ override fun onChange(position: Int) = currentList.getOrNull(position)?.title ?: ""
+
+ private fun saveRecyclerViewState() {
+ recyclerViewState = recyclerView.layoutManager?.onSaveInstanceState()
+ }
+
+ private fun restoreRecyclerViewState() {
+ recyclerView.layoutManager?.onRestoreInstanceState(recyclerViewState)
+ }
+
+ private class ConversationDiffCallback : DiffUtil.ItemCallback() {
+ override fun areItemsTheSame(oldItem: Conversation, newItem: Conversation): Boolean {
+ return Conversation.areItemsTheSame(oldItem, newItem)
+ }
+
+ override fun areContentsTheSame(oldItem: Conversation, newItem: Conversation): Boolean {
+ return Conversation.areContentsTheSame(oldItem, newItem)
+ }
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt
index 4ba2f9e4..79abd34a 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt
@@ -1,24 +1,12 @@
package com.simplemobiletools.smsmessenger.adapters
import android.content.Intent
-import android.graphics.Typeface
-import android.os.Parcelable
import android.text.TextUtils
-import android.util.TypedValue
import android.view.Menu
-import android.view.View
-import android.view.ViewGroup
-import android.widget.TextView
-import androidx.recyclerview.widget.DiffUtil
-import androidx.recyclerview.widget.RecyclerView
-import com.bumptech.glide.Glide
-import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
-import com.simplemobiletools.commons.adapters.MyRecyclerViewListAdapter
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.FeatureLockedDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.KEY_PHONE
-import com.simplemobiletools.commons.helpers.SimpleContactsHelper
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.helpers.isNougatPlus
import com.simplemobiletools.commons.views.MyRecyclerView
@@ -29,31 +17,10 @@ import com.simplemobiletools.smsmessenger.extensions.*
import com.simplemobiletools.smsmessenger.helpers.refreshMessages
import com.simplemobiletools.smsmessenger.messaging.isShortCodeWithLetters
import com.simplemobiletools.smsmessenger.models.Conversation
-import kotlinx.android.synthetic.main.item_conversation.view.*
class ConversationsAdapter(
activity: SimpleActivity, recyclerView: MyRecyclerView, onRefresh: () -> Unit, itemClick: (Any) -> Unit
-) : MyRecyclerViewListAdapter(activity, recyclerView, ConversationDiffCallback(), itemClick, onRefresh),
- RecyclerViewFastScroller.OnPopupTextUpdate {
- private var fontSize = activity.getTextSize()
- private var drafts = HashMap()
-
- private var recyclerViewState: Parcelable? = null
-
- init {
- setupDragListener(true)
- ensureBackgroundThread {
- fetchDrafts(drafts)
- }
- setHasStableIds(true)
-
- registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
- override fun onChanged() = restoreRecyclerViewState()
- override fun onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int) = restoreRecyclerViewState()
- override fun onItemRangeInserted(positionStart: Int, itemCount: Int) = restoreRecyclerViewState()
- })
- }
-
+) : BaseConversationsAdapter(activity, recyclerView, onRefresh, itemClick) {
override fun getActionMenuId() = R.menu.cab_conversations
override fun prepareActionMode(menu: Menu) {
@@ -86,6 +53,7 @@ class ConversationsAdapter(
R.id.cab_dial_number -> dialNumber()
R.id.cab_copy_number -> copyNumberToClipboard()
R.id.cab_delete -> askConfirmDelete()
+ R.id.cab_archive -> askConfirmArchive()
R.id.cab_rename_conversation -> renameConversation(getSelectedItems().first())
R.id.cab_mark_as_read -> markAsRead()
R.id.cab_mark_as_unread -> markAsUnread()
@@ -95,37 +63,6 @@ class ConversationsAdapter(
}
}
- override fun getSelectableItemCount() = itemCount
-
- override fun getIsItemSelectable(position: Int) = true
-
- override fun getItemSelectionKey(position: Int) = currentList.getOrNull(position)?.hashCode()
-
- override fun getItemKeyPosition(key: Int) = currentList.indexOfFirst { it.hashCode() == key }
-
- override fun onActionModeCreated() {}
-
- override fun onActionModeDestroyed() {}
-
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_conversation, parent)
-
- override fun onBindViewHolder(holder: ViewHolder, position: Int) {
- val conversation = getItem(position)
- holder.bindView(conversation, allowSingleClick = true, allowLongClick = true) { itemView, _ ->
- setupView(itemView, conversation)
- }
- bindViewHolder(holder)
- }
-
- override fun getItemId(position: Int) = getItem(position).threadId
-
- override fun onViewRecycled(holder: ViewHolder) {
- super.onViewRecycled(holder)
- if (!activity.isDestroyed && !activity.isFinishing) {
- Glide.with(activity).clear(holder.itemView.conversation_image)
- }
- }
-
private fun tryBlocking() {
if (activity.isOrWasThankYouInstalled()) {
askConfirmBlock()
@@ -191,6 +128,50 @@ class ConversationsAdapter(
}
}
+ private fun askConfirmArchive() {
+ val itemsCnt = selectedKeys.size
+ val items = resources.getQuantityString(R.plurals.delete_conversations, itemsCnt, itemsCnt)
+
+ val baseString = R.string.archive_confirmation
+ val question = String.format(resources.getString(baseString), items)
+
+ ConfirmationDialog(activity, question) {
+ ensureBackgroundThread {
+ archiveConversations()
+ }
+ }
+ }
+
+ private fun archiveConversations() {
+ if (selectedKeys.isEmpty()) {
+ return
+ }
+
+ val conversationsToRemove = currentList.filter { selectedKeys.contains(it.hashCode()) } as ArrayList
+ conversationsToRemove.forEach {
+ activity.updateConversationArchivedStatus(it.threadId, true)
+ activity.notificationManager.cancel(it.threadId.hashCode())
+ }
+
+ val newList = try {
+ currentList.toMutableList().apply { removeAll(conversationsToRemove) }
+ } catch (ignored: Exception) {
+ currentList.toMutableList()
+ }
+
+ activity.runOnUiThread {
+ if (newList.none { selectedKeys.contains(it.hashCode()) }) {
+ refreshMessages()
+ finishActMode()
+ } else {
+ submitList(newList)
+ if (newList.isEmpty()) {
+ refreshMessages()
+ }
+ }
+ }
+ }
+
private fun deleteConversations() {
if (selectedKeys.isEmpty()) {
return
@@ -276,8 +257,6 @@ class ConversationsAdapter(
}
}
- private fun getSelectedItems() = currentList.filter { selectedKeys.contains(it.hashCode()) } as ArrayList
-
private fun pinConversation(pin: Boolean) {
val conversations = getSelectedItems()
if (conversations.isEmpty()) {
@@ -303,113 +282,10 @@ class ConversationsAdapter(
menu.findItem(R.id.cab_unpin_conversation).isVisible = selectedConversations.any { pinnedConversations.contains(it.threadId.toString()) }
}
- private fun fetchDrafts(drafts: HashMap) {
- drafts.clear()
- for ((threadId, draft) in activity.getAllDrafts()) {
- drafts[threadId] = draft
- }
- }
-
- fun updateFontSize() {
- fontSize = activity.getTextSize()
- notifyDataSetChanged()
- }
-
- fun updateConversations(newConversations: ArrayList, commitCallback: (() -> Unit)? = null) {
- saveRecyclerViewState()
- submitList(newConversations.toList(), commitCallback)
- }
-
- fun updateDrafts() {
- ensureBackgroundThread {
- val newDrafts = HashMap()
- fetchDrafts(newDrafts)
- if (drafts.hashCode() != newDrafts.hashCode()) {
- drafts = newDrafts
- activity.runOnUiThread {
- notifyDataSetChanged()
- }
- }
- }
- }
-
- private fun setupView(view: View, conversation: Conversation) {
- view.apply {
- setupViewBackground(activity)
- val smsDraft = drafts[conversation.threadId]
- draft_indicator.beVisibleIf(smsDraft != null)
- draft_indicator.setTextColor(properPrimaryColor)
-
- pin_indicator.beVisibleIf(activity.config.pinnedConversations.contains(conversation.threadId.toString()))
- pin_indicator.applyColorFilter(textColor)
-
- conversation_frame.isSelected = selectedKeys.contains(conversation.hashCode())
-
- conversation_address.apply {
- text = conversation.title
- setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 1.2f)
- }
-
- conversation_body_short.apply {
- text = smsDraft ?: conversation.snippet
- setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.9f)
- }
-
- conversation_date.apply {
- text = conversation.date.formatDateOrTime(context, true, false)
- setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.8f)
- }
-
- val style = if (conversation.read) {
- conversation_body_short.alpha = 0.7f
- if (conversation.isScheduled) Typeface.ITALIC else Typeface.NORMAL
- } else {
- conversation_body_short.alpha = 1f
- if (conversation.isScheduled) Typeface.BOLD_ITALIC else Typeface.BOLD
-
- }
- conversation_address.setTypeface(null, style)
- conversation_body_short.setTypeface(null, style)
-
- arrayListOf(conversation_address, conversation_body_short, conversation_date).forEach {
- it.setTextColor(textColor)
- }
-
- // at group conversations we use an icon as the placeholder, not any letter
- val placeholder = if (conversation.isGroupConversation) {
- SimpleContactsHelper(context).getColoredGroupIcon(conversation.title)
- } else {
- null
- }
-
- SimpleContactsHelper(context).loadContactImage(conversation.photoUri, conversation_image, conversation.title, placeholder)
- }
- }
-
- override fun onChange(position: Int) = currentList.getOrNull(position)?.title ?: ""
-
private fun refreshConversations() {
activity.runOnUiThread {
refreshMessages()
finishActMode()
}
}
-
- private fun saveRecyclerViewState() {
- recyclerViewState = recyclerView.layoutManager?.onSaveInstanceState()
- }
-
- private fun restoreRecyclerViewState() {
- recyclerView.layoutManager?.onRestoreInstanceState(recyclerViewState)
- }
-
- private class ConversationDiffCallback : DiffUtil.ItemCallback() {
- override fun areItemsTheSame(oldItem: Conversation, newItem: Conversation): Boolean {
- return Conversation.areItemsTheSame(oldItem, newItem)
- }
-
- override fun areContentsTheSame(oldItem: Conversation, newItem: Conversation): Boolean {
- return Conversation.areContentsTheSame(oldItem, newItem)
- }
- }
}
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 fca0754b..25d29328 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt
@@ -12,12 +12,9 @@ import com.simplemobiletools.smsmessenger.interfaces.AttachmentsDao
import com.simplemobiletools.smsmessenger.interfaces.ConversationsDao
import com.simplemobiletools.smsmessenger.interfaces.MessageAttachmentsDao
import com.simplemobiletools.smsmessenger.interfaces.MessagesDao
-import com.simplemobiletools.smsmessenger.models.Attachment
-import com.simplemobiletools.smsmessenger.models.Conversation
-import com.simplemobiletools.smsmessenger.models.Message
-import com.simplemobiletools.smsmessenger.models.MessageAttachment
+import com.simplemobiletools.smsmessenger.models.*
-@Database(entities = [Conversation::class, Attachment::class, MessageAttachment::class, Message::class], version = 7)
+@Database(entities = [Conversation::class, Attachment::class, MessageAttachment::class, Message::class], version = 8)
@TypeConverters(Converters::class)
abstract class MessagesDatabase : RoomDatabase() {
@@ -44,6 +41,7 @@ abstract class MessagesDatabase : RoomDatabase() {
.addMigrations(MIGRATION_4_5)
.addMigrations(MIGRATION_5_6)
.addMigrations(MIGRATION_6_7)
+ .addMigrations(MIGRATION_7_8)
.build()
}
}
@@ -115,5 +113,13 @@ abstract class MessagesDatabase : RoomDatabase() {
}
}
}
+
+ private val MIGRATION_7_8 = object : Migration(7, 8) {
+ override fun migrate(database: SupportSQLiteDatabase) {
+ database.apply {
+ execSQL("ALTER TABLE conversations ADD COLUMN archived INTEGER NOT NULL DEFAULT 0")
+ }
+ }
+ }
}
}
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 d07b3c8d..d4de6138 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt
@@ -268,7 +268,8 @@ fun Context.getConversations(threadId: Long? = null, privateContacts: ArrayList<
Threads.SNIPPET,
Threads.DATE,
Threads.READ,
- Threads.RECIPIENT_IDS
+ Threads.RECIPIENT_IDS,
+ Threads.ARCHIVED
)
var selection = "${Threads.MESSAGE_COUNT} > ?"
@@ -307,7 +308,8 @@ fun Context.getConversations(threadId: Long? = null, privateContacts: ArrayList<
val photoUri = if (phoneNumbers.size == 1) simpleContactHelper.getPhotoUriFromPhoneNumber(phoneNumbers.first()) else ""
val isGroupConversation = phoneNumbers.size > 1
val read = cursor.getIntValue(Threads.READ) == 1
- val conversation = Conversation(id, snippet, date.toInt(), read, title, photoUri, isGroupConversation, phoneNumbers.first())
+ val archived = cursor.getIntValue(Threads.ARCHIVED) == 1
+ val conversation = Conversation(id, snippet, date.toInt(), read, title, photoUri, isGroupConversation, phoneNumbers.first(), isArchived = archived)
conversations.add(conversation)
}
@@ -620,6 +622,20 @@ fun Context.insertNewSMS(
}
}
+fun Context.removeAllArchivedConversations(callback: (() -> Unit)? = null) {
+ ensureBackgroundThread {
+ try {
+ for (conversation in conversationsDB.getAllArchived()) {
+ deleteConversation(conversation.threadId)
+ }
+ toast(R.string.archive_emptied_successfully)
+ callback?.invoke()
+ } catch (e: Exception) {
+ toast(R.string.unknown_error_occurred)
+ }
+ }
+}
+
fun Context.deleteConversation(threadId: Long) {
var uri = Sms.CONTENT_URI
val selection = "${Sms.THREAD_ID} = ?"
@@ -641,6 +657,21 @@ fun Context.deleteConversation(threadId: Long) {
messagesDB.deleteThreadMessages(threadId)
}
+fun Context.updateConversationArchivedStatus(threadId: Long, archived: Boolean) {
+ val uri = Threads.CONTENT_URI
+ val values = ContentValues().apply {
+ put(Threads.ARCHIVED, archived)
+ }
+ val selection = "${Threads._ID} = ?"
+ val selectionArgs = arrayOf(threadId.toString())
+ contentResolver.update(uri, values, selection, selectionArgs)
+ if (archived) {
+ conversationsDB.moveToArchive(threadId)
+ } else {
+ conversationsDB.unarchive(threadId)
+ }
+}
+
fun Context.deleteMessage(id: Long, isMMS: Boolean) {
val uri = if (isMMS) Mms.CONTENT_URI else Sms.CONTENT_URI
val selection = "${Sms._ID} = ?"
@@ -969,7 +1000,8 @@ fun Context.createTemporaryThread(message: Message, threadId: Long = generateRan
isGroupConversation = addresses.size > 1,
phoneNumber = addresses.first(),
isScheduled = true,
- usesCustomTitle = cachedConv?.usesCustomTitle == true
+ usesCustomTitle = cachedConv?.usesCustomTitle == true,
+ isArchived = false
)
try {
conversationsDB.insertOrUpdate(conversation)
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 18859f76..284f83ca 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt
@@ -103,4 +103,12 @@ class Config(context: Context) : BaseConfig(context) {
var keyboardHeight: Int
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 lastArchiveCheck: Long
+ get() = prefs.getLong(LAST_ARCHIVE_CHECK, 0L)
+ set(lastArchiveCheck) = prefs.edit().putLong(LAST_ARCHIVE_CHECK, lastArchiveCheck).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 3bade2ac..039758ef 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt
@@ -40,6 +40,8 @@ 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"
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 0c8db25c..43b502ad 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt
@@ -1,9 +1,6 @@
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.Conversation
@Dao
@@ -11,8 +8,11 @@ interface ConversationsDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertOrUpdate(conversation: Conversation): Long
- @Query("SELECT * FROM conversations")
- fun getAll(): List
+ @Query("SELECT * FROM conversations WHERE archived = 0")
+ fun getNonArchived(): List
+
+ @Query("SELECT * FROM conversations WHERE archived = 1")
+ fun getAllArchived(): List
@Query("SELECT * FROM conversations WHERE thread_id = :threadId")
fun getConversationWithThreadId(threadId: Long): Conversation?
@@ -29,6 +29,12 @@ interface ConversationsDao {
@Query("UPDATE conversations SET read = 0 WHERE thread_id = :threadId")
fun markUnread(threadId: Long)
+ @Query("UPDATE conversations SET archived = 1 WHERE thread_id = :threadId")
+ fun moveToArchive(threadId: Long)
+
+ @Query("UPDATE conversations SET archived = 0 WHERE thread_id = :threadId")
+ fun unarchive(threadId: Long)
+
@Query("DELETE FROM conversations WHERE thread_id = :threadId")
fun deleteThreadId(threadId: Long)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/ArchivedConversation.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/ArchivedConversation.kt
new file mode 100644
index 00000000..bcf43692
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/ArchivedConversation.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 = "archived_conversations",
+ indices = [(Index(value = ["thread_id"], unique = true))]
+)
+data class ArchivedConversation(
+ @PrimaryKey @ColumnInfo(name = "thread_id") var threadId: Long,
+ @ColumnInfo(name = "deleted_ts") var deletedTs: Long
+)
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt
index c20d376c..b56d3d4f 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt
@@ -16,7 +16,8 @@ data class Conversation(
@ColumnInfo(name = "is_group_conversation") var isGroupConversation: Boolean,
@ColumnInfo(name = "phone_number") var phoneNumber: String,
@ColumnInfo(name = "is_scheduled") var isScheduled: Boolean = false,
- @ColumnInfo(name = "uses_custom_title") var usesCustomTitle: Boolean = false
+ @ColumnInfo(name = "uses_custom_title") var usesCustomTitle: Boolean = false,
+ @ColumnInfo(name = "archived") var isArchived: Boolean = false
) {
companion object {
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt
index 418a5cda..13af6ce0 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/receivers/SmsReceiver.kt
@@ -113,6 +113,7 @@ class SmsReceiver : BroadcastReceiver() {
subscriptionId
)
context.messagesDB.insertOrUpdate(message)
+ context.updateConversationArchivedStatus(threadId, false)
refreshMessages()
context.showReceivedMessageNotification(newMessageId, address, body, threadId, bitmap)
}
diff --git a/app/src/main/res/drawable/ic_archive_vector.xml b/app/src/main/res/drawable/ic_archive_vector.xml
new file mode 100644
index 00000000..0617d995
--- /dev/null
+++ b/app/src/main/res/drawable/ic_archive_vector.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_unarchive_vector.xml b/app/src/main/res/drawable/ic_unarchive_vector.xml
new file mode 100644
index 00000000..f4a3b76e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_unarchive_vector.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_archived_conversations.xml b/app/src/main/res/layout/activity_archived_conversations.xml
new file mode 100644
index 00000000..615dc677
--- /dev/null
+++ b/app/src/main/res/layout/activity_archived_conversations.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/archive_menu.xml b/app/src/main/res/menu/archive_menu.xml
new file mode 100644
index 00000000..b9339951
--- /dev/null
+++ b/app/src/main/res/menu/archive_menu.xml
@@ -0,0 +1,11 @@
+
+
diff --git a/app/src/main/res/menu/cab_archived_conversations.xml b/app/src/main/res/menu/cab_archived_conversations.xml
new file mode 100644
index 00000000..6c636ea0
--- /dev/null
+++ b/app/src/main/res/menu/cab_archived_conversations.xml
@@ -0,0 +1,23 @@
+
+
diff --git a/app/src/main/res/menu/cab_conversations.xml b/app/src/main/res/menu/cab_conversations.xml
index 9044cd72..c341082d 100644
--- a/app/src/main/res/menu/cab_conversations.xml
+++ b/app/src/main/res/menu/cab_conversations.xml
@@ -26,6 +26,12 @@
android:icon="@drawable/ic_minus_circle_vector"
android:title="@string/block_number"
app:showAsAction="ifRoom" />
+
-
+
+
+
- ضع إشارة مقروء
وضع علامة كغير مقروءة
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
هل أنت متأكد أنك تريد حذف كافة رسائل هذه المحادثة؟
+ Are you sure you want to archive %s?
- محادثة %d
@@ -130,4 +140,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 46520b7e..bd02cd1d 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -58,8 +58,18 @@
Mark as Read
Mark as Unread
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Are you sure you want to delete all messages of this conversation\?
+ Are you sure you want to archive %s?
- %d conversation
diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml
index f5817d89..8f90fdea 100644
--- a/app/src/main/res/values-be/strings.xml
+++ b/app/src/main/res/values-be/strings.xml
@@ -60,8 +60,18 @@
Прачытана
Не прачытана
Я
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Выдаліць усе паведамленні ў гэтай размове\?
+ Are you sure you want to archive %s?
- %d размову
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index 74c3f518..aed7a4c7 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -58,8 +58,18 @@
Отбележи като прочетено
Отбележи като непрочетено
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Сигурни ли сте, че искате да изтриете всички съобщения от този разговор\?
+ Are you sure you want to archive %s?
- %d разговор
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index a7cdf863..fbf7b9c0 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -58,8 +58,18 @@
Marca com a llegit
Marcar com no llegit
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Confirmeu que voleu suprimir tots els missatges d\'aquesta conversa\?
+ Are you sure you want to archive %s?
- %d conversa
@@ -118,4 +128,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 46520b7e..bd02cd1d 100644
--- a/app/src/main/res/values-cr/strings.xml
+++ b/app/src/main/res/values-cr/strings.xml
@@ -58,8 +58,18 @@
Mark as Read
Mark as Unread
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Are you sure you want to delete all messages of this conversation\?
+ Are you sure you want to archive %s?
- %d conversation
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 36b3c2aa..c1b25ede 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -59,8 +59,18 @@
Označit jako přečtené
Označit jako nepřečtené
Mé
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Opravdu chcete smazat všechny zprávy v této konverzaci\?
+ Are you sure you want to archive %s?
- %d konverzace
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index b6c51698..74a7367a 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -58,8 +58,18 @@
Marker som læst
Marker som ulæst
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Er du sikker på, at du vil slette alle beskeder i denne samtale\?
+ Are you sure you want to archive %s?
- %d samtale
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index aca584c8..ee2b9d24 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -58,8 +58,18 @@
Als gelesen markieren
Als ungelesen markieren
Ich
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Sollen wirklich alle Nachrichten dieser Unterhaltung gelöscht werden\?
+ Are you sure you want to archive %s?
- %d Unterhaltung
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 8ce3943e..0a3b2638 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -58,8 +58,18 @@
Σήμανση ως Αναγνωσμένο
Σήμανση ως Μη Αναγνωσμένο
Εγώ
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Είστε βέβαιοι ότι θέλετε να διαγράψετε όλα τα μηνύματα αυτής της συνομιλίας;
+ Are you sure you want to archive %s?
- %d συνομιλία
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index 50f84e7f..9471b0cf 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -58,8 +58,18 @@
Marki kiel legitan
Marki kiel nelegitan
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Are you sure you want to delete all messages of this conversation\?
+ Are you sure you want to archive %s?
- %d konversacio
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 54447449..0cb42d20 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -59,8 +59,18 @@
Marcar como leído
Marcar como no leído
Yo
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
¿Estás seguro que quieres eliminar todos los mensajes en esta conversación\?
+ Are you sure you want to archive %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 82de861e..ebbf9b8f 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -58,8 +58,18 @@
Märgi loetuks
Märgi mitteloetuks
Mina
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Kas oled kindel, et soovid kustutada kõik selle vestluse sõnumid\?
+ Are you sure you want to archive %s?
- %d vestlus
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index b25da433..50db49b9 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -58,8 +58,18 @@
Merkitse luetuksi
Merkitse lukemattomaksi
Minä
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Haluatko varmasti poistaa kaikki tämän keskustelun viestit\?
+ Are you sure you want to archive %s?
- %d keskustelu
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 38204415..4b6d0866 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -59,8 +59,18 @@
Marquer comme lu
Marquer comme non lu
Moi
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Voulez-vous vraiment supprimer tous les messages de cette conversation \?
+ Are you sure you want to archive %s?
- %d conversation
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 070c72c8..55c2d34f 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -58,8 +58,18 @@
Marcar como lida
Marcar como non lida
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Ten a certeza de que desexa eliminar todas as mensaxes desta conversa\?
+ Are you sure you want to archive %s?
- %d conversa
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index 46520b7e..bd02cd1d 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -58,8 +58,18 @@
Mark as Read
Mark as Unread
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Are you sure you want to delete all messages of this conversation\?
+ Are you sure you want to archive %s?
- %d conversation
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 476f985c..9ea37bbb 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -59,8 +59,18 @@
Označi kao pročitano
Označi kao nepročitano
Ja
+
+ Vrati iz arhiva
+ Izbriši sve arhivirane razgovore
+ Arhiv
+ Prikaži arhivirane razgovore
+ Arhiviraj
+ Nema arhiviranih razgovora
+ Arhiv je uspješno ispražnjen
+ Jeste li ste sigurni da želite isprazniti arhiv? Svi arhivirani razgovori će biti obrisani.
Stvarno želiš izbrisati sve poruke ovog razgovora\?
+ Stvarno želiš arhivirati %s?
- %d razgovor
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 0b4a7b4d..561bc61c 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -58,8 +58,18 @@
Megjelölés olvasottként
Megjelölés olvasatlanként
Nekem
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Biztos, hogy törli az összes üzenetet ebből a beszélgetésből\?
+ Are you sure you want to archive %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 9b1fa5c7..e828d21a 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -57,8 +57,18 @@
Tandai sebagai Dibaca
Tandai sebagai Belum dibaca
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Apakah Anda yakin ingin menghapus semua pesan dari percakapan ini\?
+ Are you sure you want to archive %s?
- %d percakapan
diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml
index 650816de..0c633ffb 100644
--- a/app/src/main/res/values-is/strings.xml
+++ b/app/src/main/res/values-is/strings.xml
@@ -58,8 +58,18 @@
Mark as Read
Mark as Unread
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Are you sure you want to delete all messages of this conversation\?
+ Are you sure you want to archive %s?
- %d conversation
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 59d5c284..bcab8d2d 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -59,8 +59,18 @@
Letto
Non letto
Io
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Vuoi davvero eliminare tutti i messaggi di questa conversazione\?
+ Are you sure you want to archive %s?
- %d conversazione
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index 5c4dd745..2d69ad38 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -60,8 +60,18 @@
סמן כנקרא
סמן כלא נקרא
אני
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
האם אתה בטוח שברצונך למחוק את כל ההודעות של השיחה הזו\?
+ Are you sure you want to archive %s?
- שיחה %d
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 3e23d7be..3bca3c5c 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -57,8 +57,18 @@
既読にする
未読にする
自分
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
本当にこの会話のすべてのメッセージを削除しますか?
+ Are you sure you want to archive %s?
- %d 件の会話
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index bb43c6e9..b39d4791 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -58,8 +58,18 @@
Nauja žinutė
Pažymėti kaip perskaitytą
Pažymėti kaip neskaitytą
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Ar tikrai norite ištrinti visas šio pokalbio žinutes\?
+ Are you sure you want to archive %s?
- %d pokalbis
diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml
index e3eb6292..048f6e81 100644
--- a/app/src/main/res/values-lv/strings.xml
+++ b/app/src/main/res/values-lv/strings.xml
@@ -59,8 +59,18 @@
Mark as Read
Mark as Unread
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Are you sure you want to delete all messages of this conversation\?
+ Are you sure you want to archive %s?
- %d conversation
diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml
index 46520b7e..bd02cd1d 100644
--- a/app/src/main/res/values-mk/strings.xml
+++ b/app/src/main/res/values-mk/strings.xml
@@ -58,8 +58,18 @@
Mark as Read
Mark as Unread
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Are you sure you want to delete all messages of this conversation\?
+ Are you sure you want to archive %s?
- %d conversation
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
index bea56ea1..a2b65c0b 100644
--- a/app/src/main/res/values-ml/strings.xml
+++ b/app/src/main/res/values-ml/strings.xml
@@ -58,8 +58,18 @@
വായിച്ചതായി അടയാളപ്പെടുത്തുക
വായിച്ചിട്ടില്ലെന്ന് അടയാളപ്പെടുത്തുക
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
ഈ സംഭാഷണത്തിലെ എല്ലാ സന്ദേശങ്ങളും ഇല്ലാതാക്കണമെന്ന് തീർച്ചയാണോ\?
+ Are you sure you want to archive %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 92123394..bc53dedd 100644
--- a/app/src/main/res/values-nb-rNO/strings.xml
+++ b/app/src/main/res/values-nb-rNO/strings.xml
@@ -58,8 +58,18 @@
Marker som lest
Marker som ulest
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Er du sikker på at du vil slette alle meldinger fra denne konversasjonen\?
+ Are you sure you want to archive %s?
- %d konversasjon
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 22a331d1..fe31236d 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -58,8 +58,18 @@
Als gelezen markeren
Als ongelezen markeren
Ik
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Alle berichten in dit gesprek verwijderen\?
+ Are you sure you want to archive %s?
- %d gesprek
@@ -118,4 +128,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 f2bbdb0f..7003cda7 100644
--- a/app/src/main/res/values-pa-rPK/strings.xml
+++ b/app/src/main/res/values-pa-rPK/strings.xml
@@ -58,8 +58,18 @@
پرھے وجوں چنھت کرو
نا پڑھے وجوں چنھت کرو
میں
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
تسیں پکے اے، سارے سنیہے مٹاؤ؟
+ Are you sure you want to archive %s?
- %d conversation
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 1b2e5817..eabbbf34 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -60,8 +60,18 @@
Oznacz jako przeczytane
Oznacz jako nieprzeczytane
Ja
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Czy usunąć wszystkie wiadomości z tej rozmowy\?
+ Are you sure you want to archive %s?
- %d rozmowę
@@ -124,4 +134,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 2e7a6122..83f82477 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -59,8 +59,18 @@
Marcar como Lida
Marcar como Não Lida
Eu
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Tem certeza que quer deletar todas as mensagens dessa conversa\?
+ Are you sure you want to archive %s?
- %d conversa
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 58bddea5..da820c9a 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -59,8 +59,18 @@
Marcar como lida
Marcar como não lida
Eu
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Tem a certeza de que pretende apagar todas as mensagens desta conversa\?
+ Are you sure you want to archive %s?
- %d conversa
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 7e3adc3e..50279ed5 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -59,8 +59,18 @@
Marchează ca citit
Marchează ca necitit
Eu
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Sunteți sigur că doriți să ștergeți toate mesajele din această conversație\?
+ Are you sure you want to archive %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 f289dd76..842108cc 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -60,8 +60,18 @@
Прочитано
Не прочитано
Я
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Удалить все сообщения в этой переписке\?
+ Are you sure you want to archive %s?
- %d переписку
@@ -124,4 +134,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 57609a4e..8cf9d7f6 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -59,8 +59,18 @@
Označiť ako prečítané
Označiť ako neprečítané
Ja
+
+ Zrušiť archiváciu
+ Vymazať všetky archivované konverzácie
+ Archív
+ Zobraziť archivované konverzácie
+ Archivovať
+ 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é.
Ste si istý, že chcete odstrániť všetky správy tejto konverzácie\?
+ Ste si istý, že chcete archivovať %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 3659fbed..3aed45a2 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -60,8 +60,18 @@
Označi kot prebrano
Označi kot neprebrano
Jaz
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Ste prepričani, da želite izbrisati vsa sporočila tega pogovora\?
+ Are you sure you want to archive %s?
- %d pogovor
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index 23ab0c22..28dd969a 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -59,8 +59,18 @@
Означи као прочитано
Означи као непрочитанo
Ja
+
+ Врати из архиве
+ Обриши све архивиране конверзације
+ Архива
+ Прикажи архивиране конверзације
+ Архивирај
+ Нема архивираних разговора
+ Архива је успјешно испражнјена
+ Да ли сте сигурни да желите да испразните архиву? Све архивиране поруке ће бити избрисане.
Да ли сте сигурни да желите да избришете све поруке ове конверзације\?
+ Да ли сте сигурни да желите да архивирате %s?
- %d разговор
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index ba1337e6..038dfed4 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -58,8 +58,18 @@
Markera som läst
Markera som oläst
Jag
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Är du säker på att du vill ta bort alla meddelanden i konversationen\?
+ Are you sure you want to archive %s?
- %d konversation
diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml
index 4fd6fe22..6a4da8d0 100644
--- a/app/src/main/res/values-ta/strings.xml
+++ b/app/src/main/res/values-ta/strings.xml
@@ -58,8 +58,18 @@
படித்ததாக குறியிடு
படிக்காததாக குறியிடு
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
இந்த உரையாடலின் அனைத்து செய்திகளையும் நிச்சயமாக நீக்க விரும்புகிறீர்களா\?
+ Are you sure you want to archive %s?
- %d உரையாடல்
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index 5b53abfb..46511b66 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -57,8 +57,18 @@
Mark as Read
Mark as Unread
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Are you sure you want to delete all messages of this conversation\?
+ Are you sure you want to archive %s?
- %d conversation
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index f2183dab..9dfd7924 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -58,8 +58,18 @@
Okundu olarak işaretle
Okunmadı olarak işaretle
Ben
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Bu görüşmenin tüm mesajlarını silmek istediğinizden emin misiniz\?
+ Are you sure you want to archive %s?
- %d görüşme
@@ -118,4 +128,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 4555c127..e85d92fd 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -60,8 +60,18 @@
Прочитано
Не прочитано
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Справді видалити всі повідомлення у цьому листуванні\?
+ Are you sure you want to archive %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 b1e6a241..c01af643 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -57,8 +57,18 @@
标记为已读
标记为未读
自己
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
您确定要删除此对话的所有消息吗\?
+ Are you sure you want to archive %s?
- %d 个对话
@@ -115,4 +125,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 add8c8d2..9b174550 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -57,8 +57,18 @@
標為已讀
標為未讀
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
您確定要刪除此對話中的所有訊息嗎?
+ Are you sure you want to archive %s?
- %d conversation
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 94af3996..cb057590 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -58,8 +58,18 @@
Mark as Read
Mark as Unread
Me
+
+ Unarchive
+ Delete all archived conversations
+ Archive
+ Show archived conversations
+ Archive
+ 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.
Are you sure you want to delete all messages of this conversation?
+ Are you sure you want to archive %s?
- %d conversation