move SearchActivity to be a part of MainActivity

This commit is contained in:
tibbi 2023-01-02 21:59:50 +01:00
parent 553c216997
commit c1c9cf0419
15 changed files with 218 additions and 273 deletions

View file

@ -28,7 +28,7 @@ class ConversationDetailsActivity : SimpleActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_conversation_details)
updateMaterialActivityViews(conversation_details_coordinator, participants_recyclerview, true)
updateMaterialActivityViews(conversation_details_coordinator, participants_recyclerview, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(participants_recyclerview, conversation_details_toolbar)
threadId = intent.getLongExtra(THREAD_ID, 0L)

View file

@ -12,6 +12,7 @@ import android.graphics.drawable.LayerDrawable
import android.net.Uri
import android.os.Bundle
import android.provider.Telephony
import android.text.TextUtils
import android.widget.Toast
import androidx.coordinatorlayout.widget.CoordinatorLayout
import com.simplemobiletools.commons.dialogs.FilePickerDialog
@ -22,15 +23,15 @@ import com.simplemobiletools.commons.models.Release
import com.simplemobiletools.smsmessenger.BuildConfig
import com.simplemobiletools.smsmessenger.R
import com.simplemobiletools.smsmessenger.adapters.ConversationsAdapter
import com.simplemobiletools.smsmessenger.adapters.SearchResultsAdapter
import com.simplemobiletools.smsmessenger.dialogs.ExportMessagesDialog
import com.simplemobiletools.smsmessenger.dialogs.ImportMessagesDialog
import com.simplemobiletools.smsmessenger.extensions.*
import com.simplemobiletools.smsmessenger.helpers.EXPORT_MIME_TYPE
import com.simplemobiletools.smsmessenger.helpers.MessagesExporter
import com.simplemobiletools.smsmessenger.helpers.THREAD_ID
import com.simplemobiletools.smsmessenger.helpers.THREAD_TITLE
import com.simplemobiletools.smsmessenger.helpers.*
import com.simplemobiletools.smsmessenger.models.Conversation
import com.simplemobiletools.smsmessenger.models.Events
import com.simplemobiletools.smsmessenger.models.Message
import com.simplemobiletools.smsmessenger.models.SearchResult
import kotlinx.android.synthetic.main.activity_main.*
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
@ -45,6 +46,7 @@ class MainActivity : SimpleActivity() {
private var storedTextColor = 0
private var storedFontSize = 0
private var lastSearchedText = ""
private var bus: EventBus? = null
private val smsExporter by lazy { MessagesExporter(this) }
@ -57,8 +59,7 @@ class MainActivity : SimpleActivity() {
setupOptionsMenu()
refreshMenuItems()
updateMaterialActivityViews(main_coordinator, conversations_list, true)
setupMaterialScrollListener(conversations_list, main_toolbar)
updateMaterialActivityViews(main_coordinator, conversations_list, useTransparentNavigation = true, useTopSearchMenu = true)
if (checkAppSideloading()) {
return
@ -107,6 +108,7 @@ class MainActivity : SimpleActivity() {
}
updateTextColors(main_coordinator)
search_holder.setBackgroundColor(getProperBackgroundColor())
val properPrimaryColor = getProperPrimaryColor()
no_conversations_placeholder_2.setTextColor(properPrimaryColor)
@ -127,10 +129,37 @@ class MainActivity : SimpleActivity() {
bus?.unregister(this)
}
override fun onBackPressed() {
if (search_holder.isVisible()) {
closeSearch()
} else {
super.onBackPressed()
}
}
private fun setupOptionsMenu() {
updateMenuColors()
main_toolbar_search_icon.setOnClickListener {
if (search_holder.isVisible()) {
closeSearch()
} else {
main_toolbar_search.requestFocus()
}
}
main_toolbar_search.setOnFocusChangeListener { v, hasFocus ->
if (hasFocus) {
openSearch()
}
}
main_toolbar_search.onTextChangeListener {
searchTextChanged(it)
}
main_toolbar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.search -> launchSearch()
R.id.import_messages -> tryImportMessages()
R.id.export_messages -> tryToExportMessages()
R.id.more_apps_from_us -> launchMoreAppsFromUsIntent()
@ -169,6 +198,13 @@ class MainActivity : SimpleActivity() {
storedFontSize = config.fontSize
}
private fun updateMenuColors() {
main_app_bar_layout.setBackgroundColor(getProperBackgroundColor())
main_toolbar_holder.background?.alpha = 60
main_toolbar_search.setTextColor(getProperBackgroundColor().getContrastColor())
main_toolbar_search.setHintTextColor(getProperBackgroundColor().getContrastColor().adjustAlpha(LOWER_ALPHA))
}
// while SEND_SMS and READ_SMS permissions are mandatory, READ_CONTACTS is optional. If we don't have it, we just won't be able to show the contact name in some cases
private fun askPermissions() {
handlePermission(PERMISSION_READ_SMS) {
@ -398,9 +434,77 @@ class MainActivity : SimpleActivity() {
.build()
}
private fun launchSearch() {
private fun openSearch() {
search_holder.beVisible()
main_toolbar_search_icon.setImageResource(R.drawable.ic_arrow_left_vector)
}
private fun closeSearch() {
hideKeyboard()
startActivity(Intent(applicationContext, SearchActivity::class.java))
main_toolbar_search.setText("")
search_holder.beGone()
main_toolbar_search_icon.setImageResource(R.drawable.ic_search_vector)
}
private fun searchTextChanged(text: String) {
lastSearchedText = text
search_placeholder_2.beGoneIf(text.length >= 2)
if (text.length >= 2) {
ensureBackgroundThread {
val searchQuery = "%$text%"
val messages = messagesDB.getMessagesWithText(searchQuery)
val conversations = conversationsDB.getConversationsWithText(searchQuery)
if (text == lastSearchedText) {
showSearchResults(messages, conversations, text)
}
}
} else {
search_placeholder.beVisible()
search_results_list.beGone()
}
}
private fun showSearchResults(messages: List<Message>, conversations: List<Conversation>, searchedText: String) {
val searchResults = ArrayList<SearchResult>()
conversations.forEach { conversation ->
val date = conversation.date.formatDateOrTime(this, true, true)
val searchResult = SearchResult(-1, conversation.title, conversation.phoneNumber, date, conversation.threadId, conversation.photoUri)
searchResults.add(searchResult)
}
messages.sortedByDescending { it.id }.forEach { message ->
var recipient = message.senderName
if (recipient.isEmpty() && message.participants.isNotEmpty()) {
val participantNames = message.participants.map { it.name }
recipient = TextUtils.join(", ", participantNames)
}
val date = message.date.formatDateOrTime(this, true, true)
val searchResult = SearchResult(message.id, recipient, message.body, date, message.threadId, message.senderPhotoUri)
searchResults.add(searchResult)
}
runOnUiThread {
search_results_list.beVisibleIf(searchResults.isNotEmpty())
search_placeholder.beVisibleIf(searchResults.isEmpty())
val currAdapter = search_results_list.adapter
if (currAdapter == null) {
SearchResultsAdapter(this, searchResults, search_results_list, searchedText) {
hideKeyboard()
Intent(this, ThreadActivity::class.java).apply {
putExtra(THREAD_ID, (it as SearchResult).threadId)
putExtra(THREAD_TITLE, it.title)
putExtra(SEARCHED_MESSAGE_ID, it.messageId)
startActivity(this)
}
}.apply {
search_results_list.adapter = this
}
} else {
(currAdapter as SearchResultsAdapter).updateItems(searchResults, searchedText)
}
}
}
private fun launchSettings() {

View file

@ -33,7 +33,7 @@ class NewConversationActivity : SimpleActivity() {
title = getString(R.string.new_conversation)
updateTextColors(new_conversation_holder)
updateMaterialActivityViews(new_conversation_coordinator, contacts_list, true)
updateMaterialActivityViews(new_conversation_coordinator, contacts_list, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(contacts_list, new_conversation_toolbar)
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)

View file

@ -1,146 +0,0 @@
package com.simplemobiletools.smsmessenger.activities
import android.annotation.SuppressLint
import android.app.SearchManager
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.text.TextUtils
import android.util.TypedValue
import android.view.Menu
import android.view.MenuItem
import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.smsmessenger.R
import com.simplemobiletools.smsmessenger.adapters.SearchResultsAdapter
import com.simplemobiletools.smsmessenger.extensions.conversationsDB
import com.simplemobiletools.smsmessenger.extensions.messagesDB
import com.simplemobiletools.smsmessenger.helpers.SEARCHED_MESSAGE_ID
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.Message
import com.simplemobiletools.smsmessenger.models.SearchResult
import kotlinx.android.synthetic.main.activity_search.*
class SearchActivity : SimpleActivity() {
private var mIsSearchOpen = false
private var mLastSearchedText = ""
private var mSearchMenuItem: MenuItem? = null
@SuppressLint("InlinedApi")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_search)
updateTextColors(search_holder)
search_placeholder.setTextSize(TypedValue.COMPLEX_UNIT_PX, getTextSize())
search_placeholder_2.setTextSize(TypedValue.COMPLEX_UNIT_PX, getTextSize())
setupSearch(search_toolbar.menu)
}
override fun onResume() {
super.onResume()
setupToolbar(search_toolbar, searchMenuItem = mSearchMenuItem)
}
private fun setupSearch(menu: Menu) {
val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
mSearchMenuItem = menu.findItem(R.id.search)
MenuItemCompat.setOnActionExpandListener(mSearchMenuItem, object : MenuItemCompat.OnActionExpandListener {
override fun onMenuItemActionExpand(item: MenuItem?): Boolean {
mIsSearchOpen = true
return true
}
// this triggers on device rotation too, avoid doing anything
override fun onMenuItemActionCollapse(item: MenuItem?): Boolean {
if (mIsSearchOpen) {
mIsSearchOpen = false
mLastSearchedText = ""
finish()
}
return true
}
})
mSearchMenuItem?.expandActionView()
(mSearchMenuItem?.actionView as? SearchView)?.apply {
setSearchableInfo(searchManager.getSearchableInfo(componentName))
isSubmitButtonEnabled = false
setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String) = false
override fun onQueryTextChange(newText: String): Boolean {
if (mIsSearchOpen) {
mLastSearchedText = newText
textChanged(newText)
}
return true
}
})
}
}
private fun textChanged(text: String) {
search_placeholder_2.beGoneIf(text.length >= 2)
if (text.length >= 2) {
ensureBackgroundThread {
val searchQuery = "%$text%"
val messages = messagesDB.getMessagesWithText(searchQuery)
val conversations = conversationsDB.getConversationsWithText(searchQuery)
if (text == mLastSearchedText) {
showSearchResults(messages, conversations, text)
}
}
} else {
search_placeholder.beVisible()
search_results_list.beGone()
}
}
private fun showSearchResults(messages: List<Message>, conversations: List<Conversation>, searchedText: String) {
val searchResults = ArrayList<SearchResult>()
conversations.forEach { conversation ->
val date = conversation.date.formatDateOrTime(this, true, true)
val searchResult = SearchResult(-1, conversation.title, conversation.phoneNumber, date, conversation.threadId, conversation.photoUri)
searchResults.add(searchResult)
}
messages.sortedByDescending { it.id }.forEach { message ->
var recipient = message.senderName
if (recipient.isEmpty() && message.participants.isNotEmpty()) {
val participantNames = message.participants.map { it.name }
recipient = TextUtils.join(", ", participantNames)
}
val date = message.date.formatDateOrTime(this, true, true)
val searchResult = SearchResult(message.id, recipient, message.body, date, message.threadId, message.senderPhotoUri)
searchResults.add(searchResult)
}
runOnUiThread {
search_results_list.beVisibleIf(searchResults.isNotEmpty())
search_placeholder.beVisibleIf(searchResults.isEmpty())
val currAdapter = search_results_list.adapter
if (currAdapter == null) {
SearchResultsAdapter(this, searchResults, search_results_list, searchedText) {
hideKeyboard()
Intent(this, ThreadActivity::class.java).apply {
putExtra(THREAD_ID, (it as SearchResult).threadId)
putExtra(THREAD_TITLE, it.title)
putExtra(SEARCHED_MESSAGE_ID, it.messageId)
startActivity(this)
}
}.apply {
search_results_list.adapter = this
}
} else {
(currAdapter as SearchResultsAdapter).updateItems(searchResults, searchedText)
}
}
}
}

View file

@ -25,7 +25,7 @@ class SettingsActivity : SimpleActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings)
updateMaterialActivityViews(settings_coordinator, settings_holder, true)
updateMaterialActivityViews(settings_coordinator, settings_holder, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(settings_nested_scrollview, settings_toolbar)
}

View file

@ -105,7 +105,7 @@ class ThreadActivity : SimpleActivity() {
setupOptionsMenu()
refreshMenuItems()
updateMaterialActivityViews(thread_coordinator, null, false)
updateMaterialActivityViews(thread_coordinator, null, useTransparentNavigation = false, useTopSearchMenu = false)
setupMaterialScrollListener(null, thread_toolbar)
val extras = intent.extras

View file

@ -25,7 +25,7 @@ class VCardViewerActivity : SimpleActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_vcard_viewer)
updateMaterialActivityViews(vcard_viewer_coordinator, contacts_list, true)
updateMaterialActivityViews(vcard_viewer_coordinator, contacts_list, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(contacts_list, vcard_toolbar)
val vCardUri = intent.getParcelableExtra(EXTRA_VCARD_URI) as? Uri