From 806aaf33882030ed1ace4f2131b1213723bbd318 Mon Sep 17 00:00:00 2001 From: kaushik-naik Date: Thu, 12 Mar 2026 20:20:14 +0530 Subject: [PATCH 1/3] Add following changes: 1. Provide option to select columns to be shown on folder item. 2. Render folder columns conditionally based on preferences. 3. Minor change in folder item layout --- .../activities/SettingsActivity.kt | 8 +++ .../filemanager/adapters/ItemsAdapter.kt | 34 +++++++++++- .../dialogs/ManageFolderColumnsDialog.kt | 55 +++++++++++++++++++ .../org/fossify/filemanager/helpers/Config.kt | 13 +++++ .../fossify/filemanager/helpers/Constants.kt | 3 + app/src/main/res/layout/activity_settings.xml | 15 +++++ .../layout/dialog_manage_folder_colums.xml | 41 ++++++++++++++ .../main/res/layout/item_file_dir_list.xml | 13 +++-- app/src/main/res/values/strings.xml | 4 ++ 9 files changed, 178 insertions(+), 8 deletions(-) create mode 100644 app/src/main/kotlin/org/fossify/filemanager/dialogs/ManageFolderColumnsDialog.kt create mode 100644 app/src/main/res/layout/dialog_manage_folder_colums.xml 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..68c7ea3e4 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/adapters/ItemsAdapter.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/adapters/ItemsAdapter.kt @@ -1071,8 +1071,19 @@ class ItemsAdapter( if (listItem.isDirectory) { itemIcon?.setImageDrawable(folderDrawable) - itemDetails?.text = getChildrenCnt(listItem) - itemDate?.beGone() + 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) } else { itemDetails?.text = listItem.size.formatSize() itemDate?.beVisible() @@ -1101,6 +1112,25 @@ class ItemsAdapter( } } + 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..58a49fc88 --- /dev/null +++ b/app/src/main/kotlin/org/fossify/filemanager/dialogs/ManageFolderColumnsDialog.kt @@ -0,0 +1,55 @@ +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..7221a6753 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,17 @@ 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