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" /> + + + +