diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 25f4250ff..a95a3ba3b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -36,6 +36,14 @@ android:name=".activities.MainActivity" android:resizeableActivity="true"> + + + + + + diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt index fb3de0bde..5fff99950 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt @@ -1,7 +1,9 @@ package com.simplemobiletools.gallery.pro.activities import android.app.Activity +import android.app.SearchManager import android.content.ClipData +import android.content.Context import android.content.Intent import android.net.Uri import android.os.Bundle @@ -12,6 +14,8 @@ import android.view.MenuItem import android.view.ViewGroup import android.widget.FrameLayout import android.widget.Toast +import androidx.appcompat.widget.SearchView +import androidx.core.view.MenuItemCompat import androidx.recyclerview.widget.RecyclerView import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.CreateNewFolderDialog @@ -61,6 +65,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { private var mIsPasswordProtectionPending = false private var mWasProtectionHandled = false private var mShouldStopFetching = false + private var mIsSearchOpen = false private var mLatestMediaId = 0L private var mLatestMediaDateId = 0L private var mCurrentPathPrefix = "" // used at "Group direct subfolders" for navigation @@ -68,6 +73,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { private var mLastMediaHandler = Handler() private var mTempShowHiddenHandler = Handler() private var mZoomListener: MyRecyclerView.MyZoomListener? = null + private var mSearchMenuItem: MenuItem? = null private var mDirs = ArrayList() private var mStoredAnimateGifs = true @@ -218,6 +224,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { override fun onStop() { super.onStop() + mSearchMenuItem?.collapseActionView() + if (config.temporarilyShowHidden || config.tempSkipDeleteConfirmation) { mTempShowHiddenHandler.postDelayed({ config.temporarilyShowHidden = false @@ -268,6 +276,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { findItem(R.id.reduce_column_count).isVisible = config.viewTypeFolders == VIEW_TYPE_GRID && config.dirColumnCnt > 1 findItem(R.id.hide_the_recycle_bin).isVisible = useBin && config.showRecycleBinAtFolders findItem(R.id.show_the_recycle_bin).isVisible = useBin && !config.showRecycleBinAtFolders + setupSearch(this) } } @@ -279,7 +288,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { - R.id.search -> launchSearchActivity() R.id.sort -> showSortingDialog() R.id.filter -> showFilterMediaDialog() R.id.open_camera -> launchCamera() @@ -323,6 +331,43 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { } } + private fun setupSearch(menu: Menu) { + val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager + mSearchMenuItem = menu.findItem(R.id.search) + (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) { + setupAdapter(mDirs, newText) + } + return true + } + }) + } + + MenuItemCompat.setOnActionExpandListener(mSearchMenuItem, object : MenuItemCompat.OnActionExpandListener { + override fun onMenuItemActionExpand(item: MenuItem?): Boolean { + mIsSearchOpen = true + directories_refresh_layout.isEnabled = false + return true + } + + // this triggers on device rotation too, avoid doing anything + override fun onMenuItemActionCollapse(item: MenuItem?): Boolean { + if (mIsSearchOpen) { + mIsSearchOpen = false + directories_refresh_layout.isEnabled = config.enablePullToRefresh + setupAdapter(mDirs, "") + } + return true + } + }) + } + private fun startNewPhotoFetcher() { if (isNougatPlus()) { val photoFetcher = NewPhotoFetcher() diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 0d9b32e12..a7a56c606 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -5,7 +5,8 @@ android:id="@+id/search" android:icon="@drawable/ic_search" android:title="@string/search" - app:showAsAction="always"/> + app:actionViewClass="androidx.appcompat.widget.SearchView" + app:showAsAction="collapseActionView|always"/>