mirror of
https://github.com/SimpleMobileTools/Simple-SMS-Messenger.git
synced 2025-06-05 21:49:22 +02:00
Add recycle bin list similar to main conversations list
This commit is contained in:
@@ -51,6 +51,13 @@
|
|||||||
android:configChanges="orientation"
|
android:configChanges="orientation"
|
||||||
android:exported="true" />
|
android:exported="true" />
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".activities.RecycleBinConversationsActivity"
|
||||||
|
android:configChanges="orientation"
|
||||||
|
android:exported="true"
|
||||||
|
android:label="@string/recycle_bin"
|
||||||
|
android:parentActivityName=".activities.MainActivity" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".activities.ThreadActivity"
|
android:name=".activities.ThreadActivity"
|
||||||
android:configChanges="orientation"
|
android:configChanges="orientation"
|
||||||
|
@@ -178,6 +178,7 @@ class MainActivity : SimpleActivity() {
|
|||||||
R.id.import_messages -> tryImportMessages()
|
R.id.import_messages -> tryImportMessages()
|
||||||
R.id.export_messages -> tryToExportMessages()
|
R.id.export_messages -> tryToExportMessages()
|
||||||
R.id.more_apps_from_us -> launchMoreAppsFromUsIntent()
|
R.id.more_apps_from_us -> launchMoreAppsFromUsIntent()
|
||||||
|
R.id.show_recycle_bin -> launchRecycleBin()
|
||||||
R.id.settings -> launchSettings()
|
R.id.settings -> launchSettings()
|
||||||
R.id.about -> launchAbout()
|
R.id.about -> launchAbout()
|
||||||
else -> return@setOnMenuItemClickListener false
|
else -> return@setOnMenuItemClickListener false
|
||||||
@@ -557,6 +558,11 @@ class MainActivity : SimpleActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun launchRecycleBin() {
|
||||||
|
hideKeyboard()
|
||||||
|
startActivity(Intent(applicationContext, RecycleBinConversationsActivity::class.java))
|
||||||
|
}
|
||||||
|
|
||||||
private fun launchSettings() {
|
private fun launchSettings() {
|
||||||
hideKeyboard()
|
hideKeyboard()
|
||||||
startActivity(Intent(applicationContext, SettingsActivity::class.java))
|
startActivity(Intent(applicationContext, SettingsActivity::class.java))
|
||||||
|
@@ -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<Conversation>
|
||||||
|
} 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<Conversation>) {
|
||||||
|
val sortedConversations = conversations.sortedWith(
|
||||||
|
compareByDescending<Conversation> { config.pinnedConversations.contains(it.threadId.toString()) }
|
||||||
|
.thenByDescending { it.date }
|
||||||
|
).toMutableList() as ArrayList<Conversation>
|
||||||
|
|
||||||
|
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()
|
||||||
|
}
|
||||||
|
}
|
@@ -293,7 +293,9 @@ class SettingsActivity : SimpleActivity() {
|
|||||||
toast(R.string.recycle_bin_empty)
|
toast(R.string.recycle_bin_empty)
|
||||||
} else {
|
} else {
|
||||||
ConfirmationDialog(this, "", R.string.empty_recycle_bin_confirmation, R.string.yes, R.string.no) {
|
ConfirmationDialog(this, "", R.string.empty_recycle_bin_confirmation, R.string.yes, R.string.no) {
|
||||||
emptyMessagesRecycleBin()
|
ensureBackgroundThread {
|
||||||
|
emptyMessagesRecycleBin()
|
||||||
|
}
|
||||||
recycleBinMessages = 0
|
recycleBinMessages = 0
|
||||||
settings_empty_recycle_bin_size.text =
|
settings_empty_recycle_bin_size.text =
|
||||||
resources.getQuantityString(R.plurals.delete_messages, recycleBinMessages, recycleBinMessages)
|
resources.getQuantityString(R.plurals.delete_messages, recycleBinMessages, recycleBinMessages)
|
||||||
|
@@ -14,6 +14,9 @@ interface ConversationsDao {
|
|||||||
@Query("SELECT * FROM conversations")
|
@Query("SELECT * FROM conversations")
|
||||||
fun getAll(): List<Conversation>
|
fun getAll(): List<Conversation>
|
||||||
|
|
||||||
|
@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<Conversation>
|
||||||
|
|
||||||
@Query("SELECT * FROM conversations WHERE thread_id = :threadId")
|
@Query("SELECT * FROM conversations WHERE thread_id = :threadId")
|
||||||
fun getConversationWithThreadId(threadId: Long): Conversation?
|
fun getConversationWithThreadId(threadId: Long): Conversation?
|
||||||
|
|
||||||
|
@@ -0,0 +1,83 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/recycle_bin_coordinator"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
android:id="@+id/recycle_bin_toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:background="@color/color_primary"
|
||||||
|
app:title="@string/recycle_bin"
|
||||||
|
app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/recycle_bin_nested_scrollview"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="?attr/actionBarSize"
|
||||||
|
android:fillViewport="true"
|
||||||
|
android:scrollbars="none"
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||||
|
|
||||||
|
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
|
android:id="@+id/recycle_bin_coordinator_wrapper"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/recycle_bin_holder"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<com.google.android.material.progressindicator.LinearProgressIndicator
|
||||||
|
android:id="@+id/conversations_progress_bar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:indeterminate="true"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:hideAnimationBehavior="outward"
|
||||||
|
app:showAnimationBehavior="inward"
|
||||||
|
app:showDelay="250"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
<com.simplemobiletools.commons.views.MyTextView
|
||||||
|
android:id="@+id/no_conversations_placeholder"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_marginTop="@dimen/bigger_margin"
|
||||||
|
android:alpha="0.8"
|
||||||
|
android:gravity="center"
|
||||||
|
android:paddingLeft="@dimen/activity_margin"
|
||||||
|
android:paddingRight="@dimen/activity_margin"
|
||||||
|
android:text="@string/no_conversations_found"
|
||||||
|
android:textSize="@dimen/bigger_text_size"
|
||||||
|
android:textStyle="italic"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
<com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
|
||||||
|
android:id="@+id/conversations_fastscroller"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<com.simplemobiletools.commons.views.MyRecyclerView
|
||||||
|
android:id="@+id/conversations_list"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
android:layoutAnimation="@anim/layout_animation"
|
||||||
|
android:overScrollMode="ifContentScrolls"
|
||||||
|
android:scrollbars="none"
|
||||||
|
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" />
|
||||||
|
|
||||||
|
</com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller>
|
||||||
|
</RelativeLayout>
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
22
app/src/main/res/menu/cab_recycle_bin_conversations.xml
Normal file
22
app/src/main/res/menu/cab_recycle_bin_conversations.xml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
tools:ignore="AppCompatResource,AlwaysShowAction">
|
||||||
|
<item
|
||||||
|
android:id="@+id/cab_delete"
|
||||||
|
android:icon="@drawable/ic_delete_vector"
|
||||||
|
android:showAsAction="always"
|
||||||
|
android:title="@string/delete"
|
||||||
|
app:showAsAction="always" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/cab_restore"
|
||||||
|
android:showAsAction="never"
|
||||||
|
android:title="Restore this message"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/cab_select_all"
|
||||||
|
android:icon="@drawable/ic_select_all_vector"
|
||||||
|
android:title="@string/select_all"
|
||||||
|
app:showAsAction="ifRoom" />
|
||||||
|
</menu>
|
@@ -13,6 +13,11 @@
|
|||||||
android:showAsAction="never"
|
android:showAsAction="never"
|
||||||
android:title="@string/export_messages"
|
android:title="@string/export_messages"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/show_recycle_bin"
|
||||||
|
android:showAsAction="never"
|
||||||
|
android:title="Show recycle bin"
|
||||||
|
app:showAsAction="never" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/settings"
|
android:id="@+id/settings"
|
||||||
android:icon="@drawable/ic_settings_cog_vector"
|
android:icon="@drawable/ic_settings_cog_vector"
|
||||||
|
12
app/src/main/res/menu/recycle_bin_menu.xml
Normal file
12
app/src/main/res/menu/recycle_bin_menu.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
tools:ignore="AppCompatResource">
|
||||||
|
<item
|
||||||
|
android:id="@+id/empty_recycle_bin"
|
||||||
|
android:icon="@drawable/ic_delete_vector"
|
||||||
|
android:showAsAction="ifRoom"
|
||||||
|
android:title="@string/empty_recycle_bin"
|
||||||
|
app:showAsAction="ifRoom" />
|
||||||
|
</menu>
|
Reference in New Issue
Block a user