From 21dd815f2aaee2d0e25b5ea2fb70c6444bc9b186 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 11 Apr 2020 19:41:48 +0200 Subject: [PATCH] lets use the new Conversation model at the main screen --- .../smsmessenger/activities/MainActivity.kt | 21 +++--- .../smsmessenger/activities/ThreadActivity.kt | 2 +- ...eadsAdapter.kt => ConversationsAdapter.kt} | 74 +++++++++---------- .../smsmessenger/extensions/Context.kt | 30 +++++++- .../smsmessenger/models/Conversation.kt | 2 +- app/src/main/res/layout/activity_main.xml | 10 +-- ...{item_thread.xml => item_conversation.xml} | 26 +++---- ...{cab_threads.xml => cab_conversations.xml} | 0 8 files changed, 92 insertions(+), 73 deletions(-) rename app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/{ThreadsAdapter.kt => ConversationsAdapter.kt} (54%) rename app/src/main/res/layout/{item_thread.xml => item_conversation.xml} (72%) rename app/src/main/res/menu/{cab_threads.xml => cab_conversations.xml} (100%) 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 0e1d4d45..d929e7a0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -15,14 +15,13 @@ import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.FAQItem import com.simplemobiletools.smsmessenger.BuildConfig import com.simplemobiletools.smsmessenger.R -import com.simplemobiletools.smsmessenger.adapters.ThreadsAdapter +import com.simplemobiletools.smsmessenger.adapters.ConversationsAdapter import com.simplemobiletools.smsmessenger.extensions.config -import com.simplemobiletools.smsmessenger.extensions.getMessages -import com.simplemobiletools.smsmessenger.extensions.getThreadTitle +import com.simplemobiletools.smsmessenger.extensions.getConversations import com.simplemobiletools.smsmessenger.helpers.THREAD_ID import com.simplemobiletools.smsmessenger.helpers.THREAD_TITLE +import com.simplemobiletools.smsmessenger.models.Conversation import com.simplemobiletools.smsmessenger.models.Events -import com.simplemobiletools.smsmessenger.models.Message import kotlinx.android.synthetic.main.activity_main.* import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe @@ -62,7 +61,7 @@ class MainActivity : SimpleActivity() { } } - messages_fab.setOnClickListener { + conversations_fab.setOnClickListener { Intent(this, NewMessageActivity::class.java).apply { startActivity(this) } @@ -72,7 +71,7 @@ class MainActivity : SimpleActivity() { override fun onResume() { super.onResume() if (storedTextColor != config.textColor) { - (messages_list.adapter as? ThreadsAdapter)?.updateTextColor(config.textColor) + (conversations_list.adapter as? ConversationsAdapter)?.updateTextColor(config.textColor) } updateTextColors(main_coordinator) @@ -135,16 +134,16 @@ class MainActivity : SimpleActivity() { private fun initMessenger() { storeStateVariables() ensureBackgroundThread { - val messages = getMessages() + val conversations = getConversations() runOnUiThread { - ThreadsAdapter(this, messages, messages_list, messages_fastscroller) { + ConversationsAdapter(this, conversations, conversations_list, conversations_fastscroller) { Intent(this, ThreadActivity::class.java).apply { - putExtra(THREAD_ID, (it as Message).thread) - putExtra(THREAD_TITLE, it.participants.getThreadTitle()) + putExtra(THREAD_ID, (it as Conversation).id) + putExtra(THREAD_TITLE, it.title) startActivity(this) } }.apply { - messages_list.adapter = this + conversations_list.adapter = this } } } 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 20081625..9a6902cd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -190,7 +190,7 @@ class ThreadActivity : SimpleActivity() { private fun askConfirmDelete() { ConfirmationDialog(this, getString(R.string.delete_whole_conversation_confirmation)) { - deleteThread(threadId) + deleteConversation(threadId) refreshMessages() finish() } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt similarity index 54% rename from app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadsAdapter.kt rename to app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt index ae7c02a5..81ae45c0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ThreadsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ConversationsAdapter.kt @@ -14,15 +14,14 @@ 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.deleteThread -import com.simplemobiletools.smsmessenger.extensions.getThreadTitle +import com.simplemobiletools.smsmessenger.extensions.deleteConversation import com.simplemobiletools.smsmessenger.extensions.loadImage import com.simplemobiletools.smsmessenger.helpers.refreshMessages -import com.simplemobiletools.smsmessenger.models.Message -import kotlinx.android.synthetic.main.item_thread.view.* +import com.simplemobiletools.smsmessenger.models.Conversation +import kotlinx.android.synthetic.main.item_conversation.view.* -class ThreadsAdapter( - activity: SimpleActivity, var threads: ArrayList, +class ConversationsAdapter( + activity: SimpleActivity, var conversations: ArrayList, recyclerView: MyRecyclerView, fastScroller: FastScroller, itemClick: (Any) -> Unit @@ -32,7 +31,7 @@ class ThreadsAdapter( setupDragListener(true) } - override fun getActionMenuId() = R.menu.cab_threads + override fun getActionMenuId() = R.menu.cab_conversations override fun prepareActionMode(menu: Menu) {} @@ -47,29 +46,29 @@ class ThreadsAdapter( } } - override fun getSelectableItemCount() = threads.size + override fun getSelectableItemCount() = conversations.size override fun getIsItemSelectable(position: Int) = true - override fun getItemSelectionKey(position: Int) = threads.getOrNull(position)?.id + override fun getItemSelectionKey(position: Int) = conversations.getOrNull(position)?.id - override fun getItemKeyPosition(key: Int) = threads.indexOfFirst { it.id == key } + override fun getItemKeyPosition(key: Int) = conversations.indexOfFirst { it.id == key } override fun onActionModeCreated() {} override fun onActionModeDestroyed() {} - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_thread, parent) + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_conversation, parent) override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val message = threads[position] - holder.bindView(message, true, true) { itemView, layoutPosition -> - setupView(itemView, message) + val conversation = conversations[position] + holder.bindView(conversation, true, true) { itemView, layoutPosition -> + setupView(itemView, conversation) } bindViewHolder(holder) } - override fun getItemCount() = threads.size + override fun getItemCount() = conversations.size private fun askConfirmDelete() { val itemsCnt = selectedKeys.size @@ -80,25 +79,25 @@ class ThreadsAdapter( ConfirmationDialog(activity, question) { ensureBackgroundThread { - deleteThreads() + deleteConversations() } } } - private fun deleteThreads() { + private fun deleteConversations() { if (selectedKeys.isEmpty()) { return } - val threadsToRemove = threads.filter { selectedKeys.contains(it.id) } as ArrayList + val conversationsToRemove = conversations.filter { selectedKeys.contains(it.id) } as ArrayList val positions = getSelectedItemPositions() - threadsToRemove.forEach { - activity.deleteThread(it.thread) + conversationsToRemove.forEach { + activity.deleteConversation(it.id) } - threads.removeAll(threadsToRemove) + conversations.removeAll(conversationsToRemove) activity.runOnUiThread { - if (threadsToRemove.isEmpty()) { + if (conversationsToRemove.isEmpty()) { refreshMessages() finishActMode() } else { @@ -110,34 +109,33 @@ class ThreadsAdapter( override fun onViewRecycled(holder: ViewHolder) { super.onViewRecycled(holder) if (!activity.isDestroyed && !activity.isFinishing) { - Glide.with(activity).clear(holder.itemView.thread_image) + Glide.with(activity).clear(holder.itemView.conversation_image) } } - private fun setupView(view: View, message: Message) { + private fun setupView(view: View, conversation: Conversation) { view.apply { - thread_frame.isSelected = selectedKeys.contains(message.id) + conversation_frame.isSelected = selectedKeys.contains(conversation.id) - thread_address.text = message.participants.getThreadTitle() - thread_body_short.text = message.body - thread_date.text = message.date.formatDateOrTime(context, true) + conversation_address.text = conversation.title + conversation_body_short.text = conversation.snippet + conversation_date.text = conversation.date.formatDateOrTime(context, true) - if (message.read) { - thread_address.setTypeface(null, Typeface.NORMAL) - thread_body_short.setTypeface(null, Typeface.NORMAL) - thread_body_short.alpha = 0.7f + if (conversation.read) { + conversation_address.setTypeface(null, Typeface.NORMAL) + conversation_body_short.setTypeface(null, Typeface.NORMAL) + conversation_body_short.alpha = 0.7f } else { - thread_address.setTypeface(null, Typeface.BOLD) - thread_body_short.setTypeface(null, Typeface.BOLD) - thread_body_short.alpha = 1f + conversation_address.setTypeface(null, Typeface.BOLD) + conversation_body_short.setTypeface(null, Typeface.BOLD) + conversation_body_short.alpha = 1f } - arrayListOf(thread_address, thread_body_short, thread_date).forEach { + arrayListOf(conversation_address, conversation_body_short, conversation_date).forEach { it.setTextColor(textColor) } - val participant = message.participants.first() - context.loadImage(participant.photoUri, thread_image, participant.name) + context.loadImage(conversation.photoUri, conversation_image, conversation.title) } } } 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 55370061..2f6e946b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -154,8 +154,10 @@ fun Context.getConversations(): ArrayList { Threads.RECIPIENT_IDS ) + val selection = "${Threads.ARCHIVED} = ?" + val selectionArgs = arrayOf("0") val conversations = ArrayList() - queryCursor(uri, projection, null, null, showErrors = true) { cursor -> + queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> val id = cursor.getIntValue(Threads._ID) val snippet = cursor.getStringValue(Threads.SNIPPET) ?: "" var date = cursor.getLongValue(Threads.DATE) @@ -169,7 +171,8 @@ fun Context.getConversations(): ArrayList { val phoneNumbers = getThreadPhoneNumbers(recipientIds) val names = getThreadContactNames(phoneNumbers) val title = TextUtils.join(", ", names.toTypedArray()) - val conversation = Conversation(id, snippet, date.toInt(), read, title) + val photoUri = if (phoneNumbers.size == 1) getPhotoUriFromPhoneNumber(phoneNumbers.first()) else "" + val conversation = Conversation(id, snippet, date.toInt(), read, title, photoUri) conversations.add(conversation) } return conversations @@ -339,7 +342,6 @@ fun Context.getNameAndPhotoFromPhoneNumber(number: String): NamePhoto? { return NamePhoto(number, null) } - fun Context.getNameFromPhoneNumber(number: String): String { val uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)) val projection = arrayOf( @@ -360,6 +362,26 @@ fun Context.getNameFromPhoneNumber(number: String): String { return number } +fun Context.getPhotoUriFromPhoneNumber(number: String): String { + val uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)) + val projection = arrayOf( + PhoneLookup.PHOTO_URI + ) + + try { + val cursor = contentResolver.query(uri, projection, null, null, null) + cursor.use { + if (cursor?.moveToFirst() == true) { + return cursor.getStringValue(PhoneLookup.PHOTO_URI) ?: "" + } + } + } catch (e: Exception) { + showErrorToast(e) + } + + return "" +} + fun Context.getContactNames(): List { val contacts = ArrayList() val uri = ContactsContract.Data.CONTENT_URI @@ -449,7 +471,7 @@ fun Context.insertNewSMS(address: String, subject: String, body: String, date: L contentResolver.insert(uri, contentValues) } -fun Context.deleteThread(id: Int) { +fun Context.deleteConversation(id: Int) { val uri = Sms.CONTENT_URI val selection = "${Sms.THREAD_ID} = ?" val selectionArgs = arrayOf(id.toString()) diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt index d5d59713..d93a1dee 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Conversation.kt @@ -1,3 +1,3 @@ package com.simplemobiletools.smsmessenger.models -data class Conversation(val id: Int, val snippet: String, val date: Int, val read: Boolean, val title: String) +data class Conversation(val id: Int, val snippet: String, val date: Int, val read: Boolean, val title: String, val photoUri: String) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 960e005b..6b3c8d12 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -11,7 +11,7 @@ android:layout_height="match_parent"> @@ -34,7 +34,7 @@ diff --git a/app/src/main/res/menu/cab_threads.xml b/app/src/main/res/menu/cab_conversations.xml similarity index 100% rename from app/src/main/res/menu/cab_threads.xml rename to app/src/main/res/menu/cab_conversations.xml