diff --git a/app/build.gradle b/app/build.gradle index 08e4e769..261d359d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,7 +63,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' @@ -72,7 +72,7 @@ dependencies { implementation 'com.googlecode.ez-vcard:ez-vcard:0.11.3' implementation 'androidx.lifecycle:lifecycle-process:2.5.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 c31ee1df..4e4d603a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -58,6 +58,13 @@ android:label="@string/recycle_bin" android:parentActivityName=".activities.MainActivity" /> + + + 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 a54dcc65..74fff402 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -179,6 +179,7 @@ class MainActivity : SimpleActivity() { R.id.export_messages -> tryToExportMessages() 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() else -> return@setOnMenuItemClickListener false @@ -253,7 +254,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() }) } } @@ -291,15 +295,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) @@ -353,7 +363,7 @@ class MainActivity : SimpleActivity() { } } - val allConversations = conversationsDB.getAll() as ArrayList + val allConversations = conversationsDB.getNonArchived() as ArrayList runOnUiThread { setupConversations(allConversations) } @@ -563,6 +573,11 @@ class MainActivity : SimpleActivity() { startActivity(Intent(applicationContext, RecycleBinConversationsActivity::class.java)) } + 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 52c5acd1..da1cac18 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() @@ -715,6 +722,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 { @@ -893,7 +919,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 { @@ -904,6 +931,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) @@ -1126,7 +1173,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) @@ -1332,6 +1379,7 @@ class ThreadActivity : SimpleActivity() { } } messagesDB.insertOrUpdate(message) + updateConversationArchivedStatus(message.threadId, false) } // show selected contacts, properly split to new lines when appropriate @@ -1534,10 +1582,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 1e9fd98b..6ecddfc0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/databases/MessagesDatabase.kt @@ -117,6 +117,7 @@ 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") execSQL("CREATE TABLE IF NOT EXISTS `recycle_bin_messages` (`id` INTEGER 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/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index 2c4a45c6..0e04d519 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} = ?" @@ -671,6 +687,21 @@ fun Context.moveMessageToRecycleBin(id: Long) { } } +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} = ?" @@ -999,7 +1030,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 88eb740a..350a3956 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt @@ -111,4 +111,8 @@ class Config(context: Context) : BaseConfig(context) { var lastRecycleBinCheck: Long get() = prefs.getLong(LAST_RECYCLE_BIN_CHECK, 0L) set(lastRecycleBinCheck) = prefs.edit().putLong(LAST_RECYCLE_BIN_CHECK, lastRecycleBinCheck).apply() + + var useArchive: Boolean + get() = prefs.getBoolean(USE_ARCHIVE, false) + set(useArchive) = prefs.edit().putBoolean(USE_ARCHIVE, useArchive).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 947cc219..859b555a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt @@ -42,6 +42,7 @@ const val IS_MMS = "is_mms" const val MESSAGE_ID = "message_id" const val USE_RECYCLE_BIN = "use_recycle_bin" const val LAST_RECYCLE_BIN_CHECK = "last_recycle_bin_check" +const val USE_ARCHIVE = "use_archive" 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 11d2e523..271cc83b 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 (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 getAllWithMessagesInRecycleBin(): List @@ -32,6 +32,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é + + 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