From a90bfb9a0ac463e4b28195d58629bc8330e64758 Mon Sep 17 00:00:00 2001 From: darthpaul Date: Wed, 29 Sep 2021 10:35:21 +0100 Subject: [PATCH] Implement checklist sort --- app/proguard-rules.pro | 3 + .../notes/pro/activities/MainActivity.kt | 8 ++ .../pro/activities/WidgetConfigureActivity.kt | 10 +-- .../notes/pro/adapters/NotesPagerAdapter.kt | 5 ++ .../notes/pro/dialogs/SortChecklistDialog.kt | 53 ++++++++++++ .../notes/pro/fragments/ChecklistFragment.kt | 13 ++- .../notes/pro/models/ChecklistItem.kt | 2 +- .../notes/pro/models/ChecklistSort.kt | 26 ++++++ .../pro/models/ChecklistSortDirection.kt | 6 ++ .../notes/pro/models/ChecklistSortField.kt | 6 ++ .../main/res/layout/dialog_sort_checklist.xml | 81 +++++++++++++++++++ app/src/main/res/menu/menu.xml | 5 ++ app/src/main/res/values/strings.xml | 3 + 13 files changed, 212 insertions(+), 9 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/SortChecklistDialog.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/notes/pro/models/ChecklistSort.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/notes/pro/models/ChecklistSortDirection.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/notes/pro/models/ChecklistSortField.kt create mode 100644 app/src/main/res/layout/dialog_sort_checklist.xml diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index ca6d111a..e9eb2553 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,3 +1,6 @@ -keep class com.simplemobiletools.notes.pro.models.ChecklistItem { ; } +-keep class com.simplemobiletools.notes.pro.models.ChecklistSort { + ; +} diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/activities/MainActivity.kt index 4baabd91..61e3d0c2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/activities/MainActivity.kt @@ -163,6 +163,7 @@ class MainActivity : SimpleActivity() { findItem(R.id.export_all_notes).isVisible = multipleNotesExist && hasPermission(PERMISSION_WRITE_STORAGE) findItem(R.id.open_search).isVisible = !isCurrentItemChecklist() findItem(R.id.remove_done_items).isVisible = isCurrentItemChecklist() + findItem(R.id.sort_checklist).isVisible = isCurrentItemChecklist() findItem(R.id.import_folder).isVisible = hasPermission(PERMISSION_READ_STORAGE) findItem(R.id.lock_note).isVisible = mNotes.isNotEmpty() && !mCurrentNote.isLocked() findItem(R.id.unlock_note).isVisible = mNotes.isNotEmpty() && mCurrentNote.isLocked() @@ -201,6 +202,7 @@ class MainActivity : SimpleActivity() { R.id.settings -> startActivity(Intent(applicationContext, SettingsActivity::class.java)) R.id.about -> launchAbout() R.id.remove_done_items -> fragment?.handleUnlocking { removeDoneItems() } + R.id.sort_checklist -> fragment?.handleUnlocking { displaySortChecklistDialog() } else -> return super.onOptionsItemSelected(item) } return true @@ -1169,4 +1171,10 @@ class MainActivity : SimpleActivity() { private fun removeDoneItems() { getPagerAdapter().removeDoneCheckListItems(view_pager.currentItem) } + + private fun displaySortChecklistDialog() { + SortChecklistDialog(this) { + getPagerAdapter().sortChecklistItems(view_pager.currentItem, it) + } + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/activities/WidgetConfigureActivity.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/activities/WidgetConfigureActivity.kt index be3f203f..4a5fa5d7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/activities/WidgetConfigureActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/activities/WidgetConfigureActivity.kt @@ -149,11 +149,11 @@ class WidgetConfigureActivity : SimpleActivity() { val items = Gson().fromJson>(note.value, checklistItemType) ?: ArrayList(1) items.apply { if (isEmpty()) { - add(ChecklistItem(0, "Milk", true)) - add(ChecklistItem(1, "Butter", true)) - add(ChecklistItem(2, "Salt", false)) - add(ChecklistItem(3, "Water", false)) - add(ChecklistItem(4, "Meat", true)) + add(ChecklistItem(0, System.currentTimeMillis(),"Milk", true)) + add(ChecklistItem(1, System.currentTimeMillis(),"Butter", true)) + add(ChecklistItem(2, System.currentTimeMillis(),"Salt", false)) + add(ChecklistItem(3, System.currentTimeMillis(),"Water", false)) + add(ChecklistItem(4, System.currentTimeMillis(),"Meat", true)) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/adapters/NotesPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/adapters/NotesPagerAdapter.kt index 3e4ca20a..e23a0bef 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/adapters/NotesPagerAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/adapters/NotesPagerAdapter.kt @@ -11,6 +11,7 @@ import com.simplemobiletools.notes.pro.fragments.NoteFragment import com.simplemobiletools.notes.pro.fragments.TextFragment import com.simplemobiletools.notes.pro.helpers.NOTE_ID import com.simplemobiletools.notes.pro.helpers.NoteType +import com.simplemobiletools.notes.pro.models.ChecklistSort import com.simplemobiletools.notes.pro.models.Note class NotesPagerAdapter(fm: FragmentManager, val notes: List, val activity: Activity) : FragmentStatePagerAdapter(fm) { @@ -95,4 +96,8 @@ class NotesPagerAdapter(fm: FragmentManager, val notes: List, val activity fun removeDoneCheckListItems(position: Int) { (fragments[position] as? ChecklistFragment)?.removeDoneItems() } + + fun sortChecklistItems(position: Int, sort:ChecklistSort){ + (fragments[position] as? ChecklistFragment)?.sortChecklist(sort) + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/SortChecklistDialog.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/SortChecklistDialog.kt new file mode 100644 index 00000000..6049706e --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/SortChecklistDialog.kt @@ -0,0 +1,53 @@ +package com.simplemobiletools.notes.pro.dialogs + +import android.content.DialogInterface +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.notes.pro.R +import com.simplemobiletools.notes.pro.activities.SimpleActivity +import com.simplemobiletools.notes.pro.models.ChecklistSort +import com.simplemobiletools.notes.pro.models.ChecklistSortDirection +import com.simplemobiletools.notes.pro.models.ChecklistSortField +import kotlinx.android.synthetic.main.dialog_sort_checklist.view.separate_items_checkbox +import kotlinx.android.synthetic.main.dialog_sort_checklist.view.sort_direction_type +import kotlinx.android.synthetic.main.dialog_sort_checklist.view.sort_field_type + +class SortChecklistDialog(private val activity: SimpleActivity, val callback: (ChecklistSort) -> Unit) { + init { + val view = (activity.layoutInflater.inflate(R.layout.dialog_sort_checklist, null) as ViewGroup) + + AlertDialog.Builder(activity) + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this, R.string.sort_checklist) { + getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener { + callback.invoke( + ChecklistSort( + field = getSortField(view), + direction = getSortDirection(view), + separateCheckedFromUnchecked = view.separate_items_checkbox.isChecked + ) + ) + dismiss() + } + } + } + } + + private fun getSortField(view: View): ChecklistSortField { + return when (view.sort_field_type.checkedRadioButtonId) { + R.id.sort_field_title -> ChecklistSortField.TITLE + else -> ChecklistSortField.DATE_CREATED + } + } + + private fun getSortDirection(view: View): ChecklistSortDirection { + return when (view.sort_direction_type.checkedRadioButtonId) { + R.id.sort_direction_asc -> ChecklistSortDirection.ASCENDING + else -> ChecklistSortDirection.DESCENDING + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/fragments/ChecklistFragment.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/fragments/ChecklistFragment.kt index c6b2dbcc..4d89478b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/fragments/ChecklistFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/fragments/ChecklistFragment.kt @@ -1,6 +1,7 @@ package com.simplemobiletools.notes.pro.fragments import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -18,8 +19,7 @@ import com.simplemobiletools.notes.pro.extensions.updateWidgets import com.simplemobiletools.notes.pro.helpers.NOTE_ID import com.simplemobiletools.notes.pro.helpers.NotesHelper import com.simplemobiletools.notes.pro.interfaces.ChecklistItemsListener -import com.simplemobiletools.notes.pro.models.ChecklistItem -import com.simplemobiletools.notes.pro.models.Note +import com.simplemobiletools.notes.pro.models.* import kotlinx.android.synthetic.main.fragment_checklist.view.* class ChecklistFragment : NoteFragment(), ChecklistItemsListener { @@ -140,7 +140,7 @@ class ChecklistFragment : NoteFragment(), ChecklistItemsListener { titles.forEach { title -> title.split("\n").map { it.trim() }.filter { it.isNotBlank() }.forEach { row -> - newItems.add(ChecklistItem(currentMaxId + 1, row, false)) + newItems.add(ChecklistItem(currentMaxId + 1, System.currentTimeMillis(), row, false)) currentMaxId++ } } @@ -215,4 +215,11 @@ class ChecklistFragment : NoteFragment(), ChecklistItemsListener { override fun refreshItems() { setupAdapter() } + + private val TAG = "ChecklistFragment" + fun sortChecklist(sort: ChecklistSort) { + Log.d(TAG, "sortChecklist: $sort") + items = items.sortedWith(sort.getSortComparator()).toMutableList() as ArrayList + setupAdapter() + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/ChecklistItem.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/ChecklistItem.kt index e0892b78..39b3cede 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/ChecklistItem.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/ChecklistItem.kt @@ -1,3 +1,3 @@ package com.simplemobiletools.notes.pro.models -data class ChecklistItem(val id: Int, var title: String, var isDone: Boolean) +data class ChecklistItem(val id: Int, val dateCreated: Long = 0L, var title: String, var isDone: Boolean) diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/ChecklistSort.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/ChecklistSort.kt new file mode 100644 index 00000000..4d24610b --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/ChecklistSort.kt @@ -0,0 +1,26 @@ +package com.simplemobiletools.notes.pro.models + +data class ChecklistSort( + val field: ChecklistSortField, + val direction: ChecklistSortDirection, + val separateCheckedFromUnchecked: Boolean, +) { + + companion object { + val DEFAULT = ChecklistSort(ChecklistSortField.TITLE, ChecklistSortDirection.ASCENDING, false) + } + + fun getSortComparator(): Comparator { + return when (field) { + ChecklistSortField.TITLE -> compareWithSortDirection { it.title } + ChecklistSortField.DATE_CREATED -> compareWithSortDirection { it.dateCreated } + } + } + + private fun compareWithSortDirection(compareFunc: (ChecklistItem) -> Comparable<*>): Comparator { + return when (direction) { + ChecklistSortDirection.ASCENDING -> if(separateCheckedFromUnchecked) compareBy { it.isDone }.thenBy(compareFunc) else compareBy(compareFunc) + ChecklistSortDirection.DESCENDING -> if(separateCheckedFromUnchecked) compareByDescending { it.isDone }.thenByDescending(compareFunc) else compareByDescending(compareFunc) + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/ChecklistSortDirection.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/ChecklistSortDirection.kt new file mode 100644 index 00000000..fb52e458 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/ChecklistSortDirection.kt @@ -0,0 +1,6 @@ +package com.simplemobiletools.notes.pro.models + +enum class ChecklistSortDirection { + ASCENDING, + DESCENDING, +} diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/ChecklistSortField.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/ChecklistSortField.kt new file mode 100644 index 00000000..39eef3ea --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/ChecklistSortField.kt @@ -0,0 +1,6 @@ +package com.simplemobiletools.notes.pro.models + +enum class ChecklistSortField { + TITLE, + DATE_CREATED, +} diff --git a/app/src/main/res/layout/dialog_sort_checklist.xml b/app/src/main/res/layout/dialog_sort_checklist.xml new file mode 100644 index 00000000..77260504 --- /dev/null +++ b/app/src/main/res/layout/dialog_sort_checklist.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/menu.xml b/app/src/main/res/menu/menu.xml index c5d0e1d8..9bb77520 100644 --- a/app/src/main/res/menu/menu.xml +++ b/app/src/main/res/menu/menu.xml @@ -41,6 +41,11 @@ android:icon="@drawable/ic_delete_vector" android:title="@string/remove_done_items" app:showAsAction="ifRoom" /> + Reddit: https://www.reddit.com/r/SimpleMobileTools + Sort direction + Separately sort checked from unchecked items + Sort checklist