diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt index 513e50ac..ff16f5d1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -28,6 +28,7 @@ import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import java.util.* +import kotlin.collections.ArrayList class MainActivity : SimpleActivity() { private val MAKE_DEFAULT_APP_REQUEST = 1 @@ -170,7 +171,7 @@ class MainActivity : SimpleActivity() { private fun getCachedConversations() { ensureBackgroundThread { val conversations = try { - conversationsDB.getAll().sortedByDescending { it.date }.toMutableList() as ArrayList + conversationsDB.getAll().toMutableList() as ArrayList } catch (e: Exception) { ArrayList() } @@ -226,6 +227,10 @@ class MainActivity : SimpleActivity() { private fun setupConversations(conversations: ArrayList) { val hasConversations = conversations.isNotEmpty() + val sortedConversations = conversations.sortedWith( + compareByDescending{ config.pinnedConversations.contains(it.threadId.toString()) } + .thenByDescending{ it.date } + ).toMutableList() as ArrayList conversations_list.beVisibleIf(hasConversations) no_conversations_placeholder.beVisibleIf(!hasConversations) no_conversations_placeholder_2.beVisibleIf(!hasConversations) @@ -237,7 +242,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) @@ -254,7 +259,7 @@ class MainActivity : SimpleActivity() { } } else { try { - (currAdapter as ConversationsAdapter).updateConversations(conversations) + (currAdapter as ConversationsAdapter).updateConversations(sortedConversations) } catch (ignored: Exception) { } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 28c5b7ef..5fd42606 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -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,25 @@ 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) { diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt index cbccb4b1..14853821 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -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.* @@ -48,6 +45,8 @@ class ConversationsAdapter( findItem(R.id.cab_add_number_to_contact).isVisible = isOneItemSelected() && getSelectedItems().firstOrNull()?.isGroupConversation == false findItem(R.id.cab_dial_number).isVisible = isOneItemSelected() && getSelectedItems().firstOrNull()?.isGroupConversation == false findItem(R.id.cab_copy_number).isVisible = isOneItemSelected() && getSelectedItems().firstOrNull()?.isGroupConversation == false + + checkPinBtnVisibility(this) } } @@ -64,6 +63,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() } } @@ -237,6 +238,33 @@ class ConversationsAdapter( private fun getSelectedItems() = conversations.filter { selectedKeys.contains(it.hashCode()) } as ArrayList + private fun pinConversation(pin: Boolean) { + val conversations = getSelectedItems() + + if (conversations.size == 0) { + 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) { @@ -265,6 +293,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 { diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt index 78670daf..a0dcc48e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Config.kt @@ -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 { @@ -33,4 +35,24 @@ class Config(context: Context) : BaseConfig(context) { var mmsFileSizeLimit: Long 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 + get() = prefs.getStringSet(PINNED_CONVERSATIONS, HashSet())!! + set(pinnedConversations) = prefs.edit().putStringSet(PINNED_CONVERSATIONS, pinnedConversations).apply() + + fun addPinnedConversationByThreadId(threadId: Long) { + pinnedConversations = pinnedConversations.plus(threadId.toString()) + } + + fun addPinnedConversations(conversations: List) { + pinnedConversations = pinnedConversations.plus(conversations.map { it.threadId.toString() }) + } + + fun removePinnedConversationByThreadId(threadId: Long) { + pinnedConversations = pinnedConversations.minus(threadId.toString()) + } + + fun removePinnedConversations(conversations: List) { + pinnedConversations = pinnedConversations.minus(conversations.map { it.threadId.toString() }) + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt index 9e1ec619..c036bfb9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/helpers/Constants.kt @@ -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" private const val PATH = "com.simplemobiletools.smsmessenger.action." const val MARK_AS_READ = PATH + "mark_as_read" diff --git a/app/src/main/res/drawable-hdpi/ic_pin.png b/app/src/main/res/drawable-hdpi/ic_pin.png new file mode 100644 index 00000000..0f32c2eb Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_pin.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_pin.png b/app/src/main/res/drawable-mdpi/ic_pin.png new file mode 100644 index 00000000..eb56bb8a Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_pin.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_pin.png b/app/src/main/res/drawable-xhdpi/ic_pin.png new file mode 100644 index 00000000..b97d8ac9 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_pin.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_pin.png b/app/src/main/res/drawable-xxhdpi/ic_pin.png new file mode 100644 index 00000000..4a1a3dd2 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_pin.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_pin.png b/app/src/main/res/drawable-xxxhdpi/ic_pin.png new file mode 100644 index 00000000..c516e08f Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_pin.png differ diff --git a/app/src/main/res/layout/item_conversation.xml b/app/src/main/res/layout/item_conversation.xml index 6cde1caa..6c61a3d6 100644 --- a/app/src/main/res/layout/item_conversation.xml +++ b/app/src/main/res/layout/item_conversation.xml @@ -26,6 +26,24 @@ android:layout_marginStart="@dimen/normal_margin" android:layout_marginEnd="@dimen/normal_margin" /> + + + + + + + + + diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index af8271c5..ebfd80d4 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -17,6 +17,8 @@ Odesílá se… Export zpráv Import zpráv + Pin to the top + Unpin Nová konverzace diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 16102277..97decdcf 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -17,6 +17,8 @@ Sender… Eksporter beskeder Importer beskeder + Pin to the top + Unpin Ny Samtale diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 40f69e22..28a67caf 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -17,6 +17,8 @@ Sende… Export messages Import messages + Pin to the top + Unpin Neuer Chat diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index ec01e170..fcb3fb4e 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -17,6 +17,8 @@ Γίνεται αποστολή… Εξαγωγή μηνυμάτων Εισαγωγή μηνυμάτων + Pin to the top + Unpin Νέα συνομιλία diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index a267726e..7e36ffa0 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -17,6 +17,8 @@ Sending… Export messages Import messages + Pin to the top + Unpin Nueva conversación diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index ab3a4416..8baaec9f 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -17,6 +17,8 @@ Lähetetään… Export messages Import messages + Pin to the top + Unpin Uusi keskustelu diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 1625d4fd..0aab6d75 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -17,6 +17,8 @@ Envoi en cours… Export de messages Import de messages + Pin to the top + Unpin Nouvelle conversation diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index d566febf..bc222857 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -17,6 +17,8 @@ Sending… Export messages Import messages + Pin to the top + Unpin Nova conversa diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index e4217469..7bbff46f 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -17,6 +17,8 @@ Sending… Export messages Import messages + Pin to the top + Unpin Percakapan baru diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index b1477e50..481992a3 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -17,6 +17,8 @@ Invio… Export messages Import messages + Pin to the top + Unpin Nuova conversazione diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index b281ca3d..681853ed 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -17,6 +17,8 @@ Sending… Export messages Import messages + Pin to the top + Unpin 新しい会話 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 714051b0..0a5b2567 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -17,6 +17,8 @@ Sending… Export messages Import messages + Pin to the top + Unpin Naujas pokalbis diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 50c2029f..0be2d7a7 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -17,6 +17,8 @@ Sending… Export messages Import messages + Pin to the top + Unpin പുതിയ സംഭാഷണം diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 759d3c56..6fa59309 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -17,6 +17,8 @@ Versturen… Berichten exporteren Berichten importeren + Pin to the top + Unpin Nieuw gesprek diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index bd91ca19..7de14ed7 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -17,6 +17,8 @@ Wysyłanie… Eksportuj wiadomości Importuj wiadomości + Przypnij na górze + Odepnij Nowa rozmowa diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 4f08f40e..cec92960 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -17,6 +17,8 @@ A enviar… Exportar mensagens Importar mensagens + Pin to the top + Unpin Nova conversa diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c4ae0a0b..dab9154e 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -17,6 +17,8 @@ Отправка… Экспорт сообщений Импорт сообщений + Pin to the top + Unpin Новая переписка diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 5c922a60..020a6b05 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -17,6 +17,8 @@ Odosiela sa… Exportovať správy Importovať správy + Pin to the top + Unpin Nová konverzácia diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 575b3c20..2e01517e 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -17,6 +17,8 @@ Sending… Export messages Import messages + Pin to the top + Unpin Yeni görüşme diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 8a5a6b46..a15a8fa3 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -17,6 +17,8 @@ Sending… Export messages Import messages + Pin to the top + Unpin Нове листування diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c2622ff6..bbce7ff9 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -17,6 +17,8 @@ Sending… Export messages Import messages + Pin to the top + Unpin 新的对话 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index fd6215f3..5411875a 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -5,4 +5,5 @@ 36dp 60dp 24dp + 15dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bb24daff..699ee439 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,6 +17,8 @@ Sending… Export messages Import messages + Pin to the top + Unpin New conversation