diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index aa49b1c0..c31ee1df 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -51,6 +51,13 @@
android:configChanges="orientation"
android:exported="true" />
+
+
tryImportMessages()
R.id.export_messages -> tryToExportMessages()
R.id.more_apps_from_us -> launchMoreAppsFromUsIntent()
+ R.id.show_recycle_bin -> launchRecycleBin()
R.id.settings -> launchSettings()
R.id.about -> launchAbout()
else -> return@setOnMenuItemClickListener false
@@ -557,6 +558,11 @@ class MainActivity : SimpleActivity() {
}
}
+ private fun launchRecycleBin() {
+ hideKeyboard()
+ startActivity(Intent(applicationContext, RecycleBinConversationsActivity::class.java))
+ }
+
private fun launchSettings() {
hideKeyboard()
startActivity(Intent(applicationContext, SettingsActivity::class.java))
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/RecycleBinConversationsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/RecycleBinConversationsActivity.kt
new file mode 100644
index 00000000..cd13f825
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/RecycleBinConversationsActivity.kt
@@ -0,0 +1,154 @@
+package com.simplemobiletools.smsmessenger.activities
+
+import android.annotation.SuppressLint
+import android.content.Intent
+import android.os.Bundle
+import com.simplemobiletools.commons.dialogs.ConfirmationDialog
+import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.*
+import com.simplemobiletools.smsmessenger.R
+import com.simplemobiletools.smsmessenger.adapters.ConversationsAdapter
+import com.simplemobiletools.smsmessenger.extensions.*
+import com.simplemobiletools.smsmessenger.helpers.*
+import com.simplemobiletools.smsmessenger.models.Conversation
+import com.simplemobiletools.smsmessenger.models.Events
+import kotlinx.android.synthetic.main.activity_recycle_bin_conversations.*
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+class RecycleBinConversationsActivity : SimpleActivity() {
+ private var bus: EventBus? = null
+
+ @SuppressLint("InlinedApi")
+ override fun onCreate(savedInstanceState: Bundle?) {
+ isMaterialActivity = true
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_recycle_bin_conversations)
+ setupOptionsMenu()
+
+ updateMaterialActivityViews(recycle_bin_coordinator, conversations_list, useTransparentNavigation = true, useTopSearchMenu = false)
+ setupMaterialScrollListener(conversations_list, recycle_bin_toolbar)
+
+ loadRecycleBinConversations()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ setupToolbar(recycle_bin_toolbar, NavigationIcon.Arrow)
+ updateMenuColors()
+
+ loadRecycleBinConversations()
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ bus?.unregister(this)
+ }
+
+ private fun setupOptionsMenu() {
+ recycle_bin_toolbar.inflateMenu(R.menu.recycle_bin_menu)
+
+ recycle_bin_toolbar.setOnMenuItemClickListener { menuItem ->
+ when (menuItem.itemId) {
+ R.id.empty_recycle_bin -> removeAll()
+ else -> return@setOnMenuItemClickListener false
+ }
+ return@setOnMenuItemClickListener true
+ }
+ }
+
+ private fun updateMenuColors() {
+ updateStatusbarColor(getProperBackgroundColor())
+ }
+
+ private fun loadRecycleBinConversations() {
+ ensureBackgroundThread {
+ val conversations = try {
+ conversationsDB.getAllWithMessagesInRecycleBin().toMutableList() as ArrayList
+ } catch (e: Exception) {
+ ArrayList()
+ }
+
+ runOnUiThread {
+ setupConversations(conversations)
+ }
+ }
+
+ bus = EventBus.getDefault()
+ try {
+ bus!!.register(this)
+ } catch (e: Exception) {
+ }
+ }
+
+ private fun removeAll() {
+ ConfirmationDialog(this, "", R.string.empty_recycle_bin_confirmation, R.string.yes, R.string.no) {
+ ensureBackgroundThread {
+ emptyMessagesRecycleBin()
+ loadRecycleBinConversations()
+ }
+ }
+ }
+
+ private fun getOrCreateConversationsAdapter(): ConversationsAdapter {
+ var currAdapter = conversations_list.adapter
+ if (currAdapter == null) {
+ hideKeyboard()
+ currAdapter = ConversationsAdapter(
+ activity = this,
+ recyclerView = conversations_list,
+ onRefresh = { notifyDatasetChanged() },
+ itemClick = { handleConversationClick(it) }
+ )
+
+ conversations_list.adapter = currAdapter
+ if (areSystemAnimationsEnabled) {
+ conversations_list.scheduleLayoutAnimation()
+ }
+ }
+ return currAdapter as ConversationsAdapter
+ }
+
+ 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())
+
+ try {
+ getOrCreateConversationsAdapter().apply {
+ updateConversations(sortedConversations)
+ }
+ } catch (ignored: Exception) {
+ }
+ }
+
+ private fun showOrHidePlaceholder(show: Boolean) {
+ conversations_fastscroller.beGoneIf(show)
+ no_conversations_placeholder.beVisibleIf(show)
+ no_conversations_placeholder.text = getString(R.string.no_conversations_found)
+ }
+
+ @SuppressLint("NotifyDataSetChanged")
+ private fun notifyDatasetChanged() {
+ getOrCreateConversationsAdapter().notifyDataSetChanged()
+ }
+
+ private fun handleConversationClick(any: Any) {
+ Intent(this, ThreadActivity::class.java).apply {
+ val conversation = any as Conversation
+ putExtra(THREAD_ID, conversation.threadId)
+ putExtra(THREAD_TITLE, conversation.title)
+ putExtra(WAS_PROTECTION_HANDLED, true)
+ startActivity(this)
+ }
+ }
+
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ fun refreshMessages(event: Events.RefreshMessages) {
+ loadRecycleBinConversations()
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt
index ff0d5ffe..425865ee 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt
@@ -293,7 +293,9 @@ class SettingsActivity : SimpleActivity() {
toast(R.string.recycle_bin_empty)
} else {
ConfirmationDialog(this, "", R.string.empty_recycle_bin_confirmation, R.string.yes, R.string.no) {
- emptyMessagesRecycleBin()
+ ensureBackgroundThread {
+ emptyMessagesRecycleBin()
+ }
recycleBinMessages = 0
settings_empty_recycle_bin_size.text =
resources.getQuantityString(R.plurals.delete_messages, recycleBinMessages, recycleBinMessages)
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..11d2e523 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt
@@ -14,6 +14,9 @@ interface ConversationsDao {
@Query("SELECT * FROM conversations")
fun getAll(): 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
+
@Query("SELECT * FROM conversations WHERE thread_id = :threadId")
fun getConversationWithThreadId(threadId: Long): Conversation?
diff --git a/app/src/main/res/layout/activity_recycle_bin_conversations.xml b/app/src/main/res/layout/activity_recycle_bin_conversations.xml
new file mode 100644
index 00000000..b6ab593c
--- /dev/null
+++ b/app/src/main/res/layout/activity_recycle_bin_conversations.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/cab_recycle_bin_conversations.xml b/app/src/main/res/menu/cab_recycle_bin_conversations.xml
new file mode 100644
index 00000000..8ff99d41
--- /dev/null
+++ b/app/src/main/res/menu/cab_recycle_bin_conversations.xml
@@ -0,0 +1,22 @@
+
+
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
index d60f5871..0785b49b 100644
--- a/app/src/main/res/menu/menu_main.xml
+++ b/app/src/main/res/menu/menu_main.xml
@@ -13,6 +13,11 @@
android:showAsAction="never"
android:title="@string/export_messages"
app:showAsAction="never" />
+
-
+