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.RecycleBinConversationsAdapter import com.simplemobiletools.smsmessenger.databinding.ActivityRecycleBinConversationsBinding import com.simplemobiletools.smsmessenger.extensions.* import com.simplemobiletools.smsmessenger.helpers.* import com.simplemobiletools.smsmessenger.models.Conversation import com.simplemobiletools.smsmessenger.models.Events import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode class RecycleBinConversationsActivity : SimpleActivity() { private var bus: EventBus? = null private val binding by viewBinding(ActivityRecycleBinConversationsBinding::inflate) @SuppressLint("InlinedApi") override fun onCreate(savedInstanceState: Bundle?) { isMaterialActivity = true super.onCreate(savedInstanceState) setContentView(binding.root) setupOptionsMenu() updateMaterialActivityViews( mainCoordinatorLayout = binding.recycleBinCoordinator, nestedView = binding.conversationsList, useTransparentNavigation = true, useTopSearchMenu = false ) setupMaterialScrollListener(scrollingView = binding.conversationsList, toolbar = binding.recycleBinToolbar) loadRecycleBinConversations() } override fun onResume() { super.onResume() setupToolbar(binding.recycleBinToolbar, NavigationIcon.Arrow) updateMenuColors() loadRecycleBinConversations() } override fun onDestroy() { super.onDestroy() bus?.unregister(this) } private fun setupOptionsMenu() { binding.recycleBinToolbar.inflateMenu(R.menu.recycle_bin_menu) binding.recycleBinToolbar.setOnMenuItemClickListener { menuItem -> when (menuItem.itemId) { R.id.empty_recycle_bin -> removeAll() else -> return@setOnMenuItemClickListener false } return@setOnMenuItemClickListener true } } private fun updateOptionsMenu(conversations: ArrayList) { binding.recycleBinToolbar.menu.apply { findItem(R.id.empty_recycle_bin).isVisible = conversations.isNotEmpty() } } 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 (ignored: Exception) { } } private fun removeAll() { ConfirmationDialog( activity = this, message = "", messageId = R.string.empty_recycle_bin_messages_confirmation, positive = com.simplemobiletools.commons.R.string.yes, negative = com.simplemobiletools.commons.R.string.no ) { ensureBackgroundThread { emptyMessagesRecycleBin() loadRecycleBinConversations() } } } private fun getOrCreateConversationsAdapter(): RecycleBinConversationsAdapter { var currAdapter = binding.conversationsList.adapter if (currAdapter == null) { hideKeyboard() currAdapter = RecycleBinConversationsAdapter( activity = this, recyclerView = binding.conversationsList, onRefresh = { notifyDatasetChanged() }, itemClick = { handleConversationClick(it) } ) binding.conversationsList.adapter = currAdapter if (areSystemAnimationsEnabled) { binding.conversationsList.scheduleLayoutAnimation() } } return currAdapter as RecycleBinConversationsAdapter } 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) { binding.conversationsFastscroller.beGoneIf(show) binding.noConversationsPlaceholder.beVisibleIf(show) binding.noConversationsPlaceholder.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) putExtra(IS_RECYCLE_BIN, true) startActivity(this) } } @Subscribe(threadMode = ThreadMode.MAIN) fun refreshMessages(event: Events.RefreshMessages) { loadRecycleBinConversations() } }