diff --git a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt index 529218c8a..12b6381da 100644 --- a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt @@ -1349,6 +1349,11 @@ class MainActivity : SimpleActivity() { doDeleteNote(mCurrentNote, deleteFile) } } + + val noteId = note.id + if (note.type == NoteType.TYPE_CHECKLIST && noteId != null) { + config.removeOwnSorting(noteId) + } } private fun doDeleteNote(note: Note, deleteFile: Boolean) { @@ -1552,7 +1557,7 @@ class MainActivity : SimpleActivity() { } private fun displaySortChecklistDialog() { - SortChecklistDialog(this) { + SortChecklistDialog(this, mCurrentNote.id) { getPagerAdapter().refreshChecklist(binding.viewPager.currentItem) updateWidgets() } diff --git a/app/src/main/kotlin/org/fossify/notes/activities/SettingsActivity.kt b/app/src/main/kotlin/org/fossify/notes/activities/SettingsActivity.kt index 0fa3212be..c70bee568 100644 --- a/app/src/main/kotlin/org/fossify/notes/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/org/fossify/notes/activities/SettingsActivity.kt @@ -111,6 +111,7 @@ class SettingsActivity : SimpleActivity() { setupMonospacedFont() setupShowKeyboard() setupShowNotePicker() + setupMoveUndoneChecklistItems() setupShowWordCount() setupEnableLineWrap() setupFontSize() @@ -247,6 +248,14 @@ class SettingsActivity : SimpleActivity() { } } + private fun setupMoveUndoneChecklistItems() { + binding.settingsMoveUndoneChecklistItems.isChecked = config.moveDoneChecklistItems + binding.settingsMoveUndoneChecklistItemsHolder.setOnClickListener { + binding.settingsMoveUndoneChecklistItems.toggle() + config.moveDoneChecklistItems = binding.settingsMoveUndoneChecklistItems.isChecked + } + } + private fun setupShowWordCount() { binding.settingsShowWordCount.isChecked = config.showWordCount binding.settingsShowWordCountHolder.setOnClickListener { diff --git a/app/src/main/kotlin/org/fossify/notes/adapters/OpenNoteAdapter.kt b/app/src/main/kotlin/org/fossify/notes/adapters/OpenNoteAdapter.kt index 531395c26..ffb8012be 100644 --- a/app/src/main/kotlin/org/fossify/notes/adapters/OpenNoteAdapter.kt +++ b/app/src/main/kotlin/org/fossify/notes/adapters/OpenNoteAdapter.kt @@ -125,19 +125,16 @@ class OpenNoteAdapter( val taskType = object : TypeToken>() {}.type var items = Gson().fromJson>(getNoteStoredValue(context), taskType) ?: listOf() items = items.let { - val sorting = context.config.sorting + val sorting = context.config.getSorting(id) Task.sorting = sorting + var result = it if (Task.sorting and SORT_BY_CUSTOM == 0) { - it.sorted().let { - if (context.config.moveDoneChecklistItems) { - it.sortedBy { it.isDone } - } else { - it - } - } - } else { - it + result = result.sorted() + } + if (context.config.moveDoneChecklistItems) { + result = result.sortedBy { it.isDone } } + result } val linePrefix = "• " diff --git a/app/src/main/kotlin/org/fossify/notes/adapters/TasksAdapter.kt b/app/src/main/kotlin/org/fossify/notes/adapters/TasksAdapter.kt index 26c5e4643..466fbe179 100644 --- a/app/src/main/kotlin/org/fossify/notes/adapters/TasksAdapter.kt +++ b/app/src/main/kotlin/org/fossify/notes/adapters/TasksAdapter.kt @@ -98,8 +98,10 @@ class TasksAdapter( } menu.findItem(R.id.cab_rename).isVisible = isOneItemSelected() - menu.findItem(R.id.cab_move_to_top).isVisible = selectedItems.none { it.isDone } || !activity.config.moveDoneChecklistItems - menu.findItem(R.id.cab_move_to_bottom).isVisible = selectedItems.none { it.isDone } || !activity.config.moveDoneChecklistItems + menu.findItem(R.id.cab_move_to_top).isVisible = selectedItems.none { it.isDone } + || !activity.config.moveDoneChecklistItems + menu.findItem(R.id.cab_move_to_bottom).isVisible = selectedItems.none { it.isDone } + || !activity.config.moveDoneChecklistItems } override fun getItemViewType(position: Int): Int { diff --git a/app/src/main/kotlin/org/fossify/notes/adapters/WidgetAdapter.kt b/app/src/main/kotlin/org/fossify/notes/adapters/WidgetAdapter.kt index d0510ac5d..cf5fcf767 100644 --- a/app/src/main/kotlin/org/fossify/notes/adapters/WidgetAdapter.kt +++ b/app/src/main/kotlin/org/fossify/notes/adapters/WidgetAdapter.kt @@ -129,12 +129,13 @@ class WidgetAdapter(val context: Context, val intent: Intent) : RemoteViewsServi // checklist title can be null only because of the glitch in upgrade to 6.6.0, remove this check in the future tasks = tasks.toMutableList() as ArrayList - val sorting = context.config.sorting + val sorting = context.config.getSorting(noteId) if (sorting and SORT_BY_CUSTOM == 0) { + Task.sorting = sorting tasks.sort() - if (context.config.moveDoneChecklistItems) { - tasks.sortBy { it.isDone } - } + } + if (context.config.moveDoneChecklistItems) { + tasks.sortBy { it.isDone } } } } diff --git a/app/src/main/kotlin/org/fossify/notes/dialogs/NewChecklistItemDialog.kt b/app/src/main/kotlin/org/fossify/notes/dialogs/NewChecklistItemDialog.kt index df91d6131..1360fd936 100644 --- a/app/src/main/kotlin/org/fossify/notes/dialogs/NewChecklistItemDialog.kt +++ b/app/src/main/kotlin/org/fossify/notes/dialogs/NewChecklistItemDialog.kt @@ -14,7 +14,11 @@ import org.fossify.notes.databinding.DialogNewChecklistItemBinding import org.fossify.notes.databinding.ItemAddChecklistBinding import org.fossify.notes.extensions.config -class NewChecklistItemDialog(val activity: Activity, callback: (titles: ArrayList) -> Unit) { +class NewChecklistItemDialog( + val activity: Activity, + private val noteId: Long, + callback: (titles: ArrayList) -> Unit +) { private val titles = mutableListOf() private val binding = DialogNewChecklistItemBinding.inflate(activity.layoutInflater) private val view = binding.root @@ -32,7 +36,7 @@ class NewChecklistItemDialog(val activity: Activity, callback: (titles: ArrayLis addItem.setOnClickListener { addNewEditText() } - settingsAddChecklistTop.beVisibleIf(activity.config.sorting == SORT_BY_CUSTOM) + settingsAddChecklistTop.beVisibleIf(activity.config.getSorting(noteId) == SORT_BY_CUSTOM) settingsAddChecklistTop.isChecked = activity.config.addNewChecklistItemsTop } diff --git a/app/src/main/kotlin/org/fossify/notes/dialogs/SortChecklistDialog.kt b/app/src/main/kotlin/org/fossify/notes/dialogs/SortChecklistDialog.kt index 2e5f95ac7..48bee5771 100644 --- a/app/src/main/kotlin/org/fossify/notes/dialogs/SortChecklistDialog.kt +++ b/app/src/main/kotlin/org/fossify/notes/dialogs/SortChecklistDialog.kt @@ -1,5 +1,6 @@ package org.fossify.notes.dialogs +import org.fossify.commons.extensions.beGone import org.fossify.commons.extensions.beGoneIf import org.fossify.commons.extensions.getAlertDialogBuilder import org.fossify.commons.extensions.setupDialogStuff @@ -12,16 +13,19 @@ import org.fossify.notes.activities.SimpleActivity import org.fossify.notes.databinding.DialogSortChecklistBinding import org.fossify.notes.extensions.config -class SortChecklistDialog(private val activity: SimpleActivity, private val callback: () -> Unit) { +class SortChecklistDialog( + private val activity: SimpleActivity, + private val noteId: Long?, + private val callback: () -> Unit +) { private val binding = DialogSortChecklistBinding.inflate(activity.layoutInflater) private val view = binding.root private val config = activity.config - private var currSorting = config.sorting + private var currSorting = config.getSorting(noteId) init { setupSortRadio() setupOrderRadio() - setupMoveUndoneChecklistItems() activity.getAlertDialogBuilder() .setPositiveButton(org.fossify.commons.R.string.ok) { _, _ -> dialogConfirmed() } @@ -49,6 +53,12 @@ class SortChecklistDialog(private val activity: SimpleActivity, private val call fieldBtn = binding.sortingDialogRadioCustom } + if (noteId == null) { + binding.sortingDialogUseForThisChecklist.beGone() + } else { + binding.sortingDialogUseForThisChecklist.isChecked = config.hasOwnSorting(noteId) + } + fieldBtn.isChecked = true } @@ -62,13 +72,6 @@ class SortChecklistDialog(private val activity: SimpleActivity, private val call orderBtn.isChecked = true } - private fun setupMoveUndoneChecklistItems() { - binding.settingsMoveUndoneChecklistItems.isChecked = config.moveDoneChecklistItems - binding.settingsMoveUndoneChecklistItemsHolder.setOnClickListener { - binding.settingsMoveUndoneChecklistItems.toggle() - } - } - private fun dialogConfirmed() { val sortingRadio = binding.sortingDialogRadioSorting var sorting = when (sortingRadio.checkedRadioButtonId) { @@ -83,11 +86,15 @@ class SortChecklistDialog(private val activity: SimpleActivity, private val call sorting = sorting or SORT_DESCENDING } - if (currSorting != sorting) { + if (binding.sortingDialogUseForThisChecklist.isChecked) { + config.saveOwnSorting(noteId!!, sorting) + } else { + if (noteId != null) { + config.removeOwnSorting(noteId) + } config.sorting = sorting } - config.moveDoneChecklistItems = binding.settingsMoveUndoneChecklistItems.isChecked callback() } } diff --git a/app/src/main/kotlin/org/fossify/notes/fragments/TasksFragment.kt b/app/src/main/kotlin/org/fossify/notes/fragments/TasksFragment.kt index 7f4483ab6..5d14c8e68 100644 --- a/app/src/main/kotlin/org/fossify/notes/fragments/TasksFragment.kt +++ b/app/src/main/kotlin/org/fossify/notes/fragments/TasksFragment.kt @@ -139,7 +139,7 @@ class TasksFragment : NoteFragment(), TasksActionListener { } private fun showNewItemDialog() { - NewChecklistItemDialog(activity as SimpleActivity) { titles -> + NewChecklistItemDialog(activity as SimpleActivity, noteId) { titles -> var currentMaxId = tasks.maxByOrNull { item -> item.id }?.id ?: 0 val newItems = ArrayList() @@ -201,7 +201,7 @@ class TasksFragment : NoteFragment(), TasksActionListener { private fun setupAdapter() { updateUIVisibility() - Task.sorting = requireContext().config.sorting + Task.sorting = requireContext().config.getSorting(noteId) if (Task.sorting and SORT_BY_CUSTOM == 0) { tasks.sort() } @@ -282,7 +282,7 @@ class TasksFragment : NoteFragment(), TasksActionListener { } override fun moveTask(fromPosition: Int, toPosition: Int) { - activity?.config?.sorting = SORT_BY_CUSTOM + switchToCustomSorting() if (fromPosition < toPosition) { for (i in fromPosition until toPosition) { tasks.swap(i, i + 1) @@ -297,12 +297,16 @@ class TasksFragment : NoteFragment(), TasksActionListener { setupAdapter() } - override fun moveTasksToTop(taskIds: List) = moveTasks(taskIds.reversed(), targetPosition = 0) + override fun moveTasksToTop(taskIds: List) { + moveTasks(taskIds.reversed(), targetPosition = 0) + } - override fun moveTasksToBottom(taskIds: List) = moveTasks(taskIds, targetPosition = tasks.lastIndex) + override fun moveTasksToBottom(taskIds: List) { + moveTasks(taskIds, targetPosition = tasks.lastIndex) + } private fun moveTasks(taskIds: List, targetPosition: Int) { - activity?.config?.sorting = SORT_BY_CUSTOM + switchToCustomSorting() taskIds.forEach { id -> val position = tasks.indexOfFirst { it.id == id } if (position != -1) { @@ -319,6 +323,15 @@ class TasksFragment : NoteFragment(), TasksActionListener { } } + private fun switchToCustomSorting() { + val config = activity?.config ?: return + if (config.hasOwnSorting(noteId) == true) { + config.saveOwnSorting(noteId, SORT_BY_CUSTOM) + } else { + config.sorting = SORT_BY_CUSTOM + } + } + private fun FragmentChecklistBinding.toCommonBinding(): CommonNoteBinding = this.let { object : CommonNoteBinding { override val root: View = it.root diff --git a/app/src/main/kotlin/org/fossify/notes/helpers/Config.kt b/app/src/main/kotlin/org/fossify/notes/helpers/Config.kt index 1a8581d22..c18f25b73 100644 --- a/app/src/main/kotlin/org/fossify/notes/helpers/Config.kt +++ b/app/src/main/kotlin/org/fossify/notes/helpers/Config.kt @@ -92,4 +92,14 @@ class Config(context: Context) : BaseConfig(context) { var addNewChecklistItemsTop: Boolean get() = prefs.getBoolean(ADD_NEW_CHECKLIST_ITEMS_TOP, false) set(addNewCheckListItemsTop) = prefs.edit().putBoolean(ADD_NEW_CHECKLIST_ITEMS_TOP, addNewCheckListItemsTop).apply() + + fun getSorting(noteId: Long?): Int { + return if (noteId == null) sorting else getFolderSorting(noteId.toString()) + } + + fun hasOwnSorting(noteId: Long?) = noteId != null && hasCustomSorting(noteId.toString()) + + fun saveOwnSorting(noteId: Long, sorting: Int) = saveCustomSorting(noteId.toString(), sorting) + + fun removeOwnSorting(noteId: Long) = removeCustomSorting(noteId.toString()) } diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 59348ec1a..c17b729d0 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -227,6 +227,21 @@ + + + + + + - - - + android:minHeight="@dimen/min_radio_checkbox_height" + android:text="@string/use_for_this_checklist" /> - diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 0504ba947..1adf7dca2 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -67,6 +67,7 @@ Lista kontrolna jest pusta Usuń odhaczone elementy Dodaj na górze + Tylko w tej liście kontrolnej %d odhaczony element %d odhaczone elementy diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eca147d3d..2d197b134 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -72,6 +72,7 @@ The checklist is empty Delete checked items Add to the top + Use for this checklist only %d checked item %d checked items