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 238c29e5..bdaae2f7 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 @@ -40,9 +40,9 @@ import com.simplemobiletools.notes.pro.helpers.NoteType import com.simplemobiletools.notes.pro.helpers.NotesHelper import com.simplemobiletools.notes.pro.helpers.OPEN_NOTE_ID import com.simplemobiletools.notes.pro.models.Note -import kotlinx.android.synthetic.main.activity_main.* import java.io.File import java.nio.charset.Charset +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : SimpleActivity() { private val EXPORT_FILE_SYNC = 1 @@ -159,13 +159,16 @@ class MainActivity : SimpleActivity() { override fun onPrepareOptionsMenu(menu: Menu): Boolean { val multipleNotesExist = mNotes.size > 1 + val isCurrentItemChecklist = isCurrentItemChecklist() + menu.apply { findItem(R.id.rename_note).isVisible = multipleNotesExist findItem(R.id.open_note).isVisible = multipleNotesExist findItem(R.id.delete_note).isVisible = multipleNotesExist 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.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() @@ -204,6 +207,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 @@ -1172,4 +1176,10 @@ class MainActivity : SimpleActivity() { private fun removeDoneItems() { getPagerAdapter().removeDoneCheckListItems(view_pager.currentItem) } + + private fun displaySortChecklistDialog() { + SortChecklistDialog(this) { + getPagerAdapter().refreshChecklist(view_pager.currentItem) + } + } } 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 050f16ec..4cad5a35 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 @@ -158,11 +158,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..d9a07f85 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 @@ -95,4 +95,8 @@ class NotesPagerAdapter(fm: FragmentManager, val notes: List, val activity fun removeDoneCheckListItems(position: Int) { (fragments[position] as? ChecklistFragment)?.removeDoneItems() } + + fun refreshChecklist(position: Int) { + (fragments[position] as? ChecklistFragment)?.refreshItems() + } } 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..202e61fa --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/SortChecklistDialog.kt @@ -0,0 +1,67 @@ +package com.simplemobiletools.notes.pro.dialogs + +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.commons.helpers.SORT_BY_DATE_CREATED +import com.simplemobiletools.commons.helpers.SORT_BY_TITLE +import com.simplemobiletools.commons.helpers.SORT_DESCENDING +import com.simplemobiletools.notes.pro.R +import com.simplemobiletools.notes.pro.activities.SimpleActivity +import com.simplemobiletools.notes.pro.extensions.config +import kotlinx.android.synthetic.main.dialog_sort_checklist.view.* + +class SortChecklistDialog(private val activity: SimpleActivity, private val callback: () -> Unit) { + private val view = activity.layoutInflater.inflate(R.layout.dialog_sort_checklist, null) + private val config = activity.config + private var currSorting = config.sorting + + init { + setupSortRadio() + setupOrderRadio() + AlertDialog.Builder(activity) + .setPositiveButton(R.string.ok) { _, _ -> dialogConfirmed() } + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this, R.string.sort_by) + } + } + + private fun setupSortRadio() { + val fieldRadio = view.sorting_dialog_radio_sorting + var fieldBtn = fieldRadio.sorting_dialog_radio_title + + if (currSorting and SORT_BY_DATE_CREATED != 0) { + fieldBtn = fieldRadio.sorting_dialog_radio_date_created + } + + fieldBtn.isChecked = true + } + + private fun setupOrderRadio() { + val orderRadio = view.sorting_dialog_radio_order + var orderBtn = orderRadio.sorting_dialog_radio_ascending + + if (currSorting and SORT_DESCENDING != 0) { + orderBtn = orderRadio.sorting_dialog_radio_descending + } + + orderBtn.isChecked = true + } + + private fun dialogConfirmed() { + val sortingRadio = view.sorting_dialog_radio_sorting + var sorting = when (sortingRadio.checkedRadioButtonId) { + R.id.sorting_dialog_radio_date_created -> SORT_BY_DATE_CREATED + else -> SORT_BY_TITLE + } + + if (view.sorting_dialog_radio_order.checkedRadioButtonId == R.id.sorting_dialog_radio_descending) { + sorting = sorting or SORT_DESCENDING + } + + if (currSorting != sorting) { + config.sorting = sorting + callback() + } + } +} 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..8a36a75c 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 @@ -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++ } } @@ -158,7 +158,8 @@ class ChecklistFragment : NoteFragment(), ChecklistItemsListener { private fun setupAdapter() { updateUIVisibility() - + ChecklistItem.sorting = requireContext().config.sorting + items.sort() ChecklistAdapter( activity = activity as SimpleActivity, items = items, 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..79d79be8 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,24 @@ package com.simplemobiletools.notes.pro.models -data class ChecklistItem(val id: Int, var title: String, var isDone: Boolean) +import com.simplemobiletools.commons.helpers.AlphanumericComparator +import com.simplemobiletools.commons.helpers.SORT_BY_TITLE +import com.simplemobiletools.commons.helpers.SORT_DESCENDING + +data class ChecklistItem(val id: Int, val dateCreated: Long = 0L, var title: String, var isDone: Boolean) : Comparable { + companion object { + var sorting = 0 + } + + override fun compareTo(other: ChecklistItem): Int { + var result = when { + sorting and SORT_BY_TITLE != 0 -> AlphanumericComparator().compare(title.lowercase(), other.title.lowercase()) + else -> dateCreated.compareTo(other.dateCreated) + } + + if (sorting and SORT_DESCENDING != 0) { + result *= -1 + } + + return result + } +} 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..a8d7e200 --- /dev/null +++ b/app/src/main/res/layout/dialog_sort_checklist.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/menu.xml b/app/src/main/res/menu/menu.xml index c5d0e1d8..c030a9d5 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" /> + + 2048 +