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" /> - - -