diff --git a/CHANGELOG.md b/CHANGELOG.md index 79f79d896..a0f8afc08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added +- Ability to select columns to be shown on folder item ([#321]) ## [1.6.1] - 2026-02-14 ### Changed @@ -133,6 +135,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#250]: https://github.com/FossifyOrg/File-Manager/issues/250 [#251]: https://github.com/FossifyOrg/File-Manager/issues/251 [#267]: https://github.com/FossifyOrg/File-Manager/issues/267 +[#321]: https://github.com/FossifyOrg/File-Manager/issues/321 [Unreleased]: https://github.com/FossifyOrg/File-Manager/compare/1.6.1...HEAD [1.6.1]: https://github.com/FossifyOrg/File-Manager/compare/1.6.0...1.6.1 diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/SettingsActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/SettingsActivity.kt index 7f00eb6f9..d675e783d 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/SettingsActivity.kt @@ -11,6 +11,7 @@ import org.fossify.commons.helpers.* import org.fossify.commons.models.RadioItem import org.fossify.filemanager.R import org.fossify.filemanager.databinding.ActivitySettingsBinding +import org.fossify.filemanager.dialogs.ManageFolderColumnsDialog import org.fossify.filemanager.dialogs.ManageVisibleTabsDialog import org.fossify.filemanager.extensions.config import org.fossify.filemanager.helpers.RootHelpers @@ -38,6 +39,7 @@ class SettingsActivity : SimpleActivity() { setupLanguage() setupManageFavorites() setupManageShownTabs() + setupCustomizeFolderOptions() setupChangeDateTimeFormat() setupFontSize() setupShowHidden() @@ -188,6 +190,12 @@ class SettingsActivity : SimpleActivity() { } } + private fun setupCustomizeFolderOptions(){ + binding.settingsManageFolderColumnsHolder.setOnClickListener { + ManageFolderColumnsDialog(this) + } + } + private fun setupAppPasswordProtection() { binding.settingsAppPasswordProtection.isChecked = config.isAppPasswordProtectionOn binding.settingsAppPasswordProtectionHolder.setOnClickListener { diff --git a/app/src/main/kotlin/org/fossify/filemanager/adapters/ItemsAdapter.kt b/app/src/main/kotlin/org/fossify/filemanager/adapters/ItemsAdapter.kt index bea529466..a695b44de 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/adapters/ItemsAdapter.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/adapters/ItemsAdapter.kt @@ -1070,37 +1070,86 @@ class ItemsAdapter( } if (listItem.isDirectory) { - itemIcon?.setImageDrawable(folderDrawable) - itemDetails?.text = getChildrenCnt(listItem) - itemDate?.beGone() + setupDirectoryView(itemIcon, listItem, itemDetails, itemDate) } else { - itemDetails?.text = listItem.size.formatSize() - itemDate?.beVisible() - itemDate?.text = listItem.modified.formatDate(activity, dateFormat, timeFormat) - - val drawable = fileDrawables.getOrElse( - key = fileName.substringAfterLast(".").lowercase(Locale.getDefault()), - defaultValue = { fileDrawable } - ) - val options = RequestOptions() - .signature(listItem.getKey()) - .diskCacheStrategy(DiskCacheStrategy.RESOURCE) - .error(drawable) - .transform(CenterCrop(), RoundedCorners(10)) - - val itemToLoad = getImagePathToLoad(listItem.path) - if (!activity.isDestroyed && itemIcon != null) { - Glide.with(activity) - .load(itemToLoad) - .transition(DrawableTransitionOptions.withCrossFade()) - .apply(options) - .into(itemIcon!!) - } + setupFileView(itemIcon, listItem, itemDetails, itemDate, fileName) } } } } + private fun setupDirectoryView( + itemIcon: ImageView?, + listItem: ListItem, + itemDetails: TextView?, + itemDate: TextView? + ){ + itemIcon?.setImageDrawable(folderDrawable) + val parts = mutableListOf() + + if (config.showFolderChildrenCount) { + parts.add(getChildrenCnt(listItem)) + } + + if (config.showFolderSize) { + parts.add(listItem.mSize.formatSize()) + loadFolderSize(listItem, getItemKeyPosition(listItem.path.hashCode())) + } + + itemDetails?.text = parts.joinToString(" • ") + setupFolderDate(listItem,itemDate) + } + + private fun setupFileView( + itemIcon: ImageView?, + listItem: ListItem, + itemDetails: TextView?, + itemDate: TextView?, + fileName : String + ){ + itemDetails?.text = listItem.size.formatSize() + itemDate?.beVisible() + itemDate?.text = listItem.modified.formatDate(activity, dateFormat, timeFormat) + + val drawable = fileDrawables.getOrElse( + key = fileName.substringAfterLast(".").lowercase(Locale.getDefault()), + defaultValue = { fileDrawable } + ) + val options = RequestOptions() + .signature(listItem.getKey()) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE) + .error(drawable) + .transform(CenterCrop(), RoundedCorners(10)) + + val itemToLoad = getImagePathToLoad(listItem.path) + if (!activity.isDestroyed && itemIcon != null) { + Glide.with(activity) + .load(itemToLoad) + .transition(DrawableTransitionOptions.withCrossFade()) + .apply(options) + .into(itemIcon!!) + } + } + + private fun loadFolderSize(listItem: ListItem, position: Int) { + ensureBackgroundThread { + val size = File(listItem.path).getProperSize(config.shouldShowHidden()) + activity.runOnUiThread { + listItem.mSize = size + notifyItemChanged(position, Unit) + } + } + } + + private fun setupFolderDate(listItem : ListItem,dateView: TextView?) { + if (config.showFolderLastModifiedAt) { + dateView?.beVisible() + dateView?.text = listItem.modified.formatDate(activity, dateFormat, timeFormat) + } else { + dateView?.beGone() + } + } + private fun getChildrenCnt(item: FileDirItem): String { val children = item.children return activity.resources.getQuantityString(R.plurals.items, children, children) diff --git a/app/src/main/kotlin/org/fossify/filemanager/dialogs/ManageFolderColumnsDialog.kt b/app/src/main/kotlin/org/fossify/filemanager/dialogs/ManageFolderColumnsDialog.kt new file mode 100644 index 000000000..1706236ed --- /dev/null +++ b/app/src/main/kotlin/org/fossify/filemanager/dialogs/ManageFolderColumnsDialog.kt @@ -0,0 +1,56 @@ +package org.fossify.filemanager.dialogs + +import org.fossify.commons.activities.BaseSimpleActivity +import org.fossify.commons.extensions.getAlertDialogBuilder +import org.fossify.commons.extensions.setupDialogStuff +import org.fossify.commons.views.MyAppCompatCheckbox +import org.fossify.filemanager.databinding.DialogManageFolderColumsBinding +import org.fossify.filemanager.extensions.config + +class ManageFolderColumnsDialog(val activity: BaseSimpleActivity) { + private var config = activity.config + private val binding: DialogManageFolderColumsBinding = DialogManageFolderColumsBinding + .inflate(activity.layoutInflater) + private var showFolderSize : Boolean = config.showFolderSize + private var showChildrenCount : Boolean = config.showFolderChildrenCount + private var showModifiedAt : Boolean = config.showFolderLastModifiedAt + + init { + + setupColumnCheckboxSelection() + + activity.getAlertDialogBuilder() + .setPositiveButton("OK",{dialog,which -> dialogConfirmed()}) + .setNegativeButton("Cancel",null) + .apply { + activity.setupDialogStuff(binding.root, this) + } + } + + private fun setupColumnCheckboxSelection(){ + setupCheckbox(binding.manageFolderColumnsSize, showFolderSize) { showFolderSize = it } + setupCheckbox(binding.manageFolderColumnsChildrenCount, showChildrenCount) { showChildrenCount = it } + setupCheckbox(binding.manageFolderColumnsModifiedAt, showModifiedAt) { showModifiedAt = it } + } + + private fun setupCheckbox(checkbox: MyAppCompatCheckbox, initialState: Boolean, onChanged: (Boolean) -> Unit) { + checkbox.isChecked = initialState + checkbox.setOnClickListener { + onChanged(checkbox.isChecked) + } + } + + private fun dialogConfirmed(){ + if(config.showFolderSize != showFolderSize){ + config.showFolderSize = showFolderSize + } + + if(config.showFolderChildrenCount != showChildrenCount){ + config.showFolderChildrenCount = showChildrenCount + } + + if(config.showFolderLastModifiedAt != showModifiedAt){ + config.showFolderLastModifiedAt = showModifiedAt + } + } +} diff --git a/app/src/main/kotlin/org/fossify/filemanager/helpers/Config.kt b/app/src/main/kotlin/org/fossify/filemanager/helpers/Config.kt index c5278fdb9..eac687ca2 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/helpers/Config.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/helpers/Config.kt @@ -121,4 +121,23 @@ class Config(context: Context) : BaseConfig(context) { var wasStorageAnalysisTabAdded: Boolean get() = prefs.getBoolean(WAS_STORAGE_ANALYSIS_TAB_ADDED, false) set(wasStorageAnalysisTabAdded) = prefs.edit().putBoolean(WAS_STORAGE_ANALYSIS_TAB_ADDED, wasStorageAnalysisTabAdded).apply() + + var showFolderSize : Boolean + get() = prefs.getBoolean(FOLDER_SHOW_SIZE, false) + set(showFolderSize) = prefs.edit() + .putBoolean(FOLDER_SHOW_SIZE,showFolderSize) + .apply() + + var showFolderLastModifiedAt : Boolean + get() = prefs.getBoolean(FOLDER_SHOW_LAST_MODIFIED_AT,false) + set(folderShowLastModifiedAt) = prefs.edit() + .putBoolean(FOLDER_SHOW_LAST_MODIFIED_AT,folderShowLastModifiedAt) + .apply() + + var showFolderChildrenCount : Boolean + get() = prefs.getBoolean(FOLDER_SHOW_CHILDREN_COUNT,true) + set(showFolderChildrenCount) = prefs.edit() + .putBoolean(FOLDER_SHOW_CHILDREN_COUNT,showFolderChildrenCount) + .apply() + } diff --git a/app/src/main/kotlin/org/fossify/filemanager/helpers/Constants.kt b/app/src/main/kotlin/org/fossify/filemanager/helpers/Constants.kt index 6df79baf1..035896e96 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/helpers/Constants.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/helpers/Constants.kt @@ -22,6 +22,9 @@ const val FILE_LANDSCAPE_COLUMN_CNT = "file_landscape_column_cnt" const val DISPLAY_FILE_NAMES = "display_file_names" const val SHOW_TABS = "show_tabs" const val WAS_STORAGE_ANALYSIS_TAB_ADDED = "was_storage_analysis_tab_added" +const val FOLDER_SHOW_SIZE = "show_folder_size" +const val FOLDER_SHOW_LAST_MODIFIED_AT = "show_folder_last_modified_at" +const val FOLDER_SHOW_CHILDREN_COUNT = "show_folder_children_count" // open as const val OPEN_AS_DEFAULT = 0 diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index a2c554139..a43075c78 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -143,6 +143,21 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_file_dir_list.xml b/app/src/main/res/layout/item_file_dir_list.xml index fe4a6521b..aaa88ac66 100644 --- a/app/src/main/res/layout/item_file_dir_list.xml +++ b/app/src/main/res/layout/item_file_dir_list.xml @@ -49,8 +49,8 @@ android:alpha="0.6" android:paddingStart="@dimen/tiny_margin" android:textSize="@dimen/smaller_text_size" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@+id/item_date" + app:layout_constraintBottom_toTopOf="@+id/item_date" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/item_icon" app:layout_constraintTop_toBottomOf="@+id/item_name" app:layout_constraintVertical_bias="0.5" @@ -58,14 +58,15 @@ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 07a68b549..aea4bdaa0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -56,6 +56,10 @@ Enable root access Require pressing Back twice to leave the app + Manage folder columns + Size + Children count + Last modified at