From b12702848ce7e8ad23023b95b5ff65d098b04724 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 7 Jan 2023 19:19:11 +0100 Subject: [PATCH] adding an initial implementation of Search at Recents tab --- .../pro/activities/MainActivity.kt | 14 +-- .../pro/activities/MimeTypesActivity.kt | 9 -- .../pro/fragments/StorageFragment.kt | 114 ++++++++++++++++-- .../filemanager/pro/helpers/Constants.kt | 11 ++ app/src/main/res/layout/storage_fragment.xml | 104 ++++++++++++---- 5 files changed, 198 insertions(+), 54 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/MainActivity.kt index 12472a67..6bea222c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/MainActivity.kt @@ -144,16 +144,12 @@ class MainActivity : SimpleActivity() { } override fun onBackPressed() { - if (getCurrentFragment() is StorageFragment) { - super.onBackPressed() - return - } - + val currentFragment = getCurrentFragment() if (main_menu.isSearchOpen) { main_menu.closeSearch() - } else if (getCurrentFragment() is RecentsFragment) { + } else if (currentFragment is RecentsFragment) { super.onBackPressed() - } else if (getCurrentFragment()!!.breadcrumbs.getItemCount() <= 1) { + } else if (currentFragment != null && currentFragment.breadcrumbs.getItemCount() <= 1) { if (!wasBackJustPressed && config.pressBackTwice) { wasBackJustPressed = true toast(R.string.press_back_again) @@ -164,8 +160,8 @@ class MainActivity : SimpleActivity() { finish() } } else { - getCurrentFragment()!!.breadcrumbs.removeBreadcrumb() - openPath(getCurrentFragment()!!.breadcrumbs.getLastItem().path) + currentFragment?.breadcrumbs?.removeBreadcrumb() ?: return + openPath(currentFragment.breadcrumbs.getLastItem().path) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/MimeTypesActivity.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/MimeTypesActivity.kt index 9e41cee4..ce0a97cb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/MimeTypesActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/activities/MimeTypesActivity.kt @@ -349,15 +349,6 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener { mimetypes_placeholder.beVisibleIf(items.isEmpty()) } - private fun getListItemsFromFileDirItems(fileDirItems: ArrayList): ArrayList { - val listItems = ArrayList() - fileDirItems.forEach { - val listItem = ListItem(it.path, it.name, false, 0, it.size, it.modified, false, false) - listItems.add(listItem) - } - return listItems - } - private fun getRecyclerAdapter() = mimetypes_list.adapter as? ItemsAdapter private fun showSortingDialog() { diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/StorageFragment.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/StorageFragment.kt index 96e32949..f64dbe61 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/StorageFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/StorageFragment.kt @@ -4,26 +4,39 @@ import android.annotation.SuppressLint import android.app.usage.StorageStatsManager import android.content.Context import android.content.Intent +import android.os.Handler import android.os.storage.StorageManager import android.provider.MediaStore import android.provider.Settings import android.util.AttributeSet import androidx.appcompat.app.AppCompatActivity import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.LOWER_ALPHA +import com.simplemobiletools.commons.helpers.SHORT_ANIMATION_DURATION import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.helpers.isOreoPlus +import com.simplemobiletools.commons.models.FileDirItem import com.simplemobiletools.filemanager.pro.R import com.simplemobiletools.filemanager.pro.activities.MimeTypesActivity import com.simplemobiletools.filemanager.pro.activities.SimpleActivity +import com.simplemobiletools.filemanager.pro.adapters.ItemsAdapter +import com.simplemobiletools.filemanager.pro.extensions.config import com.simplemobiletools.filemanager.pro.extensions.formatSizeThousand import com.simplemobiletools.filemanager.pro.helpers.* +import com.simplemobiletools.filemanager.pro.interfaces.ItemOperationsListener +import com.simplemobiletools.filemanager.pro.models.ListItem import kotlinx.android.synthetic.main.storage_fragment.view.* import java.util.* -class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { +class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), ItemOperationsListener { private val SIZE_DIVIDER = 100000 + private var allDeviceListItems = ArrayList() override fun setupFragment(activity: SimpleActivity) { + if (this.activity == null) { + this.activity = activity + } + total_space.text = String.format(context.getString(R.string.total_storage), "…") getSizes() @@ -42,41 +55,46 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage documents_holder.setOnClickListener { launchMimetypeActivity(DOCUMENTS) } archives_holder.setOnClickListener { launchMimetypeActivity(ARCHIVES) } others_holder.setOnClickListener { launchMimetypeActivity(OTHERS) } - } - override fun refreshFragment() {} + Handler().postDelayed({ + val fileDirItems = getAllFiles() + allDeviceListItems = getListItemsFromFileDirItems(fileDirItems) + setupSearchResultsAdapter() + }, 2000) + } override fun onResume(textColor: Int) { getSizes() context.updateTextColors(storage_fragment) + search_holder.setBackgroundColor(context.getProperBackgroundColor()) val properPrimaryColor = context.getProperPrimaryColor() main_storage_usage_progressbar.setIndicatorColor(properPrimaryColor) - main_storage_usage_progressbar.trackColor = properPrimaryColor.adjustAlpha(0.3f) + main_storage_usage_progressbar.trackColor = properPrimaryColor.adjustAlpha(LOWER_ALPHA) val redColor = context.resources.getColor(R.color.md_red_700) images_progressbar.setIndicatorColor(redColor) - images_progressbar.trackColor = redColor.adjustAlpha(0.3f) + images_progressbar.trackColor = redColor.adjustAlpha(LOWER_ALPHA) val greenColor = context.resources.getColor(R.color.md_green_700) videos_progressbar.setIndicatorColor(greenColor) - videos_progressbar.trackColor = greenColor.adjustAlpha(0.3f) + videos_progressbar.trackColor = greenColor.adjustAlpha(LOWER_ALPHA) val lightBlueColor = context.resources.getColor(R.color.md_light_blue_700) audio_progressbar.setIndicatorColor(lightBlueColor) - audio_progressbar.trackColor = lightBlueColor.adjustAlpha(0.3f) + audio_progressbar.trackColor = lightBlueColor.adjustAlpha(LOWER_ALPHA) val yellowColor = context.resources.getColor(R.color.md_yellow_700) documents_progressbar.setIndicatorColor(yellowColor) - documents_progressbar.trackColor = yellowColor.adjustAlpha(0.3f) + documents_progressbar.trackColor = yellowColor.adjustAlpha(LOWER_ALPHA) val tealColor = context.resources.getColor(R.color.md_teal_700) archives_progressbar.setIndicatorColor(tealColor) - archives_progressbar.trackColor = tealColor.adjustAlpha(0.3f) + archives_progressbar.trackColor = tealColor.adjustAlpha(LOWER_ALPHA) val pinkColor = context.resources.getColor(R.color.md_pink_700) others_progressbar.setIndicatorColor(pinkColor) - others_progressbar.trackColor = pinkColor.adjustAlpha(0.3f) + others_progressbar.trackColor = pinkColor.adjustAlpha(LOWER_ALPHA) } private fun launchMimetypeActivity(mimetype: String) { @@ -223,6 +241,82 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage } override fun searchQueryChanged(text: String) { + if (text.isNotEmpty()) { + if (search_holder.alpha < 1f) { + search_holder.fadeIn() + } + } else { + search_holder.animate().alpha(0f).setDuration(SHORT_ANIMATION_DURATION).withEndAction { + search_holder.beGone() + (search_results_list.adapter as? ItemsAdapter)?.updateItems(allDeviceListItems, text) + }.start() + } + if (text.isNotEmpty()) { + val filtered = allDeviceListItems.filter { it.mName.contains(text, true) }.toMutableList() as ArrayList + (search_results_list.adapter as? ItemsAdapter)?.updateItems(filtered, text) + search_placeholder.beVisibleIf(filtered.isEmpty()) + } } + + private fun setupSearchResultsAdapter() { + ItemsAdapter(context as SimpleActivity, allDeviceListItems, this, search_results_list, false, null, false) { + clickedPath((it as FileDirItem).path) + }.apply { + search_results_list.adapter = this + } + } + + private fun getAllFiles(): ArrayList { + val fileDirItems = ArrayList() + val showHidden = context?.config?.shouldShowHidden ?: return fileDirItems + val uri = MediaStore.Files.getContentUri("external") + val projection = arrayOf( + MediaStore.Files.FileColumns.DATA, + MediaStore.Files.FileColumns.DISPLAY_NAME, + MediaStore.Files.FileColumns.SIZE, + MediaStore.Files.FileColumns.DATE_MODIFIED + ) + + try { + context?.queryCursor(uri, projection) { cursor -> + try { + val name = cursor.getStringValue(MediaStore.Files.FileColumns.DISPLAY_NAME) + if (!showHidden && name.startsWith(".")) { + return@queryCursor + } + + val size = cursor.getLongValue(MediaStore.Files.FileColumns.SIZE) + if (size == 0L) { + return@queryCursor + } + + val path = cursor.getStringValue(MediaStore.Files.FileColumns.DATA) + val lastModified = cursor.getLongValue(MediaStore.Files.FileColumns.DATE_MODIFIED) * 1000 + fileDirItems.add(FileDirItem(path, name, false, 0, size, lastModified)) + } catch (e: Exception) { + } + } + } catch (e: Exception) { + context?.showErrorToast(e) + } + + return fileDirItems + } + + override fun refreshFragment() {} + + override fun deleteFiles(files: ArrayList) {} + + override fun selectedPaths(paths: ArrayList) {} + + override fun setupDateTimeFormat() {} + + override fun setupFontSize() {} + + override fun toggleFilenameVisibility() {} + + override fun columnCountChanged() {} + + override fun finishActMode() {} } diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/helpers/Constants.kt index 5af5a270..8e29fc4b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/helpers/Constants.kt @@ -3,6 +3,8 @@ package com.simplemobiletools.filemanager.pro.helpers import com.simplemobiletools.commons.helpers.TAB_FILES import com.simplemobiletools.commons.helpers.TAB_RECENT_FILES import com.simplemobiletools.commons.helpers.TAB_STORAGE_ANALYSIS +import com.simplemobiletools.commons.models.FileDirItem +import com.simplemobiletools.filemanager.pro.models.ListItem const val PATH = "path" const val MAX_COLUMN_COUNT = 15 @@ -64,3 +66,12 @@ val archiveMimeTypes = arrayListOf( "application/java-archive", "multipart/x-zip" ) + +fun getListItemsFromFileDirItems(fileDirItems: ArrayList): ArrayList { + val listItems = ArrayList() + fileDirItems.forEach { + val listItem = ListItem(it.path, it.name, false, 0, it.size, it.modified, false, false) + listItems.add(listItem) + } + return listItems +} diff --git a/app/src/main/res/layout/storage_fragment.xml b/app/src/main/res/layout/storage_fragment.xml index 05840ef0..b8bad400 100644 --- a/app/src/main/res/layout/storage_fragment.xml +++ b/app/src/main/res/layout/storage_fragment.xml @@ -9,22 +9,24 @@ + android:layout_height="match_parent" + android:fillViewport="true"> - + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:ignore="HardcodedText"> + android:paddingEnd="@dimen/activity_margin" + app:layout_constraintTop_toTopOf="parent"> + android:paddingBottom="@dimen/normal_margin" + app:layout_constraintTop_toBottomOf="@+id/free_space_holder"> @@ -108,19 +112,21 @@ + android:paddingBottom="@dimen/normal_margin" + app:layout_constraintTop_toBottomOf="@+id/images_holder"> @@ -147,19 +153,21 @@ + android:paddingBottom="@dimen/normal_margin" + app:layout_constraintTop_toBottomOf="@+id/videos_holder"> @@ -186,19 +194,21 @@ + android:paddingBottom="@dimen/normal_margin" + app:layout_constraintTop_toBottomOf="@+id/audio_holder"> @@ -225,19 +235,21 @@ + android:paddingBottom="@dimen/normal_margin" + app:layout_constraintTop_toBottomOf="@+id/documents_holder"> @@ -264,19 +276,21 @@ + android:paddingBottom="@dimen/normal_margin" + app:layout_constraintTop_toBottomOf="@+id/archives_holder"> @@ -300,6 +314,44 @@ android:max="100" app:trackThickness="2dp" /> - + + + + + + + + +