show search results in a recyclerview list
This commit is contained in:
parent
fbe46a55a8
commit
33a8b498f3
|
@ -56,7 +56,7 @@ android {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'com.simplemobiletools:commons:5.33.31'
|
implementation 'com.simplemobiletools:commons:5.33.32'
|
||||||
implementation 'org.greenrobot:eventbus:3.2.0'
|
implementation 'org.greenrobot:eventbus:3.2.0'
|
||||||
implementation 'com.klinkerapps:android-smsmms:5.2.6'
|
implementation 'com.klinkerapps:android-smsmms:5.2.6'
|
||||||
implementation 'com.github.tibbi:IndicatorFastScroll:c3de1d040a'
|
implementation 'com.github.tibbi:IndicatorFastScroll:c3de1d040a'
|
||||||
|
|
|
@ -3,6 +3,7 @@ package com.simplemobiletools.smsmessenger.activities
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.app.SearchManager
|
import android.app.SearchManager
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
|
@ -11,8 +12,11 @@ import androidx.core.view.MenuItemCompat
|
||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
||||||
import com.simplemobiletools.smsmessenger.R
|
import com.simplemobiletools.smsmessenger.R
|
||||||
|
import com.simplemobiletools.smsmessenger.adapters.SearchResultsAdapter
|
||||||
import com.simplemobiletools.smsmessenger.extensions.conversationsDB
|
import com.simplemobiletools.smsmessenger.extensions.conversationsDB
|
||||||
import com.simplemobiletools.smsmessenger.extensions.messagesDB
|
import com.simplemobiletools.smsmessenger.extensions.messagesDB
|
||||||
|
import com.simplemobiletools.smsmessenger.helpers.THREAD_ID
|
||||||
|
import com.simplemobiletools.smsmessenger.helpers.THREAD_TITLE
|
||||||
import com.simplemobiletools.smsmessenger.models.SearchResult
|
import com.simplemobiletools.smsmessenger.models.SearchResult
|
||||||
import kotlinx.android.synthetic.main.activity_search.*
|
import kotlinx.android.synthetic.main.activity_search.*
|
||||||
|
|
||||||
|
@ -83,18 +87,30 @@ class SearchActivity : SimpleActivity() {
|
||||||
if (text == mLastSearchedText) {
|
if (text == mLastSearchedText) {
|
||||||
val searchResults = ArrayList<SearchResult>()
|
val searchResults = ArrayList<SearchResult>()
|
||||||
conversations.forEach { conversation ->
|
conversations.forEach { conversation ->
|
||||||
val searchResult = SearchResult(conversation.title, conversation.phoneNumber, conversation.date, conversation.threadId)
|
val date = conversation.date.formatDateOrTime(this, true, true)
|
||||||
|
val searchResult = SearchResult(conversation.title, conversation.phoneNumber, date, conversation.threadId)
|
||||||
searchResults.add(searchResult)
|
searchResults.add(searchResult)
|
||||||
}
|
}
|
||||||
|
|
||||||
messages.forEach { message ->
|
messages.forEach { message ->
|
||||||
val searchResult = SearchResult(message.senderName, message.body, message.date, message.threadId)
|
val date = message.date.formatDateOrTime(this, true, true)
|
||||||
|
val searchResult = SearchResult(message.senderName, message.body, date, message.threadId)
|
||||||
searchResults.add(searchResult)
|
searchResults.add(searchResult)
|
||||||
}
|
}
|
||||||
|
|
||||||
runOnUiThread {
|
runOnUiThread {
|
||||||
search_results_list.beVisibleIf(searchResults.isNotEmpty())
|
search_results_list.beVisibleIf(searchResults.isNotEmpty())
|
||||||
search_placeholder.beVisibleIf(searchResults.isEmpty())
|
search_placeholder.beVisibleIf(searchResults.isEmpty())
|
||||||
|
|
||||||
|
SearchResultsAdapter(this, searchResults, search_results_list) {
|
||||||
|
Intent(this, ThreadActivity::class.java).apply {
|
||||||
|
putExtra(THREAD_ID, (it as SearchResult).threadId)
|
||||||
|
putExtra(THREAD_TITLE, it.title)
|
||||||
|
startActivity(this)
|
||||||
|
}
|
||||||
|
}.apply {
|
||||||
|
search_results_list.adapter = this
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -232,7 +232,7 @@ class ConversationsAdapter(activity: SimpleActivity, var conversations: ArrayLis
|
||||||
}
|
}
|
||||||
|
|
||||||
conversation_date.apply {
|
conversation_date.apply {
|
||||||
text = conversation.date.formatDateOrTime(context, true)
|
text = conversation.date.formatDateOrTime(context, true, false)
|
||||||
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.8f)
|
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.8f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
package com.simplemobiletools.smsmessenger.adapters
|
||||||
|
|
||||||
|
import android.util.TypedValue
|
||||||
|
import android.view.Menu
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
|
||||||
|
import com.simplemobiletools.commons.extensions.getTextSize
|
||||||
|
import com.simplemobiletools.commons.views.MyRecyclerView
|
||||||
|
import com.simplemobiletools.smsmessenger.R
|
||||||
|
import com.simplemobiletools.smsmessenger.activities.SimpleActivity
|
||||||
|
import com.simplemobiletools.smsmessenger.models.SearchResult
|
||||||
|
import kotlinx.android.synthetic.main.item_search_result.view.*
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class SearchResultsAdapter(activity: SimpleActivity, var searchResults: ArrayList<SearchResult>, recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) :
|
||||||
|
MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
|
||||||
|
private var fontSize = activity.getTextSize()
|
||||||
|
|
||||||
|
override fun getActionMenuId() = 0
|
||||||
|
|
||||||
|
override fun prepareActionMode(menu: Menu) {}
|
||||||
|
|
||||||
|
override fun actionItemPressed(id: Int) {}
|
||||||
|
|
||||||
|
override fun getSelectableItemCount() = searchResults.size
|
||||||
|
|
||||||
|
override fun getIsItemSelectable(position: Int) = false
|
||||||
|
|
||||||
|
override fun getItemSelectionKey(position: Int) = searchResults.getOrNull(position)?.hashCode()
|
||||||
|
|
||||||
|
override fun getItemKeyPosition(key: Int) = searchResults.indexOfFirst { it.hashCode() == key }
|
||||||
|
|
||||||
|
override fun onActionModeCreated() {}
|
||||||
|
|
||||||
|
override fun onActionModeDestroyed() {}
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_search_result, parent)
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
|
val searchResult = searchResults[position]
|
||||||
|
holder.bindView(searchResult, true, false) { itemView, layoutPosition ->
|
||||||
|
setupView(itemView, searchResult)
|
||||||
|
}
|
||||||
|
bindViewHolder(holder)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItemCount() = searchResults.size
|
||||||
|
|
||||||
|
private fun setupView(view: View, searchResult: SearchResult) {
|
||||||
|
view.apply {
|
||||||
|
search_result_title.apply {
|
||||||
|
text = searchResult.title
|
||||||
|
setTextColor(textColor)
|
||||||
|
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 1.2f)
|
||||||
|
}
|
||||||
|
|
||||||
|
search_result_snippet.apply {
|
||||||
|
text = searchResult.snippet
|
||||||
|
setTextColor(textColor)
|
||||||
|
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.9f)
|
||||||
|
}
|
||||||
|
|
||||||
|
search_result_date.apply {
|
||||||
|
text = searchResult.date
|
||||||
|
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 0.8f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -42,8 +42,10 @@ import kotlinx.android.synthetic.main.item_thread_error.view.*
|
||||||
import kotlinx.android.synthetic.main.item_thread_sending.view.*
|
import kotlinx.android.synthetic.main.item_thread_sending.view.*
|
||||||
import kotlinx.android.synthetic.main.item_thread_success.view.*
|
import kotlinx.android.synthetic.main.item_thread_success.view.*
|
||||||
|
|
||||||
class ThreadAdapter(activity: SimpleActivity, var messages: ArrayList<ThreadItem>, recyclerView: MyRecyclerView, fastScroller: FastScroller,
|
class ThreadAdapter(
|
||||||
itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
|
activity: SimpleActivity, var messages: ArrayList<ThreadItem>, recyclerView: MyRecyclerView, fastScroller: FastScroller,
|
||||||
|
itemClick: (Any) -> Unit
|
||||||
|
) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
|
||||||
private val roundedCornersRadius = resources.getDimension(R.dimen.normal_margin).toInt()
|
private val roundedCornersRadius = resources.getDimension(R.dimen.normal_margin).toInt()
|
||||||
private var fontSize = activity.getTextSize()
|
private var fontSize = activity.getTextSize()
|
||||||
|
|
||||||
|
@ -329,7 +331,7 @@ class ThreadAdapter(activity: SimpleActivity, var messages: ArrayList<ThreadItem
|
||||||
private fun setupDateTime(view: View, dateTime: ThreadDateTime) {
|
private fun setupDateTime(view: View, dateTime: ThreadDateTime) {
|
||||||
view.apply {
|
view.apply {
|
||||||
thread_date_time.apply {
|
thread_date_time.apply {
|
||||||
text = dateTime.date.formatDateOrTime(context, false)
|
text = dateTime.date.formatDateOrTime(context, false, false)
|
||||||
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
|
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
|
||||||
}
|
}
|
||||||
thread_date_time.setTextColor(textColor)
|
thread_date_time.setTextColor(textColor)
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
package com.simplemobiletools.smsmessenger.models
|
package com.simplemobiletools.smsmessenger.models
|
||||||
|
|
||||||
data class SearchResult(val title: String, val snippet: String, val date: Int, val threadId: Long)
|
data class SearchResult(val title: String, val snippet: String, val date: String, val threadId: Long)
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/search_result_holder"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:padding="@dimen/normal_margin">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/search_result_title"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_toStartOf="@+id/search_result_date"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:paddingEnd="@dimen/activity_margin"
|
||||||
|
android:textSize="@dimen/big_text_size"
|
||||||
|
tools:text="John" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/search_result_snippet"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@+id/search_result_title"
|
||||||
|
android:alpha="0.7"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:paddingEnd="@dimen/activity_margin"
|
||||||
|
android:textSize="@dimen/big_text_size"
|
||||||
|
tools:text="Hey buddy!" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/search_result_date"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:layout_marginTop="@dimen/tiny_margin"
|
||||||
|
android:alpha="0.7"
|
||||||
|
android:textSize="@dimen/smaller_text_size"
|
||||||
|
tools:text="08/02/2021" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
Loading…
Reference in New Issue