From 4caf77bc9b73f0eb608cd51de0808f7b7ab734e8 Mon Sep 17 00:00:00 2001 From: fatih ergin Date: Wed, 9 Aug 2023 18:23:19 +0300 Subject: [PATCH] migrate fragments to viewbinding --- .../pro/fragments/ItemsFragment.kt | 194 +++++++------- .../pro/fragments/MyViewPagerFragment.kt | 27 +- .../pro/fragments/RecentsFragment.kt | 58 +++-- .../pro/fragments/StorageFragment.kt | 236 ++++++++++-------- 4 files changed, 292 insertions(+), 223 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/ItemsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/ItemsFragment.kt index caa8492b..0aa811f0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/ItemsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/ItemsFragment.kt @@ -17,6 +17,7 @@ import com.simplemobiletools.filemanager.pro.R import com.simplemobiletools.filemanager.pro.activities.MainActivity import com.simplemobiletools.filemanager.pro.activities.SimpleActivity import com.simplemobiletools.filemanager.pro.adapters.ItemsAdapter +import com.simplemobiletools.filemanager.pro.databinding.ItemsFragmentBinding import com.simplemobiletools.filemanager.pro.dialogs.CreateNewItemDialog import com.simplemobiletools.filemanager.pro.extensions.config import com.simplemobiletools.filemanager.pro.extensions.isPathOnRoot @@ -24,10 +25,10 @@ import com.simplemobiletools.filemanager.pro.helpers.MAX_COLUMN_COUNT import com.simplemobiletools.filemanager.pro.helpers.RootHelpers import com.simplemobiletools.filemanager.pro.interfaces.ItemOperationsListener import com.simplemobiletools.filemanager.pro.models.ListItem -import kotlinx.android.synthetic.main.items_fragment.view.* import java.io.File -class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), ItemOperationsListener, +class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), + ItemOperationsListener, Breadcrumbs.BreadcrumbsListener { private var showHidden = false private var lastSearchedText = "" @@ -36,17 +37,26 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF private var storedItems = ArrayList() private var itemsIgnoringSearch = ArrayList() + private lateinit var binding: ItemsFragmentBinding + + override fun onFinishInflate() { + super.onFinishInflate() + binding = ItemsFragmentBinding.bind(this) + innerBinding = ItemsInnerBinding(binding) + } override fun setupFragment(activity: SimpleActivity) { if (this.activity == null) { this.activity = activity - breadcrumbs.listener = this@ItemsFragment - items_swipe_refresh.setOnRefreshListener { refreshFragment() } - items_fab.setOnClickListener { - if (isCreateDocumentIntent) { - (activity as MainActivity).createDocumentConfirmed(currentPath) - } else { - createNewItem() + binding.apply { + breadcrumbs.listener = this@ItemsFragment + itemsSwipeRefresh.setOnRefreshListener { refreshFragment() } + itemsFab.setOnClickListener { + if (isCreateDocumentIntent) { + (activity as MainActivity).createDocumentConfirmed(currentPath) + } else { + createNewItem() + } } } } @@ -60,22 +70,24 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF initDrawables() } - val properPrimaryColor = context!!.getProperPrimaryColor() - items_fastscroller.updateColors(properPrimaryColor) - progress_bar.setIndicatorColor(properPrimaryColor) - progress_bar.trackColor = properPrimaryColor.adjustAlpha(LOWER_ALPHA) + binding.apply { + val properPrimaryColor = context!!.getProperPrimaryColor() + itemsFastscroller.updateColors(properPrimaryColor) + progressBar.setIndicatorColor(properPrimaryColor) + progressBar.trackColor = properPrimaryColor.adjustAlpha(LOWER_ALPHA) - if (currentPath != "") { - breadcrumbs.updateColor(textColor) + if (currentPath != "") { + breadcrumbs.updateColor(textColor) + } + + itemsSwipeRefresh.isEnabled = lastSearchedText.isEmpty() && activity?.config?.enablePullToRefresh != false } - - items_swipe_refresh.isEnabled = lastSearchedText.isEmpty() && activity?.config?.enablePullToRefresh != false } override fun setupFontSize() { getRecyclerAdapter()?.updateFontSizes() if (currentPath != "") { - breadcrumbs.updateFontSize(context!!.getTextSize(), false) + binding.breadcrumbs.updateFontSize(context!!.getTextSize(), false) } } @@ -133,18 +145,18 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF private fun addItems(items: ArrayList, forceRefresh: Boolean = false) { activity?.runOnUiThread { - items_swipe_refresh?.isRefreshing = false - breadcrumbs.setBreadcrumb(currentPath) + binding.itemsSwipeRefresh?.isRefreshing = false + binding.breadcrumbs.setBreadcrumb(currentPath) if (!forceRefresh && items.hashCode() == storedItems.hashCode()) { return@runOnUiThread } storedItems = items - if (items_list.adapter == null) { - breadcrumbs.updateFontSize(context!!.getTextSize(), true) + if (binding.itemsList.adapter == null) { + binding.breadcrumbs.updateFontSize(context!!.getTextSize(), true) } - ItemsAdapter(activity as SimpleActivity, storedItems, this, items_list, isPickMultipleIntent, items_swipe_refresh) { + ItemsAdapter(activity as SimpleActivity, storedItems, this, binding.itemsList, isPickMultipleIntent, binding.itemsSwipeRefresh) { if ((it as? ListItem)?.isSectionTitle == true) { openDirectory(it.mPath) searchClosed() @@ -153,11 +165,11 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF } }.apply { setupZoomListener(zoomListener) - items_list.adapter = this + binding.itemsList.adapter = this } if (context.areSystemAnimationsEnabled) { - items_list.scheduleLayoutAnimation() + binding.itemsList.scheduleLayoutAnimation() } getRecyclerLayoutManager().onRestoreInstanceState(scrollStates[currentPath]) @@ -166,7 +178,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF private fun getScrollState() = getRecyclerLayoutManager().onSaveInstanceState() - private fun getRecyclerLayoutManager() = (items_list.layoutManager as MyGridLayoutManager) + private fun getRecyclerLayoutManager() = (binding.itemsList.layoutManager as MyGridLayoutManager) @SuppressLint("NewApi") private fun getItems(path: String, callback: (originalPath: String, items: ArrayList) -> Unit) { @@ -295,60 +307,64 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF return } - items_swipe_refresh.isEnabled = text.isEmpty() && activity?.config?.enablePullToRefresh != false - when { - text.isEmpty() -> { - items_fastscroller.beVisible() - getRecyclerAdapter()?.updateItems(itemsIgnoringSearch) - items_placeholder.beGone() - items_placeholder_2.beGone() - hideProgressBar() - } - text.length == 1 -> { - items_fastscroller.beGone() - items_placeholder.beVisible() - items_placeholder_2.beVisible() - hideProgressBar() - } - else -> { - showProgressBar() - ensureBackgroundThread { - val files = searchFiles(text, currentPath) - files.sortBy { it.getParentPath() } + binding.apply { + itemsSwipeRefresh.isEnabled = text.isEmpty() && activity?.config?.enablePullToRefresh != false + when { + text.isEmpty() -> { + itemsFastscroller.beVisible() + getRecyclerAdapter()?.updateItems(itemsIgnoringSearch) + itemsPlaceholder.beGone() + itemsPlaceholder2.beGone() + hideProgressBar() + } - if (lastSearchedText != text) { - return@ensureBackgroundThread - } + text.length == 1 -> { + itemsFastscroller.beGone() + itemsPlaceholder.beVisible() + itemsPlaceholder2.beVisible() + hideProgressBar() + } - val listItems = ArrayList() + else -> { + showProgressBar() + ensureBackgroundThread { + val files = searchFiles(text, currentPath) + files.sortBy { it.getParentPath() } - var previousParent = "" - files.forEach { - val parent = it.mPath.getParentPath() - if (!it.isDirectory && parent != previousParent && context != null) { - val sectionTitle = ListItem(parent, context!!.humanizePath(parent), false, 0, 0, 0, true, false) - listItems.add(sectionTitle) - previousParent = parent + if (lastSearchedText != text) { + return@ensureBackgroundThread } - if (it.isDirectory) { - val sectionTitle = ListItem(it.path, context!!.humanizePath(it.path), true, 0, 0, 0, true, false) - listItems.add(sectionTitle) - previousParent = parent + val listItems = ArrayList() + + var previousParent = "" + files.forEach { + val parent = it.mPath.getParentPath() + if (!it.isDirectory && parent != previousParent && context != null) { + val sectionTitle = ListItem(parent, context!!.humanizePath(parent), false, 0, 0, 0, true, false) + listItems.add(sectionTitle) + previousParent = parent + } + + if (it.isDirectory) { + val sectionTitle = ListItem(it.path, context!!.humanizePath(it.path), true, 0, 0, 0, true, false) + listItems.add(sectionTitle) + previousParent = parent + } + + if (!it.isDirectory) { + listItems.add(it) + } } - if (!it.isDirectory) { - listItems.add(it) + activity?.runOnUiThread { + getRecyclerAdapter()?.updateItems(listItems, text) + itemsFastscroller.beVisibleIf(listItems.isNotEmpty()) + itemsPlaceholder.beVisibleIf(listItems.isEmpty()) + itemsPlaceholder2.beGone() + hideProgressBar() } } - - activity?.runOnUiThread { - getRecyclerAdapter()?.updateItems(listItems, text) - items_fastscroller.beVisibleIf(listItems.isNotEmpty()) - items_placeholder.beVisibleIf(listItems.isEmpty()) - items_placeholder_2.beGone() - hideProgressBar() - } } } } @@ -390,12 +406,14 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF } private fun searchClosed() { - lastSearchedText = "" - items_swipe_refresh.isEnabled = activity?.config?.enablePullToRefresh != false - items_fastscroller.beVisible() - items_placeholder.beGone() - items_placeholder_2.beGone() - hideProgressBar() + binding.apply { + lastSearchedText = "" + itemsSwipeRefresh.isEnabled = activity?.config?.enablePullToRefresh != false + itemsFastscroller.beVisible() + itemsPlaceholder.beGone() + itemsPlaceholder2.beGone() + hideProgressBar() + } } private fun createNewItem() { @@ -408,7 +426,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF } } - private fun getRecyclerAdapter() = items_list.adapter as? ItemsAdapter + private fun getRecyclerAdapter() = binding.itemsList.adapter as? ItemsAdapter private fun setupLayoutManager() { if (context!!.config.getFolderViewType(currentPath) == VIEW_TYPE_GRID) { @@ -419,13 +437,13 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF setupListLayoutManager() } - items_list.adapter = null + binding.itemsList.adapter = null initZoomListener() addItems(storedItems, true) } private fun setupGridLayoutManager() { - val layoutManager = items_list.layoutManager as MyGridLayoutManager + val layoutManager = binding.itemsList.layoutManager as MyGridLayoutManager layoutManager.spanCount = context?.config?.fileColumnCnt ?: 3 layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { @@ -440,14 +458,14 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF } private fun setupListLayoutManager() { - val layoutManager = items_list.layoutManager as MyGridLayoutManager + val layoutManager = binding.itemsList.layoutManager as MyGridLayoutManager layoutManager.spanCount = 1 zoomListener = null } private fun initZoomListener() { if (context?.config?.getFolderViewType(currentPath) == VIEW_TYPE_GRID) { - val layoutManager = items_list.layoutManager as MyGridLayoutManager + val layoutManager = binding.itemsList.layoutManager as MyGridLayoutManager zoomListener = object : MyRecyclerView.MyZoomListener { override fun zoomIn() { if (layoutManager.spanCount > 1) { @@ -483,21 +501,23 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF } override fun columnCountChanged() { - (items_list.layoutManager as MyGridLayoutManager).spanCount = context!!.config.fileColumnCnt + (binding.itemsList.layoutManager as MyGridLayoutManager).spanCount = context!!.config.fileColumnCnt (activity as? MainActivity)?.refreshMenuItems() getRecyclerAdapter()?.apply { notifyItemRangeChanged(0, listItems.size) } } - private fun showProgressBar() { - progress_bar.show() + fun showProgressBar() { + binding.progressBar.show() } private fun hideProgressBar() { - progress_bar.hide() + binding.progressBar.hide() } + fun getBreadcrumbs() = binding.breadcrumbs + override fun toggleFilenameVisibility() { getRecyclerAdapter()?.updateDisplayFilenamesInGrid() } @@ -509,7 +529,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF openPath(it) } } else { - val item = breadcrumbs.getItem(id) + val item = binding.breadcrumbs.getItem(id) openPath(item.path) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/MyViewPagerFragment.kt index f5510223..115f58dd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/MyViewPagerFragment.kt @@ -6,15 +6,19 @@ import android.widget.RelativeLayout import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.VIEW_TYPE_LIST import com.simplemobiletools.commons.models.FileDirItem +import com.simplemobiletools.commons.views.MyFloatingActionButton import com.simplemobiletools.filemanager.pro.R import com.simplemobiletools.filemanager.pro.activities.MainActivity import com.simplemobiletools.filemanager.pro.activities.SimpleActivity +import com.simplemobiletools.filemanager.pro.databinding.ItemsFragmentBinding +import com.simplemobiletools.filemanager.pro.databinding.RecentsFragmentBinding +import com.simplemobiletools.filemanager.pro.databinding.StorageFragmentBinding import com.simplemobiletools.filemanager.pro.extensions.isPathOnRoot import com.simplemobiletools.filemanager.pro.extensions.tryOpenPathIntent import com.simplemobiletools.filemanager.pro.helpers.RootHelpers -import kotlinx.android.synthetic.main.items_fragment.view.* -abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) : RelativeLayout(context, attributeSet) { +abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) : + RelativeLayout(context, attributeSet) { protected var activity: SimpleActivity? = null protected var currentViewType = VIEW_TYPE_LIST @@ -24,6 +28,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) var isPickMultipleIntent = false var wantedMimeType = "" protected var isCreateDocumentIntent = false + protected lateinit var innerBinding: BINDING protected fun clickedPath(path: String) { if (isGetContentIntent || isCreateDocumentIntent) { @@ -48,7 +53,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) this.isCreateDocumentIntent = isCreateDocumentIntent val fabIcon = context.resources.getColoredDrawableWithColor(iconId, context.getProperPrimaryColor().getContrastColor()) - items_fab?.setImageDrawable(fabIcon) + innerBinding.itemsFab?.setImageDrawable(fabIcon) } fun handleFileDeleting(files: ArrayList, hasFolder: Boolean) { @@ -90,4 +95,20 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) abstract fun refreshFragment() abstract fun searchQueryChanged(text: String) + + interface InnerBinding { + val itemsFab: MyFloatingActionButton? + } + + class ItemsInnerBinding(val binding: ItemsFragmentBinding) : InnerBinding { + override val itemsFab: MyFloatingActionButton = binding.itemsFab + } + + class RecentsInnerBinding(val binding: RecentsFragmentBinding) : InnerBinding { + override val itemsFab: MyFloatingActionButton? = null + } + + class StorageInnerBinding(val binding: StorageFragmentBinding) : InnerBinding { + override val itemsFab: MyFloatingActionButton? = null + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/RecentsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/RecentsFragment.kt index 5b9778fb..ee7f5cff 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/RecentsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/pro/fragments/RecentsFragment.kt @@ -17,25 +17,31 @@ import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.filemanager.pro.activities.MainActivity import com.simplemobiletools.filemanager.pro.activities.SimpleActivity import com.simplemobiletools.filemanager.pro.adapters.ItemsAdapter +import com.simplemobiletools.filemanager.pro.databinding.RecentsFragmentBinding import com.simplemobiletools.filemanager.pro.extensions.config import com.simplemobiletools.filemanager.pro.helpers.MAX_COLUMN_COUNT import com.simplemobiletools.filemanager.pro.interfaces.ItemOperationsListener import com.simplemobiletools.filemanager.pro.models.ListItem -import kotlinx.android.synthetic.main.recents_fragment.view.recents_list -import kotlinx.android.synthetic.main.recents_fragment.view.recents_placeholder -import kotlinx.android.synthetic.main.recents_fragment.view.recents_swipe_refresh import java.io.File -class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), ItemOperationsListener { +class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), + ItemOperationsListener { private val RECENTS_LIMIT = 50 private var filesIgnoringSearch = ArrayList() private var lastSearchedText = "" private var zoomListener: MyRecyclerView.MyZoomListener? = null + private lateinit var binding: RecentsFragmentBinding + + override fun onFinishInflate() { + super.onFinishInflate() + binding = RecentsFragmentBinding.bind(this) + innerBinding = RecentsInnerBinding(binding) + } override fun setupFragment(activity: SimpleActivity) { if (this.activity == null) { this.activity = activity - recents_swipe_refresh.setOnRefreshListener { refreshFragment() } + binding.recentsSwipeRefresh.setOnRefreshListener { refreshFragment() } } refreshFragment() @@ -44,9 +50,11 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage override fun refreshFragment() { ensureBackgroundThread { getRecents { recents -> - recents_swipe_refresh?.isRefreshing = false - recents_list.beVisibleIf(recents.isNotEmpty()) - recents_placeholder.beVisibleIf(recents.isEmpty()) + binding.apply { + recentsSwipeRefresh?.isRefreshing = false + recentsList.beVisibleIf(recents.isNotEmpty()) + recentsPlaceholder.beVisibleIf(recents.isEmpty()) + } filesIgnoringSearch = recents addItems(recents, false) @@ -58,24 +66,24 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage } private fun addItems(recents: ArrayList, forceRefresh: Boolean) { - if (!forceRefresh && recents.hashCode() == (recents_list.adapter as? ItemsAdapter)?.listItems.hashCode()) { + if (!forceRefresh && recents.hashCode() == (binding.recentsList.adapter as? ItemsAdapter)?.listItems.hashCode()) { return } - ItemsAdapter(activity as SimpleActivity, recents, this, recents_list, isPickMultipleIntent, recents_swipe_refresh, false) { + ItemsAdapter(activity as SimpleActivity, recents, this, binding.recentsList, isPickMultipleIntent, binding.recentsSwipeRefresh, false) { clickedPath((it as FileDirItem).path) }.apply { setupZoomListener(zoomListener) - recents_list.adapter = this + binding.recentsList.adapter = this } if (context.areSystemAnimationsEnabled) { - recents_list.scheduleLayoutAnimation() + binding.recentsList.scheduleLayoutAnimation() } } override fun onResume(textColor: Int) { - recents_placeholder.setTextColor(textColor) + binding.recentsPlaceholder.setTextColor(textColor) getRecyclerAdapter()?.apply { updatePrimaryColor() @@ -83,7 +91,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage initDrawables() } - recents_swipe_refresh.isEnabled = lastSearchedText.isEmpty() && activity?.config?.enablePullToRefresh != false + binding.recentsSwipeRefresh.isEnabled = lastSearchedText.isEmpty() && activity?.config?.enablePullToRefresh != false } private fun setupLayoutManager() { @@ -95,26 +103,26 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage setupListLayoutManager() } - val oldItems = (recents_list.adapter as? ItemsAdapter)?.listItems?.toMutableList() as ArrayList - recents_list.adapter = null + val oldItems = (binding.recentsList.adapter as? ItemsAdapter)?.listItems?.toMutableList() as ArrayList + binding.recentsList.adapter = null initZoomListener() addItems(oldItems, true) } private fun setupGridLayoutManager() { - val layoutManager = recents_list.layoutManager as MyGridLayoutManager + val layoutManager = binding.recentsList.layoutManager as MyGridLayoutManager layoutManager.spanCount = context?.config?.fileColumnCnt ?: 3 } private fun setupListLayoutManager() { - val layoutManager = recents_list.layoutManager as MyGridLayoutManager + val layoutManager = binding.recentsList.layoutManager as MyGridLayoutManager layoutManager.spanCount = 1 zoomListener = null } private fun initZoomListener() { if (context?.config?.getFolderViewType("") == VIEW_TYPE_GRID) { - val layoutManager = recents_list.layoutManager as MyGridLayoutManager + val layoutManager = binding.recentsList.layoutManager as MyGridLayoutManager zoomListener = object : MyRecyclerView.MyZoomListener { override fun zoomIn() { if (layoutManager.spanCount > 1) { @@ -187,7 +195,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage } } - private fun getRecyclerAdapter() = recents_list.adapter as? ItemsAdapter + private fun getRecyclerAdapter() = binding.recentsList.adapter as? ItemsAdapter override fun toggleFilenameVisibility() { getRecyclerAdapter()?.updateDisplayFilenamesInGrid() @@ -208,7 +216,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage } override fun columnCountChanged() { - (recents_list.layoutManager as MyGridLayoutManager).spanCount = context!!.config.fileColumnCnt + (binding.recentsList.layoutManager as MyGridLayoutManager).spanCount = context!!.config.fileColumnCnt (activity as? MainActivity)?.refreshMenuItems() getRecyclerAdapter()?.apply { notifyItemRangeChanged(0, listItems.size) @@ -234,9 +242,11 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage override fun searchQueryChanged(text: String) { lastSearchedText = text val filtered = filesIgnoringSearch.filter { it.mName.contains(text, true) }.toMutableList() as ArrayList - (recents_list.adapter as? ItemsAdapter)?.updateItems(filtered, text) - recents_placeholder.beVisibleIf(filtered.isEmpty()) - recents_swipe_refresh.isEnabled = lastSearchedText.isEmpty() && activity?.config?.enablePullToRefresh != false + binding.apply { + (recentsList.adapter as? ItemsAdapter)?.updateItems(filtered, text) + recentsPlaceholder.beVisibleIf(filtered.isEmpty()) + recentsSwipeRefresh.isEnabled = lastSearchedText.isEmpty() && activity?.config?.enablePullToRefresh != false + } } override fun finishActMode() { 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 7ef6187b..6db802c8 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 @@ -21,28 +21,36 @@ 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.databinding.StorageFragmentBinding 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), ItemOperationsListener { +class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), + ItemOperationsListener { private val SIZE_DIVIDER = 100000 private var allDeviceListItems = ArrayList() private var lastSearchedText = "" + private lateinit var binding: StorageFragmentBinding + + override fun onFinishInflate() { + super.onFinishInflate() + binding = StorageFragmentBinding.bind(this) + innerBinding = StorageInnerBinding(binding) + } override fun setupFragment(activity: SimpleActivity) { if (this.activity == null) { this.activity = activity } - total_space.text = String.format(context.getString(R.string.total_storage), "…") + binding.totalSpace.text = String.format(context.getString(R.string.total_storage), "…") getSizes() - free_space_holder.setOnClickListener { + binding.freeSpaceHolder.setOnClickListener { try { val storageSettingsIntent = Intent(Settings.ACTION_INTERNAL_STORAGE_SETTINGS) activity.startActivity(storageSettingsIntent) @@ -51,12 +59,14 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage } } - images_holder.setOnClickListener { launchMimetypeActivity(IMAGES) } - videos_holder.setOnClickListener { launchMimetypeActivity(VIDEOS) } - audio_holder.setOnClickListener { launchMimetypeActivity(AUDIO) } - documents_holder.setOnClickListener { launchMimetypeActivity(DOCUMENTS) } - archives_holder.setOnClickListener { launchMimetypeActivity(ARCHIVES) } - others_holder.setOnClickListener { launchMimetypeActivity(OTHERS) } + binding.apply { + imagesHolder.setOnClickListener { launchMimetypeActivity(IMAGES) } + videosHolder.setOnClickListener { launchMimetypeActivity(VIDEOS) } + audioHolder.setOnClickListener { launchMimetypeActivity(AUDIO) } + documentsHolder.setOnClickListener { launchMimetypeActivity(DOCUMENTS) } + archivesHolder.setOnClickListener { launchMimetypeActivity(ARCHIVES) } + othersHolder.setOnClickListener { launchMimetypeActivity(OTHERS) } + } Handler().postDelayed({ refreshFragment() @@ -65,39 +75,42 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage override fun onResume(textColor: Int) { getSizes() - context.updateTextColors(storage_fragment) + context.updateTextColors(binding.root) - val properPrimaryColor = context.getProperPrimaryColor() - main_storage_usage_progressbar.setIndicatorColor(properPrimaryColor) - main_storage_usage_progressbar.trackColor = properPrimaryColor.adjustAlpha(LOWER_ALPHA) + binding.apply { + val properPrimaryColor = context.getProperPrimaryColor() + mainStorageUsageProgressbar.setIndicatorColor(properPrimaryColor) + mainStorageUsageProgressbar.trackColor = properPrimaryColor.adjustAlpha(LOWER_ALPHA) - val redColor = context.resources.getColor(R.color.md_red_700) - images_progressbar.setIndicatorColor(redColor) - images_progressbar.trackColor = redColor.adjustAlpha(LOWER_ALPHA) + val redColor = context.resources.getColor(R.color.md_red_700) + imagesProgressbar.setIndicatorColor(redColor) + imagesProgressbar.trackColor = redColor.adjustAlpha(LOWER_ALPHA) - val greenColor = context.resources.getColor(R.color.md_green_700) - videos_progressbar.setIndicatorColor(greenColor) - videos_progressbar.trackColor = greenColor.adjustAlpha(LOWER_ALPHA) + val greenColor = context.resources.getColor(R.color.md_green_700) + videosProgressbar.setIndicatorColor(greenColor) + videosProgressbar.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(LOWER_ALPHA) + val lightBlueColor = context.resources.getColor(R.color.md_light_blue_700) + audioProgressbar.setIndicatorColor(lightBlueColor) + audioProgressbar.trackColor = lightBlueColor.adjustAlpha(LOWER_ALPHA) - val yellowColor = context.resources.getColor(R.color.md_yellow_700) - documents_progressbar.setIndicatorColor(yellowColor) - documents_progressbar.trackColor = yellowColor.adjustAlpha(LOWER_ALPHA) + val yellowColor = context.resources.getColor(R.color.md_yellow_700) + documentsProgressbar.setIndicatorColor(yellowColor) + documentsProgressbar.trackColor = yellowColor.adjustAlpha(LOWER_ALPHA) - val tealColor = context.resources.getColor(R.color.md_teal_700) - archives_progressbar.setIndicatorColor(tealColor) - archives_progressbar.trackColor = tealColor.adjustAlpha(LOWER_ALPHA) + val tealColor = context.resources.getColor(R.color.md_teal_700) + archivesProgressbar.setIndicatorColor(tealColor) + archivesProgressbar.trackColor = tealColor.adjustAlpha(LOWER_ALPHA) - val pinkColor = context.resources.getColor(R.color.md_pink_700) - others_progressbar.setIndicatorColor(pinkColor) - others_progressbar.trackColor = pinkColor.adjustAlpha(LOWER_ALPHA) + val pinkColor = context.resources.getColor(R.color.md_pink_700) + othersProgressbar.setIndicatorColor(pinkColor) + othersProgressbar.trackColor = pinkColor.adjustAlpha(LOWER_ALPHA) + + searchHolder.setBackgroundColor(context.getProperBackgroundColor()) + progressBar.setIndicatorColor(properPrimaryColor) + progressBar.trackColor = properPrimaryColor.adjustAlpha(LOWER_ALPHA) + } - search_holder.setBackgroundColor(context.getProperBackgroundColor()) - progress_bar.setIndicatorColor(properPrimaryColor) - progress_bar.trackColor = properPrimaryColor.adjustAlpha(LOWER_ALPHA) } private fun launchMimetypeActivity(mimetype: String) { @@ -116,31 +129,33 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage getMainStorageStats(context) val filesSize = getSizesByMimeType() - val imagesSize = filesSize[IMAGES]!! - val videosSize = filesSize[VIDEOS]!! - val audioSize = filesSize[AUDIO]!! - val documentsSize = filesSize[DOCUMENTS]!! - val archivesSize = filesSize[ARCHIVES]!! - val othersSize = filesSize[OTHERS]!! + val fileSizeImages = filesSize[IMAGES]!! + val fileSizeVideos = filesSize[VIDEOS]!! + val fileSizeAudios = filesSize[AUDIO]!! + val fileSizeDocuments = filesSize[DOCUMENTS]!! + val fileSizeArchives = filesSize[ARCHIVES]!! + val fileSizeOthers = filesSize[OTHERS]!! post { - images_size.text = imagesSize.formatSize() - images_progressbar.progress = (imagesSize / SIZE_DIVIDER).toInt() + binding.apply { + imagesSize.text = fileSizeImages.formatSize() + imagesProgressbar.progress = (fileSizeImages / SIZE_DIVIDER).toInt() - videos_size.text = videosSize.formatSize() - videos_progressbar.progress = (videosSize / SIZE_DIVIDER).toInt() + videosSize.text = fileSizeVideos.formatSize() + videosProgressbar.progress = (fileSizeVideos / SIZE_DIVIDER).toInt() - audio_size.text = audioSize.formatSize() - audio_progressbar.progress = (audioSize / SIZE_DIVIDER).toInt() + audioSize.text = fileSizeAudios.formatSize() + audioProgressbar.progress = (fileSizeAudios / SIZE_DIVIDER).toInt() - documents_size.text = documentsSize.formatSize() - documents_progressbar.progress = (documentsSize / SIZE_DIVIDER).toInt() + documentsSize.text = fileSizeDocuments.formatSize() + documentsProgressbar.progress = (fileSizeDocuments / SIZE_DIVIDER).toInt() - archives_size.text = archivesSize.formatSize() - archives_progressbar.progress = (archivesSize / SIZE_DIVIDER).toInt() + archivesSize.text = fileSizeArchives.formatSize() + archivesProgressbar.progress = (fileSizeArchives / SIZE_DIVIDER).toInt() - others_size.text = othersSize.formatSize() - others_progressbar.progress = (othersSize / SIZE_DIVIDER).toInt() + othersSize.text = fileSizeOthers.formatSize() + othersProgressbar.progress = (fileSizeOthers / SIZE_DIVIDER).toInt() + } } } } @@ -217,23 +232,25 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage // internal storage val storageStatsManager = context.getSystemService(AppCompatActivity.STORAGE_STATS_SERVICE) as StorageStatsManager val uuid = StorageManager.UUID_DEFAULT - val totalSpace = storageStatsManager.getTotalBytes(uuid) - val freeSpace = storageStatsManager.getFreeBytes(uuid) + val totalStorageSpace = storageStatsManager.getTotalBytes(uuid) + val freeStorageSpace = storageStatsManager.getFreeBytes(uuid) post { - arrayOf( - main_storage_usage_progressbar, images_progressbar, videos_progressbar, audio_progressbar, documents_progressbar, - archives_progressbar, others_progressbar - ).forEach { - it.max = (totalSpace / SIZE_DIVIDER).toInt() + binding.apply { + arrayOf( + mainStorageUsageProgressbar, imagesProgressbar, videosProgressbar, audioProgressbar, documentsProgressbar, + archivesProgressbar, othersProgressbar + ).forEach { + it.max = (totalStorageSpace / SIZE_DIVIDER).toInt() + } + + mainStorageUsageProgressbar.progress = ((totalStorageSpace - freeStorageSpace) / SIZE_DIVIDER).toInt() + + mainStorageUsageProgressbar.beVisible() + freeSpaceValue.text = freeStorageSpace.formatSizeThousand() + totalSpace.text = String.format(context.getString(R.string.total_storage), totalStorageSpace.formatSizeThousand()) + freeSpaceLabel.beVisible() } - - main_storage_usage_progressbar.progress = ((totalSpace - freeSpace) / SIZE_DIVIDER).toInt() - - main_storage_usage_progressbar.beVisible() - free_space_value.text = freeSpace.formatSizeThousand() - total_space.text = String.format(context.getString(R.string.total_storage), totalSpace.formatSizeThousand()) - free_space_label.beVisible() } } else { // sd card @@ -245,41 +262,42 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage override fun searchQueryChanged(text: String) { lastSearchedText = text - - 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.length == 1) { - search_results_list.beGone() - search_placeholder.beVisible() - search_placeholder_2.beVisible() - hideProgressBar() - } else if (text.isEmpty()) { - search_results_list.beGone() - hideProgressBar() - } else { - showProgressBar() - ensureBackgroundThread { - val start = System.currentTimeMillis() - val filtered = allDeviceListItems.filter { it.mName.contains(text, true) }.toMutableList() as ArrayList - if (lastSearchedText != text) { - return@ensureBackgroundThread + binding.apply { + if (text.isNotEmpty()) { + if (searchHolder.alpha < 1f) { + searchHolder.fadeIn() } + } else { + searchHolder.animate().alpha(0f).setDuration(SHORT_ANIMATION_DURATION).withEndAction { + searchHolder.beGone() + (searchResultsList.adapter as? ItemsAdapter)?.updateItems(allDeviceListItems, text) + }.start() + } - (context as? Activity)?.runOnUiThread { - (search_results_list.adapter as? ItemsAdapter)?.updateItems(filtered, text) - search_results_list.beVisible() - search_placeholder.beVisibleIf(filtered.isEmpty()) - search_placeholder_2.beGone() - hideProgressBar() + if (text.length == 1) { + searchResultsList.beGone() + searchPlaceholder.beVisible() + searchPlaceholder2.beVisible() + hideProgressBar() + } else if (text.isEmpty()) { + searchResultsList.beGone() + hideProgressBar() + } else { + showProgressBar() + ensureBackgroundThread { + val start = System.currentTimeMillis() + val filtered = allDeviceListItems.filter { it.mName.contains(text, true) }.toMutableList() as ArrayList + if (lastSearchedText != text) { + return@ensureBackgroundThread + } + + (context as? Activity)?.runOnUiThread { + (searchResultsList.adapter as? ItemsAdapter)?.updateItems(filtered, text) + searchResultsList.beVisible() + searchPlaceholder.beVisibleIf(filtered.isEmpty()) + searchPlaceholder2.beGone() + hideProgressBar() + } } } } @@ -294,25 +312,25 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage setupListLayoutManager() } - search_results_list.adapter = null + binding.searchResultsList.adapter = null addItems() } private fun setupGridLayoutManager() { - val layoutManager = search_results_list.layoutManager as MyGridLayoutManager + val layoutManager = binding.searchResultsList.layoutManager as MyGridLayoutManager layoutManager.spanCount = context?.config?.fileColumnCnt ?: 3 } private fun setupListLayoutManager() { - val layoutManager = search_results_list.layoutManager as MyGridLayoutManager + val layoutManager = binding.searchResultsList.layoutManager as MyGridLayoutManager layoutManager.spanCount = 1 } private fun addItems() { - ItemsAdapter(context as SimpleActivity, ArrayList(), this, search_results_list, false, null, false) { + ItemsAdapter(context as SimpleActivity, ArrayList(), this, binding.searchResultsList, false, null, false) { clickedPath((it as FileDirItem).path) }.apply { - search_results_list.adapter = this + binding.searchResultsList.adapter = this } } @@ -367,14 +385,14 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage } private fun showProgressBar() { - progress_bar.show() + binding.progressBar.show() } private fun hideProgressBar() { - progress_bar.hide() + binding.progressBar.hide() } - private fun getRecyclerAdapter() = search_results_list.adapter as? ItemsAdapter + private fun getRecyclerAdapter() = binding.searchResultsList.adapter as? ItemsAdapter override fun refreshFragment() { ensureBackgroundThread { @@ -403,7 +421,7 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage } override fun columnCountChanged() { - (search_results_list.layoutManager as MyGridLayoutManager).spanCount = context!!.config.fileColumnCnt + (binding.searchResultsList.layoutManager as MyGridLayoutManager).spanCount = context!!.config.fileColumnCnt getRecyclerAdapter()?.apply { notifyItemRangeChanged(0, listItems.size) }