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, conversations: List, searchedText: String) { val searchResults = ArrayList() 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) } } } }