diff --git a/app/build.gradle b/app/build.gradle
index 5b9e799d..c15decc8 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -63,7 +63,7 @@ android {
}
dependencies {
- implementation 'com.github.SimpleMobileTools:Simple-Commons:cf120f1fa8'
+ implementation 'com.github.SimpleMobileTools:Simple-Commons:61f60f11eb'
implementation 'org.greenrobot:eventbus:3.3.1'
implementation 'com.github.tibbi:IndicatorFastScroll:4524cd0b61'
implementation 'com.github.tibbi:android-smsmms:33fcaf94d9'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 63b440dc..19e8b0b0 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -57,23 +57,6 @@
android:parentActivityName=".activities.MainActivity"
android:windowSoftInputMode="adjustResize" />
-
-
-
-
-
-
-
-
-
+ 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, 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)
+ }
+ }
}
private fun launchSettings() {
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt
index 33f8de21..e0b0dd48 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewConversationActivity.kt
@@ -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)
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SearchActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SearchActivity.kt
deleted file mode 100644
index 5e2f9b57..00000000
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SearchActivity.kt
+++ /dev/null
@@ -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, 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)
- }
- }
- }
-}
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt
index 6ae36730..fc86ece8 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt
@@ -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)
}
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 e970f7f4..a0ae324c 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt
@@ -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
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/VCardViewerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/VCardViewerActivity.kt
index 5db38761..8eee0efb 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/VCardViewerActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/VCardViewerActivity.kt
@@ -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
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 5f317c76..50f675dc 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -5,13 +5,53 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
-
+ android:layout_marginStart="@dimen/activity_margin"
+ android:layout_marginEnd="@dimen/activity_margin">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_search.xml b/app/src/main/res/layout/activity_search.xml
deleted file mode 100644
index 837fbed0..00000000
--- a/app/src/main/res/layout/activity_search.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/item_conversation.xml b/app/src/main/res/layout/item_conversation.xml
index fd18a9a5..60ee9815 100644
--- a/app/src/main/res/layout/item_conversation.xml
+++ b/app/src/main/res/layout/item_conversation.xml
@@ -26,7 +26,8 @@
android:layout_alignBottom="@+id/conversation_date"
android:layout_centerVertical="true"
android:layout_marginStart="@dimen/normal_margin"
- android:layout_marginEnd="@dimen/normal_margin" />
+ android:layout_marginEnd="@dimen/normal_margin"
+ tools:src="@mipmap/ic_sms_messenger" />
+ android:padding="@dimen/activity_margin">
+ android:layout_marginEnd="@dimen/normal_margin"
+ tools:src="@mipmap/ic_sms_messenger" />
-
+ app:showAsAction="always" />
-
-