From 7b84ec77fdcd3b286bfe707f19e35d4ccee24faf Mon Sep 17 00:00:00 2001 From: Agnieszka C <85929121+Aga-C@users.noreply.github.com> Date: Fri, 3 Sep 2021 19:00:23 +0200 Subject: [PATCH 01/10] Added SMS drafts support (#83) --- .../smsmessenger/activities/ThreadActivity.kt | 14 +++++ .../adapters/ConversationsAdapter.kt | 9 +++- .../smsmessenger/extensions/Context.kt | 52 +++++++++++++++++++ app/src/main/res/layout/item_conversation.xml | 16 +++++- 4 files changed, 89 insertions(+), 2 deletions(-) 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 f235f327..5b7af23a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -108,11 +108,25 @@ class ThreadActivity : SimpleActivity() { override fun onResume() { super.onResume() + + val smsDraft = getSmsDraft(threadId) + if (smsDraft != null) { + thread_type_message.setText(smsDraft) + } isActivityVisible = true } override fun onPause() { super.onPause() + + if (thread_type_message.value != "" && attachmentUris.isEmpty()) { + saveSmsDraft(thread_type_message.value, threadId) + } else { + deleteSmsDraft(threadId) + } + + bus?.post(Events.RefreshMessages()) + isActivityVisible = false } 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 c895ea85..40ad72d8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -23,6 +23,7 @@ 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.helpers.refreshMessages import com.simplemobiletools.smsmessenger.models.Conversation import kotlinx.android.synthetic.main.item_conversation.view.* @@ -220,6 +221,8 @@ class ConversationsAdapter( private fun setupView(view: View, conversation: Conversation) { view.apply { + val smsDraft = context.getSmsDraft(conversation.threadId) + conversation_frame.isSelected = selectedKeys.contains(conversation.hashCode()) conversation_address.apply { @@ -228,10 +231,14 @@ class ConversationsAdapter( } conversation_body_short.apply { - text = conversation.snippet + text = smsDraft ?: conversation.snippet setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.9f) } + draft_indicator.apply { + visibility = if (smsDraft != null) View.VISIBLE else View.GONE + } + conversation_date.apply { text = conversation.date.formatDateOrTime(context, true, false) setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.8f) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index cb55e7c8..9d00d0cd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -764,3 +764,55 @@ fun Context.getLockScreenVisibilityText(type: Int) = getString( else -> R.string.nothing } ) + +fun Context.getSmsDraft(threadId: Long): String? { + val uri = Sms.Draft.CONTENT_URI + val projection = arrayOf(Sms.BODY) + val selection = "${Sms.THREAD_ID} = ?" + val selectionArgs = arrayOf(threadId.toString()) + + try { + val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor.use { + if (cursor?.moveToFirst() == true) { + return cursor.getString(0) + } + } + } catch (e: Exception) { + } + + return null +} + +fun Context.saveSmsDraft(body: String, threadId: Long) { + val uri = Sms.Draft.CONTENT_URI + val contentValues = ContentValues().apply { + put(Sms.BODY, body) + put(Sms.DATE, System.currentTimeMillis().toString()) + put(Sms.TYPE, Sms.MESSAGE_TYPE_DRAFT) + put(Sms.THREAD_ID, threadId) + } + + try { + contentResolver.insert(uri, contentValues) + } catch (e: Exception) { + } +} + +fun Context.deleteSmsDraft(threadId: Long) { + val lookupUri = Sms.Draft.CONTENT_URI + val lookupProjection = arrayOf(Sms._ID) + val lookupSelection = "${Sms.THREAD_ID} = ?" + val lookupSelectionArgs = arrayOf(threadId.toString()) + try { + val cursor = contentResolver.query(lookupUri, lookupProjection, lookupSelection, lookupSelectionArgs, null) + cursor.use { + if (cursor?.moveToFirst() == true) { + val draftId = cursor.getLong(0) + val uri = Uri.withAppendedPath(Sms.CONTENT_URI, "/${draftId}") + contentResolver.delete(uri, null, null) + } + } + } catch (e: Exception) { + } +} diff --git a/app/src/main/res/layout/item_conversation.xml b/app/src/main/res/layout/item_conversation.xml index 5fce6297..6cde1caa 100644 --- a/app/src/main/res/layout/item_conversation.xml +++ b/app/src/main/res/layout/item_conversation.xml @@ -37,12 +37,26 @@ android:textSize="@dimen/big_text_size" tools:text="John" /> + + Date: Sun, 5 Sep 2021 18:15:37 +0200 Subject: [PATCH 02/10] Now the conversation can be marked as read from the main message cab --- .../adapters/ConversationsAdapter.kt | 20 +++++++++++++++++++ app/src/main/res/menu/cab_conversations.xml | 4 ++++ 2 files changed, 24 insertions(+) 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 c895ea85..475d4ee0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -23,6 +23,7 @@ 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.markThreadMessagesRead import com.simplemobiletools.smsmessenger.helpers.refreshMessages import com.simplemobiletools.smsmessenger.models.Conversation import kotlinx.android.synthetic.main.item_conversation.view.* @@ -60,6 +61,7 @@ class ConversationsAdapter( R.id.cab_copy_number -> copyNumberToClipboard() R.id.cab_delete -> askConfirmDelete() R.id.cab_select_all -> selectAll() + R.id.cab_mark_as_read -> markAsRead() } } @@ -184,6 +186,24 @@ class ConversationsAdapter( } } + private fun markAsRead(){ + if (selectedKeys.isEmpty()) { + return + } + val conversationsMarkedAsRead = conversations.filter { selectedKeys.contains(it.hashCode()) } as ArrayList + + ensureBackgroundThread { + conversationsMarkedAsRead.forEach { + activity.markThreadMessagesRead(it.threadId) + } + activity.runOnUiThread { + refreshMessages() + finishActMode() + } + } + + } + private fun addNumberToContact() { val conversation = getSelectedItems().firstOrNull() ?: return Intent().apply { diff --git a/app/src/main/res/menu/cab_conversations.xml b/app/src/main/res/menu/cab_conversations.xml index 2be314f3..0f3acb38 100644 --- a/app/src/main/res/menu/cab_conversations.xml +++ b/app/src/main/res/menu/cab_conversations.xml @@ -29,4 +29,8 @@ android:id="@+id/cab_select_all" android:title="@string/select_all" app:showAsAction="never" /> + From 1a5f055cd9edf6bc6bac0c3ec5646860e0f4fb31 Mon Sep 17 00:00:00 2001 From: AlbertoPellitteri Date: Sun, 5 Sep 2021 18:38:35 +0200 Subject: [PATCH 03/10] small performance improvement --- .../smsmessenger/adapters/ConversationsAdapter.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 475d4ee0..252f61da 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -5,6 +5,7 @@ import android.content.Intent import android.graphics.Typeface import android.net.Uri import android.text.TextUtils +import android.util.Log import android.util.TypedValue import android.view.Menu import android.view.View @@ -191,9 +192,8 @@ class ConversationsAdapter( return } val conversationsMarkedAsRead = conversations.filter { selectedKeys.contains(it.hashCode()) } as ArrayList - ensureBackgroundThread { - conversationsMarkedAsRead.forEach { + conversationsMarkedAsRead.filter{el -> !el.read}.forEach { activity.markThreadMessagesRead(it.threadId) } activity.runOnUiThread { From 8ce253b95703dea8652cfe9aca18663ab149b27c Mon Sep 17 00:00:00 2001 From: AlbertoPellitteri Date: Mon, 6 Sep 2021 22:51:37 +0200 Subject: [PATCH 04/10] Remove unused import --- .../smsmessenger/adapters/ConversationsAdapter.kt | 1 - 1 file changed, 1 deletion(-) 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 252f61da..600b6a7a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -5,7 +5,6 @@ import android.content.Intent import android.graphics.Typeface import android.net.Uri import android.text.TextUtils -import android.util.Log import android.util.TypedValue import android.view.Menu import android.view.View From f9a71c0e0b03b48bffe4cb6e0aab2d02bef51513 Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Wed, 8 Sep 2021 15:18:03 +0200 Subject: [PATCH 05/10] keep Select All as the last cab item --- app/src/main/res/menu/cab_conversations.xml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/menu/cab_conversations.xml b/app/src/main/res/menu/cab_conversations.xml index 0f3acb38..b1afe973 100644 --- a/app/src/main/res/menu/cab_conversations.xml +++ b/app/src/main/res/menu/cab_conversations.xml @@ -25,12 +25,16 @@ android:id="@+id/cab_copy_number" android:title="@string/copy_number_to_clipboard" app:showAsAction="never" /> - + + From e28b8ddae0dae9ba0b217ab4a1db971c5f6c61f5 Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Wed, 8 Sep 2021 15:18:24 +0200 Subject: [PATCH 06/10] Update ConversationsAdapter.kt --- .../adapters/ConversationsAdapter.kt | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) 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 600b6a7a..c13136fe 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -24,6 +24,7 @@ import com.simplemobiletools.smsmessenger.R import com.simplemobiletools.smsmessenger.activities.SimpleActivity import com.simplemobiletools.smsmessenger.extensions.deleteConversation import com.simplemobiletools.smsmessenger.extensions.markThreadMessagesRead +import com.simplemobiletools.smsmessenger.extensions.markThreadMessagesUnread import com.simplemobiletools.smsmessenger.helpers.refreshMessages import com.simplemobiletools.smsmessenger.models.Conversation import kotlinx.android.synthetic.main.item_conversation.view.* @@ -61,6 +62,7 @@ class ConversationsAdapter( R.id.cab_copy_number -> copyNumberToClipboard() R.id.cab_delete -> askConfirmDelete() R.id.cab_select_all -> selectAll() + R.id.cab_mark_as_unread -> markAsUnread() R.id.cab_mark_as_read -> markAsRead() } } @@ -186,21 +188,34 @@ class ConversationsAdapter( } } - private fun markAsRead(){ + private fun markAsRead() { if (selectedKeys.isEmpty()) { return } - val conversationsMarkedAsRead = conversations.filter { selectedKeys.contains(it.hashCode()) } as ArrayList + + val conversationsMarkedAsRead = conversations.filter { selectedKeys.contains(it.hashCode()) } as ArrayList ensureBackgroundThread { - conversationsMarkedAsRead.filter{el -> !el.read}.forEach { + conversationsMarkedAsRead.filter { conversation -> !conversation.read }.forEach { activity.markThreadMessagesRead(it.threadId) } + activity.runOnUiThread { refreshMessages() finishActMode() } } + } + private fun markAsUnread() { + if (selectedKeys.isEmpty()) { + return + } + val conversationsMarkedAsUnread = conversations.filter { selectedKeys.contains(it.hashCode()) } as ArrayList + ensureBackgroundThread { + conversationsMarkedAsUnread.filter { conversation -> conversation.read }.forEach { + activity.markThreadMessagesUnread(it.threadId) + } + } } private fun addNumberToContact() { From 8ffc176d316d0f56e75bf4c9896ca221ecd17ba1 Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Wed, 8 Sep 2021 15:18:57 +0200 Subject: [PATCH 07/10] Update ConversationsAdapter.kt --- .../smsmessenger/adapters/ConversationsAdapter.kt | 1 + 1 file changed, 1 insertion(+) 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 c13136fe..7914adb3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -210,6 +210,7 @@ class ConversationsAdapter( if (selectedKeys.isEmpty()) { return } + val conversationsMarkedAsUnread = conversations.filter { selectedKeys.contains(it.hashCode()) } as ArrayList ensureBackgroundThread { conversationsMarkedAsUnread.filter { conversation -> conversation.read }.forEach { From 14ea068f73d33c93814ab671c9d7234d822c6b4c Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Wed, 8 Sep 2021 15:20:31 +0200 Subject: [PATCH 08/10] Update ConversationsAdapter.kt --- .../smsmessenger/adapters/ConversationsAdapter.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 7914adb3..09e75004 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -61,9 +61,9 @@ class ConversationsAdapter( R.id.cab_dial_number -> dialNumber() R.id.cab_copy_number -> copyNumberToClipboard() R.id.cab_delete -> askConfirmDelete() - R.id.cab_select_all -> selectAll() - R.id.cab_mark_as_unread -> markAsUnread() R.id.cab_mark_as_read -> markAsRead() + R.id.cab_mark_as_unread -> markAsUnread() + R.id.cab_select_all -> selectAll() } } From 327b7f673ac1d4d9ad20e30fdfb78e2088e6e049 Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Wed, 8 Sep 2021 20:00:28 +0200 Subject: [PATCH 09/10] fixing a compile error + some renaming --- .../smsmessenger/extensions/Context.kt | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index 6415e79d..fbe15066 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -35,9 +35,9 @@ import com.simplemobiletools.smsmessenger.interfaces.MessagesDao import com.simplemobiletools.smsmessenger.models.* import com.simplemobiletools.smsmessenger.receivers.DirectReplyReceiver import com.simplemobiletools.smsmessenger.receivers.MarkAsReadReceiver +import me.leolin.shortcutbadger.ShortcutBadger import java.util.* import kotlin.collections.ArrayList -import me.leolin.shortcutbadger.ShortcutBadger val Context.config: Config get() = Config.newInstance(applicationContext) @@ -800,19 +800,20 @@ fun Context.saveSmsDraft(body: String, threadId: Long) { } fun Context.deleteSmsDraft(threadId: Long) { - val lookupUri = Sms.Draft.CONTENT_URI - val lookupProjection = arrayOf(Sms._ID) - val lookupSelection = "${Sms.THREAD_ID} = ?" - val lookupSelectionArgs = arrayOf(threadId.toString()) + val uri = Sms.Draft.CONTENT_URI + val projection = arrayOf(Sms._ID) + val selection = "${Sms.THREAD_ID} = ?" + val selectionArgs = arrayOf(threadId.toString()) try { - val cursor = contentResolver.query(lookupUri, lookupProjection, lookupSelection, lookupSelectionArgs, null) + val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null) cursor.use { if (cursor?.moveToFirst() == true) { val draftId = cursor.getLong(0) - val uri = Uri.withAppendedPath(Sms.CONTENT_URI, "/${draftId}") - contentResolver.delete(uri, null, null) + val draftUri = Uri.withAppendedPath(Sms.CONTENT_URI, "/${draftId}") + contentResolver.delete(draftUri, null, null) } } + } catch (e: Exception) { } } From aa71a39f1bf928eb002e890a8e45d8f6eee33bec Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Wed, 8 Sep 2021 20:03:35 +0200 Subject: [PATCH 10/10] minor code cleanup + color customization fix --- .../smsmessenger/adapters/ConversationsAdapter.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 13994142..2990622a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -257,6 +257,8 @@ class ConversationsAdapter( private fun setupView(view: View, conversation: Conversation) { view.apply { val smsDraft = context.getSmsDraft(conversation.threadId) + draft_indicator.beVisibleIf(smsDraft != null) + draft_indicator.setTextColor(adjustedPrimaryColor) conversation_frame.isSelected = selectedKeys.contains(conversation.hashCode()) @@ -270,10 +272,6 @@ class ConversationsAdapter( setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.9f) } - draft_indicator.apply { - visibility = if (smsDraft != null) View.VISIBLE else View.GONE - } - conversation_date.apply { text = conversation.date.formatDateOrTime(context, true, false) setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.8f)