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 d50548d9..b21d77ca 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 dd1d60e2..2990622a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -23,10 +23,11 @@ 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.helpers.refreshMessages import com.simplemobiletools.smsmessenger.models.Conversation -import com.simplemobiletools.smsmessenger.models.Events import kotlinx.android.synthetic.main.item_conversation.view.* class ConversationsAdapter( @@ -61,8 +62,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_read -> markAsRead() R.id.cab_mark_as_unread -> markAsUnread() + R.id.cab_select_all -> selectAll() } } @@ -187,14 +189,15 @@ class ConversationsAdapter( } } - private fun markAsUnread() { + private fun markAsRead() { if (selectedKeys.isEmpty()) { return } - val conversationsMarkedAsUnread = conversations.filter { selectedKeys.contains(it.hashCode()) } as ArrayList + + val conversationsMarkedAsRead = conversations.filter { selectedKeys.contains(it.hashCode()) } as ArrayList ensureBackgroundThread { - conversationsMarkedAsUnread.filter { conversation -> conversation.read }.forEach { - activity.markThreadMessagesUnread(it.threadId) + conversationsMarkedAsRead.filter { conversation -> !conversation.read }.forEach { + activity.markThreadMessagesRead(it.threadId) } activity.runOnUiThread { @@ -204,6 +207,19 @@ class ConversationsAdapter( } } + 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() { val conversation = getSelectedItems().firstOrNull() ?: return Intent().apply { @@ -240,6 +256,10 @@ 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()) conversation_address.apply { @@ -248,7 +268,7 @@ class ConversationsAdapter( } conversation_body_short.apply { - text = conversation.snippet + text = smsDraft ?: conversation.snippet setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.9f) } 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 0758d60d..93076e75 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 import java.text.Normalizer val Context.config: Config get() = Config.newInstance(applicationContext) @@ -776,6 +776,58 @@ fun Context.removeDiacriticsIfNeeded(text: String): String { return msg } +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 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(uri, projection, selection, selectionArgs, null) + cursor.use { + if (cursor?.moveToFirst() == true) { + val draftId = cursor.getLong(0) + val draftUri = Uri.withAppendedPath(Sms.CONTENT_URI, "/${draftId}") + contentResolver.delete(draftUri, null, null) + } + } + } catch (e: Exception) { + } +} + fun Context.updateLastConversationMessage(threadId: Long) { val uri = Threads.CONTENT_URI val selection = "${Threads._ID} = ?" 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" /> + + +