diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/MessagesAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/MessagesAdapter.kt index 6b05a173..5561765b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/MessagesAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/MessagesAdapter.kt @@ -6,13 +6,18 @@ import android.view.View import android.view.ViewGroup import android.widget.TextView import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter +import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.extensions.formatDateOrTime +import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.SimpleActivity +import com.simplemobiletools.smsmessenger.extensions.deleteThread +import com.simplemobiletools.smsmessenger.models.Events import com.simplemobiletools.smsmessenger.models.Message import kotlinx.android.synthetic.main.item_message.view.* +import org.greenrobot.eventbus.EventBus class MessagesAdapter( activity: SimpleActivity, var messages: ArrayList, @@ -36,6 +41,7 @@ class MessagesAdapter( when (id) { R.id.cab_select_all -> selectAll() + R.id.cab_delete -> askConfirmDelete() } } @@ -63,9 +69,41 @@ class MessagesAdapter( override fun getItemCount() = messages.size - private fun getItemWithKey(key: Int): Message? = messages.firstOrNull { it.id == key } + private fun askConfirmDelete() { + val itemsCnt = selectedKeys.size + val items = resources.getQuantityString(R.plurals.delete_conversations, itemsCnt, itemsCnt) - private fun getSelectedItems() = messages.filter { selectedKeys.contains(it.id) } as ArrayList + val baseString = R.string.delete_conversations_confirmation + val question = String.format(resources.getString(baseString), items) + + ConfirmationDialog(activity, question) { + ensureBackgroundThread { + deleteMessages() + } + } + } + + private fun deleteMessages() { + if (selectedKeys.isEmpty()) { + return + } + + val messagesToRemove = messages.filter { selectedKeys.contains(it.id) } as java.util.ArrayList + val positions = getSelectedItemPositions() + messagesToRemove.forEach { + activity.deleteThread(it.thread) + } + messages.removeAll(messagesToRemove) + + activity.runOnUiThread { + if (messagesToRemove.isEmpty()) { + EventBus.getDefault().post(Events.RefreshMessages()) + finishActMode() + } else { + removeSelectedItems(positions) + } + } + } private fun setupView(view: View, message: Message) { view.apply { 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 0fcb3e88..f5ea4d63 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -175,6 +175,13 @@ fun Context.insertNewSMS(address: String, subject: String, body: String, date: L contentResolver.insert(uri, contentValues) } +fun Context.deleteThread(id: Int) { + val uri = Telephony.Sms.CONTENT_URI + val selection = "${Telephony.Sms.THREAD_ID} = ?" + val selectionArgs = arrayOf(id.toString()) + contentResolver.delete(uri, selection, selectionArgs) +} + fun Context.markSMSRead(id: Int) { val uri = Telephony.Sms.CONTENT_URI val contentValues = ContentValues().apply { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 520a59d3..7794317c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -8,4 +8,13 @@ Received SMS New message + + + Are you sure you want to delete %s? + + + + %d conversation + %d conversations +