Merge pull request #208 from Aga-C/add-pin-conversation

Added pinning conversations (#197)
This commit is contained in:
Tibor Kaputa 2021-09-24 18:34:43 +02:00 committed by GitHub
commit a2b8a77f42
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
36 changed files with 184 additions and 8 deletions

View File

@ -36,6 +36,7 @@ import org.greenrobot.eventbus.ThreadMode
import java.io.FileOutputStream
import java.io.OutputStream
import java.util.*
import kotlin.collections.ArrayList
class MainActivity : SimpleActivity() {
private val MAKE_DEFAULT_APP_REQUEST = 1
@ -188,7 +189,7 @@ class MainActivity : SimpleActivity() {
private fun getCachedConversations() {
ensureBackgroundThread {
val conversations = try {
conversationsDB.getAll().sortedByDescending { it.date }.toMutableList() as ArrayList<Conversation>
conversationsDB.getAll().toMutableList() as ArrayList<Conversation>
} catch (e: Exception) {
ArrayList()
}
@ -244,6 +245,10 @@ class MainActivity : SimpleActivity() {
private fun setupConversations(conversations: ArrayList<Conversation>) {
val hasConversations = conversations.isNotEmpty()
val sortedConversations = conversations.sortedWith(
compareByDescending<Conversation> { config.pinnedConversations.contains(it.threadId.toString()) }
.thenByDescending { it.date }
).toMutableList() as ArrayList<Conversation>
conversations_list.beVisibleIf(hasConversations)
no_conversations_placeholder.beVisibleIf(!hasConversations)
no_conversations_placeholder_2.beVisibleIf(!hasConversations)
@ -255,7 +260,7 @@ class MainActivity : SimpleActivity() {
val currAdapter = conversations_list.adapter
if (currAdapter == null) {
ConversationsAdapter(this, conversations, conversations_list, conversations_fastscroller) {
ConversationsAdapter(this, sortedConversations, conversations_list, conversations_fastscroller) {
Intent(this, ThreadActivity::class.java).apply {
putExtra(THREAD_ID, (it as Conversation).threadId)
putExtra(THREAD_TITLE, it.title)
@ -272,7 +277,7 @@ class MainActivity : SimpleActivity() {
}
} else {
try {
(currAdapter as ConversationsAdapter).updateConversations(conversations)
(currAdapter as ConversationsAdapter).updateConversations(sortedConversations)
} catch (ignored: Exception) {
}
}

View File

@ -146,6 +146,7 @@ class ThreadActivity : SimpleActivity() {
}
updateMenuItemColors(menu)
checkPinBtnVisibility(menu)
return true
}
@ -159,6 +160,8 @@ class ThreadActivity : SimpleActivity() {
R.id.delete -> askConfirmDelete()
R.id.manage_people -> managePeople()
R.id.mark_as_unread -> markAsUnread()
R.id.pin_conversation -> pinConversation(true)
R.id.unpin_conversation -> pinConversation(false)
else -> return super.onOptionsItemSelected(item)
}
return true
@ -852,6 +855,24 @@ class ThreadActivity : SimpleActivity() {
return participants
}
private fun pinConversation(pin: Boolean) {
if (pin) {
config.addPinnedConversationByThreadId(threadId)
} else {
config.removePinnedConversationByThreadId(threadId)
}
runOnUiThread {
refreshMessages()
}
}
private fun checkPinBtnVisibility(menu: Menu) {
val pinnedConversations = config.pinnedConversations
menu.findItem(R.id.pin_conversation).isVisible = !pinnedConversations.contains(threadId.toString())
menu.findItem(R.id.unpin_conversation).isVisible = pinnedConversations.contains(threadId.toString())
}
@SuppressLint("MissingPermission")
@Subscribe(threadMode = ThreadMode.ASYNC)
fun refreshMessages(event: Events.RefreshMessages) {

View File

@ -22,10 +22,7 @@ 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.deleteConversation
import com.simplemobiletools.smsmessenger.extensions.getSmsDraft
import com.simplemobiletools.smsmessenger.extensions.markThreadMessagesRead
import com.simplemobiletools.smsmessenger.extensions.markThreadMessagesUnread
import com.simplemobiletools.smsmessenger.extensions.*
import com.simplemobiletools.smsmessenger.helpers.refreshMessages
import com.simplemobiletools.smsmessenger.models.Conversation
import kotlinx.android.synthetic.main.item_conversation.view.*
@ -52,6 +49,7 @@ class ConversationsAdapter(
findItem(R.id.cab_copy_number).isVisible = isOneItemSelected() && selectedItems.firstOrNull()?.isGroupConversation == false
findItem(R.id.cab_mark_as_read).isVisible = selectedItems.any { !it.read }
findItem(R.id.cab_mark_as_unread).isVisible = selectedItems.any { it.read }
checkPinBtnVisibility(this)
}
}
@ -68,6 +66,8 @@ class ConversationsAdapter(
R.id.cab_delete -> askConfirmDelete()
R.id.cab_mark_as_read -> markAsRead()
R.id.cab_mark_as_unread -> markAsUnread()
R.id.cab_pin_conversation -> pinConversation(true)
R.id.cab_unpin_conversation -> pinConversation(false)
R.id.cab_select_all -> selectAll()
}
}
@ -241,6 +241,31 @@ class ConversationsAdapter(
private fun getSelectedItems() = conversations.filter { selectedKeys.contains(it.hashCode()) } as ArrayList<Conversation>
private fun pinConversation(pin: Boolean) {
val conversations = getSelectedItems()
if (conversations.isEmpty()) {
return
}
if (pin) {
activity.config.addPinnedConversations(conversations)
} else {
activity.config.removePinnedConversations(conversations)
}
activity.runOnUiThread {
refreshMessages()
finishActMode()
}
}
private fun checkPinBtnVisibility(menu: Menu) {
val pinnedConversations = activity.config.pinnedConversations
val selectedConversations = getSelectedItems()
menu.findItem(R.id.cab_pin_conversation).isVisible = selectedConversations.any { !pinnedConversations.contains(it.threadId.toString()) }
menu.findItem(R.id.cab_unpin_conversation).isVisible = selectedConversations.any { pinnedConversations.contains(it.threadId.toString()) }
}
override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder)
if (!activity.isDestroyed && !activity.isFinishing) {
@ -269,6 +294,8 @@ class ConversationsAdapter(
draft_indicator.beVisibleIf(smsDraft != null)
draft_indicator.setTextColor(adjustedPrimaryColor)
pin_indicator.beVisibleIf(activity.config.pinnedConversations.contains(conversation.threadId.toString()))
conversation_frame.isSelected = selectedKeys.contains(conversation.hashCode())
conversation_address.apply {

View File

@ -2,6 +2,8 @@ package com.simplemobiletools.smsmessenger.helpers
import android.content.Context
import com.simplemobiletools.commons.helpers.BaseConfig
import com.simplemobiletools.smsmessenger.models.Conversation
import java.util.HashSet
class Config(context: Context) : BaseConfig(context) {
companion object {
@ -34,6 +36,26 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getLong(MMS_FILE_SIZE_LIMIT, FILE_SIZE_1_MB)
set(mmsFileSizeLimit) = prefs.edit().putLong(MMS_FILE_SIZE_LIMIT, mmsFileSizeLimit).apply()
var pinnedConversations: Set<String>
get() = prefs.getStringSet(PINNED_CONVERSATIONS, HashSet<String>())!!
set(pinnedConversations) = prefs.edit().putStringSet(PINNED_CONVERSATIONS, pinnedConversations).apply()
fun addPinnedConversationByThreadId(threadId: Long) {
pinnedConversations = pinnedConversations.plus(threadId.toString())
}
fun addPinnedConversations(conversations: List<Conversation>) {
pinnedConversations = pinnedConversations.plus(conversations.map { it.threadId.toString() })
}
fun removePinnedConversationByThreadId(threadId: Long) {
pinnedConversations = pinnedConversations.minus(threadId.toString())
}
fun removePinnedConversations(conversations: List<Conversation>) {
pinnedConversations = pinnedConversations.minus(conversations.map { it.threadId.toString() })
}
var lastExportPath: String
get() = prefs.getString(LAST_EXPORT_PATH, "")!!
set(lastExportPath) = prefs.edit().putString(LAST_EXPORT_PATH, lastExportPath).apply()
@ -53,5 +75,4 @@ class Config(context: Context) : BaseConfig(context) {
var importMms: Boolean
get() = prefs.getBoolean(IMPORT_MMS, true)
set(importMms) = prefs.edit().putBoolean(IMPORT_MMS, importMms).apply()
}

View File

@ -17,6 +17,7 @@ const val USE_SIMPLE_CHARACTERS = "use_simple_characters"
const val LOCK_SCREEN_VISIBILITY = "lock_screen_visibility"
const val ENABLE_DELIVERY_REPORTS = "enable_delivery_reports"
const val MMS_FILE_SIZE_LIMIT = "mms_file_size_limit"
const val PINNED_CONVERSATIONS = "pinned_conversations"
const val LAST_EXPORT_PATH = "last_export_path"
const val EXPORT_SMS = "export_sms"
const val EXPORT_MMS = "export_mms"

Binary file not shown.

After

Width:  |  Height:  |  Size: 882 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 532 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -26,6 +26,24 @@
android:layout_marginStart="@dimen/normal_margin"
android:layout_marginEnd="@dimen/normal_margin" />
<RelativeLayout
android:id="@+id/pin_indicator_l"
android:layout_width="@dimen/normal_icon_size"
android:layout_height="@dimen/normal_icon_size"
android:layout_alignTop="@+id/conversation_address"
android:layout_alignBottom="@+id/conversation_date"
android:layout_centerVertical="true"
android:layout_marginStart="@dimen/normal_margin"
android:layout_marginEnd="@dimen/normal_margin">
<ImageView
android:id="@+id/pin_indicator"
android:layout_width="@dimen/pin_icon_size"
android:layout_height="@dimen/pin_icon_size"
android:layout_alignParentRight="true"
android:src="@drawable/ic_pin" />
</RelativeLayout>
<TextView
android:id="@+id/conversation_address"
android:layout_width="match_parent"

View File

@ -33,6 +33,14 @@
android:id="@+id/cab_mark_as_unread"
android:title="@string/mark_as_unread"
app:showAsAction="never" />
<item
android:id="@+id/cab_pin_conversation"
android:title="@string/pin_conversation"
app:showAsAction="never" />
<item
android:id="@+id/cab_unpin_conversation"
android:title="@string/unpin_conversation"
app:showAsAction="never" />
<item
android:id="@+id/cab_select_all"
android:title="@string/select_all"

View File

@ -19,4 +19,12 @@
android:id="@+id/mark_as_unread"
android:title="@string/mark_as_unread"
app:showAsAction="never" />
<item
android:id="@+id/pin_conversation"
android:title="@string/pin_conversation"
app:showAsAction="never" />
<item
android:id="@+id/unpin_conversation"
android:title="@string/unpin_conversation"
app:showAsAction="never" />
</menu>

View File

@ -15,6 +15,10 @@
<string name="no_reply_support">Odesílatel nepodporuje odpovědi</string>
<string name="draft">Návrh</string>
<string name="sending">Odesílá se…</string>
<string name="export_messages">Export zpráv</string>
<string name="import_messages">Import zpráv</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Nová konverzace</string>

View File

@ -15,6 +15,10 @@
<string name="no_reply_support">Afsender understøtter ikke svar</string>
<string name="draft">Udkast</string>
<string name="sending">Sender…</string>
<string name="export_messages">Eksporter beskeder</string>
<string name="import_messages">Importer beskeder</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Ny Samtale</string>

View File

@ -15,6 +15,10 @@
<string name="no_reply_support">Der Absender unterstützt keine Antworten.</string>
<string name="draft">Entwurf</string>
<string name="sending">Sende…</string>
<string name="export_messages">Export messages</string>
<string name="import_messages">Import messages</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Neuer Chat</string>

View File

@ -15,6 +15,10 @@
<string name="no_reply_support">Ο αποστολέας δεν υποστηρίζει απαντήσεις</string>
<string name="draft">Πρόχειρο</string>
<string name="sending">Γίνεται αποστολή…</string>
<string name="export_messages">Εξαγωγή μηνυμάτων</string>
<string name="import_messages">Εισαγωγή μηνυμάτων</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Νέα συνομιλία</string>

View File

@ -15,6 +15,10 @@
<string name="no_reply_support">Sender doesn\'t support replies</string>
<string name="draft">Draft</string>
<string name="sending">Sending…</string>
<string name="export_messages">Export messages</string>
<string name="import_messages">Import messages</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Nueva conversación</string>

View File

@ -15,6 +15,10 @@
<string name="no_reply_support">Lähettäjä ei tue vastauksia</string>
<string name="draft">Luonnos</string>
<string name="sending">Lähetetään…</string>
<string name="export_messages">Export messages</string>
<string name="import_messages">Import messages</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Uusi keskustelu</string>

View File

@ -15,6 +15,10 @@
<string name="no_reply_support">L\'expéditeur n\'accepte pas les réponses</string>
<string name="draft">Brouillon</string>
<string name="sending">Envoi en cours…</string>
<string name="export_messages">Export de messages</string>
<string name="import_messages">Import de messages</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Nouvelle conversation</string>

View File

@ -15,6 +15,10 @@
<string name="no_reply_support">Sender doesn\'t support replies</string>
<string name="draft">Draft</string>
<string name="sending">Sending…</string>
<string name="export_messages">Export messages</string>
<string name="import_messages">Import messages</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Nova conversa</string>

View File

@ -15,6 +15,10 @@
<string name="no_reply_support">Sender doesn\'t support replies</string>
<string name="draft">Draft</string>
<string name="sending">Sending…</string>
<string name="export_messages">Export messages</string>
<string name="import_messages">Import messages</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Percakapan baru</string>

View File

@ -15,6 +15,10 @@
<string name="no_reply_support">Il mittente non accetta risposte</string>
<string name="draft">Bozza</string>
<string name="sending">Invio…</string>
<string name="export_messages">Export messages</string>
<string name="import_messages">Import messages</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Nuova conversazione</string>

View File

@ -15,6 +15,10 @@
<string name="no_reply_support">Sender doesn\'t support replies</string>
<string name="draft">Draft</string>
<string name="sending">Sending…</string>
<string name="export_messages">Export messages</string>
<string name="import_messages">Import messages</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">新しい会話</string>

View File

@ -15,6 +15,8 @@
<string name="no_reply_support">Sender doesn\'t support replies</string>
<string name="draft">Draft</string>
<string name="sending">Sending…</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Naujas pokalbis</string>

View File

@ -15,6 +15,8 @@
<string name="no_reply_support">Sender doesn\'t support replies</string>
<string name="draft">Draft</string>
<string name="sending">Sending…</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">പുതിയ സംഭാഷണം</string>

View File

@ -15,6 +15,8 @@
<string name="no_reply_support">Afzender ondersteunt geen antwoorden</string>
<string name="draft">Concept</string>
<string name="sending">Versturen…</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Nieuw gesprek</string>

View File

@ -15,6 +15,8 @@
<string name="no_reply_support">Nadawca nie obsługuje odpowiedzi</string>
<string name="draft">Szkic</string>
<string name="sending">Wysyłanie…</string>
<string name="pin_conversation">Przypnij na górze</string>
<string name="unpin_conversation">Odepnij</string>
<!-- New conversation -->
<string name="new_conversation">Nowa rozmowa</string>

View File

@ -15,6 +15,8 @@
<string name="no_reply_support">O remetente não aceita respostas</string>
<string name="draft">Rascunho</string>
<string name="sending">A enviar…</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Nova conversa</string>

View File

@ -15,6 +15,8 @@
<string name="no_reply_support">Отправитель не поддерживает ответы</string>
<string name="draft">Черновик</string>
<string name="sending">Отправка…</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Новая переписка</string>

View File

@ -15,6 +15,8 @@
<string name="no_reply_support">Odosielateľ nepodporuje odpovede</string>
<string name="draft">Koncept</string>
<string name="sending">Odosiela sa…</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Nová konverzácia</string>

View File

@ -15,6 +15,8 @@
<string name="no_reply_support">Sender doesn\'t support replies</string>
<string name="draft">Draft</string>
<string name="sending">Sending…</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Yeni görüşme</string>

View File

@ -15,6 +15,8 @@
<string name="no_reply_support">Sender doesn\'t support replies</string>
<string name="draft">Draft</string>
<string name="sending">Sending…</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">Нове листування</string>

View File

@ -15,6 +15,8 @@
<string name="no_reply_support">Sender doesn\'t support replies</string>
<string name="draft">Draft</string>
<string name="sending">Sending…</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">新的对话</string>

View File

@ -5,4 +5,5 @@
<dimen name="play_outline_size">36dp</dimen>
<dimen name="attachment_preview_size">60dp</dimen>
<dimen name="remove_attachment_size">24dp</dimen>
<dimen name="pin_icon_size">15dp</dimen>
</resources>

View File

@ -15,6 +15,8 @@
<string name="no_reply_support">Sender doesn\'t support replies</string>
<string name="draft">Draft</string>
<string name="sending">Sending…</string>
<string name="pin_conversation">Pin to the top</string>
<string name="unpin_conversation">Unpin</string>
<!-- New conversation -->
<string name="new_conversation">New conversation</string>